mercurial/hg.py
changeset 895 77b52b864249
parent 890 391de0bcc722
parent 894 62ec665759f2
child 896 01215ad04283
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: