mercurial/hg.py
changeset 861 cbe5c4d016b7
parent 856 fbe964ae7325
child 862 d70c1c31fd45
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"):