mercurial/dirstate.py
changeset 26747 beff0b2481b3
parent 26746 3c1d297fe929
child 26749 4a82cb5c1dc8
equal deleted inserted replaced
26746:3c1d297fe929 26747:beff0b2481b3
   646                 else:
   646                 else:
   647                     self._map[f] = dirstatetuple('n', 0o666, -1, 0)
   647                     self._map[f] = dirstatetuple('n', 0o666, -1, 0)
   648         self._pl = (parent, nullid)
   648         self._pl = (parent, nullid)
   649         self._dirty = True
   649         self._dirty = True
   650 
   650 
   651     def write(self, repo=None):
   651     def write(self, tr=False):
   652         if not self._dirty:
   652         if not self._dirty:
   653             return
   653             return
   654 
   654 
   655         # enough 'delaywrite' prevents 'pack_dirstate' from dropping
   655         # enough 'delaywrite' prevents 'pack_dirstate' from dropping
   656         # timestamp of each entries in dirstate, because of 'now > mtime'
   656         # timestamp of each entries in dirstate, because of 'now > mtime'
   658         if delaywrite > 0:
   658         if delaywrite > 0:
   659             import time # to avoid useless import
   659             import time # to avoid useless import
   660             time.sleep(delaywrite)
   660             time.sleep(delaywrite)
   661 
   661 
   662         filename = self._filename
   662         filename = self._filename
   663         if not repo:
   663         if tr is False: # not explicitly specified
   664             tr = None
       
   665             if self._opener.lexists(self._pendingfilename):
   664             if self._opener.lexists(self._pendingfilename):
   666                 # if pending file already exists, in-memory changes
   665                 # if pending file already exists, in-memory changes
   667                 # should be written into it, because it has priority
   666                 # should be written into it, because it has priority
   668                 # to '.hg/dirstate' at reading under HG_PENDING mode
   667                 # to '.hg/dirstate' at reading under HG_PENDING mode
   669                 filename = self._pendingfilename
   668                 filename = self._pendingfilename
   670         else:
   669         elif tr:
   671             tr = repo.currenttransaction()
       
   672 
       
   673         if tr:
       
   674             # 'dirstate.write()' is not only for writing in-memory
   670             # 'dirstate.write()' is not only for writing in-memory
   675             # changes out, but also for dropping ambiguous timestamp.
   671             # changes out, but also for dropping ambiguous timestamp.
   676             # delayed writing re-raise "ambiguous timestamp issue".
   672             # delayed writing re-raise "ambiguous timestamp issue".
   677             # See also the wiki page below for detail:
   673             # See also the wiki page below for detail:
   678             # https://www.mercurial-scm.org/wiki/DirstateTransactionPlan
   674             # https://www.mercurial-scm.org/wiki/DirstateTransactionPlan
   679 
   675 
   680             # emulate dropping timestamp in 'parsers.pack_dirstate'
   676             # emulate dropping timestamp in 'parsers.pack_dirstate'
   681             now = _getfsnow(repo.vfs)
   677             now = _getfsnow(self._opener)
   682             dmap = self._map
   678             dmap = self._map
   683             for f, e in dmap.iteritems():
   679             for f, e in dmap.iteritems():
   684                 if e[0] == 'n' and e[3] == now:
   680                 if e[0] == 'n' and e[3] == now:
   685                     dmap[f] = dirstatetuple(e[0], e[1], e[2], -1)
   681                     dmap[f] = dirstatetuple(e[0], e[1], e[2], -1)
   686 
   682