mercurial/shelve.py
changeset 46277 ed2f2150d57c
parent 46276 eb7b2929ae49
child 46278 58ca94869287
equal deleted inserted replaced
46276:eb7b2929ae49 46277:ed2f2150d57c
    78 
    78 
    79     Handles common functions on shelve files (.hg/.patch) using
    79     Handles common functions on shelve files (.hg/.patch) using
    80     the vfs layer"""
    80     the vfs layer"""
    81 
    81 
    82     def __init__(self, repo, name, filetype=None):
    82     def __init__(self, repo, name, filetype=None):
    83         self.repo = repo
       
    84         self.name = name
    83         self.name = name
    85         self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
    84         self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
    86         self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
    85         self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
    87         if filetype:
    86         if filetype:
    88             self.fname = name + b'.' + filetype
    87             self.fname = name + b'.' + filetype
   115     def stat(self):
   114     def stat(self):
   116         return self.vfs.stat(self.fname)
   115         return self.vfs.stat(self.fname)
   117 
   116 
   118     def opener(self, mode=b'rb'):
   117     def opener(self, mode=b'rb'):
   119         return self.vfs(self.fname, mode)
   118         return self.vfs(self.fname, mode)
   120 
       
   121     def applybundle(self, tr):
       
   122         fp = self.opener()
       
   123         try:
       
   124             targetphase = phases.internal
       
   125             if not phases.supportinternal(self.repo):
       
   126                 targetphase = phases.secret
       
   127             gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
       
   128             pretip = self.repo[b'tip']
       
   129             bundle2.applybundle(
       
   130                 self.repo,
       
   131                 gen,
       
   132                 tr,
       
   133                 source=b'unshelve',
       
   134                 url=b'bundle:' + self.vfs.join(self.fname),
       
   135                 targetphase=targetphase,
       
   136             )
       
   137             shelvectx = self.repo[b'tip']
       
   138             if pretip == shelvectx:
       
   139                 shelverev = tr.changes[b'revduplicates'][-1]
       
   140                 shelvectx = self.repo[shelverev]
       
   141             return shelvectx
       
   142         finally:
       
   143             fp.close()
       
   144 
   119 
   145 
   120 
   146 class Shelf(object):
   121 class Shelf(object):
   147     """Represents a shelf, including possibly multiple files storing it.
   122     """Represents a shelf, including possibly multiple files storing it.
   148 
   123 
   190             bundle_filename,
   165             bundle_filename,
   191             btype,
   166             btype,
   192             self.vfs,
   167             self.vfs,
   193             compression=compression,
   168             compression=compression,
   194         )
   169         )
       
   170 
       
   171     def applybundle(self, tr):
       
   172         filename = self.name + b'.hg'
       
   173         fp = self.vfs(filename)
       
   174         try:
       
   175             targetphase = phases.internal
       
   176             if not phases.supportinternal(self.repo):
       
   177                 targetphase = phases.secret
       
   178             gen = exchange.readbundle(self.repo.ui, fp, filename, self.vfs)
       
   179             pretip = self.repo[b'tip']
       
   180             bundle2.applybundle(
       
   181                 self.repo,
       
   182                 gen,
       
   183                 tr,
       
   184                 source=b'unshelve',
       
   185                 url=b'bundle:' + self.vfs.join(filename),
       
   186                 targetphase=targetphase,
       
   187             )
       
   188             shelvectx = self.repo[b'tip']
       
   189             if pretip == shelvectx:
       
   190                 shelverev = tr.changes[b'revduplicates'][-1]
       
   191                 shelvectx = self.repo[shelverev]
       
   192             return shelvectx
       
   193         finally:
       
   194             fp.close()
   195 
   195 
   196 
   196 
   197 class shelvedstate(object):
   197 class shelvedstate(object):
   198     """Handle persistence during unshelving operations.
   198     """Handle persistence during unshelving operations.
   199 
   199 
   902     node = None
   902     node = None
   903     if shelvedfile(repo, basename, b'shelve').exists():
   903     if shelvedfile(repo, basename, b'shelve').exists():
   904         node = Shelf(repo, basename).readinfo()[b'node']
   904         node = Shelf(repo, basename).readinfo()[b'node']
   905     if node is None or node not in repo:
   905     if node is None or node not in repo:
   906         with ui.configoverride({(b'ui', b'quiet'): True}):
   906         with ui.configoverride({(b'ui', b'quiet'): True}):
   907             shelvectx = shelvedfile(repo, basename, b'hg').applybundle(tr)
   907             shelvectx = Shelf(repo, basename).applybundle(tr)
   908         # We might not strip the unbundled changeset, so we should keep track of
   908         # We might not strip the unbundled changeset, so we should keep track of
   909         # the unshelve node in case we need to reuse it (eg: unshelve --keep)
   909         # the unshelve node in case we need to reuse it (eg: unshelve --keep)
   910         if node is None:
   910         if node is None:
   911             info = {b'node': hex(shelvectx.node())}
   911             info = {b'node': hex(shelvectx.node())}
   912             Shelf(repo, basename).writeinfo(info)
   912             Shelf(repo, basename).writeinfo(info)