mercurial/localrepo.py
changeset 3295 764688cf51e5
parent 3241 a184cd0c2db9
child 3296 4546a5e31cb8
equal deleted inserted replaced
3291:0b5d626b354e 3295:764688cf51e5
   460         return self.do_lock("wlock", wait, self.dirstate.write,
   460         return self.do_lock("wlock", wait, self.dirstate.write,
   461                             self.wreload,
   461                             self.wreload,
   462                             desc=_('working directory of %s') % self.origroot)
   462                             desc=_('working directory of %s') % self.origroot)
   463 
   463 
   464     def checkfilemerge(self, filename, text, filelog, manifest1, manifest2):
   464     def checkfilemerge(self, filename, text, filelog, manifest1, manifest2):
   465         "determine whether a new filenode is needed"
   465         """
       
   466         Determine whether a new filenode is needed and what parent
       
   467         and rename information is needed for a file commit.
       
   468 
       
   469         Returns (old entry, file parent 1, file parent 2, metadata)
       
   470 
       
   471         If old entry is not None, a commit is not needed.
       
   472         """
   466         fp1 = manifest1.get(filename, nullid)
   473         fp1 = manifest1.get(filename, nullid)
   467         fp2 = manifest2.get(filename, nullid)
   474         fp2 = manifest2.get(filename, nullid)
   468 
   475 
   469         if fp2 != nullid:
   476         meta = {}
       
   477         cp = self.dirstate.copied(filename)
       
   478         if cp:
       
   479             meta["copy"] = cp
       
   480             if not manifest2: # not a branch merge
       
   481                 meta["copyrev"] = hex(manifest1.get(cp, nullid))
       
   482                 fp2 = nullid
       
   483             elif fp2 != nullid: # copied on remote side
       
   484                 meta["copyrev"] = hex(manifest1.get(cp, nullid))
       
   485             else: # copied on local side, reversed
       
   486                 meta["copyrev"] = hex(manifest2.get(cp))
       
   487                 fp2 = nullid
       
   488             self.ui.debug(_(" %s: copy %s:%s\n") %
       
   489                           (filename, cp, meta["copyrev"]))
       
   490             fp1 = nullid
       
   491         elif fp2 != nullid:
   470             # is one parent an ancestor of the other?
   492             # is one parent an ancestor of the other?
   471             fpa = filelog.ancestor(fp1, fp2)
   493             fpa = filelog.ancestor(fp1, fp2)
   472             if fpa == fp1:
   494             if fpa == fp1:
   473                 fp1, fp2 = fp2, nullid
   495                 fp1, fp2 = fp2, nullid
   474             elif fpa == fp2:
   496             elif fpa == fp2:
   475                 fp2 = nullid
   497                 fp2 = nullid
   476 
   498 
   477             # is the file unmodified from the parent? report existing entry
   499             # is the file unmodified from the parent? report existing entry
       
   500             # fixme: use filelog.cmp()
   478             if fp2 == nullid and text == filelog.read(fp1):
   501             if fp2 == nullid and text == filelog.read(fp1):
   479                 return (fp1, None, None)
   502                 return (fp1, None, None, {})
   480 
   503 
   481         return (None, fp1, fp2)
   504         return (None, fp1, fp2, meta)
   482 
   505 
   483     def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None):
   506     def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None):
   484         orig_parent = self.dirstate.parents()[0] or nullid
   507         orig_parent = self.dirstate.parents()[0] or nullid
   485         p1 = p1 or self.dirstate.parents()[0] or nullid
   508         p1 = p1 or self.dirstate.parents()[0] or nullid
   486         p2 = p2 or self.dirstate.parents()[1] or nullid
   509         p2 = p2 or self.dirstate.parents()[1] or nullid
   504             try:
   527             try:
   505                 t = self.wread(f)
   528                 t = self.wread(f)
   506                 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
   529                 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
   507                 r = self.file(f)
   530                 r = self.file(f)
   508 
   531 
   509                 (entry, fp1, fp2) = self.checkfilemerge(f, t, r, m1, m2)
   532                 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2)
   510                 if entry:
   533                 if entry:
   511                     m1[f] = entry
   534                     m1[f] = entry
   512                     continue
   535                     continue
   513 
   536 
   514                 m1[f] = r.add(t, {}, tr, linkrev, fp1, fp2)
   537                 m1[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
   515                 changed.append(f)
   538                 changed.append(f)
   516                 if update_dirstate:
   539                 if update_dirstate:
   517                     self.dirstate.update([f], "n")
   540                     self.dirstate.update([f], "n")
   518             except IOError:
   541             except IOError:
   519                 try:
   542                 try:
   587                 self.ui.warn(_("trouble committing %s!\n") % f)
   610                 self.ui.warn(_("trouble committing %s!\n") % f)
   588                 raise
   611                 raise
   589 
   612 
   590             r = self.file(f)
   613             r = self.file(f)
   591 
   614 
   592             meta = {}
   615             entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2)
   593             cp = self.dirstate.copied(f)
   616             if entry:
   594             if cp:
   617                 new[f] = entry
   595                 meta["copy"] = cp
   618                 continue
   596                 meta["copyrev"] = hex(m1.get(cp, m2.get(cp, nullid)))
       
   597                 self.ui.debug(_(" %s: copy %s:%s\n") % (f, cp, meta["copyrev"]))
       
   598                 fp1, fp2 = nullid, nullid
       
   599             else:
       
   600                 entry, fp1, fp2 = self.checkfilemerge(f, t, r, m1, m2)
       
   601                 if entry:
       
   602                     new[f] = entry
       
   603                     continue
       
   604 
   619 
   605             new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
   620             new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
   606             # remember what we've added so that we can later calculate
   621             # remember what we've added so that we can later calculate
   607             # the files to pull from a set of changesets
   622             # the files to pull from a set of changesets
   608             changed.append(f)
   623             changed.append(f)