comparison mercurial/shelve.py @ 46277:ed2f2150d57c

shelve: move method for reading .hg to new shelf class Differential Revision: https://phab.mercurial-scm.org/D9704
author Martin von Zweigbergk <martinvonz@google.com>
date Thu, 07 Jan 2021 13:57:21 -0800
parents eb7b2929ae49
children 58ca94869287
comparison
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)