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"): |