comparison mercurial/hg.py @ 895:77b52b864249

Merge walk changes with Matt's tip.
author Bryan O'Sullivan <bos@serpentine.com>
date Sat, 13 Aug 2005 15:26:32 -0800
parents 391de0bcc722 62ec665759f2
children 01215ad04283
comparison
equal deleted inserted replaced
890:391de0bcc722 895:77b52b864249
395 self.copies[dest] = source 395 self.copies[dest] = source
396 396
397 def copied(self, file): 397 def copied(self, file):
398 return self.copies.get(file, None) 398 return self.copies.get(file, None)
399 399
400 def update(self, files, state): 400 def update(self, files, state, **kw):
401 ''' current states: 401 ''' current states:
402 n normal 402 n normal
403 m needs merging 403 m needs merging
404 r marked for removal 404 r marked for removal
405 a marked for addition''' 405 a marked for addition'''
410 for f in files: 410 for f in files:
411 if state == "r": 411 if state == "r":
412 self.map[f] = ('r', 0, 0, 0) 412 self.map[f] = ('r', 0, 0, 0)
413 else: 413 else:
414 s = os.stat(os.path.join(self.root, f)) 414 s = os.stat(os.path.join(self.root, f))
415 self.map[f] = (state, s.st_mode, s.st_size, s.st_mtime) 415 st_size = kw.get('st_size', s.st_size)
416 st_mtime = kw.get('st_mtime', s.st_mtime)
417 self.map[f] = (state, s.st_mode, st_size, st_mtime)
416 418
417 def forget(self, files): 419 def forget(self, files):
418 if not files: return 420 if not files: return
419 self.read() 421 self.read()
420 self.markdirty() 422 self.markdirty()
500 continue 502 continue
501 if stat.S_ISDIR(st.st_mode): 503 if stat.S_ISDIR(st.st_mode):
502 for dir, subdirs, fl in os.walk(f): 504 for dir, subdirs, fl in os.walk(f):
503 d = dir[len(self.root) + 1:] 505 d = dir[len(self.root) + 1:]
504 nd = util.normpath(d) 506 nd = util.normpath(d)
507 if nd == '.': nd = ''
505 if seen(nd): 508 if seen(nd):
506 subdirs[:] = [] 509 subdirs[:] = []
507 continue 510 continue
508 for sd in subdirs: 511 for sd in subdirs:
509 ds = os.path.join(nd, sd +'/') 512 ds = os.path.join(nd, sd +'/')
541 if fn not in dc and self.ignore(fn): 544 if fn not in dc and self.ignore(fn):
542 continue 545 continue
543 if match(fn): 546 if match(fn):
544 yield src, fn 547 yield src, fn
545 548
546 def changes(self, files = None, match = util.always): 549 def changes(self, files=None, match=util.always):
547 self.read() 550 self.read()
548 if not files: 551 if not files:
549 dc = self.map.copy() 552 dc = self.map.copy()
550 else: 553 else:
551 dc = self.filterfiles(files) 554 dc = self.filterfiles(files)
552 lookup, changed, added, unknown = [], [], [], [] 555 lookup, modified, added, unknown = [], [], [], []
556 removed, deleted = [], []
553 557
554 for src, fn in self.walk(files, match, dc=dc): 558 for src, fn in self.walk(files, match, dc=dc):
555 try: s = os.stat(os.path.join(self.root, fn)) 559 try:
556 except: continue 560 s = os.stat(os.path.join(self.root, fn))
557 561 except OSError:
558 if fn in dc: 562 continue
559 c = dc[fn] 563 if not stat.S_ISREG(s.st_mode):
564 continue
565 c = dc.get(fn)
566 if c:
560 del dc[fn] 567 del dc[fn]
561
562 if c[0] == 'm': 568 if c[0] == 'm':
563 changed.append(fn) 569 modified.append(fn)
564 elif c[0] == 'a': 570 elif c[0] == 'a':
565 added.append(fn) 571 added.append(fn)
566 elif c[0] == 'r': 572 elif c[0] == 'r':
567 unknown.append(fn) 573 unknown.append(fn)
568 elif c[2] != s.st_size or (c[1] ^ s.st_mode) & 0100: 574 elif c[2] != s.st_size or (c[1] ^ s.st_mode) & 0100:
569 changed.append(fn) 575 modified.append(fn)
570 elif c[1] != s.st_mode or c[3] != s.st_mtime: 576 elif c[3] != s.st_mtime:
571 lookup.append(fn) 577 lookup.append(fn)
572 else: 578 else:
573 if match(fn): unknown.append(fn) 579 unknown.append(fn)
574 580
575 return (lookup, changed, added, filter(match, dc.keys()), unknown) 581 for fn, c in [(fn, c) for fn, c in dc.items() if match(fn)]:
582 if c[0] == 'r':
583 removed.append(fn)
584 else:
585 deleted.append(fn)
586 return (lookup, modified, added, removed + deleted, unknown)
576 587
577 # used to avoid circular references so destructors work 588 # used to avoid circular references so destructors work
578 def opener(base): 589 def opener(base):
579 p = base 590 p = base
580 def o(path, mode="r"): 591 def o(path, mode="r"):
1621 for f in files: 1632 for f in files:
1622 self.ui.status("merging %s\n" % f) 1633 self.ui.status("merging %s\n" % f)
1623 m, o, flag = merge[f] 1634 m, o, flag = merge[f]
1624 self.merge3(f, m, o) 1635 self.merge3(f, m, o)
1625 util.set_exec(self.wjoin(f), flag) 1636 util.set_exec(self.wjoin(f), flag)
1626 if moddirstate and mode == 'm': 1637 if moddirstate:
1627 # only update dirstate on branch merge, otherwise we 1638 if mode == 'm':
1628 # could mark files with changes as unchanged 1639 # only update dirstate on branch merge, otherwise we
1629 self.dirstate.update([f], mode) 1640 # could mark files with changes as unchanged
1641 self.dirstate.update([f], mode)
1642 elif p2 == nullid:
1643 # update dirstate from parent1's manifest
1644 m1n = self.changelog.read(p1)[0]
1645 m1 = self.manifest.read(m1n)
1646 f_len = len(self.file(f).read(m1[f]))
1647 self.dirstate.update([f], mode, st_size=f_len, st_mtime=0)
1648 else:
1649 self.ui.warn("Second parent without branch merge!?\n"
1650 "Dirstate for file %s may be wrong.\n" % f)
1630 1651
1631 remove.sort() 1652 remove.sort()
1632 for f in remove: 1653 for f in remove:
1633 self.ui.note("removing %s\n" % f) 1654 self.ui.note("removing %s\n" % f)
1634 try: 1655 try: