Show More
@@ -190,6 +190,35 b' def cleanupoldbackups(repo):' | |||
|
190 | 190 | if err.errno != errno.ENOENT: |
|
191 | 191 | raise |
|
192 | 192 | |
|
193 | def _aborttransaction(repo): | |
|
194 | '''Abort current transaction for shelve/unshelve, but keep dirstate | |
|
195 | ''' | |
|
196 | backupname = 'dirstate.shelve' | |
|
197 | dirstatebackup = None | |
|
198 | try: | |
|
199 | # create backup of (un)shelved dirstate, because aborting transaction | |
|
200 | # should restore dirstate to one at the beginning of the | |
|
201 | # transaction, which doesn't include the result of (un)shelving | |
|
202 | fp = repo.vfs.open(backupname, "w") | |
|
203 | dirstatebackup = backupname | |
|
204 | # clearing _dirty/_dirtypl of dirstate by _writedirstate below | |
|
205 | # is unintentional. but it doesn't cause problem in this case, | |
|
206 | # because no code path refers them until transaction is aborted. | |
|
207 | repo.dirstate._writedirstate(fp) # write in-memory changes forcibly | |
|
208 | ||
|
209 | tr = repo.currenttransaction() | |
|
210 | tr.abort() | |
|
211 | ||
|
212 | # TODO: this should be done via transaction.abort() | |
|
213 | repo.dirstate.invalidate() # prevent wlock from writing changes out | |
|
214 | ||
|
215 | # restore to backuped dirstate | |
|
216 | repo.vfs.rename(dirstatebackup, 'dirstate') | |
|
217 | dirstatebackup = None | |
|
218 | finally: | |
|
219 | if dirstatebackup: | |
|
220 | repo.vfs.unlink(dirstatebackup) | |
|
221 | ||
|
193 | 222 | def createcmd(ui, repo, pats, opts): |
|
194 | 223 | """subcommand that creates a new shelve""" |
|
195 | 224 |
General Comments 0
You need to be logged in to leave comments.
Login now