hgext/obsolete.py
changeset 52 62bdc2567099
parent 51 d98e06ab8320
child 53 0bcbf690dfca
equal deleted inserted replaced
51:d98e06ab8320 52:62bdc2567099
     3 # Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
     3 # Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
     4 #                Logilab SA        <contact@logilab.fr>
     4 #                Logilab SA        <contact@logilab.fr>
     5 #
     5 #
     6 # This software may be used and distributed according to the terms of the
     6 # This software may be used and distributed according to the terms of the
     7 # GNU General Public License version 2 or any later version.
     7 # GNU General Public License version 2 or any later version.
       
     8 import os
     8 
     9 
     9 from mercurial import util
    10 from mercurial import util
    10 from mercurial import context
    11 from mercurial import context
    11 from mercurial import revset
    12 from mercurial import revset
    12 from mercurial import scmutil
    13 from mercurial import scmutil
    13 from mercurial import extensions
    14 from mercurial import extensions
    14 from mercurial import pushkey
    15 from mercurial import pushkey
    15 from mercurial import discovery
    16 from mercurial import discovery
    16 from mercurial import error
    17 from mercurial import error
    17 from mercurial.node import hex, bin
    18 from mercurial.node import hex, bin
       
    19 from mercurial.lock import release
    18 
    20 
    19 # Patch changectx
    21 # Patch changectx
    20 #############################
    22 #############################
    21 
    23 
    22 def obsolete(ctx):
    24 def obsolete(ctx):
   117     if not repo.local():
   119     if not repo.local():
   118         return
   120         return
   119 
   121 
   120     opull = repo.pull
   122     opull = repo.pull
   121     opush = repo.push
   123     opush = repo.push
       
   124     orollback = repo.rollback
       
   125     o_writejournal = repo._writejournal
   122 
   126 
   123     class obsoletingrepo(repo.__class__):
   127     class obsoletingrepo(repo.__class__):
   124 
   128 
   125 
   129 
   126         ### Hidden revision support
   130         ### Hidden revision support
   220                 self.changelog.hiddenrevs.add(repo[obj].rev())
   224                 self.changelog.hiddenrevs.add(repo[obj].rev())
   221             except error.RepoLookupError:
   225             except error.RepoLookupError:
   222                 pass #unknow revision (but keep propagating the data
   226                 pass #unknow revision (but keep propagating the data
   223             self._writeobsrels()
   227             self._writeobsrels()
   224 
   228 
       
   229         ### rollback support
       
   230 
       
   231         def _writejournal(self, desc):
       
   232             entries = list(o_writejournal(desc))
       
   233             filename = 'obsolete-relations'
       
   234             filepath = self.join(filename)
       
   235             if  os.path.exists(filepath):
       
   236                 journalname = 'journal.' + filename
       
   237                 journalpath = self.join(journalname)
       
   238                 util.copyfile(filepath, journalpath)
       
   239                 entries.append(journalpath)
       
   240             return tuple(entries)
       
   241 
       
   242         def rollback(self, dryrun=False):
       
   243             wlock = lock = None
       
   244             try:
       
   245                 wlock = self.wlock()
       
   246                 lock = self.lock()
       
   247                 ret = orollback(dryrun)
       
   248                 if not (ret or dryrun): #rollback did not failed
       
   249                     src = self.join('undo.obsolete-relations')
       
   250                     dst = self.join('obsolete-relations')
       
   251                     if os.path.exists(src):
       
   252                         util.rename(src, dst)
       
   253                     elif os.path.exists(dst): #unlink in any case
       
   254                         os.unlink(dst)
       
   255                     # invalidate cache
       
   256                     self.__dict__.pop('_obssubrels', None)
       
   257                     self.__dict__.pop('_obsobjrels', None)
       
   258                 return ret
       
   259             finally:
       
   260                 release(lock, wlock)
       
   261 
   225     repo.__class__ = obsoletingrepo
   262     repo.__class__ = obsoletingrepo
   226 
   263 
   227 
   264 
   228 ### Other Extension compat
   265 ### Other Extension compat
   229 ############################
   266 ############################