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" %