Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/hg.py @ 244:43105253cf5e
root relative IO and valid commit states
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
root relative IO and valid commit states
do all working dir manipulation relative to localrepository.root
change the valid commit states
manifest hash: def7de4dfb4cad1fd4ef6f713fa3b5c903e05c58
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCof1VywK+sNU5EO8RArEVAJ9F/zFYqRvS2dWxOhONCm1OjEjILQCfcmDq
ARbGkSFSyVmyUSBSEq4n//E=
=qIEI
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Sat, 04 Jun 2005 11:13:25 -0800 |
parents | afe895fcc0d0 |
children | 863b508c5b36 |
comparison
equal
deleted
inserted
replaced
243:9a9ea2d1d3c4 | 244:43105253cf5e |
---|---|
148 l = [hex(manifest), user, date] + list + ["", desc] | 148 l = [hex(manifest), user, date] + list + ["", desc] |
149 text = "\n".join(l) | 149 text = "\n".join(l) |
150 return self.addrevision(text, transaction, self.count(), p1, p2) | 150 return self.addrevision(text, transaction, self.count(), p1, p2) |
151 | 151 |
152 class dirstate: | 152 class dirstate: |
153 def __init__(self, opener, ui): | 153 def __init__(self, opener, ui, root): |
154 self.opener = opener | 154 self.opener = opener |
155 self.root = root | |
155 self.dirty = 0 | 156 self.dirty = 0 |
156 self.ui = ui | 157 self.ui = ui |
157 self.map = None | 158 self.map = None |
158 self.pl = None | 159 self.pl = None |
159 | 160 |
221 for f in files: | 222 for f in files: |
222 if state == "r": | 223 if state == "r": |
223 self.map[f] = ('r', 0, 0, 0) | 224 self.map[f] = ('r', 0, 0, 0) |
224 else: | 225 else: |
225 try: | 226 try: |
226 s = os.stat(f) | 227 s = os.stat(os.path.join(self.root, f)) |
227 self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime) | 228 self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime) |
228 except OSError: | 229 except OSError: |
229 if state != "i": raise | 230 if state != "i": raise |
230 self.map[f] = ('r', 0, 0, 0) | 231 self.map[f] = ('r', 0, 0, 0) |
231 | 232 |
309 self.changelog = changelog(self.opener) | 310 self.changelog = changelog(self.opener) |
310 self.ignorelist = None | 311 self.ignorelist = None |
311 self.tags = None | 312 self.tags = None |
312 | 313 |
313 if not self.remote: | 314 if not self.remote: |
314 self.dirstate = dirstate(self.opener, ui) | 315 self.dirstate = dirstate(self.opener, ui, self.root) |
315 | 316 |
316 def ignore(self, f): | 317 def ignore(self, f): |
317 if self.ignorelist is None: | 318 if self.ignorelist is None: |
318 self.ignorelist = [] | 319 self.ignorelist = [] |
319 try: | 320 try: |
341 except KeyError: | 342 except KeyError: |
342 return self.changelog.lookup(key) | 343 return self.changelog.lookup(key) |
343 | 344 |
344 def join(self, f): | 345 def join(self, f): |
345 return os.path.join(self.path, f) | 346 return os.path.join(self.path, f) |
347 | |
348 def wjoin(self, f): | |
349 return os.path.join(self.root, f) | |
346 | 350 |
347 def file(self, f): | 351 def file(self, f): |
348 if f[0] == '/': f = f[1:] | 352 if f[0] == '/': f = f[1:] |
349 return filelog(self.opener, f) | 353 return filelog(self.opener, f) |
350 | 354 |
418 commit = [] | 422 commit = [] |
419 remove = [] | 423 remove = [] |
420 if files: | 424 if files: |
421 for f in files: | 425 for f in files: |
422 s = self.dirstate.state(f) | 426 s = self.dirstate.state(f) |
423 if s in 'cai': | 427 if s in 'nmai': |
424 commit.append(f) | 428 commit.append(f) |
425 elif s == 'r': | 429 elif s == 'r': |
426 remove.append(f) | 430 remove.append(f) |
427 else: | 431 else: |
428 self.warn("%s not tracked!\n") | 432 self.ui.warn("%s not tracked!\n" % f) |
429 else: | 433 else: |
430 (c, a, d, u) = self.diffdir(self.root) | 434 (c, a, d, u) = self.diffdir(self.root) |
431 commit = c + a | 435 commit = c + a |
432 remove = d | 436 remove = d |
433 | 437 |
448 linkrev = self.changelog.count() | 452 linkrev = self.changelog.count() |
449 commit.sort() | 453 commit.sort() |
450 for f in commit: | 454 for f in commit: |
451 self.ui.note(f + "\n") | 455 self.ui.note(f + "\n") |
452 try: | 456 try: |
453 t = file(f).read() | 457 t = file(self.wjoin(f)).read() |
454 except IOError: | 458 except IOError: |
455 self.warn("trouble committing %s!\n" % f) | 459 self.warn("trouble committing %s!\n" % f) |
456 raise | 460 raise |
457 | 461 |
458 r = self.file(f) | 462 r = self.file(f) |
491 for f,n in l: | 495 for f,n in l: |
492 if f[0] == "/": continue | 496 if f[0] == "/": continue |
493 self.ui.note(f, "\n") | 497 self.ui.note(f, "\n") |
494 t = self.file(f).revision(n) | 498 t = self.file(f).revision(n) |
495 try: | 499 try: |
496 file(f, "w").write(t) | 500 file(self.wjoin(f), "w").write(t) |
497 except IOError: | 501 except IOError: |
498 os.makedirs(os.path.dirname(f)) | 502 os.makedirs(os.path.dirname(f)) |
499 file(f, "w").write(t) | 503 file(self.wjoin(f), "w").write(t) |
500 | 504 |
501 self.dirstate.setparents(node) | 505 self.dirstate.setparents(node) |
502 self.dirstate.clear() | 506 self.dirstate.clear() |
503 self.dirstate.update([f for f,n in l], "n") | 507 self.dirstate.update([f for f,n in l], "n") |
504 | 508 |
517 change = self.changelog.read(changeset) | 521 change = self.changelog.read(changeset) |
518 mf = self.manifest.read(change[0]) | 522 mf = self.manifest.read(change[0]) |
519 dc = self.dirstate.copy() | 523 dc = self.dirstate.copy() |
520 | 524 |
521 def fcmp(fn): | 525 def fcmp(fn): |
522 t1 = file(os.path.join(self.root, fn)).read() | 526 t1 = file(self.wjoin(fn)).read() |
523 t2 = self.file(fn).revision(mf[fn]) | 527 t2 = self.file(fn).revision(mf[fn]) |
524 return cmp(t1, t2) | 528 return cmp(t1, t2) |
525 | 529 |
526 for dir, subdirs, files in os.walk(self.root): | 530 for dir, subdirs, files in os.walk(self.root): |
527 d = dir[len(self.root)+1:] | 531 d = dir[len(self.root)+1:] |
583 | 587 |
584 return (changed, added, deleted) | 588 return (changed, added, deleted) |
585 | 589 |
586 def add(self, list): | 590 def add(self, list): |
587 for f in list: | 591 for f in list: |
588 p = os.path.join(self.root, f) | 592 p = self.wjoin(f) |
589 if not os.path.isfile(p): | 593 if not os.path.isfile(p): |
590 self.ui.warn("%s does not exist!\n" % f) | 594 self.ui.warn("%s does not exist!\n" % f) |
591 elif self.dirstate.state(f) == 'n': | 595 elif self.dirstate.state(f) == 'n': |
592 self.ui.warn("%s already tracked!\n" % f) | 596 self.ui.warn("%s already tracked!\n" % f) |
593 else: | 597 else: |
600 else: | 604 else: |
601 self.dirstate.forget([f]) | 605 self.dirstate.forget([f]) |
602 | 606 |
603 def remove(self, list): | 607 def remove(self, list): |
604 for f in list: | 608 for f in list: |
605 p = os.path.join(self.root, f) | 609 p = self.wjoin(f) |
606 if os.path.isfile(p): | 610 if os.path.isfile(p): |
607 self.ui.warn("%s still exists!\n" % f) | 611 self.ui.warn("%s still exists!\n" % f) |
608 elif f not in self.dirstate: | 612 elif f not in self.dirstate: |
609 self.ui.warn("%s not tracked!\n" % f) | 613 self.ui.warn("%s not tracked!\n" % f) |
610 else: | 614 else: |
933 for f in files: | 937 for f in files: |
934 if f[0] == "/": continue | 938 if f[0] == "/": continue |
935 self.ui.note(f, "\n") | 939 self.ui.note(f, "\n") |
936 t = self.file(f).revision(get[f]) | 940 t = self.file(f).revision(get[f]) |
937 try: | 941 try: |
938 file(f, "w").write(t) | 942 file(self.wjoin(f), "w").write(t) |
939 except IOError: | 943 except IOError: |
940 os.makedirs(os.path.dirname(f)) | 944 os.makedirs(os.path.dirname(f)) |
941 file(f, "w").write(t) | 945 file(self.wjoin(f), "w").write(t) |
942 | 946 |
943 # we have to remember what files we needed to get/change | 947 # we have to remember what files we needed to get/change |
944 # because any file that's different from either one of its | 948 # because any file that's different from either one of its |
945 # parents must be in the changeset | 949 # parents must be in the changeset |
946 self.dirstate.update(files, 'm') | 950 self.dirstate.update(files, 'm') |
971 f.close() | 975 f.close() |
972 return name | 976 return name |
973 | 977 |
974 fl = self.file(fn) | 978 fl = self.file(fn) |
975 base = fl.ancestor(my, other) | 979 base = fl.ancestor(my, other) |
976 a = fn | 980 a = self.wjoin(fn) |
977 b = temp("other", other) | 981 b = temp("other", other) |
978 c = temp("base", base) | 982 c = temp("base", base) |
979 | 983 |
980 self.ui.note("resolving %s\n" % fn) | 984 self.ui.note("resolving %s\n" % fn) |
981 self.ui.debug("file %s: other %s ancestor %s\n" % | 985 self.ui.debug("file %s: other %s ancestor %s\n" % |