comparison mercurial/hg.py @ 861:cbe5c4d016b7

dirstate.changes() now distinguishes 'hg remove'd or just deleted files. Interface is not yet changed. Non-regular files are considered to be removed or deleted. Removed the unneeded match(fn) call for adding to the unknown list.
author Thomas Arendsen Hein <thomas@intevation.de>
date Tue, 09 Aug 2005 11:32:30 +0100
parents fbe964ae7325
children d70c1c31fd45
comparison
equal deleted inserted replaced
860:8ccbac05cf59 861:cbe5c4d016b7
8 import sys, struct, os 8 import sys, struct, os
9 import util 9 import util
10 from revlog import * 10 from revlog import *
11 from demandload import * 11 from demandload import *
12 demandload(globals(), "re lock urllib urllib2 transaction time socket") 12 demandload(globals(), "re lock urllib urllib2 transaction time socket")
13 demandload(globals(), "tempfile httprangereader bdiff urlparse") 13 demandload(globals(), "tempfile httprangereader bdiff urlparse stat")
14 demandload(globals(), "bisect select") 14 demandload(globals(), "bisect select")
15 15
16 class filelog(revlog): 16 class filelog(revlog):
17 def __init__(self, opener, path): 17 def __init__(self, opener, path):
18 revlog.__init__(self, opener, 18 revlog.__init__(self, opener,
482 elif self.ignore(fn): 482 elif self.ignore(fn):
483 continue 483 continue
484 if match(fn): 484 if match(fn):
485 yield src, fn 485 yield src, fn
486 486
487 def changes(self, files = None, match = util.always): 487 def changes(self, files=None, match=util.always):
488 self.read() 488 self.read()
489 dc = self.map.copy() 489 dc = self.map.copy()
490 lookup, changed, added, unknown = [], [], [], [] 490 lookup, modified, added, unknown = [], [], [], []
491 removed, deleted = [], []
491 492
492 for src, fn in self.walk(files, match): 493 for src, fn in self.walk(files, match):
493 try: s = os.stat(os.path.join(self.root, fn)) 494 try:
494 except: continue 495 s = os.stat(os.path.join(self.root, fn))
495 496 except OSError:
496 if fn in dc: 497 continue
497 c = dc[fn] 498 if not stat.S_ISREG(s.st_mode):
499 continue
500 c = dc.get(fn)
501 if c:
498 del dc[fn] 502 del dc[fn]
499
500 if c[0] == 'm': 503 if c[0] == 'm':
501 changed.append(fn) 504 modified.append(fn)
502 elif c[0] == 'a': 505 elif c[0] == 'a':
503 added.append(fn) 506 added.append(fn)
504 elif c[0] == 'r': 507 elif c[0] == 'r':
505 unknown.append(fn) 508 unknown.append(fn)
506 elif c[2] != s.st_size or (c[1] ^ s.st_mode) & 0100: 509 elif c[2] != s.st_size or (c[1] ^ s.st_mode) & 0100:
507 changed.append(fn) 510 modified.append(fn)
508 elif c[1] != s.st_mode or c[3] != s.st_mtime: 511 elif c[3] != s.st_mtime:
509 lookup.append(fn) 512 lookup.append(fn)
510 else: 513 else:
511 if match(fn): unknown.append(fn) 514 unknown.append(fn)
512 515
513 return (lookup, changed, added, filter(match, dc.keys()), unknown) 516 for fn, c in [(fn, c) for fn, c in dc.items() if match(fn)]:
517 if c[0] == 'r':
518 removed.append(fn)
519 else:
520 deleted.append(fn)
521 return (lookup, modified, added, removed + deleted, unknown)
514 522
515 # used to avoid circular references so destructors work 523 # used to avoid circular references so destructors work
516 def opener(base): 524 def opener(base):
517 p = base 525 p = base
518 def o(path, mode="r"): 526 def o(path, mode="r"):