Mercurial > public > mercurial-scm > hg-stable
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) |