equal
deleted
inserted
replaced
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) |