##// END OF EJS Templates
shelve: raise more specific errors...
Martin von Zweigbergk -
r46898:3edd82c0 default draft
parent child Browse files
Show More
@@ -1,1158 +1,1164 b''
1 # shelve.py - save/restore working directory state
1 # shelve.py - save/restore working directory state
2 #
2 #
3 # Copyright 2013 Facebook, Inc.
3 # Copyright 2013 Facebook, Inc.
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 """save and restore changes to the working directory
8 """save and restore changes to the working directory
9
9
10 The "hg shelve" command saves changes made to the working directory
10 The "hg shelve" command saves changes made to the working directory
11 and reverts those changes, resetting the working directory to a clean
11 and reverts those changes, resetting the working directory to a clean
12 state.
12 state.
13
13
14 Later on, the "hg unshelve" command restores the changes saved by "hg
14 Later on, the "hg unshelve" command restores the changes saved by "hg
15 shelve". Changes can be restored even after updating to a different
15 shelve". Changes can be restored even after updating to a different
16 parent, in which case Mercurial's merge machinery will resolve any
16 parent, in which case Mercurial's merge machinery will resolve any
17 conflicts if necessary.
17 conflicts if necessary.
18
18
19 You can have more than one shelved change outstanding at a time; each
19 You can have more than one shelved change outstanding at a time; each
20 shelved change has a distinct name. For details, see the help for "hg
20 shelved change has a distinct name. For details, see the help for "hg
21 shelve".
21 shelve".
22 """
22 """
23 from __future__ import absolute_import
23 from __future__ import absolute_import
24
24
25 import collections
25 import collections
26 import errno
26 import errno
27 import itertools
27 import itertools
28 import stat
28 import stat
29
29
30 from .i18n import _
30 from .i18n import _
31 from .pycompat import open
31 from .pycompat import open
32 from .node import (
32 from .node import (
33 bin,
33 bin,
34 hex,
34 hex,
35 nullid,
35 nullid,
36 nullrev,
36 nullrev,
37 )
37 )
38 from . import (
38 from . import (
39 bookmarks,
39 bookmarks,
40 bundle2,
40 bundle2,
41 changegroup,
41 changegroup,
42 cmdutil,
42 cmdutil,
43 discovery,
43 discovery,
44 error,
44 error,
45 exchange,
45 exchange,
46 hg,
46 hg,
47 lock as lockmod,
47 lock as lockmod,
48 mdiff,
48 mdiff,
49 merge,
49 merge,
50 mergestate as mergestatemod,
50 mergestate as mergestatemod,
51 patch,
51 patch,
52 phases,
52 phases,
53 pycompat,
53 pycompat,
54 repair,
54 repair,
55 scmutil,
55 scmutil,
56 templatefilters,
56 templatefilters,
57 util,
57 util,
58 vfs as vfsmod,
58 vfs as vfsmod,
59 )
59 )
60 from .utils import (
60 from .utils import (
61 dateutil,
61 dateutil,
62 stringutil,
62 stringutil,
63 )
63 )
64
64
65 backupdir = b'shelve-backup'
65 backupdir = b'shelve-backup'
66 shelvedir = b'shelved'
66 shelvedir = b'shelved'
67 shelvefileextensions = [b'hg', b'patch', b'shelve']
67 shelvefileextensions = [b'hg', b'patch', b'shelve']
68 # universal extension is present in all types of shelves
68 # universal extension is present in all types of shelves
69 patchextension = b'patch'
69 patchextension = b'patch'
70
70
71 # we never need the user, so we use a
71 # we never need the user, so we use a
72 # generic user for all shelve operations
72 # generic user for all shelve operations
73 shelveuser = b'shelve@localhost'
73 shelveuser = b'shelve@localhost'
74
74
75
75
76 class shelvedfile(object):
76 class shelvedfile(object):
77 """Helper for the file storing a single shelve
77 """Helper for the file storing a single shelve
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
83 self.repo = repo
84 self.name = name
84 self.name = name
85 self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
85 self.vfs = vfsmod.vfs(repo.vfs.join(shelvedir))
86 self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
86 self.backupvfs = vfsmod.vfs(repo.vfs.join(backupdir))
87 self.ui = self.repo.ui
87 self.ui = self.repo.ui
88 if filetype:
88 if filetype:
89 self.fname = name + b'.' + filetype
89 self.fname = name + b'.' + filetype
90 else:
90 else:
91 self.fname = name
91 self.fname = name
92
92
93 def exists(self):
93 def exists(self):
94 return self.vfs.exists(self.fname)
94 return self.vfs.exists(self.fname)
95
95
96 def filename(self):
96 def filename(self):
97 return self.vfs.join(self.fname)
97 return self.vfs.join(self.fname)
98
98
99 def backupfilename(self):
99 def backupfilename(self):
100 def gennames(base):
100 def gennames(base):
101 yield base
101 yield base
102 base, ext = base.rsplit(b'.', 1)
102 base, ext = base.rsplit(b'.', 1)
103 for i in itertools.count(1):
103 for i in itertools.count(1):
104 yield b'%s-%d.%s' % (base, i, ext)
104 yield b'%s-%d.%s' % (base, i, ext)
105
105
106 name = self.backupvfs.join(self.fname)
106 name = self.backupvfs.join(self.fname)
107 for n in gennames(name):
107 for n in gennames(name):
108 if not self.backupvfs.exists(n):
108 if not self.backupvfs.exists(n):
109 return n
109 return n
110
110
111 def movetobackup(self):
111 def movetobackup(self):
112 if not self.backupvfs.isdir():
112 if not self.backupvfs.isdir():
113 self.backupvfs.makedir()
113 self.backupvfs.makedir()
114 util.rename(self.filename(), self.backupfilename())
114 util.rename(self.filename(), self.backupfilename())
115
115
116 def stat(self):
116 def stat(self):
117 return self.vfs.stat(self.fname)
117 return self.vfs.stat(self.fname)
118
118
119 def opener(self, mode=b'rb'):
119 def opener(self, mode=b'rb'):
120 return self.vfs(self.fname, mode)
120 return self.vfs(self.fname, mode)
121
121
122 def applybundle(self, tr):
122 def applybundle(self, tr):
123 fp = self.opener()
123 fp = self.opener()
124 try:
124 try:
125 targetphase = phases.internal
125 targetphase = phases.internal
126 if not phases.supportinternal(self.repo):
126 if not phases.supportinternal(self.repo):
127 targetphase = phases.secret
127 targetphase = phases.secret
128 gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
128 gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
129 pretip = self.repo[b'tip']
129 pretip = self.repo[b'tip']
130 bundle2.applybundle(
130 bundle2.applybundle(
131 self.repo,
131 self.repo,
132 gen,
132 gen,
133 tr,
133 tr,
134 source=b'unshelve',
134 source=b'unshelve',
135 url=b'bundle:' + self.vfs.join(self.fname),
135 url=b'bundle:' + self.vfs.join(self.fname),
136 targetphase=targetphase,
136 targetphase=targetphase,
137 )
137 )
138 shelvectx = self.repo[b'tip']
138 shelvectx = self.repo[b'tip']
139 if pretip == shelvectx:
139 if pretip == shelvectx:
140 shelverev = tr.changes[b'revduplicates'][-1]
140 shelverev = tr.changes[b'revduplicates'][-1]
141 shelvectx = self.repo[shelverev]
141 shelvectx = self.repo[shelverev]
142 return shelvectx
142 return shelvectx
143 finally:
143 finally:
144 fp.close()
144 fp.close()
145
145
146 def writebundle(self, bases, node):
146 def writebundle(self, bases, node):
147 cgversion = changegroup.safeversion(self.repo)
147 cgversion = changegroup.safeversion(self.repo)
148 if cgversion == b'01':
148 if cgversion == b'01':
149 btype = b'HG10BZ'
149 btype = b'HG10BZ'
150 compression = None
150 compression = None
151 else:
151 else:
152 btype = b'HG20'
152 btype = b'HG20'
153 compression = b'BZ'
153 compression = b'BZ'
154
154
155 repo = self.repo.unfiltered()
155 repo = self.repo.unfiltered()
156
156
157 outgoing = discovery.outgoing(
157 outgoing = discovery.outgoing(
158 repo, missingroots=bases, ancestorsof=[node]
158 repo, missingroots=bases, ancestorsof=[node]
159 )
159 )
160 cg = changegroup.makechangegroup(repo, outgoing, cgversion, b'shelve')
160 cg = changegroup.makechangegroup(repo, outgoing, cgversion, b'shelve')
161
161
162 bundle2.writebundle(
162 bundle2.writebundle(
163 self.ui, cg, self.fname, btype, self.vfs, compression=compression
163 self.ui, cg, self.fname, btype, self.vfs, compression=compression
164 )
164 )
165
165
166 def writeinfo(self, info):
166 def writeinfo(self, info):
167 scmutil.simplekeyvaluefile(self.vfs, self.fname).write(info)
167 scmutil.simplekeyvaluefile(self.vfs, self.fname).write(info)
168
168
169 def readinfo(self):
169 def readinfo(self):
170 return scmutil.simplekeyvaluefile(self.vfs, self.fname).read()
170 return scmutil.simplekeyvaluefile(self.vfs, self.fname).read()
171
171
172
172
173 class shelvedstate(object):
173 class shelvedstate(object):
174 """Handle persistence during unshelving operations.
174 """Handle persistence during unshelving operations.
175
175
176 Handles saving and restoring a shelved state. Ensures that different
176 Handles saving and restoring a shelved state. Ensures that different
177 versions of a shelved state are possible and handles them appropriately.
177 versions of a shelved state are possible and handles them appropriately.
178 """
178 """
179
179
180 _version = 2
180 _version = 2
181 _filename = b'shelvedstate'
181 _filename = b'shelvedstate'
182 _keep = b'keep'
182 _keep = b'keep'
183 _nokeep = b'nokeep'
183 _nokeep = b'nokeep'
184 # colon is essential to differentiate from a real bookmark name
184 # colon is essential to differentiate from a real bookmark name
185 _noactivebook = b':no-active-bookmark'
185 _noactivebook = b':no-active-bookmark'
186 _interactive = b'interactive'
186 _interactive = b'interactive'
187
187
188 @classmethod
188 @classmethod
189 def _verifyandtransform(cls, d):
189 def _verifyandtransform(cls, d):
190 """Some basic shelvestate syntactic verification and transformation"""
190 """Some basic shelvestate syntactic verification and transformation"""
191 try:
191 try:
192 d[b'originalwctx'] = bin(d[b'originalwctx'])
192 d[b'originalwctx'] = bin(d[b'originalwctx'])
193 d[b'pendingctx'] = bin(d[b'pendingctx'])
193 d[b'pendingctx'] = bin(d[b'pendingctx'])
194 d[b'parents'] = [bin(h) for h in d[b'parents'].split(b' ')]
194 d[b'parents'] = [bin(h) for h in d[b'parents'].split(b' ')]
195 d[b'nodestoremove'] = [
195 d[b'nodestoremove'] = [
196 bin(h) for h in d[b'nodestoremove'].split(b' ')
196 bin(h) for h in d[b'nodestoremove'].split(b' ')
197 ]
197 ]
198 except (ValueError, TypeError, KeyError) as err:
198 except (ValueError, TypeError, KeyError) as err:
199 raise error.CorruptedState(pycompat.bytestr(err))
199 raise error.CorruptedState(pycompat.bytestr(err))
200
200
201 @classmethod
201 @classmethod
202 def _getversion(cls, repo):
202 def _getversion(cls, repo):
203 """Read version information from shelvestate file"""
203 """Read version information from shelvestate file"""
204 fp = repo.vfs(cls._filename)
204 fp = repo.vfs(cls._filename)
205 try:
205 try:
206 version = int(fp.readline().strip())
206 version = int(fp.readline().strip())
207 except ValueError as err:
207 except ValueError as err:
208 raise error.CorruptedState(pycompat.bytestr(err))
208 raise error.CorruptedState(pycompat.bytestr(err))
209 finally:
209 finally:
210 fp.close()
210 fp.close()
211 return version
211 return version
212
212
213 @classmethod
213 @classmethod
214 def _readold(cls, repo):
214 def _readold(cls, repo):
215 """Read the old position-based version of a shelvestate file"""
215 """Read the old position-based version of a shelvestate file"""
216 # Order is important, because old shelvestate file uses it
216 # Order is important, because old shelvestate file uses it
217 # to detemine values of fields (i.g. name is on the second line,
217 # to detemine values of fields (i.g. name is on the second line,
218 # originalwctx is on the third and so forth). Please do not change.
218 # originalwctx is on the third and so forth). Please do not change.
219 keys = [
219 keys = [
220 b'version',
220 b'version',
221 b'name',
221 b'name',
222 b'originalwctx',
222 b'originalwctx',
223 b'pendingctx',
223 b'pendingctx',
224 b'parents',
224 b'parents',
225 b'nodestoremove',
225 b'nodestoremove',
226 b'branchtorestore',
226 b'branchtorestore',
227 b'keep',
227 b'keep',
228 b'activebook',
228 b'activebook',
229 ]
229 ]
230 # this is executed only seldomly, so it is not a big deal
230 # this is executed only seldomly, so it is not a big deal
231 # that we open this file twice
231 # that we open this file twice
232 fp = repo.vfs(cls._filename)
232 fp = repo.vfs(cls._filename)
233 d = {}
233 d = {}
234 try:
234 try:
235 for key in keys:
235 for key in keys:
236 d[key] = fp.readline().strip()
236 d[key] = fp.readline().strip()
237 finally:
237 finally:
238 fp.close()
238 fp.close()
239 return d
239 return d
240
240
241 @classmethod
241 @classmethod
242 def load(cls, repo):
242 def load(cls, repo):
243 version = cls._getversion(repo)
243 version = cls._getversion(repo)
244 if version < cls._version:
244 if version < cls._version:
245 d = cls._readold(repo)
245 d = cls._readold(repo)
246 elif version == cls._version:
246 elif version == cls._version:
247 d = scmutil.simplekeyvaluefile(repo.vfs, cls._filename).read(
247 d = scmutil.simplekeyvaluefile(repo.vfs, cls._filename).read(
248 firstlinenonkeyval=True
248 firstlinenonkeyval=True
249 )
249 )
250 else:
250 else:
251 raise error.Abort(
251 raise error.Abort(
252 _(
252 _(
253 b'this version of shelve is incompatible '
253 b'this version of shelve is incompatible '
254 b'with the version used in this repo'
254 b'with the version used in this repo'
255 )
255 )
256 )
256 )
257
257
258 cls._verifyandtransform(d)
258 cls._verifyandtransform(d)
259 try:
259 try:
260 obj = cls()
260 obj = cls()
261 obj.name = d[b'name']
261 obj.name = d[b'name']
262 obj.wctx = repo[d[b'originalwctx']]
262 obj.wctx = repo[d[b'originalwctx']]
263 obj.pendingctx = repo[d[b'pendingctx']]
263 obj.pendingctx = repo[d[b'pendingctx']]
264 obj.parents = d[b'parents']
264 obj.parents = d[b'parents']
265 obj.nodestoremove = d[b'nodestoremove']
265 obj.nodestoremove = d[b'nodestoremove']
266 obj.branchtorestore = d.get(b'branchtorestore', b'')
266 obj.branchtorestore = d.get(b'branchtorestore', b'')
267 obj.keep = d.get(b'keep') == cls._keep
267 obj.keep = d.get(b'keep') == cls._keep
268 obj.activebookmark = b''
268 obj.activebookmark = b''
269 if d.get(b'activebook', b'') != cls._noactivebook:
269 if d.get(b'activebook', b'') != cls._noactivebook:
270 obj.activebookmark = d.get(b'activebook', b'')
270 obj.activebookmark = d.get(b'activebook', b'')
271 obj.interactive = d.get(b'interactive') == cls._interactive
271 obj.interactive = d.get(b'interactive') == cls._interactive
272 except (error.RepoLookupError, KeyError) as err:
272 except (error.RepoLookupError, KeyError) as err:
273 raise error.CorruptedState(pycompat.bytestr(err))
273 raise error.CorruptedState(pycompat.bytestr(err))
274
274
275 return obj
275 return obj
276
276
277 @classmethod
277 @classmethod
278 def save(
278 def save(
279 cls,
279 cls,
280 repo,
280 repo,
281 name,
281 name,
282 originalwctx,
282 originalwctx,
283 pendingctx,
283 pendingctx,
284 nodestoremove,
284 nodestoremove,
285 branchtorestore,
285 branchtorestore,
286 keep=False,
286 keep=False,
287 activebook=b'',
287 activebook=b'',
288 interactive=False,
288 interactive=False,
289 ):
289 ):
290 info = {
290 info = {
291 b"name": name,
291 b"name": name,
292 b"originalwctx": hex(originalwctx.node()),
292 b"originalwctx": hex(originalwctx.node()),
293 b"pendingctx": hex(pendingctx.node()),
293 b"pendingctx": hex(pendingctx.node()),
294 b"parents": b' '.join([hex(p) for p in repo.dirstate.parents()]),
294 b"parents": b' '.join([hex(p) for p in repo.dirstate.parents()]),
295 b"nodestoremove": b' '.join([hex(n) for n in nodestoremove]),
295 b"nodestoremove": b' '.join([hex(n) for n in nodestoremove]),
296 b"branchtorestore": branchtorestore,
296 b"branchtorestore": branchtorestore,
297 b"keep": cls._keep if keep else cls._nokeep,
297 b"keep": cls._keep if keep else cls._nokeep,
298 b"activebook": activebook or cls._noactivebook,
298 b"activebook": activebook or cls._noactivebook,
299 }
299 }
300 if interactive:
300 if interactive:
301 info[b'interactive'] = cls._interactive
301 info[b'interactive'] = cls._interactive
302 scmutil.simplekeyvaluefile(repo.vfs, cls._filename).write(
302 scmutil.simplekeyvaluefile(repo.vfs, cls._filename).write(
303 info, firstline=(b"%d" % cls._version)
303 info, firstline=(b"%d" % cls._version)
304 )
304 )
305
305
306 @classmethod
306 @classmethod
307 def clear(cls, repo):
307 def clear(cls, repo):
308 repo.vfs.unlinkpath(cls._filename, ignoremissing=True)
308 repo.vfs.unlinkpath(cls._filename, ignoremissing=True)
309
309
310
310
311 def cleanupoldbackups(repo):
311 def cleanupoldbackups(repo):
312 vfs = vfsmod.vfs(repo.vfs.join(backupdir))
312 vfs = vfsmod.vfs(repo.vfs.join(backupdir))
313 maxbackups = repo.ui.configint(b'shelve', b'maxbackups')
313 maxbackups = repo.ui.configint(b'shelve', b'maxbackups')
314 hgfiles = [f for f in vfs.listdir() if f.endswith(b'.' + patchextension)]
314 hgfiles = [f for f in vfs.listdir() if f.endswith(b'.' + patchextension)]
315 hgfiles = sorted([(vfs.stat(f)[stat.ST_MTIME], f) for f in hgfiles])
315 hgfiles = sorted([(vfs.stat(f)[stat.ST_MTIME], f) for f in hgfiles])
316 if maxbackups > 0 and maxbackups < len(hgfiles):
316 if maxbackups > 0 and maxbackups < len(hgfiles):
317 bordermtime = hgfiles[-maxbackups][0]
317 bordermtime = hgfiles[-maxbackups][0]
318 else:
318 else:
319 bordermtime = None
319 bordermtime = None
320 for mtime, f in hgfiles[: len(hgfiles) - maxbackups]:
320 for mtime, f in hgfiles[: len(hgfiles) - maxbackups]:
321 if mtime == bordermtime:
321 if mtime == bordermtime:
322 # keep it, because timestamp can't decide exact order of backups
322 # keep it, because timestamp can't decide exact order of backups
323 continue
323 continue
324 base = f[: -(1 + len(patchextension))]
324 base = f[: -(1 + len(patchextension))]
325 for ext in shelvefileextensions:
325 for ext in shelvefileextensions:
326 vfs.tryunlink(base + b'.' + ext)
326 vfs.tryunlink(base + b'.' + ext)
327
327
328
328
329 def _backupactivebookmark(repo):
329 def _backupactivebookmark(repo):
330 activebookmark = repo._activebookmark
330 activebookmark = repo._activebookmark
331 if activebookmark:
331 if activebookmark:
332 bookmarks.deactivate(repo)
332 bookmarks.deactivate(repo)
333 return activebookmark
333 return activebookmark
334
334
335
335
336 def _restoreactivebookmark(repo, mark):
336 def _restoreactivebookmark(repo, mark):
337 if mark:
337 if mark:
338 bookmarks.activate(repo, mark)
338 bookmarks.activate(repo, mark)
339
339
340
340
341 def _aborttransaction(repo, tr):
341 def _aborttransaction(repo, tr):
342 """Abort current transaction for shelve/unshelve, but keep dirstate"""
342 """Abort current transaction for shelve/unshelve, but keep dirstate"""
343 dirstatebackupname = b'dirstate.shelve'
343 dirstatebackupname = b'dirstate.shelve'
344 repo.dirstate.savebackup(tr, dirstatebackupname)
344 repo.dirstate.savebackup(tr, dirstatebackupname)
345 tr.abort()
345 tr.abort()
346 repo.dirstate.restorebackup(None, dirstatebackupname)
346 repo.dirstate.restorebackup(None, dirstatebackupname)
347
347
348
348
349 def getshelvename(repo, parent, opts):
349 def getshelvename(repo, parent, opts):
350 """Decide on the name this shelve is going to have"""
350 """Decide on the name this shelve is going to have"""
351
351
352 def gennames():
352 def gennames():
353 yield label
353 yield label
354 for i in itertools.count(1):
354 for i in itertools.count(1):
355 yield b'%s-%02d' % (label, i)
355 yield b'%s-%02d' % (label, i)
356
356
357 name = opts.get(b'name')
357 name = opts.get(b'name')
358 label = repo._activebookmark or parent.branch() or b'default'
358 label = repo._activebookmark or parent.branch() or b'default'
359 # slashes aren't allowed in filenames, therefore we rename it
359 # slashes aren't allowed in filenames, therefore we rename it
360 label = label.replace(b'/', b'_')
360 label = label.replace(b'/', b'_')
361 label = label.replace(b'\\', b'_')
361 label = label.replace(b'\\', b'_')
362 # filenames must not start with '.' as it should not be hidden
362 # filenames must not start with '.' as it should not be hidden
363 if label.startswith(b'.'):
363 if label.startswith(b'.'):
364 label = label.replace(b'.', b'_', 1)
364 label = label.replace(b'.', b'_', 1)
365
365
366 if name:
366 if name:
367 if shelvedfile(repo, name, patchextension).exists():
367 if shelvedfile(repo, name, patchextension).exists():
368 e = _(b"a shelved change named '%s' already exists") % name
368 e = _(b"a shelved change named '%s' already exists") % name
369 raise error.Abort(e)
369 raise error.Abort(e)
370
370
371 # ensure we are not creating a subdirectory or a hidden file
371 # ensure we are not creating a subdirectory or a hidden file
372 if b'/' in name or b'\\' in name:
372 if b'/' in name or b'\\' in name:
373 raise error.Abort(
373 raise error.Abort(
374 _(b'shelved change names can not contain slashes')
374 _(b'shelved change names can not contain slashes')
375 )
375 )
376 if name.startswith(b'.'):
376 if name.startswith(b'.'):
377 raise error.Abort(_(b"shelved change names can not start with '.'"))
377 raise error.Abort(_(b"shelved change names can not start with '.'"))
378
378
379 else:
379 else:
380 for n in gennames():
380 for n in gennames():
381 if not shelvedfile(repo, n, patchextension).exists():
381 if not shelvedfile(repo, n, patchextension).exists():
382 name = n
382 name = n
383 break
383 break
384
384
385 return name
385 return name
386
386
387
387
388 def mutableancestors(ctx):
388 def mutableancestors(ctx):
389 """return all mutable ancestors for ctx (included)
389 """return all mutable ancestors for ctx (included)
390
390
391 Much faster than the revset ancestors(ctx) & draft()"""
391 Much faster than the revset ancestors(ctx) & draft()"""
392 seen = {nullrev}
392 seen = {nullrev}
393 visit = collections.deque()
393 visit = collections.deque()
394 visit.append(ctx)
394 visit.append(ctx)
395 while visit:
395 while visit:
396 ctx = visit.popleft()
396 ctx = visit.popleft()
397 yield ctx.node()
397 yield ctx.node()
398 for parent in ctx.parents():
398 for parent in ctx.parents():
399 rev = parent.rev()
399 rev = parent.rev()
400 if rev not in seen:
400 if rev not in seen:
401 seen.add(rev)
401 seen.add(rev)
402 if parent.mutable():
402 if parent.mutable():
403 visit.append(parent)
403 visit.append(parent)
404
404
405
405
406 def getcommitfunc(extra, interactive, editor=False):
406 def getcommitfunc(extra, interactive, editor=False):
407 def commitfunc(ui, repo, message, match, opts):
407 def commitfunc(ui, repo, message, match, opts):
408 hasmq = util.safehasattr(repo, b'mq')
408 hasmq = util.safehasattr(repo, b'mq')
409 if hasmq:
409 if hasmq:
410 saved, repo.mq.checkapplied = repo.mq.checkapplied, False
410 saved, repo.mq.checkapplied = repo.mq.checkapplied, False
411
411
412 targetphase = phases.internal
412 targetphase = phases.internal
413 if not phases.supportinternal(repo):
413 if not phases.supportinternal(repo):
414 targetphase = phases.secret
414 targetphase = phases.secret
415 overrides = {(b'phases', b'new-commit'): targetphase}
415 overrides = {(b'phases', b'new-commit'): targetphase}
416 try:
416 try:
417 editor_ = False
417 editor_ = False
418 if editor:
418 if editor:
419 editor_ = cmdutil.getcommiteditor(
419 editor_ = cmdutil.getcommiteditor(
420 editform=b'shelve.shelve', **pycompat.strkwargs(opts)
420 editform=b'shelve.shelve', **pycompat.strkwargs(opts)
421 )
421 )
422 with repo.ui.configoverride(overrides):
422 with repo.ui.configoverride(overrides):
423 return repo.commit(
423 return repo.commit(
424 message,
424 message,
425 shelveuser,
425 shelveuser,
426 opts.get(b'date'),
426 opts.get(b'date'),
427 match,
427 match,
428 editor=editor_,
428 editor=editor_,
429 extra=extra,
429 extra=extra,
430 )
430 )
431 finally:
431 finally:
432 if hasmq:
432 if hasmq:
433 repo.mq.checkapplied = saved
433 repo.mq.checkapplied = saved
434
434
435 def interactivecommitfunc(ui, repo, *pats, **opts):
435 def interactivecommitfunc(ui, repo, *pats, **opts):
436 opts = pycompat.byteskwargs(opts)
436 opts = pycompat.byteskwargs(opts)
437 match = scmutil.match(repo[b'.'], pats, {})
437 match = scmutil.match(repo[b'.'], pats, {})
438 message = opts[b'message']
438 message = opts[b'message']
439 return commitfunc(ui, repo, message, match, opts)
439 return commitfunc(ui, repo, message, match, opts)
440
440
441 return interactivecommitfunc if interactive else commitfunc
441 return interactivecommitfunc if interactive else commitfunc
442
442
443
443
444 def _nothingtoshelvemessaging(ui, repo, pats, opts):
444 def _nothingtoshelvemessaging(ui, repo, pats, opts):
445 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
445 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
446 if stat.deleted:
446 if stat.deleted:
447 ui.status(
447 ui.status(
448 _(b"nothing changed (%d missing files, see 'hg status')\n")
448 _(b"nothing changed (%d missing files, see 'hg status')\n")
449 % len(stat.deleted)
449 % len(stat.deleted)
450 )
450 )
451 else:
451 else:
452 ui.status(_(b"nothing changed\n"))
452 ui.status(_(b"nothing changed\n"))
453
453
454
454
455 def _shelvecreatedcommit(repo, node, name, match):
455 def _shelvecreatedcommit(repo, node, name, match):
456 info = {b'node': hex(node)}
456 info = {b'node': hex(node)}
457 shelvedfile(repo, name, b'shelve').writeinfo(info)
457 shelvedfile(repo, name, b'shelve').writeinfo(info)
458 bases = list(mutableancestors(repo[node]))
458 bases = list(mutableancestors(repo[node]))
459 shelvedfile(repo, name, b'hg').writebundle(bases, node)
459 shelvedfile(repo, name, b'hg').writebundle(bases, node)
460 with shelvedfile(repo, name, patchextension).opener(b'wb') as fp:
460 with shelvedfile(repo, name, patchextension).opener(b'wb') as fp:
461 cmdutil.exportfile(
461 cmdutil.exportfile(
462 repo, [node], fp, opts=mdiff.diffopts(git=True), match=match
462 repo, [node], fp, opts=mdiff.diffopts(git=True), match=match
463 )
463 )
464
464
465
465
466 def _includeunknownfiles(repo, pats, opts, extra):
466 def _includeunknownfiles(repo, pats, opts, extra):
467 s = repo.status(match=scmutil.match(repo[None], pats, opts), unknown=True)
467 s = repo.status(match=scmutil.match(repo[None], pats, opts), unknown=True)
468 if s.unknown:
468 if s.unknown:
469 extra[b'shelve_unknown'] = b'\0'.join(s.unknown)
469 extra[b'shelve_unknown'] = b'\0'.join(s.unknown)
470 repo[None].add(s.unknown)
470 repo[None].add(s.unknown)
471
471
472
472
473 def _finishshelve(repo, tr):
473 def _finishshelve(repo, tr):
474 if phases.supportinternal(repo):
474 if phases.supportinternal(repo):
475 tr.close()
475 tr.close()
476 else:
476 else:
477 _aborttransaction(repo, tr)
477 _aborttransaction(repo, tr)
478
478
479
479
480 def createcmd(ui, repo, pats, opts):
480 def createcmd(ui, repo, pats, opts):
481 """subcommand that creates a new shelve"""
481 """subcommand that creates a new shelve"""
482 with repo.wlock():
482 with repo.wlock():
483 cmdutil.checkunfinished(repo)
483 cmdutil.checkunfinished(repo)
484 return _docreatecmd(ui, repo, pats, opts)
484 return _docreatecmd(ui, repo, pats, opts)
485
485
486
486
487 def _docreatecmd(ui, repo, pats, opts):
487 def _docreatecmd(ui, repo, pats, opts):
488 wctx = repo[None]
488 wctx = repo[None]
489 parents = wctx.parents()
489 parents = wctx.parents()
490 parent = parents[0]
490 parent = parents[0]
491 origbranch = wctx.branch()
491 origbranch = wctx.branch()
492
492
493 if parent.node() != nullid:
493 if parent.node() != nullid:
494 desc = b"changes to: %s" % parent.description().split(b'\n', 1)[0]
494 desc = b"changes to: %s" % parent.description().split(b'\n', 1)[0]
495 else:
495 else:
496 desc = b'(changes in empty repository)'
496 desc = b'(changes in empty repository)'
497
497
498 if not opts.get(b'message'):
498 if not opts.get(b'message'):
499 opts[b'message'] = desc
499 opts[b'message'] = desc
500
500
501 lock = tr = activebookmark = None
501 lock = tr = activebookmark = None
502 try:
502 try:
503 lock = repo.lock()
503 lock = repo.lock()
504
504
505 # use an uncommitted transaction to generate the bundle to avoid
505 # use an uncommitted transaction to generate the bundle to avoid
506 # pull races. ensure we don't print the abort message to stderr.
506 # pull races. ensure we don't print the abort message to stderr.
507 tr = repo.transaction(b'shelve', report=lambda x: None)
507 tr = repo.transaction(b'shelve', report=lambda x: None)
508
508
509 interactive = opts.get(b'interactive', False)
509 interactive = opts.get(b'interactive', False)
510 includeunknown = opts.get(b'unknown', False) and not opts.get(
510 includeunknown = opts.get(b'unknown', False) and not opts.get(
511 b'addremove', False
511 b'addremove', False
512 )
512 )
513
513
514 name = getshelvename(repo, parent, opts)
514 name = getshelvename(repo, parent, opts)
515 activebookmark = _backupactivebookmark(repo)
515 activebookmark = _backupactivebookmark(repo)
516 extra = {b'internal': b'shelve'}
516 extra = {b'internal': b'shelve'}
517 if includeunknown:
517 if includeunknown:
518 _includeunknownfiles(repo, pats, opts, extra)
518 _includeunknownfiles(repo, pats, opts, extra)
519
519
520 if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts):
520 if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts):
521 # In non-bare shelve we don't store newly created branch
521 # In non-bare shelve we don't store newly created branch
522 # at bundled commit
522 # at bundled commit
523 repo.dirstate.setbranch(repo[b'.'].branch())
523 repo.dirstate.setbranch(repo[b'.'].branch())
524
524
525 commitfunc = getcommitfunc(extra, interactive, editor=True)
525 commitfunc = getcommitfunc(extra, interactive, editor=True)
526 if not interactive:
526 if not interactive:
527 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
527 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
528 else:
528 else:
529 node = cmdutil.dorecord(
529 node = cmdutil.dorecord(
530 ui,
530 ui,
531 repo,
531 repo,
532 commitfunc,
532 commitfunc,
533 None,
533 None,
534 False,
534 False,
535 cmdutil.recordfilter,
535 cmdutil.recordfilter,
536 *pats,
536 *pats,
537 **pycompat.strkwargs(opts)
537 **pycompat.strkwargs(opts)
538 )
538 )
539 if not node:
539 if not node:
540 _nothingtoshelvemessaging(ui, repo, pats, opts)
540 _nothingtoshelvemessaging(ui, repo, pats, opts)
541 return 1
541 return 1
542
542
543 # Create a matcher so that prefetch doesn't attempt to fetch
543 # Create a matcher so that prefetch doesn't attempt to fetch
544 # the entire repository pointlessly, and as an optimisation
544 # the entire repository pointlessly, and as an optimisation
545 # for movedirstate, if needed.
545 # for movedirstate, if needed.
546 match = scmutil.matchfiles(repo, repo[node].files())
546 match = scmutil.matchfiles(repo, repo[node].files())
547 _shelvecreatedcommit(repo, node, name, match)
547 _shelvecreatedcommit(repo, node, name, match)
548
548
549 ui.status(_(b'shelved as %s\n') % name)
549 ui.status(_(b'shelved as %s\n') % name)
550 if opts[b'keep']:
550 if opts[b'keep']:
551 with repo.dirstate.parentchange():
551 with repo.dirstate.parentchange():
552 scmutil.movedirstate(repo, parent, match)
552 scmutil.movedirstate(repo, parent, match)
553 else:
553 else:
554 hg.update(repo, parent.node())
554 hg.update(repo, parent.node())
555 ms = mergestatemod.mergestate.read(repo)
555 ms = mergestatemod.mergestate.read(repo)
556 if not ms.unresolvedcount():
556 if not ms.unresolvedcount():
557 ms.reset()
557 ms.reset()
558
558
559 if origbranch != repo[b'.'].branch() and not _isbareshelve(pats, opts):
559 if origbranch != repo[b'.'].branch() and not _isbareshelve(pats, opts):
560 repo.dirstate.setbranch(origbranch)
560 repo.dirstate.setbranch(origbranch)
561
561
562 _finishshelve(repo, tr)
562 _finishshelve(repo, tr)
563 finally:
563 finally:
564 _restoreactivebookmark(repo, activebookmark)
564 _restoreactivebookmark(repo, activebookmark)
565 lockmod.release(tr, lock)
565 lockmod.release(tr, lock)
566
566
567
567
568 def _isbareshelve(pats, opts):
568 def _isbareshelve(pats, opts):
569 return (
569 return (
570 not pats
570 not pats
571 and not opts.get(b'interactive', False)
571 and not opts.get(b'interactive', False)
572 and not opts.get(b'include', False)
572 and not opts.get(b'include', False)
573 and not opts.get(b'exclude', False)
573 and not opts.get(b'exclude', False)
574 )
574 )
575
575
576
576
577 def _iswctxonnewbranch(repo):
577 def _iswctxonnewbranch(repo):
578 return repo[None].branch() != repo[b'.'].branch()
578 return repo[None].branch() != repo[b'.'].branch()
579
579
580
580
581 def cleanupcmd(ui, repo):
581 def cleanupcmd(ui, repo):
582 """subcommand that deletes all shelves"""
582 """subcommand that deletes all shelves"""
583
583
584 with repo.wlock():
584 with repo.wlock():
585 for (name, _type) in repo.vfs.readdir(shelvedir):
585 for (name, _type) in repo.vfs.readdir(shelvedir):
586 suffix = name.rsplit(b'.', 1)[-1]
586 suffix = name.rsplit(b'.', 1)[-1]
587 if suffix in shelvefileextensions:
587 if suffix in shelvefileextensions:
588 shelvedfile(repo, name).movetobackup()
588 shelvedfile(repo, name).movetobackup()
589 cleanupoldbackups(repo)
589 cleanupoldbackups(repo)
590
590
591
591
592 def deletecmd(ui, repo, pats):
592 def deletecmd(ui, repo, pats):
593 """subcommand that deletes a specific shelve"""
593 """subcommand that deletes a specific shelve"""
594 if not pats:
594 if not pats:
595 raise error.Abort(_(b'no shelved changes specified!'))
595 raise error.InputError(_(b'no shelved changes specified!'))
596 with repo.wlock():
596 with repo.wlock():
597 for name in pats:
597 for name in pats:
598 if not shelvedfile(repo, name, patchextension).exists():
598 if not shelvedfile(repo, name, patchextension).exists():
599 raise error.Abort(_(b"shelved change '%s' not found") % name)
599 raise error.InputError(
600 _(b"shelved change '%s' not found") % name
601 )
600 for suffix in shelvefileextensions:
602 for suffix in shelvefileextensions:
601 shfile = shelvedfile(repo, name, suffix)
603 shfile = shelvedfile(repo, name, suffix)
602 if shfile.exists():
604 if shfile.exists():
603 shfile.movetobackup()
605 shfile.movetobackup()
604 cleanupoldbackups(repo)
606 cleanupoldbackups(repo)
605
607
606
608
607 def listshelves(repo):
609 def listshelves(repo):
608 """return all shelves in repo as list of (time, filename)"""
610 """return all shelves in repo as list of (time, filename)"""
609 try:
611 try:
610 names = repo.vfs.readdir(shelvedir)
612 names = repo.vfs.readdir(shelvedir)
611 except OSError as err:
613 except OSError as err:
612 if err.errno != errno.ENOENT:
614 if err.errno != errno.ENOENT:
613 raise
615 raise
614 return []
616 return []
615 info = []
617 info = []
616 for (name, _type) in names:
618 for (name, _type) in names:
617 pfx, sfx = name.rsplit(b'.', 1)
619 pfx, sfx = name.rsplit(b'.', 1)
618 if not pfx or sfx != patchextension:
620 if not pfx or sfx != patchextension:
619 continue
621 continue
620 st = shelvedfile(repo, name).stat()
622 st = shelvedfile(repo, name).stat()
621 info.append((st[stat.ST_MTIME], shelvedfile(repo, pfx).filename()))
623 info.append((st[stat.ST_MTIME], shelvedfile(repo, pfx).filename()))
622 return sorted(info, reverse=True)
624 return sorted(info, reverse=True)
623
625
624
626
625 def listcmd(ui, repo, pats, opts):
627 def listcmd(ui, repo, pats, opts):
626 """subcommand that displays the list of shelves"""
628 """subcommand that displays the list of shelves"""
627 pats = set(pats)
629 pats = set(pats)
628 width = 80
630 width = 80
629 if not ui.plain():
631 if not ui.plain():
630 width = ui.termwidth()
632 width = ui.termwidth()
631 namelabel = b'shelve.newest'
633 namelabel = b'shelve.newest'
632 ui.pager(b'shelve')
634 ui.pager(b'shelve')
633 for mtime, name in listshelves(repo):
635 for mtime, name in listshelves(repo):
634 sname = util.split(name)[1]
636 sname = util.split(name)[1]
635 if pats and sname not in pats:
637 if pats and sname not in pats:
636 continue
638 continue
637 ui.write(sname, label=namelabel)
639 ui.write(sname, label=namelabel)
638 namelabel = b'shelve.name'
640 namelabel = b'shelve.name'
639 if ui.quiet:
641 if ui.quiet:
640 ui.write(b'\n')
642 ui.write(b'\n')
641 continue
643 continue
642 ui.write(b' ' * (16 - len(sname)))
644 ui.write(b' ' * (16 - len(sname)))
643 used = 16
645 used = 16
644 date = dateutil.makedate(mtime)
646 date = dateutil.makedate(mtime)
645 age = b'(%s)' % templatefilters.age(date, abbrev=True)
647 age = b'(%s)' % templatefilters.age(date, abbrev=True)
646 ui.write(age, label=b'shelve.age')
648 ui.write(age, label=b'shelve.age')
647 ui.write(b' ' * (12 - len(age)))
649 ui.write(b' ' * (12 - len(age)))
648 used += 12
650 used += 12
649 with open(name + b'.' + patchextension, b'rb') as fp:
651 with open(name + b'.' + patchextension, b'rb') as fp:
650 while True:
652 while True:
651 line = fp.readline()
653 line = fp.readline()
652 if not line:
654 if not line:
653 break
655 break
654 if not line.startswith(b'#'):
656 if not line.startswith(b'#'):
655 desc = line.rstrip()
657 desc = line.rstrip()
656 if ui.formatted():
658 if ui.formatted():
657 desc = stringutil.ellipsis(desc, width - used)
659 desc = stringutil.ellipsis(desc, width - used)
658 ui.write(desc)
660 ui.write(desc)
659 break
661 break
660 ui.write(b'\n')
662 ui.write(b'\n')
661 if not (opts[b'patch'] or opts[b'stat']):
663 if not (opts[b'patch'] or opts[b'stat']):
662 continue
664 continue
663 difflines = fp.readlines()
665 difflines = fp.readlines()
664 if opts[b'patch']:
666 if opts[b'patch']:
665 for chunk, label in patch.difflabel(iter, difflines):
667 for chunk, label in patch.difflabel(iter, difflines):
666 ui.write(chunk, label=label)
668 ui.write(chunk, label=label)
667 if opts[b'stat']:
669 if opts[b'stat']:
668 for chunk, label in patch.diffstatui(difflines, width=width):
670 for chunk, label in patch.diffstatui(difflines, width=width):
669 ui.write(chunk, label=label)
671 ui.write(chunk, label=label)
670
672
671
673
672 def patchcmds(ui, repo, pats, opts):
674 def patchcmds(ui, repo, pats, opts):
673 """subcommand that displays shelves"""
675 """subcommand that displays shelves"""
674 if len(pats) == 0:
676 if len(pats) == 0:
675 shelves = listshelves(repo)
677 shelves = listshelves(repo)
676 if not shelves:
678 if not shelves:
677 raise error.Abort(_(b"there are no shelves to show"))
679 raise error.Abort(_(b"there are no shelves to show"))
678 mtime, name = shelves[0]
680 mtime, name = shelves[0]
679 sname = util.split(name)[1]
681 sname = util.split(name)[1]
680 pats = [sname]
682 pats = [sname]
681
683
682 for shelfname in pats:
684 for shelfname in pats:
683 if not shelvedfile(repo, shelfname, patchextension).exists():
685 if not shelvedfile(repo, shelfname, patchextension).exists():
684 raise error.Abort(_(b"cannot find shelf %s") % shelfname)
686 raise error.Abort(_(b"cannot find shelf %s") % shelfname)
685
687
686 listcmd(ui, repo, pats, opts)
688 listcmd(ui, repo, pats, opts)
687
689
688
690
689 def checkparents(repo, state):
691 def checkparents(repo, state):
690 """check parent while resuming an unshelve"""
692 """check parent while resuming an unshelve"""
691 if state.parents != repo.dirstate.parents():
693 if state.parents != repo.dirstate.parents():
692 raise error.Abort(
694 raise error.Abort(
693 _(b'working directory parents do not match unshelve state')
695 _(b'working directory parents do not match unshelve state')
694 )
696 )
695
697
696
698
697 def _loadshelvedstate(ui, repo, opts):
699 def _loadshelvedstate(ui, repo, opts):
698 try:
700 try:
699 state = shelvedstate.load(repo)
701 state = shelvedstate.load(repo)
700 if opts.get(b'keep') is None:
702 if opts.get(b'keep') is None:
701 opts[b'keep'] = state.keep
703 opts[b'keep'] = state.keep
702 except IOError as err:
704 except IOError as err:
703 if err.errno != errno.ENOENT:
705 if err.errno != errno.ENOENT:
704 raise
706 raise
705 cmdutil.wrongtooltocontinue(repo, _(b'unshelve'))
707 cmdutil.wrongtooltocontinue(repo, _(b'unshelve'))
706 except error.CorruptedState as err:
708 except error.CorruptedState as err:
707 ui.debug(pycompat.bytestr(err) + b'\n')
709 ui.debug(pycompat.bytestr(err) + b'\n')
708 if opts.get(b'continue'):
710 if opts.get(b'continue'):
709 msg = _(b'corrupted shelved state file')
711 msg = _(b'corrupted shelved state file')
710 hint = _(
712 hint = _(
711 b'please run hg unshelve --abort to abort unshelve '
713 b'please run hg unshelve --abort to abort unshelve '
712 b'operation'
714 b'operation'
713 )
715 )
714 raise error.Abort(msg, hint=hint)
716 raise error.Abort(msg, hint=hint)
715 elif opts.get(b'abort'):
717 elif opts.get(b'abort'):
716 shelvedstate.clear(repo)
718 shelvedstate.clear(repo)
717 raise error.Abort(
719 raise error.Abort(
718 _(
720 _(
719 b'could not read shelved state file, your '
721 b'could not read shelved state file, your '
720 b'working copy may be in an unexpected state\n'
722 b'working copy may be in an unexpected state\n'
721 b'please update to some commit\n'
723 b'please update to some commit\n'
722 )
724 )
723 )
725 )
724 return state
726 return state
725
727
726
728
727 def unshelveabort(ui, repo, state):
729 def unshelveabort(ui, repo, state):
728 """subcommand that abort an in-progress unshelve"""
730 """subcommand that abort an in-progress unshelve"""
729 with repo.lock():
731 with repo.lock():
730 try:
732 try:
731 checkparents(repo, state)
733 checkparents(repo, state)
732
734
733 merge.clean_update(state.pendingctx)
735 merge.clean_update(state.pendingctx)
734 if state.activebookmark and state.activebookmark in repo._bookmarks:
736 if state.activebookmark and state.activebookmark in repo._bookmarks:
735 bookmarks.activate(repo, state.activebookmark)
737 bookmarks.activate(repo, state.activebookmark)
736 mergefiles(ui, repo, state.wctx, state.pendingctx)
738 mergefiles(ui, repo, state.wctx, state.pendingctx)
737 if not phases.supportinternal(repo):
739 if not phases.supportinternal(repo):
738 repair.strip(
740 repair.strip(
739 ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
741 ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
740 )
742 )
741 finally:
743 finally:
742 shelvedstate.clear(repo)
744 shelvedstate.clear(repo)
743 ui.warn(_(b"unshelve of '%s' aborted\n") % state.name)
745 ui.warn(_(b"unshelve of '%s' aborted\n") % state.name)
744
746
745
747
746 def hgabortunshelve(ui, repo):
748 def hgabortunshelve(ui, repo):
747 """logic to abort unshelve using 'hg abort"""
749 """logic to abort unshelve using 'hg abort"""
748 with repo.wlock():
750 with repo.wlock():
749 state = _loadshelvedstate(ui, repo, {b'abort': True})
751 state = _loadshelvedstate(ui, repo, {b'abort': True})
750 return unshelveabort(ui, repo, state)
752 return unshelveabort(ui, repo, state)
751
753
752
754
753 def mergefiles(ui, repo, wctx, shelvectx):
755 def mergefiles(ui, repo, wctx, shelvectx):
754 """updates to wctx and merges the changes from shelvectx into the
756 """updates to wctx and merges the changes from shelvectx into the
755 dirstate."""
757 dirstate."""
756 with ui.configoverride({(b'ui', b'quiet'): True}):
758 with ui.configoverride({(b'ui', b'quiet'): True}):
757 hg.update(repo, wctx.node())
759 hg.update(repo, wctx.node())
758 ui.pushbuffer(True)
760 ui.pushbuffer(True)
759 cmdutil.revert(ui, repo, shelvectx)
761 cmdutil.revert(ui, repo, shelvectx)
760 ui.popbuffer()
762 ui.popbuffer()
761
763
762
764
763 def restorebranch(ui, repo, branchtorestore):
765 def restorebranch(ui, repo, branchtorestore):
764 if branchtorestore and branchtorestore != repo.dirstate.branch():
766 if branchtorestore and branchtorestore != repo.dirstate.branch():
765 repo.dirstate.setbranch(branchtorestore)
767 repo.dirstate.setbranch(branchtorestore)
766 ui.status(
768 ui.status(
767 _(b'marked working directory as branch %s\n') % branchtorestore
769 _(b'marked working directory as branch %s\n') % branchtorestore
768 )
770 )
769
771
770
772
771 def unshelvecleanup(ui, repo, name, opts):
773 def unshelvecleanup(ui, repo, name, opts):
772 """remove related files after an unshelve"""
774 """remove related files after an unshelve"""
773 if not opts.get(b'keep'):
775 if not opts.get(b'keep'):
774 for filetype in shelvefileextensions:
776 for filetype in shelvefileextensions:
775 shfile = shelvedfile(repo, name, filetype)
777 shfile = shelvedfile(repo, name, filetype)
776 if shfile.exists():
778 if shfile.exists():
777 shfile.movetobackup()
779 shfile.movetobackup()
778 cleanupoldbackups(repo)
780 cleanupoldbackups(repo)
779
781
780
782
781 def unshelvecontinue(ui, repo, state, opts):
783 def unshelvecontinue(ui, repo, state, opts):
782 """subcommand to continue an in-progress unshelve"""
784 """subcommand to continue an in-progress unshelve"""
783 # We're finishing off a merge. First parent is our original
785 # We're finishing off a merge. First parent is our original
784 # parent, second is the temporary "fake" commit we're unshelving.
786 # parent, second is the temporary "fake" commit we're unshelving.
785 interactive = state.interactive
787 interactive = state.interactive
786 basename = state.name
788 basename = state.name
787 with repo.lock():
789 with repo.lock():
788 checkparents(repo, state)
790 checkparents(repo, state)
789 ms = mergestatemod.mergestate.read(repo)
791 ms = mergestatemod.mergestate.read(repo)
790 if list(ms.unresolved()):
792 if list(ms.unresolved()):
791 raise error.Abort(
793 raise error.Abort(
792 _(b"unresolved conflicts, can't continue"),
794 _(b"unresolved conflicts, can't continue"),
793 hint=_(b"see 'hg resolve', then 'hg unshelve --continue'"),
795 hint=_(b"see 'hg resolve', then 'hg unshelve --continue'"),
794 )
796 )
795
797
796 shelvectx = repo[state.parents[1]]
798 shelvectx = repo[state.parents[1]]
797 pendingctx = state.pendingctx
799 pendingctx = state.pendingctx
798
800
799 with repo.dirstate.parentchange():
801 with repo.dirstate.parentchange():
800 repo.setparents(state.pendingctx.node(), nullid)
802 repo.setparents(state.pendingctx.node(), nullid)
801 repo.dirstate.write(repo.currenttransaction())
803 repo.dirstate.write(repo.currenttransaction())
802
804
803 targetphase = phases.internal
805 targetphase = phases.internal
804 if not phases.supportinternal(repo):
806 if not phases.supportinternal(repo):
805 targetphase = phases.secret
807 targetphase = phases.secret
806 overrides = {(b'phases', b'new-commit'): targetphase}
808 overrides = {(b'phases', b'new-commit'): targetphase}
807 with repo.ui.configoverride(overrides, b'unshelve'):
809 with repo.ui.configoverride(overrides, b'unshelve'):
808 with repo.dirstate.parentchange():
810 with repo.dirstate.parentchange():
809 repo.setparents(state.parents[0], nullid)
811 repo.setparents(state.parents[0], nullid)
810 newnode, ispartialunshelve = _createunshelvectx(
812 newnode, ispartialunshelve = _createunshelvectx(
811 ui, repo, shelvectx, basename, interactive, opts
813 ui, repo, shelvectx, basename, interactive, opts
812 )
814 )
813
815
814 if newnode is None:
816 if newnode is None:
815 shelvectx = state.pendingctx
817 shelvectx = state.pendingctx
816 msg = _(
818 msg = _(
817 b'note: unshelved changes already existed '
819 b'note: unshelved changes already existed '
818 b'in the working copy\n'
820 b'in the working copy\n'
819 )
821 )
820 ui.status(msg)
822 ui.status(msg)
821 else:
823 else:
822 # only strip the shelvectx if we produced one
824 # only strip the shelvectx if we produced one
823 state.nodestoremove.append(newnode)
825 state.nodestoremove.append(newnode)
824 shelvectx = repo[newnode]
826 shelvectx = repo[newnode]
825
827
826 merge.update(pendingctx)
828 merge.update(pendingctx)
827 mergefiles(ui, repo, state.wctx, shelvectx)
829 mergefiles(ui, repo, state.wctx, shelvectx)
828 restorebranch(ui, repo, state.branchtorestore)
830 restorebranch(ui, repo, state.branchtorestore)
829
831
830 if not phases.supportinternal(repo):
832 if not phases.supportinternal(repo):
831 repair.strip(
833 repair.strip(
832 ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
834 ui, repo, state.nodestoremove, backup=False, topic=b'shelve'
833 )
835 )
834 shelvedstate.clear(repo)
836 shelvedstate.clear(repo)
835 if not ispartialunshelve:
837 if not ispartialunshelve:
836 unshelvecleanup(ui, repo, state.name, opts)
838 unshelvecleanup(ui, repo, state.name, opts)
837 _restoreactivebookmark(repo, state.activebookmark)
839 _restoreactivebookmark(repo, state.activebookmark)
838 ui.status(_(b"unshelve of '%s' complete\n") % state.name)
840 ui.status(_(b"unshelve of '%s' complete\n") % state.name)
839
841
840
842
841 def hgcontinueunshelve(ui, repo):
843 def hgcontinueunshelve(ui, repo):
842 """logic to resume unshelve using 'hg continue'"""
844 """logic to resume unshelve using 'hg continue'"""
843 with repo.wlock():
845 with repo.wlock():
844 state = _loadshelvedstate(ui, repo, {b'continue': True})
846 state = _loadshelvedstate(ui, repo, {b'continue': True})
845 return unshelvecontinue(ui, repo, state, {b'keep': state.keep})
847 return unshelvecontinue(ui, repo, state, {b'keep': state.keep})
846
848
847
849
848 def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
850 def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
849 """Temporarily commit working copy changes before moving unshelve commit"""
851 """Temporarily commit working copy changes before moving unshelve commit"""
850 # Store pending changes in a commit and remember added in case a shelve
852 # Store pending changes in a commit and remember added in case a shelve
851 # contains unknown files that are part of the pending change
853 # contains unknown files that are part of the pending change
852 s = repo.status()
854 s = repo.status()
853 addedbefore = frozenset(s.added)
855 addedbefore = frozenset(s.added)
854 if not (s.modified or s.added or s.removed):
856 if not (s.modified or s.added or s.removed):
855 return tmpwctx, addedbefore
857 return tmpwctx, addedbefore
856 ui.status(
858 ui.status(
857 _(
859 _(
858 b"temporarily committing pending changes "
860 b"temporarily committing pending changes "
859 b"(restore with 'hg unshelve --abort')\n"
861 b"(restore with 'hg unshelve --abort')\n"
860 )
862 )
861 )
863 )
862 extra = {b'internal': b'shelve'}
864 extra = {b'internal': b'shelve'}
863 commitfunc = getcommitfunc(extra=extra, interactive=False, editor=False)
865 commitfunc = getcommitfunc(extra=extra, interactive=False, editor=False)
864 tempopts = {}
866 tempopts = {}
865 tempopts[b'message'] = b"pending changes temporary commit"
867 tempopts[b'message'] = b"pending changes temporary commit"
866 tempopts[b'date'] = opts.get(b'date')
868 tempopts[b'date'] = opts.get(b'date')
867 with ui.configoverride({(b'ui', b'quiet'): True}):
869 with ui.configoverride({(b'ui', b'quiet'): True}):
868 node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
870 node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
869 tmpwctx = repo[node]
871 tmpwctx = repo[node]
870 return tmpwctx, addedbefore
872 return tmpwctx, addedbefore
871
873
872
874
873 def _unshelverestorecommit(ui, repo, tr, basename):
875 def _unshelverestorecommit(ui, repo, tr, basename):
874 """Recreate commit in the repository during the unshelve"""
876 """Recreate commit in the repository during the unshelve"""
875 repo = repo.unfiltered()
877 repo = repo.unfiltered()
876 node = None
878 node = None
877 if shelvedfile(repo, basename, b'shelve').exists():
879 if shelvedfile(repo, basename, b'shelve').exists():
878 node = shelvedfile(repo, basename, b'shelve').readinfo()[b'node']
880 node = shelvedfile(repo, basename, b'shelve').readinfo()[b'node']
879 if node is None or node not in repo:
881 if node is None or node not in repo:
880 with ui.configoverride({(b'ui', b'quiet'): True}):
882 with ui.configoverride({(b'ui', b'quiet'): True}):
881 shelvectx = shelvedfile(repo, basename, b'hg').applybundle(tr)
883 shelvectx = shelvedfile(repo, basename, b'hg').applybundle(tr)
882 # We might not strip the unbundled changeset, so we should keep track of
884 # We might not strip the unbundled changeset, so we should keep track of
883 # the unshelve node in case we need to reuse it (eg: unshelve --keep)
885 # the unshelve node in case we need to reuse it (eg: unshelve --keep)
884 if node is None:
886 if node is None:
885 info = {b'node': hex(shelvectx.node())}
887 info = {b'node': hex(shelvectx.node())}
886 shelvedfile(repo, basename, b'shelve').writeinfo(info)
888 shelvedfile(repo, basename, b'shelve').writeinfo(info)
887 else:
889 else:
888 shelvectx = repo[node]
890 shelvectx = repo[node]
889
891
890 return repo, shelvectx
892 return repo, shelvectx
891
893
892
894
893 def _createunshelvectx(ui, repo, shelvectx, basename, interactive, opts):
895 def _createunshelvectx(ui, repo, shelvectx, basename, interactive, opts):
894 """Handles the creation of unshelve commit and updates the shelve if it
896 """Handles the creation of unshelve commit and updates the shelve if it
895 was partially unshelved.
897 was partially unshelved.
896
898
897 If interactive is:
899 If interactive is:
898
900
899 * False: Commits all the changes in the working directory.
901 * False: Commits all the changes in the working directory.
900 * True: Prompts the user to select changes to unshelve and commit them.
902 * True: Prompts the user to select changes to unshelve and commit them.
901 Update the shelve with remaining changes.
903 Update the shelve with remaining changes.
902
904
903 Returns the node of the new commit formed and a bool indicating whether
905 Returns the node of the new commit formed and a bool indicating whether
904 the shelve was partially unshelved.Creates a commit ctx to unshelve
906 the shelve was partially unshelved.Creates a commit ctx to unshelve
905 interactively or non-interactively.
907 interactively or non-interactively.
906
908
907 The user might want to unshelve certain changes only from the stored
909 The user might want to unshelve certain changes only from the stored
908 shelve in interactive. So, we would create two commits. One with requested
910 shelve in interactive. So, we would create two commits. One with requested
909 changes to unshelve at that time and the latter is shelved for future.
911 changes to unshelve at that time and the latter is shelved for future.
910
912
911 Here, we return both the newnode which is created interactively and a
913 Here, we return both the newnode which is created interactively and a
912 bool to know whether the shelve is partly done or completely done.
914 bool to know whether the shelve is partly done or completely done.
913 """
915 """
914 opts[b'message'] = shelvectx.description()
916 opts[b'message'] = shelvectx.description()
915 opts[b'interactive-unshelve'] = True
917 opts[b'interactive-unshelve'] = True
916 pats = []
918 pats = []
917 if not interactive:
919 if not interactive:
918 newnode = repo.commit(
920 newnode = repo.commit(
919 text=shelvectx.description(),
921 text=shelvectx.description(),
920 extra=shelvectx.extra(),
922 extra=shelvectx.extra(),
921 user=shelvectx.user(),
923 user=shelvectx.user(),
922 date=shelvectx.date(),
924 date=shelvectx.date(),
923 )
925 )
924 return newnode, False
926 return newnode, False
925
927
926 commitfunc = getcommitfunc(shelvectx.extra(), interactive=True, editor=True)
928 commitfunc = getcommitfunc(shelvectx.extra(), interactive=True, editor=True)
927 newnode = cmdutil.dorecord(
929 newnode = cmdutil.dorecord(
928 ui,
930 ui,
929 repo,
931 repo,
930 commitfunc,
932 commitfunc,
931 None,
933 None,
932 False,
934 False,
933 cmdutil.recordfilter,
935 cmdutil.recordfilter,
934 *pats,
936 *pats,
935 **pycompat.strkwargs(opts)
937 **pycompat.strkwargs(opts)
936 )
938 )
937 snode = repo.commit(
939 snode = repo.commit(
938 text=shelvectx.description(),
940 text=shelvectx.description(),
939 extra=shelvectx.extra(),
941 extra=shelvectx.extra(),
940 user=shelvectx.user(),
942 user=shelvectx.user(),
941 )
943 )
942 if snode:
944 if snode:
943 m = scmutil.matchfiles(repo, repo[snode].files())
945 m = scmutil.matchfiles(repo, repo[snode].files())
944 _shelvecreatedcommit(repo, snode, basename, m)
946 _shelvecreatedcommit(repo, snode, basename, m)
945
947
946 return newnode, bool(snode)
948 return newnode, bool(snode)
947
949
948
950
949 def _rebaserestoredcommit(
951 def _rebaserestoredcommit(
950 ui,
952 ui,
951 repo,
953 repo,
952 opts,
954 opts,
953 tr,
955 tr,
954 oldtiprev,
956 oldtiprev,
955 basename,
957 basename,
956 pctx,
958 pctx,
957 tmpwctx,
959 tmpwctx,
958 shelvectx,
960 shelvectx,
959 branchtorestore,
961 branchtorestore,
960 activebookmark,
962 activebookmark,
961 ):
963 ):
962 """Rebase restored commit from its original location to a destination"""
964 """Rebase restored commit from its original location to a destination"""
963 # If the shelve is not immediately on top of the commit
965 # If the shelve is not immediately on top of the commit
964 # we'll be merging with, rebase it to be on top.
966 # we'll be merging with, rebase it to be on top.
965 interactive = opts.get(b'interactive')
967 interactive = opts.get(b'interactive')
966 if tmpwctx.node() == shelvectx.p1().node() and not interactive:
968 if tmpwctx.node() == shelvectx.p1().node() and not interactive:
967 # We won't skip on interactive mode because, the user might want to
969 # We won't skip on interactive mode because, the user might want to
968 # unshelve certain changes only.
970 # unshelve certain changes only.
969 return shelvectx, False
971 return shelvectx, False
970
972
971 overrides = {
973 overrides = {
972 (b'ui', b'forcemerge'): opts.get(b'tool', b''),
974 (b'ui', b'forcemerge'): opts.get(b'tool', b''),
973 (b'phases', b'new-commit'): phases.secret,
975 (b'phases', b'new-commit'): phases.secret,
974 }
976 }
975 with repo.ui.configoverride(overrides, b'unshelve'):
977 with repo.ui.configoverride(overrides, b'unshelve'):
976 ui.status(_(b'rebasing shelved changes\n'))
978 ui.status(_(b'rebasing shelved changes\n'))
977 stats = merge.graft(
979 stats = merge.graft(
978 repo,
980 repo,
979 shelvectx,
981 shelvectx,
980 labels=[b'working-copy', b'shelve'],
982 labels=[b'working-copy', b'shelve'],
981 keepconflictparent=True,
983 keepconflictparent=True,
982 )
984 )
983 if stats.unresolvedcount:
985 if stats.unresolvedcount:
984 tr.close()
986 tr.close()
985
987
986 nodestoremove = [
988 nodestoremove = [
987 repo.changelog.node(rev)
989 repo.changelog.node(rev)
988 for rev in pycompat.xrange(oldtiprev, len(repo))
990 for rev in pycompat.xrange(oldtiprev, len(repo))
989 ]
991 ]
990 shelvedstate.save(
992 shelvedstate.save(
991 repo,
993 repo,
992 basename,
994 basename,
993 pctx,
995 pctx,
994 tmpwctx,
996 tmpwctx,
995 nodestoremove,
997 nodestoremove,
996 branchtorestore,
998 branchtorestore,
997 opts.get(b'keep'),
999 opts.get(b'keep'),
998 activebookmark,
1000 activebookmark,
999 interactive,
1001 interactive,
1000 )
1002 )
1001 raise error.ConflictResolutionRequired(b'unshelve')
1003 raise error.ConflictResolutionRequired(b'unshelve')
1002
1004
1003 with repo.dirstate.parentchange():
1005 with repo.dirstate.parentchange():
1004 repo.setparents(tmpwctx.node(), nullid)
1006 repo.setparents(tmpwctx.node(), nullid)
1005 newnode, ispartialunshelve = _createunshelvectx(
1007 newnode, ispartialunshelve = _createunshelvectx(
1006 ui, repo, shelvectx, basename, interactive, opts
1008 ui, repo, shelvectx, basename, interactive, opts
1007 )
1009 )
1008
1010
1009 if newnode is None:
1011 if newnode is None:
1010 shelvectx = tmpwctx
1012 shelvectx = tmpwctx
1011 msg = _(
1013 msg = _(
1012 b'note: unshelved changes already existed '
1014 b'note: unshelved changes already existed '
1013 b'in the working copy\n'
1015 b'in the working copy\n'
1014 )
1016 )
1015 ui.status(msg)
1017 ui.status(msg)
1016 else:
1018 else:
1017 shelvectx = repo[newnode]
1019 shelvectx = repo[newnode]
1018 merge.update(tmpwctx)
1020 merge.update(tmpwctx)
1019
1021
1020 return shelvectx, ispartialunshelve
1022 return shelvectx, ispartialunshelve
1021
1023
1022
1024
1023 def _forgetunknownfiles(repo, shelvectx, addedbefore):
1025 def _forgetunknownfiles(repo, shelvectx, addedbefore):
1024 # Forget any files that were unknown before the shelve, unknown before
1026 # Forget any files that were unknown before the shelve, unknown before
1025 # unshelve started, but are now added.
1027 # unshelve started, but are now added.
1026 shelveunknown = shelvectx.extra().get(b'shelve_unknown')
1028 shelveunknown = shelvectx.extra().get(b'shelve_unknown')
1027 if not shelveunknown:
1029 if not shelveunknown:
1028 return
1030 return
1029 shelveunknown = frozenset(shelveunknown.split(b'\0'))
1031 shelveunknown = frozenset(shelveunknown.split(b'\0'))
1030 addedafter = frozenset(repo.status().added)
1032 addedafter = frozenset(repo.status().added)
1031 toforget = (addedafter & shelveunknown) - addedbefore
1033 toforget = (addedafter & shelveunknown) - addedbefore
1032 repo[None].forget(toforget)
1034 repo[None].forget(toforget)
1033
1035
1034
1036
1035 def _finishunshelve(repo, oldtiprev, tr, activebookmark):
1037 def _finishunshelve(repo, oldtiprev, tr, activebookmark):
1036 _restoreactivebookmark(repo, activebookmark)
1038 _restoreactivebookmark(repo, activebookmark)
1037 # The transaction aborting will strip all the commits for us,
1039 # The transaction aborting will strip all the commits for us,
1038 # but it doesn't update the inmemory structures, so addchangegroup
1040 # but it doesn't update the inmemory structures, so addchangegroup
1039 # hooks still fire and try to operate on the missing commits.
1041 # hooks still fire and try to operate on the missing commits.
1040 # Clean up manually to prevent this.
1042 # Clean up manually to prevent this.
1041 repo.unfiltered().changelog.strip(oldtiprev, tr)
1043 repo.unfiltered().changelog.strip(oldtiprev, tr)
1042 _aborttransaction(repo, tr)
1044 _aborttransaction(repo, tr)
1043
1045
1044
1046
1045 def _checkunshelveuntrackedproblems(ui, repo, shelvectx):
1047 def _checkunshelveuntrackedproblems(ui, repo, shelvectx):
1046 """Check potential problems which may result from working
1048 """Check potential problems which may result from working
1047 copy having untracked changes."""
1049 copy having untracked changes."""
1048 wcdeleted = set(repo.status().deleted)
1050 wcdeleted = set(repo.status().deleted)
1049 shelvetouched = set(shelvectx.files())
1051 shelvetouched = set(shelvectx.files())
1050 intersection = wcdeleted.intersection(shelvetouched)
1052 intersection = wcdeleted.intersection(shelvetouched)
1051 if intersection:
1053 if intersection:
1052 m = _(b"shelved change touches missing files")
1054 m = _(b"shelved change touches missing files")
1053 hint = _(b"run hg status to see which files are missing")
1055 hint = _(b"run hg status to see which files are missing")
1054 raise error.Abort(m, hint=hint)
1056 raise error.Abort(m, hint=hint)
1055
1057
1056
1058
1057 def unshelvecmd(ui, repo, *shelved, **opts):
1059 def unshelvecmd(ui, repo, *shelved, **opts):
1058 opts = pycompat.byteskwargs(opts)
1060 opts = pycompat.byteskwargs(opts)
1059 abortf = opts.get(b'abort')
1061 abortf = opts.get(b'abort')
1060 continuef = opts.get(b'continue')
1062 continuef = opts.get(b'continue')
1061 interactive = opts.get(b'interactive')
1063 interactive = opts.get(b'interactive')
1062 if not abortf and not continuef:
1064 if not abortf and not continuef:
1063 cmdutil.checkunfinished(repo)
1065 cmdutil.checkunfinished(repo)
1064 shelved = list(shelved)
1066 shelved = list(shelved)
1065 if opts.get(b"name"):
1067 if opts.get(b"name"):
1066 shelved.append(opts[b"name"])
1068 shelved.append(opts[b"name"])
1067
1069
1068 if interactive and opts.get(b'keep'):
1070 if interactive and opts.get(b'keep'):
1069 raise error.Abort(_(b'--keep on --interactive is not yet supported'))
1071 raise error.InputError(
1072 _(b'--keep on --interactive is not yet supported')
1073 )
1070 if abortf or continuef:
1074 if abortf or continuef:
1071 if abortf and continuef:
1075 if abortf and continuef:
1072 raise error.Abort(_(b'cannot use both abort and continue'))
1076 raise error.InputError(_(b'cannot use both abort and continue'))
1073 if shelved:
1077 if shelved:
1074 raise error.Abort(
1078 raise error.InputError(
1075 _(
1079 _(
1076 b'cannot combine abort/continue with '
1080 b'cannot combine abort/continue with '
1077 b'naming a shelved change'
1081 b'naming a shelved change'
1078 )
1082 )
1079 )
1083 )
1080 if abortf and opts.get(b'tool', False):
1084 if abortf and opts.get(b'tool', False):
1081 ui.warn(_(b'tool option will be ignored\n'))
1085 ui.warn(_(b'tool option will be ignored\n'))
1082
1086
1083 state = _loadshelvedstate(ui, repo, opts)
1087 state = _loadshelvedstate(ui, repo, opts)
1084 if abortf:
1088 if abortf:
1085 return unshelveabort(ui, repo, state)
1089 return unshelveabort(ui, repo, state)
1086 elif continuef and interactive:
1090 elif continuef and interactive:
1087 raise error.Abort(_(b'cannot use both continue and interactive'))
1091 raise error.InputError(
1092 _(b'cannot use both continue and interactive')
1093 )
1088 elif continuef:
1094 elif continuef:
1089 return unshelvecontinue(ui, repo, state, opts)
1095 return unshelvecontinue(ui, repo, state, opts)
1090 elif len(shelved) > 1:
1096 elif len(shelved) > 1:
1091 raise error.Abort(_(b'can only unshelve one change at a time'))
1097 raise error.InputError(_(b'can only unshelve one change at a time'))
1092 elif not shelved:
1098 elif not shelved:
1093 shelved = listshelves(repo)
1099 shelved = listshelves(repo)
1094 if not shelved:
1100 if not shelved:
1095 raise error.Abort(_(b'no shelved changes to apply!'))
1101 raise error.StateError(_(b'no shelved changes to apply!'))
1096 basename = util.split(shelved[0][1])[1]
1102 basename = util.split(shelved[0][1])[1]
1097 ui.status(_(b"unshelving change '%s'\n") % basename)
1103 ui.status(_(b"unshelving change '%s'\n") % basename)
1098 else:
1104 else:
1099 basename = shelved[0]
1105 basename = shelved[0]
1100
1106
1101 if not shelvedfile(repo, basename, patchextension).exists():
1107 if not shelvedfile(repo, basename, patchextension).exists():
1102 raise error.Abort(_(b"shelved change '%s' not found") % basename)
1108 raise error.InputError(_(b"shelved change '%s' not found") % basename)
1103
1109
1104 return _dounshelve(ui, repo, basename, opts)
1110 return _dounshelve(ui, repo, basename, opts)
1105
1111
1106
1112
1107 def _dounshelve(ui, repo, basename, opts):
1113 def _dounshelve(ui, repo, basename, opts):
1108 repo = repo.unfiltered()
1114 repo = repo.unfiltered()
1109 lock = tr = None
1115 lock = tr = None
1110 try:
1116 try:
1111 lock = repo.lock()
1117 lock = repo.lock()
1112 tr = repo.transaction(b'unshelve', report=lambda x: None)
1118 tr = repo.transaction(b'unshelve', report=lambda x: None)
1113 oldtiprev = len(repo)
1119 oldtiprev = len(repo)
1114
1120
1115 pctx = repo[b'.']
1121 pctx = repo[b'.']
1116 tmpwctx = pctx
1122 tmpwctx = pctx
1117 # The goal is to have a commit structure like so:
1123 # The goal is to have a commit structure like so:
1118 # ...-> pctx -> tmpwctx -> shelvectx
1124 # ...-> pctx -> tmpwctx -> shelvectx
1119 # where tmpwctx is an optional commit with the user's pending changes
1125 # where tmpwctx is an optional commit with the user's pending changes
1120 # and shelvectx is the unshelved changes. Then we merge it all down
1126 # and shelvectx is the unshelved changes. Then we merge it all down
1121 # to the original pctx.
1127 # to the original pctx.
1122
1128
1123 activebookmark = _backupactivebookmark(repo)
1129 activebookmark = _backupactivebookmark(repo)
1124 tmpwctx, addedbefore = _commitworkingcopychanges(
1130 tmpwctx, addedbefore = _commitworkingcopychanges(
1125 ui, repo, opts, tmpwctx
1131 ui, repo, opts, tmpwctx
1126 )
1132 )
1127 repo, shelvectx = _unshelverestorecommit(ui, repo, tr, basename)
1133 repo, shelvectx = _unshelverestorecommit(ui, repo, tr, basename)
1128 _checkunshelveuntrackedproblems(ui, repo, shelvectx)
1134 _checkunshelveuntrackedproblems(ui, repo, shelvectx)
1129 branchtorestore = b''
1135 branchtorestore = b''
1130 if shelvectx.branch() != shelvectx.p1().branch():
1136 if shelvectx.branch() != shelvectx.p1().branch():
1131 branchtorestore = shelvectx.branch()
1137 branchtorestore = shelvectx.branch()
1132
1138
1133 shelvectx, ispartialunshelve = _rebaserestoredcommit(
1139 shelvectx, ispartialunshelve = _rebaserestoredcommit(
1134 ui,
1140 ui,
1135 repo,
1141 repo,
1136 opts,
1142 opts,
1137 tr,
1143 tr,
1138 oldtiprev,
1144 oldtiprev,
1139 basename,
1145 basename,
1140 pctx,
1146 pctx,
1141 tmpwctx,
1147 tmpwctx,
1142 shelvectx,
1148 shelvectx,
1143 branchtorestore,
1149 branchtorestore,
1144 activebookmark,
1150 activebookmark,
1145 )
1151 )
1146 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
1152 overrides = {(b'ui', b'forcemerge'): opts.get(b'tool', b'')}
1147 with ui.configoverride(overrides, b'unshelve'):
1153 with ui.configoverride(overrides, b'unshelve'):
1148 mergefiles(ui, repo, pctx, shelvectx)
1154 mergefiles(ui, repo, pctx, shelvectx)
1149 restorebranch(ui, repo, branchtorestore)
1155 restorebranch(ui, repo, branchtorestore)
1150 shelvedstate.clear(repo)
1156 shelvedstate.clear(repo)
1151 _finishunshelve(repo, oldtiprev, tr, activebookmark)
1157 _finishunshelve(repo, oldtiprev, tr, activebookmark)
1152 _forgetunknownfiles(repo, shelvectx, addedbefore)
1158 _forgetunknownfiles(repo, shelvectx, addedbefore)
1153 if not ispartialunshelve:
1159 if not ispartialunshelve:
1154 unshelvecleanup(ui, repo, basename, opts)
1160 unshelvecleanup(ui, repo, basename, opts)
1155 finally:
1161 finally:
1156 if tr:
1162 if tr:
1157 tr.release()
1163 tr.release()
1158 lockmod.release(lock)
1164 lockmod.release(lock)
@@ -1,1537 +1,1537 b''
1 #testcases stripbased phasebased
1 #testcases stripbased phasebased
2
2
3 $ cat <<EOF >> $HGRCPATH
3 $ cat <<EOF >> $HGRCPATH
4 > [extensions]
4 > [extensions]
5 > mq =
5 > mq =
6 > [defaults]
6 > [defaults]
7 > diff = --nodates --git
7 > diff = --nodates --git
8 > qnew = --date '0 0'
8 > qnew = --date '0 0'
9 > [shelve]
9 > [shelve]
10 > maxbackups = 2
10 > maxbackups = 2
11 > EOF
11 > EOF
12
12
13 #if phasebased
13 #if phasebased
14
14
15 $ cat <<EOF >> $HGRCPATH
15 $ cat <<EOF >> $HGRCPATH
16 > [format]
16 > [format]
17 > internal-phase = yes
17 > internal-phase = yes
18 > EOF
18 > EOF
19
19
20 #endif
20 #endif
21
21
22 $ hg init repo
22 $ hg init repo
23 $ cd repo
23 $ cd repo
24 $ mkdir a b
24 $ mkdir a b
25 $ echo a > a/a
25 $ echo a > a/a
26 $ echo b > b/b
26 $ echo b > b/b
27 $ echo c > c
27 $ echo c > c
28 $ echo d > d
28 $ echo d > d
29 $ echo x > x
29 $ echo x > x
30 $ hg addremove -q
30 $ hg addremove -q
31
31
32 shelve has a help message
32 shelve has a help message
33 $ hg shelve -h
33 $ hg shelve -h
34 hg shelve [OPTION]... [FILE]...
34 hg shelve [OPTION]... [FILE]...
35
35
36 save and set aside changes from the working directory
36 save and set aside changes from the working directory
37
37
38 Shelving takes files that "hg status" reports as not clean, saves the
38 Shelving takes files that "hg status" reports as not clean, saves the
39 modifications to a bundle (a shelved change), and reverts the files so
39 modifications to a bundle (a shelved change), and reverts the files so
40 that their state in the working directory becomes clean.
40 that their state in the working directory becomes clean.
41
41
42 To restore these changes to the working directory, using "hg unshelve";
42 To restore these changes to the working directory, using "hg unshelve";
43 this will work even if you switch to a different commit.
43 this will work even if you switch to a different commit.
44
44
45 When no files are specified, "hg shelve" saves all not-clean files. If
45 When no files are specified, "hg shelve" saves all not-clean files. If
46 specific files or directories are named, only changes to those files are
46 specific files or directories are named, only changes to those files are
47 shelved.
47 shelved.
48
48
49 In bare shelve (when no files are specified, without interactive, include
49 In bare shelve (when no files are specified, without interactive, include
50 and exclude option), shelving remembers information if the working
50 and exclude option), shelving remembers information if the working
51 directory was on newly created branch, in other words working directory
51 directory was on newly created branch, in other words working directory
52 was on different branch than its first parent. In this situation
52 was on different branch than its first parent. In this situation
53 unshelving restores branch information to the working directory.
53 unshelving restores branch information to the working directory.
54
54
55 Each shelved change has a name that makes it easier to find later. The
55 Each shelved change has a name that makes it easier to find later. The
56 name of a shelved change defaults to being based on the active bookmark,
56 name of a shelved change defaults to being based on the active bookmark,
57 or if there is no active bookmark, the current named branch. To specify a
57 or if there is no active bookmark, the current named branch. To specify a
58 different name, use "--name".
58 different name, use "--name".
59
59
60 To see a list of existing shelved changes, use the "--list" option. For
60 To see a list of existing shelved changes, use the "--list" option. For
61 each shelved change, this will print its name, age, and description; use "
61 each shelved change, this will print its name, age, and description; use "
62 --patch" or "--stat" for more details.
62 --patch" or "--stat" for more details.
63
63
64 To delete specific shelved changes, use "--delete". To delete all shelved
64 To delete specific shelved changes, use "--delete". To delete all shelved
65 changes, use "--cleanup".
65 changes, use "--cleanup".
66
66
67 options ([+] can be repeated):
67 options ([+] can be repeated):
68
68
69 -A --addremove mark new/missing files as added/removed before
69 -A --addremove mark new/missing files as added/removed before
70 shelving
70 shelving
71 -u --unknown store unknown files in the shelve
71 -u --unknown store unknown files in the shelve
72 --cleanup delete all shelved changes
72 --cleanup delete all shelved changes
73 --date DATE shelve with the specified commit date
73 --date DATE shelve with the specified commit date
74 -d --delete delete the named shelved change(s)
74 -d --delete delete the named shelved change(s)
75 -e --edit invoke editor on commit messages
75 -e --edit invoke editor on commit messages
76 -k --keep shelve, but keep changes in the working directory
76 -k --keep shelve, but keep changes in the working directory
77 -l --list list current shelves
77 -l --list list current shelves
78 -m --message TEXT use text as shelve message
78 -m --message TEXT use text as shelve message
79 -n --name NAME use the given name for the shelved commit
79 -n --name NAME use the given name for the shelved commit
80 -p --patch output patches for changes (provide the names of the
80 -p --patch output patches for changes (provide the names of the
81 shelved changes as positional arguments)
81 shelved changes as positional arguments)
82 -i --interactive interactive mode
82 -i --interactive interactive mode
83 --stat output diffstat-style summary of changes (provide
83 --stat output diffstat-style summary of changes (provide
84 the names of the shelved changes as positional
84 the names of the shelved changes as positional
85 arguments)
85 arguments)
86 -I --include PATTERN [+] include names matching the given patterns
86 -I --include PATTERN [+] include names matching the given patterns
87 -X --exclude PATTERN [+] exclude names matching the given patterns
87 -X --exclude PATTERN [+] exclude names matching the given patterns
88 --mq operate on patch repository
88 --mq operate on patch repository
89
89
90 (some details hidden, use --verbose to show complete help)
90 (some details hidden, use --verbose to show complete help)
91
91
92 shelving in an empty repo should be possible
92 shelving in an empty repo should be possible
93 (this tests also that editor is not invoked, if '--edit' is not
93 (this tests also that editor is not invoked, if '--edit' is not
94 specified)
94 specified)
95
95
96 $ HGEDITOR=cat hg shelve
96 $ HGEDITOR=cat hg shelve
97 shelved as default
97 shelved as default
98 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
98 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
99
99
100 $ hg unshelve
100 $ hg unshelve
101 unshelving change 'default'
101 unshelving change 'default'
102
102
103 $ hg commit -q -m 'initial commit'
103 $ hg commit -q -m 'initial commit'
104
104
105 $ hg shelve
105 $ hg shelve
106 nothing changed
106 nothing changed
107 [1]
107 [1]
108
108
109 make sure shelve files were backed up
109 make sure shelve files were backed up
110
110
111 $ ls .hg/shelve-backup
111 $ ls .hg/shelve-backup
112 default.hg
112 default.hg
113 default.patch
113 default.patch
114 default.shelve
114 default.shelve
115
115
116 checks to make sure we dont create a directory or
116 checks to make sure we dont create a directory or
117 hidden file while choosing a new shelve name
117 hidden file while choosing a new shelve name
118
118
119 when we are given a name
119 when we are given a name
120
120
121 $ hg shelve -n foo/bar
121 $ hg shelve -n foo/bar
122 abort: shelved change names can not contain slashes
122 abort: shelved change names can not contain slashes
123 [255]
123 [255]
124 $ hg shelve -n .baz
124 $ hg shelve -n .baz
125 abort: shelved change names can not start with '.'
125 abort: shelved change names can not start with '.'
126 [255]
126 [255]
127 $ hg shelve -n foo\\bar
127 $ hg shelve -n foo\\bar
128 abort: shelved change names can not contain slashes
128 abort: shelved change names can not contain slashes
129 [255]
129 [255]
130
130
131 when shelve has to choose itself
131 when shelve has to choose itself
132
132
133 $ hg branch x/y -q
133 $ hg branch x/y -q
134 $ hg commit -q -m "Branch commit 0"
134 $ hg commit -q -m "Branch commit 0"
135 $ hg shelve
135 $ hg shelve
136 nothing changed
136 nothing changed
137 [1]
137 [1]
138 $ hg branch .x -q
138 $ hg branch .x -q
139 $ hg commit -q -m "Branch commit 1"
139 $ hg commit -q -m "Branch commit 1"
140 $ hg shelve
140 $ hg shelve
141 nothing changed
141 nothing changed
142 [1]
142 [1]
143 $ hg branch x\\y -q
143 $ hg branch x\\y -q
144 $ hg commit -q -m "Branch commit 2"
144 $ hg commit -q -m "Branch commit 2"
145 $ hg shelve
145 $ hg shelve
146 nothing changed
146 nothing changed
147 [1]
147 [1]
148
148
149 cleaning the branches made for name checking tests
149 cleaning the branches made for name checking tests
150
150
151 $ hg up default -q
151 $ hg up default -q
152 $ hg strip e9177275307e+6a6d231f43d+882bae7c62c2 -q
152 $ hg strip e9177275307e+6a6d231f43d+882bae7c62c2 -q
153
153
154 create an mq patch - shelving should work fine with a patch applied
154 create an mq patch - shelving should work fine with a patch applied
155
155
156 $ echo n > n
156 $ echo n > n
157 $ hg add n
157 $ hg add n
158 $ hg commit n -m second
158 $ hg commit n -m second
159 $ hg qnew second.patch
159 $ hg qnew second.patch
160
160
161 shelve a change that we will delete later
161 shelve a change that we will delete later
162
162
163 $ echo a >> a/a
163 $ echo a >> a/a
164 $ hg shelve
164 $ hg shelve
165 shelved as default
165 shelved as default
166 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
166 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167
167
168 set up some more complex changes to shelve
168 set up some more complex changes to shelve
169
169
170 $ echo a >> a/a
170 $ echo a >> a/a
171 $ hg mv b b.rename
171 $ hg mv b b.rename
172 moving b/b to b.rename/b
172 moving b/b to b.rename/b
173 $ hg cp c c.copy
173 $ hg cp c c.copy
174 $ hg mv d ghost
174 $ hg mv d ghost
175 $ rm ghost
175 $ rm ghost
176 $ hg status -C
176 $ hg status -C
177 M a/a
177 M a/a
178 A b.rename/b
178 A b.rename/b
179 b/b
179 b/b
180 A c.copy
180 A c.copy
181 c
181 c
182 R b/b
182 R b/b
183 R d
183 R d
184 ! ghost
184 ! ghost
185 d
185 d
186
186
187 the common case - no options or filenames
187 the common case - no options or filenames
188
188
189 $ hg shelve
189 $ hg shelve
190 shelved as default-01
190 shelved as default-01
191 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
191 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
192 $ hg status -C
192 $ hg status -C
193
193
194 ensure that our shelved changes exist
194 ensure that our shelved changes exist
195
195
196 $ hg shelve -l
196 $ hg shelve -l
197 default-01 (*)* changes to: [mq]: second.patch (glob)
197 default-01 (*)* changes to: [mq]: second.patch (glob)
198 default (*)* changes to: [mq]: second.patch (glob)
198 default (*)* changes to: [mq]: second.patch (glob)
199
199
200 $ hg shelve -l -p default
200 $ hg shelve -l -p default
201 default (*)* changes to: [mq]: second.patch (glob)
201 default (*)* changes to: [mq]: second.patch (glob)
202
202
203 diff --git a/a/a b/a/a
203 diff --git a/a/a b/a/a
204 --- a/a/a
204 --- a/a/a
205 +++ b/a/a
205 +++ b/a/a
206 @@ -1,1 +1,2 @@
206 @@ -1,1 +1,2 @@
207 a
207 a
208 +a
208 +a
209
209
210 $ hg shelve --list --addremove
210 $ hg shelve --list --addremove
211 abort: options '--list' and '--addremove' may not be used together
211 abort: options '--list' and '--addremove' may not be used together
212 [10]
212 [10]
213
213
214 delete our older shelved change
214 delete our older shelved change
215
215
216 $ hg shelve -d default
216 $ hg shelve -d default
217 $ hg qfinish -a -q
217 $ hg qfinish -a -q
218
218
219 ensure shelve backups aren't overwritten
219 ensure shelve backups aren't overwritten
220
220
221 $ ls .hg/shelve-backup/
221 $ ls .hg/shelve-backup/
222 default-1.hg
222 default-1.hg
223 default-1.patch
223 default-1.patch
224 default-1.shelve
224 default-1.shelve
225 default.hg
225 default.hg
226 default.patch
226 default.patch
227 default.shelve
227 default.shelve
228
228
229 local edits should not prevent a shelved change from applying
229 local edits should not prevent a shelved change from applying
230
230
231 $ printf "z\na\n" > a/a
231 $ printf "z\na\n" > a/a
232 $ hg unshelve --keep
232 $ hg unshelve --keep
233 unshelving change 'default-01'
233 unshelving change 'default-01'
234 temporarily committing pending changes (restore with 'hg unshelve --abort')
234 temporarily committing pending changes (restore with 'hg unshelve --abort')
235 rebasing shelved changes
235 rebasing shelved changes
236 merging a/a
236 merging a/a
237
237
238 $ hg revert --all -q
238 $ hg revert --all -q
239 $ rm a/a.orig b.rename/b c.copy
239 $ rm a/a.orig b.rename/b c.copy
240
240
241 apply it and make sure our state is as expected
241 apply it and make sure our state is as expected
242
242
243 (this also tests that same timestamp prevents backups from being
243 (this also tests that same timestamp prevents backups from being
244 removed, even though there are more than 'maxbackups' backups)
244 removed, even though there are more than 'maxbackups' backups)
245
245
246 $ f -t .hg/shelve-backup/default.patch
246 $ f -t .hg/shelve-backup/default.patch
247 .hg/shelve-backup/default.patch: file
247 .hg/shelve-backup/default.patch: file
248 $ touch -t 200001010000 .hg/shelve-backup/default.patch
248 $ touch -t 200001010000 .hg/shelve-backup/default.patch
249 $ f -t .hg/shelve-backup/default-1.patch
249 $ f -t .hg/shelve-backup/default-1.patch
250 .hg/shelve-backup/default-1.patch: file
250 .hg/shelve-backup/default-1.patch: file
251 $ touch -t 200001010000 .hg/shelve-backup/default-1.patch
251 $ touch -t 200001010000 .hg/shelve-backup/default-1.patch
252
252
253 $ hg unshelve
253 $ hg unshelve
254 unshelving change 'default-01'
254 unshelving change 'default-01'
255 $ hg status -C
255 $ hg status -C
256 M a/a
256 M a/a
257 A b.rename/b
257 A b.rename/b
258 b/b
258 b/b
259 A c.copy
259 A c.copy
260 c
260 c
261 R b/b
261 R b/b
262 R d
262 R d
263 $ hg shelve -l
263 $ hg shelve -l
264
264
265 (both of default.hg and default-1.hg should be still kept, because it
265 (both of default.hg and default-1.hg should be still kept, because it
266 is difficult to decide actual order of them from same timestamp)
266 is difficult to decide actual order of them from same timestamp)
267
267
268 $ ls .hg/shelve-backup/
268 $ ls .hg/shelve-backup/
269 default-01.hg
269 default-01.hg
270 default-01.patch
270 default-01.patch
271 default-01.shelve
271 default-01.shelve
272 default-1.hg
272 default-1.hg
273 default-1.patch
273 default-1.patch
274 default-1.shelve
274 default-1.shelve
275 default.hg
275 default.hg
276 default.patch
276 default.patch
277 default.shelve
277 default.shelve
278
278
279 $ hg unshelve
279 $ hg unshelve
280 abort: no shelved changes to apply!
280 abort: no shelved changes to apply!
281 [255]
281 [20]
282 $ hg unshelve foo
282 $ hg unshelve foo
283 abort: shelved change 'foo' not found
283 abort: shelved change 'foo' not found
284 [255]
284 [10]
285
285
286 named shelves, specific filenames, and "commit messages" should all work
286 named shelves, specific filenames, and "commit messages" should all work
287 (this tests also that editor is invoked, if '--edit' is specified)
287 (this tests also that editor is invoked, if '--edit' is specified)
288
288
289 $ hg status -C
289 $ hg status -C
290 M a/a
290 M a/a
291 A b.rename/b
291 A b.rename/b
292 b/b
292 b/b
293 A c.copy
293 A c.copy
294 c
294 c
295 R b/b
295 R b/b
296 R d
296 R d
297 $ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
297 $ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
298 wat
298 wat
299
299
300
300
301 HG: Enter commit message. Lines beginning with 'HG:' are removed.
301 HG: Enter commit message. Lines beginning with 'HG:' are removed.
302 HG: Leave message empty to abort commit.
302 HG: Leave message empty to abort commit.
303 HG: --
303 HG: --
304 HG: user: shelve@localhost
304 HG: user: shelve@localhost
305 HG: branch 'default'
305 HG: branch 'default'
306 HG: changed a/a
306 HG: changed a/a
307
307
308 expect "a" to no longer be present, but status otherwise unchanged
308 expect "a" to no longer be present, but status otherwise unchanged
309
309
310 $ hg status -C
310 $ hg status -C
311 A b.rename/b
311 A b.rename/b
312 b/b
312 b/b
313 A c.copy
313 A c.copy
314 c
314 c
315 R b/b
315 R b/b
316 R d
316 R d
317 $ hg shelve -l --stat
317 $ hg shelve -l --stat
318 wibble (*) wat (glob)
318 wibble (*) wat (glob)
319 a/a | 1 +
319 a/a | 1 +
320 1 files changed, 1 insertions(+), 0 deletions(-)
320 1 files changed, 1 insertions(+), 0 deletions(-)
321
321
322 and now "a/a" should reappear
322 and now "a/a" should reappear
323
323
324 $ cd a
324 $ cd a
325 $ hg unshelve -q wibble
325 $ hg unshelve -q wibble
326 $ cd ..
326 $ cd ..
327 $ hg status -C
327 $ hg status -C
328 M a/a
328 M a/a
329 A b.rename/b
329 A b.rename/b
330 b/b
330 b/b
331 A c.copy
331 A c.copy
332 c
332 c
333 R b/b
333 R b/b
334 R d
334 R d
335
335
336 ensure old shelve backups are being deleted automatically
336 ensure old shelve backups are being deleted automatically
337
337
338 $ ls .hg/shelve-backup/
338 $ ls .hg/shelve-backup/
339 default-01.hg
339 default-01.hg
340 default-01.patch
340 default-01.patch
341 default-01.shelve
341 default-01.shelve
342 wibble.hg
342 wibble.hg
343 wibble.patch
343 wibble.patch
344 wibble.shelve
344 wibble.shelve
345
345
346 cause unshelving to result in a merge with 'a' conflicting
346 cause unshelving to result in a merge with 'a' conflicting
347
347
348 $ hg shelve -q
348 $ hg shelve -q
349 $ echo c>>a/a
349 $ echo c>>a/a
350 $ hg commit -m second
350 $ hg commit -m second
351 $ hg tip --template '{files}\n'
351 $ hg tip --template '{files}\n'
352 a/a
352 a/a
353
353
354 add an unrelated change that should be preserved
354 add an unrelated change that should be preserved
355
355
356 $ mkdir foo
356 $ mkdir foo
357 $ echo foo > foo/foo
357 $ echo foo > foo/foo
358 $ hg add foo/foo
358 $ hg add foo/foo
359
359
360 force a conflicted merge to occur
360 force a conflicted merge to occur
361
361
362 $ hg unshelve
362 $ hg unshelve
363 unshelving change 'default'
363 unshelving change 'default'
364 temporarily committing pending changes (restore with 'hg unshelve --abort')
364 temporarily committing pending changes (restore with 'hg unshelve --abort')
365 rebasing shelved changes
365 rebasing shelved changes
366 merging a/a
366 merging a/a
367 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
367 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
368 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
368 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
369 [240]
369 [240]
370 $ hg status -v
370 $ hg status -v
371 M a/a
371 M a/a
372 M b.rename/b
372 M b.rename/b
373 M c.copy
373 M c.copy
374 R b/b
374 R b/b
375 R d
375 R d
376 ? a/a.orig
376 ? a/a.orig
377 # The repository is in an unfinished *unshelve* state.
377 # The repository is in an unfinished *unshelve* state.
378
378
379 # Unresolved merge conflicts:
379 # Unresolved merge conflicts:
380 #
380 #
381 # a/a
381 # a/a
382 #
382 #
383 # To mark files as resolved: hg resolve --mark FILE
383 # To mark files as resolved: hg resolve --mark FILE
384
384
385 # To continue: hg unshelve --continue
385 # To continue: hg unshelve --continue
386 # To abort: hg unshelve --abort
386 # To abort: hg unshelve --abort
387
387
388
388
389 ensure that we have a merge with unresolved conflicts
389 ensure that we have a merge with unresolved conflicts
390
390
391 #if phasebased
391 #if phasebased
392 $ hg heads -q --template '{rev}\n'
392 $ hg heads -q --template '{rev}\n'
393 8
393 8
394 5
394 5
395 $ hg parents -q --template '{rev}\n'
395 $ hg parents -q --template '{rev}\n'
396 8
396 8
397 5
397 5
398 #endif
398 #endif
399
399
400 #if stripbased
400 #if stripbased
401 $ hg heads -q --template '{rev}\n'
401 $ hg heads -q --template '{rev}\n'
402 5
402 5
403 4
403 4
404 $ hg parents -q --template '{rev}\n'
404 $ hg parents -q --template '{rev}\n'
405 4
405 4
406 5
406 5
407 #endif
407 #endif
408
408
409 $ hg status
409 $ hg status
410 M a/a
410 M a/a
411 M b.rename/b
411 M b.rename/b
412 M c.copy
412 M c.copy
413 R b/b
413 R b/b
414 R d
414 R d
415 ? a/a.orig
415 ? a/a.orig
416 $ hg diff
416 $ hg diff
417 diff --git a/a/a b/a/a
417 diff --git a/a/a b/a/a
418 --- a/a/a
418 --- a/a/a
419 +++ b/a/a
419 +++ b/a/a
420 @@ -1,2 +1,6 @@
420 @@ -1,2 +1,6 @@
421 a
421 a
422 +<<<<<<< working-copy: 2377350b6337 - shelve: pending changes temporary commit
422 +<<<<<<< working-copy: 2377350b6337 - shelve: pending changes temporary commit
423 c
423 c
424 +=======
424 +=======
425 +a
425 +a
426 +>>>>>>> shelve: 203c9f771d2b - shelve: changes to: [mq]: second.patch
426 +>>>>>>> shelve: 203c9f771d2b - shelve: changes to: [mq]: second.patch
427 diff --git a/b/b b/b.rename/b
427 diff --git a/b/b b/b.rename/b
428 rename from b/b
428 rename from b/b
429 rename to b.rename/b
429 rename to b.rename/b
430 diff --git a/c b/c.copy
430 diff --git a/c b/c.copy
431 copy from c
431 copy from c
432 copy to c.copy
432 copy to c.copy
433 diff --git a/d b/d
433 diff --git a/d b/d
434 deleted file mode 100644
434 deleted file mode 100644
435 --- a/d
435 --- a/d
436 +++ /dev/null
436 +++ /dev/null
437 @@ -1,1 +0,0 @@
437 @@ -1,1 +0,0 @@
438 -d
438 -d
439 $ hg resolve -l
439 $ hg resolve -l
440 U a/a
440 U a/a
441
441
442 $ hg shelve
442 $ hg shelve
443 abort: unshelve already in progress
443 abort: unshelve already in progress
444 (use 'hg unshelve --continue' or 'hg unshelve --abort')
444 (use 'hg unshelve --continue' or 'hg unshelve --abort')
445 [20]
445 [20]
446
446
447 abort the unshelve and be happy
447 abort the unshelve and be happy
448
448
449 $ hg status
449 $ hg status
450 M a/a
450 M a/a
451 M b.rename/b
451 M b.rename/b
452 M c.copy
452 M c.copy
453 R b/b
453 R b/b
454 R d
454 R d
455 ? a/a.orig
455 ? a/a.orig
456 $ hg unshelve -a
456 $ hg unshelve -a
457 unshelve of 'default' aborted
457 unshelve of 'default' aborted
458 $ hg heads -q
458 $ hg heads -q
459 [37]:2e69b451d1ea (re)
459 [37]:2e69b451d1ea (re)
460 $ hg parents
460 $ hg parents
461 changeset: [37]:2e69b451d1ea (re)
461 changeset: [37]:2e69b451d1ea (re)
462 tag: tip
462 tag: tip
463 parent: 3:509104101065 (?)
463 parent: 3:509104101065 (?)
464 user: test
464 user: test
465 date: Thu Jan 01 00:00:00 1970 +0000
465 date: Thu Jan 01 00:00:00 1970 +0000
466 summary: second
466 summary: second
467
467
468 $ hg resolve -l
468 $ hg resolve -l
469 $ hg status
469 $ hg status
470 A foo/foo
470 A foo/foo
471 ? a/a.orig
471 ? a/a.orig
472
472
473 try to continue with no unshelve underway
473 try to continue with no unshelve underway
474
474
475 $ hg unshelve -c
475 $ hg unshelve -c
476 abort: no unshelve in progress
476 abort: no unshelve in progress
477 [20]
477 [20]
478 $ hg status
478 $ hg status
479 A foo/foo
479 A foo/foo
480 ? a/a.orig
480 ? a/a.orig
481
481
482 redo the unshelve to get a conflict
482 redo the unshelve to get a conflict
483
483
484 $ hg unshelve -q
484 $ hg unshelve -q
485 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
485 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
486 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
486 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
487 [240]
487 [240]
488
488
489 attempt to continue
489 attempt to continue
490
490
491 $ hg unshelve -c
491 $ hg unshelve -c
492 abort: unresolved conflicts, can't continue
492 abort: unresolved conflicts, can't continue
493 (see 'hg resolve', then 'hg unshelve --continue')
493 (see 'hg resolve', then 'hg unshelve --continue')
494 [255]
494 [255]
495
495
496 $ hg revert -r . a/a
496 $ hg revert -r . a/a
497 $ hg resolve -m a/a
497 $ hg resolve -m a/a
498 (no more unresolved files)
498 (no more unresolved files)
499 continue: hg unshelve --continue
499 continue: hg unshelve --continue
500
500
501 $ hg commit -m 'commit while unshelve in progress'
501 $ hg commit -m 'commit while unshelve in progress'
502 abort: unshelve already in progress
502 abort: unshelve already in progress
503 (use 'hg unshelve --continue' or 'hg unshelve --abort')
503 (use 'hg unshelve --continue' or 'hg unshelve --abort')
504 [20]
504 [20]
505
505
506 $ hg graft --continue
506 $ hg graft --continue
507 abort: no graft in progress
507 abort: no graft in progress
508 (continue: hg unshelve --continue)
508 (continue: hg unshelve --continue)
509 [20]
509 [20]
510 $ hg unshelve -c
510 $ hg unshelve -c
511 unshelve of 'default' complete
511 unshelve of 'default' complete
512
512
513 ensure the repo is as we hope
513 ensure the repo is as we hope
514
514
515 $ hg parents
515 $ hg parents
516 changeset: [37]:2e69b451d1ea (re)
516 changeset: [37]:2e69b451d1ea (re)
517 tag: tip
517 tag: tip
518 parent: 3:509104101065 (?)
518 parent: 3:509104101065 (?)
519 user: test
519 user: test
520 date: Thu Jan 01 00:00:00 1970 +0000
520 date: Thu Jan 01 00:00:00 1970 +0000
521 summary: second
521 summary: second
522
522
523 $ hg heads -q
523 $ hg heads -q
524 [37]:2e69b451d1ea (re)
524 [37]:2e69b451d1ea (re)
525
525
526 $ hg status -C
526 $ hg status -C
527 A b.rename/b
527 A b.rename/b
528 b/b
528 b/b
529 A c.copy
529 A c.copy
530 c
530 c
531 A foo/foo
531 A foo/foo
532 R b/b
532 R b/b
533 R d
533 R d
534 ? a/a.orig
534 ? a/a.orig
535
535
536 there should be no shelves left
536 there should be no shelves left
537
537
538 $ hg shelve -l
538 $ hg shelve -l
539
539
540 #if execbit
540 #if execbit
541
541
542 ensure that metadata-only changes are shelved
542 ensure that metadata-only changes are shelved
543
543
544 $ chmod +x a/a
544 $ chmod +x a/a
545 $ hg shelve -q -n execbit a/a
545 $ hg shelve -q -n execbit a/a
546 $ hg status a/a
546 $ hg status a/a
547 $ hg unshelve -q execbit
547 $ hg unshelve -q execbit
548 $ hg status a/a
548 $ hg status a/a
549 M a/a
549 M a/a
550 $ hg revert a/a
550 $ hg revert a/a
551
551
552 #else
552 #else
553
553
554 Dummy shelve op, to keep rev numbers aligned
554 Dummy shelve op, to keep rev numbers aligned
555
555
556 $ echo foo > a/a
556 $ echo foo > a/a
557 $ hg shelve -q -n dummy a/a
557 $ hg shelve -q -n dummy a/a
558 $ hg unshelve -q dummy
558 $ hg unshelve -q dummy
559 $ hg revert a/a
559 $ hg revert a/a
560
560
561 #endif
561 #endif
562
562
563 #if symlink
563 #if symlink
564
564
565 $ rm a/a
565 $ rm a/a
566 $ ln -s foo a/a
566 $ ln -s foo a/a
567 $ hg shelve -q -n symlink a/a
567 $ hg shelve -q -n symlink a/a
568 $ hg status a/a
568 $ hg status a/a
569 $ hg unshelve -q -n symlink
569 $ hg unshelve -q -n symlink
570 $ hg status a/a
570 $ hg status a/a
571 M a/a
571 M a/a
572 $ hg revert a/a
572 $ hg revert a/a
573
573
574 #else
574 #else
575
575
576 Dummy shelve op, to keep rev numbers aligned
576 Dummy shelve op, to keep rev numbers aligned
577
577
578 $ echo bar > a/a
578 $ echo bar > a/a
579 $ hg shelve -q -n dummy a/a
579 $ hg shelve -q -n dummy a/a
580 $ hg unshelve -q dummy
580 $ hg unshelve -q dummy
581 $ hg revert a/a
581 $ hg revert a/a
582
582
583 #endif
583 #endif
584
584
585 set up another conflict between a commit and a shelved change
585 set up another conflict between a commit and a shelved change
586
586
587 $ hg revert -q -C -a
587 $ hg revert -q -C -a
588 $ rm a/a.orig b.rename/b c.copy
588 $ rm a/a.orig b.rename/b c.copy
589 $ echo a >> a/a
589 $ echo a >> a/a
590 $ hg shelve -q
590 $ hg shelve -q
591 $ echo x >> a/a
591 $ echo x >> a/a
592 $ hg ci -m 'create conflict'
592 $ hg ci -m 'create conflict'
593 $ hg add foo/foo
593 $ hg add foo/foo
594
594
595 if we resolve a conflict while unshelving, the unshelve should succeed
595 if we resolve a conflict while unshelving, the unshelve should succeed
596
596
597 $ hg unshelve --tool :merge-other --keep
597 $ hg unshelve --tool :merge-other --keep
598 unshelving change 'default'
598 unshelving change 'default'
599 temporarily committing pending changes (restore with 'hg unshelve --abort')
599 temporarily committing pending changes (restore with 'hg unshelve --abort')
600 rebasing shelved changes
600 rebasing shelved changes
601 merging a/a
601 merging a/a
602 $ hg parents -q
602 $ hg parents -q
603 (4|13):33f7f61e6c5e (re)
603 (4|13):33f7f61e6c5e (re)
604 $ hg shelve -l
604 $ hg shelve -l
605 default (*)* changes to: second (glob)
605 default (*)* changes to: second (glob)
606 $ hg status
606 $ hg status
607 M a/a
607 M a/a
608 A foo/foo
608 A foo/foo
609 $ cat a/a
609 $ cat a/a
610 a
610 a
611 c
611 c
612 a
612 a
613 $ cat > a/a << EOF
613 $ cat > a/a << EOF
614 > a
614 > a
615 > c
615 > c
616 > x
616 > x
617 > EOF
617 > EOF
618
618
619 $ HGMERGE=true hg unshelve
619 $ HGMERGE=true hg unshelve
620 unshelving change 'default'
620 unshelving change 'default'
621 temporarily committing pending changes (restore with 'hg unshelve --abort')
621 temporarily committing pending changes (restore with 'hg unshelve --abort')
622 rebasing shelved changes
622 rebasing shelved changes
623 merging a/a
623 merging a/a
624 note: unshelved changes already existed in the working copy
624 note: unshelved changes already existed in the working copy
625 $ hg parents -q
625 $ hg parents -q
626 (4|13):33f7f61e6c5e (re)
626 (4|13):33f7f61e6c5e (re)
627 $ hg shelve -l
627 $ hg shelve -l
628 $ hg status
628 $ hg status
629 A foo/foo
629 A foo/foo
630 $ cat a/a
630 $ cat a/a
631 a
631 a
632 c
632 c
633 x
633 x
634
634
635 test keep and cleanup
635 test keep and cleanup
636
636
637 $ hg shelve
637 $ hg shelve
638 shelved as default
638 shelved as default
639 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
639 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
640 $ hg shelve --list
640 $ hg shelve --list
641 default (*)* changes to: create conflict (glob)
641 default (*)* changes to: create conflict (glob)
642 $ hg unshelve -k
642 $ hg unshelve -k
643 unshelving change 'default'
643 unshelving change 'default'
644 $ hg shelve --list
644 $ hg shelve --list
645 default (*)* changes to: create conflict (glob)
645 default (*)* changes to: create conflict (glob)
646 $ hg shelve --cleanup
646 $ hg shelve --cleanup
647 $ hg shelve --list
647 $ hg shelve --list
648
648
649 $ hg shelve --cleanup --delete
649 $ hg shelve --cleanup --delete
650 abort: options '--cleanup' and '--delete' may not be used together
650 abort: options '--cleanup' and '--delete' may not be used together
651 [10]
651 [10]
652 $ hg shelve --cleanup --patch
652 $ hg shelve --cleanup --patch
653 abort: options '--cleanup' and '--patch' may not be used together
653 abort: options '--cleanup' and '--patch' may not be used together
654 [10]
654 [10]
655 $ hg shelve --cleanup --message MESSAGE
655 $ hg shelve --cleanup --message MESSAGE
656 abort: options '--cleanup' and '--message' may not be used together
656 abort: options '--cleanup' and '--message' may not be used together
657 [10]
657 [10]
658
658
659 test bookmarks
659 test bookmarks
660
660
661 $ hg bookmark test
661 $ hg bookmark test
662 $ hg bookmark
662 $ hg bookmark
663 \* test (4|13):33f7f61e6c5e (re)
663 \* test (4|13):33f7f61e6c5e (re)
664 $ hg shelve
664 $ hg shelve
665 shelved as test
665 shelved as test
666 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
666 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
667 $ hg bookmark
667 $ hg bookmark
668 \* test (4|13):33f7f61e6c5e (re)
668 \* test (4|13):33f7f61e6c5e (re)
669 $ hg unshelve
669 $ hg unshelve
670 unshelving change 'test'
670 unshelving change 'test'
671 $ hg bookmark
671 $ hg bookmark
672 \* test (4|13):33f7f61e6c5e (re)
672 \* test (4|13):33f7f61e6c5e (re)
673
673
674 shelve should still work even if mq is disabled
674 shelve should still work even if mq is disabled
675
675
676 $ hg --config extensions.mq=! shelve
676 $ hg --config extensions.mq=! shelve
677 shelved as test
677 shelved as test
678 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
678 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
679 $ hg --config extensions.mq=! shelve --list
679 $ hg --config extensions.mq=! shelve --list
680 test (*)* changes to: create conflict (glob)
680 test (*)* changes to: create conflict (glob)
681 $ hg bookmark
681 $ hg bookmark
682 \* test (4|13):33f7f61e6c5e (re)
682 \* test (4|13):33f7f61e6c5e (re)
683 $ hg --config extensions.mq=! unshelve
683 $ hg --config extensions.mq=! unshelve
684 unshelving change 'test'
684 unshelving change 'test'
685 $ hg bookmark
685 $ hg bookmark
686 \* test (4|13):33f7f61e6c5e (re)
686 \* test (4|13):33f7f61e6c5e (re)
687
687
688 Recreate some conflict again
688 Recreate some conflict again
689
689
690 $ hg up -C -r 2e69b451d1ea
690 $ hg up -C -r 2e69b451d1ea
691 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
691 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
692 (leaving bookmark test)
692 (leaving bookmark test)
693 $ echo y >> a/a
693 $ echo y >> a/a
694 $ hg shelve
694 $ hg shelve
695 shelved as default
695 shelved as default
696 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
696 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
697 $ hg up test
697 $ hg up test
698 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
698 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
699 (activating bookmark test)
699 (activating bookmark test)
700 $ hg bookmark
700 $ hg bookmark
701 \* test (4|13):33f7f61e6c5e (re)
701 \* test (4|13):33f7f61e6c5e (re)
702 $ hg unshelve
702 $ hg unshelve
703 unshelving change 'default'
703 unshelving change 'default'
704 rebasing shelved changes
704 rebasing shelved changes
705 merging a/a
705 merging a/a
706 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
706 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
707 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
707 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
708 [240]
708 [240]
709 $ hg bookmark
709 $ hg bookmark
710 test (4|13):33f7f61e6c5e (re)
710 test (4|13):33f7f61e6c5e (re)
711
711
712 Test that resolving all conflicts in one direction (so that the rebase
712 Test that resolving all conflicts in one direction (so that the rebase
713 is a no-op), works (issue4398)
713 is a no-op), works (issue4398)
714
714
715 $ hg revert -a -r .
715 $ hg revert -a -r .
716 reverting a/a
716 reverting a/a
717 $ hg resolve -m a/a
717 $ hg resolve -m a/a
718 (no more unresolved files)
718 (no more unresolved files)
719 continue: hg unshelve --continue
719 continue: hg unshelve --continue
720 $ hg unshelve -c
720 $ hg unshelve -c
721 note: unshelved changes already existed in the working copy
721 note: unshelved changes already existed in the working copy
722 unshelve of 'default' complete
722 unshelve of 'default' complete
723 $ hg bookmark
723 $ hg bookmark
724 \* test (4|13):33f7f61e6c5e (re)
724 \* test (4|13):33f7f61e6c5e (re)
725 $ hg diff
725 $ hg diff
726 $ hg status
726 $ hg status
727 ? a/a.orig
727 ? a/a.orig
728 ? foo/foo
728 ? foo/foo
729 $ hg summary
729 $ hg summary
730 parent: (4|13):33f7f61e6c5e tip (re)
730 parent: (4|13):33f7f61e6c5e tip (re)
731 create conflict
731 create conflict
732 branch: default
732 branch: default
733 bookmarks: *test
733 bookmarks: *test
734 commit: 2 unknown (clean)
734 commit: 2 unknown (clean)
735 update: (current)
735 update: (current)
736 phases: 5 draft
736 phases: 5 draft
737
737
738 $ hg shelve --delete --stat
738 $ hg shelve --delete --stat
739 abort: options '--delete' and '--stat' may not be used together
739 abort: options '--delete' and '--stat' may not be used together
740 [10]
740 [10]
741 $ hg shelve --delete --name NAME
741 $ hg shelve --delete --name NAME
742 abort: options '--delete' and '--name' may not be used together
742 abort: options '--delete' and '--name' may not be used together
743 [10]
743 [10]
744
744
745 Test interactive shelve
745 Test interactive shelve
746 $ cat <<EOF >> $HGRCPATH
746 $ cat <<EOF >> $HGRCPATH
747 > [ui]
747 > [ui]
748 > interactive = true
748 > interactive = true
749 > EOF
749 > EOF
750 $ echo 'a' >> a/b
750 $ echo 'a' >> a/b
751 $ cat a/a >> a/b
751 $ cat a/a >> a/b
752 $ echo 'x' >> a/b
752 $ echo 'x' >> a/b
753 $ mv a/b a/a
753 $ mv a/b a/a
754 $ echo 'a' >> foo/foo
754 $ echo 'a' >> foo/foo
755 $ hg st
755 $ hg st
756 M a/a
756 M a/a
757 ? a/a.orig
757 ? a/a.orig
758 ? foo/foo
758 ? foo/foo
759 $ cat a/a
759 $ cat a/a
760 a
760 a
761 a
761 a
762 c
762 c
763 x
763 x
764 x
764 x
765 $ cat foo/foo
765 $ cat foo/foo
766 foo
766 foo
767 a
767 a
768 $ hg shelve --interactive --config ui.interactive=false
768 $ hg shelve --interactive --config ui.interactive=false
769 abort: running non-interactively
769 abort: running non-interactively
770 [10]
770 [10]
771 $ hg shelve --interactive << EOF
771 $ hg shelve --interactive << EOF
772 > y
772 > y
773 > y
773 > y
774 > n
774 > n
775 > EOF
775 > EOF
776 diff --git a/a/a b/a/a
776 diff --git a/a/a b/a/a
777 2 hunks, 2 lines changed
777 2 hunks, 2 lines changed
778 examine changes to 'a/a'?
778 examine changes to 'a/a'?
779 (enter ? for help) [Ynesfdaq?] y
779 (enter ? for help) [Ynesfdaq?] y
780
780
781 @@ -1,3 +1,4 @@
781 @@ -1,3 +1,4 @@
782 +a
782 +a
783 a
783 a
784 c
784 c
785 x
785 x
786 record change 1/2 to 'a/a'?
786 record change 1/2 to 'a/a'?
787 (enter ? for help) [Ynesfdaq?] y
787 (enter ? for help) [Ynesfdaq?] y
788
788
789 @@ -1,3 +2,4 @@
789 @@ -1,3 +2,4 @@
790 a
790 a
791 c
791 c
792 x
792 x
793 +x
793 +x
794 record change 2/2 to 'a/a'?
794 record change 2/2 to 'a/a'?
795 (enter ? for help) [Ynesfdaq?] n
795 (enter ? for help) [Ynesfdaq?] n
796
796
797 shelved as test
797 shelved as test
798 merging a/a
798 merging a/a
799 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
799 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
800 $ cat a/a
800 $ cat a/a
801 a
801 a
802 c
802 c
803 x
803 x
804 x
804 x
805 $ cat foo/foo
805 $ cat foo/foo
806 foo
806 foo
807 a
807 a
808 $ hg st
808 $ hg st
809 M a/a
809 M a/a
810 ? foo/foo
810 ? foo/foo
811 $ hg bookmark
811 $ hg bookmark
812 \* test (4|13):33f7f61e6c5e (re)
812 \* test (4|13):33f7f61e6c5e (re)
813 there shouldn't be a merge state
813 there shouldn't be a merge state
814 $ hg resolve -l
814 $ hg resolve -l
815 $ hg unshelve
815 $ hg unshelve
816 unshelving change 'test'
816 unshelving change 'test'
817 temporarily committing pending changes (restore with 'hg unshelve --abort')
817 temporarily committing pending changes (restore with 'hg unshelve --abort')
818 rebasing shelved changes
818 rebasing shelved changes
819 merging a/a
819 merging a/a
820 $ hg bookmark
820 $ hg bookmark
821 \* test (4|13):33f7f61e6c5e (re)
821 \* test (4|13):33f7f61e6c5e (re)
822 $ cat a/a
822 $ cat a/a
823 a
823 a
824 a
824 a
825 c
825 c
826 x
826 x
827 x
827 x
828
828
829 shelve --patch and shelve --stat should work with valid shelfnames
829 shelve --patch and shelve --stat should work with valid shelfnames
830
830
831 $ hg up --clean .
831 $ hg up --clean .
832 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
832 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
833 (leaving bookmark test)
833 (leaving bookmark test)
834 $ hg shelve --list
834 $ hg shelve --list
835 $ echo 'patch a' > shelf-patch-a
835 $ echo 'patch a' > shelf-patch-a
836 $ hg add shelf-patch-a
836 $ hg add shelf-patch-a
837 $ hg shelve
837 $ hg shelve
838 shelved as default
838 shelved as default
839 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
839 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
840 $ echo 'patch b' > shelf-patch-b
840 $ echo 'patch b' > shelf-patch-b
841 $ hg add shelf-patch-b
841 $ hg add shelf-patch-b
842 $ hg shelve
842 $ hg shelve
843 shelved as default-01
843 shelved as default-01
844 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
844 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
845 $ hg shelve --patch default default-01
845 $ hg shelve --patch default default-01
846 default-01 (*)* changes to: create conflict (glob)
846 default-01 (*)* changes to: create conflict (glob)
847
847
848 diff --git a/shelf-patch-b b/shelf-patch-b
848 diff --git a/shelf-patch-b b/shelf-patch-b
849 new file mode 100644
849 new file mode 100644
850 --- /dev/null
850 --- /dev/null
851 +++ b/shelf-patch-b
851 +++ b/shelf-patch-b
852 @@ -0,0 +1,1 @@
852 @@ -0,0 +1,1 @@
853 +patch b
853 +patch b
854 default (*)* changes to: create conflict (glob)
854 default (*)* changes to: create conflict (glob)
855
855
856 diff --git a/shelf-patch-a b/shelf-patch-a
856 diff --git a/shelf-patch-a b/shelf-patch-a
857 new file mode 100644
857 new file mode 100644
858 --- /dev/null
858 --- /dev/null
859 +++ b/shelf-patch-a
859 +++ b/shelf-patch-a
860 @@ -0,0 +1,1 @@
860 @@ -0,0 +1,1 @@
861 +patch a
861 +patch a
862 $ hg shelve --stat default default-01
862 $ hg shelve --stat default default-01
863 default-01 (*)* changes to: create conflict (glob)
863 default-01 (*)* changes to: create conflict (glob)
864 shelf-patch-b | 1 +
864 shelf-patch-b | 1 +
865 1 files changed, 1 insertions(+), 0 deletions(-)
865 1 files changed, 1 insertions(+), 0 deletions(-)
866 default (*)* changes to: create conflict (glob)
866 default (*)* changes to: create conflict (glob)
867 shelf-patch-a | 1 +
867 shelf-patch-a | 1 +
868 1 files changed, 1 insertions(+), 0 deletions(-)
868 1 files changed, 1 insertions(+), 0 deletions(-)
869 $ hg shelve --patch default
869 $ hg shelve --patch default
870 default (*)* changes to: create conflict (glob)
870 default (*)* changes to: create conflict (glob)
871
871
872 diff --git a/shelf-patch-a b/shelf-patch-a
872 diff --git a/shelf-patch-a b/shelf-patch-a
873 new file mode 100644
873 new file mode 100644
874 --- /dev/null
874 --- /dev/null
875 +++ b/shelf-patch-a
875 +++ b/shelf-patch-a
876 @@ -0,0 +1,1 @@
876 @@ -0,0 +1,1 @@
877 +patch a
877 +patch a
878 $ hg shelve --stat default
878 $ hg shelve --stat default
879 default (*)* changes to: create conflict (glob)
879 default (*)* changes to: create conflict (glob)
880 shelf-patch-a | 1 +
880 shelf-patch-a | 1 +
881 1 files changed, 1 insertions(+), 0 deletions(-)
881 1 files changed, 1 insertions(+), 0 deletions(-)
882 $ hg shelve --patch nonexistentshelf
882 $ hg shelve --patch nonexistentshelf
883 abort: cannot find shelf nonexistentshelf
883 abort: cannot find shelf nonexistentshelf
884 [255]
884 [255]
885 $ hg shelve --stat nonexistentshelf
885 $ hg shelve --stat nonexistentshelf
886 abort: cannot find shelf nonexistentshelf
886 abort: cannot find shelf nonexistentshelf
887 [255]
887 [255]
888 $ hg shelve --patch default nonexistentshelf
888 $ hg shelve --patch default nonexistentshelf
889 abort: cannot find shelf nonexistentshelf
889 abort: cannot find shelf nonexistentshelf
890 [255]
890 [255]
891
891
892 when the user asks for a patch, we assume they want the most recent shelve if
892 when the user asks for a patch, we assume they want the most recent shelve if
893 they don't provide a shelve name
893 they don't provide a shelve name
894
894
895 $ hg shelve --patch
895 $ hg shelve --patch
896 default-01 (*)* changes to: create conflict (glob)
896 default-01 (*)* changes to: create conflict (glob)
897
897
898 diff --git a/shelf-patch-b b/shelf-patch-b
898 diff --git a/shelf-patch-b b/shelf-patch-b
899 new file mode 100644
899 new file mode 100644
900 --- /dev/null
900 --- /dev/null
901 +++ b/shelf-patch-b
901 +++ b/shelf-patch-b
902 @@ -0,0 +1,1 @@
902 @@ -0,0 +1,1 @@
903 +patch b
903 +patch b
904
904
905 $ cd ..
905 $ cd ..
906
906
907 Shelve from general delta repo uses bundle2 on disk
907 Shelve from general delta repo uses bundle2 on disk
908 --------------------------------------------------
908 --------------------------------------------------
909
909
910 no general delta
910 no general delta
911
911
912 $ hg clone --pull repo bundle1 --config format.usegeneraldelta=0
912 $ hg clone --pull repo bundle1 --config format.usegeneraldelta=0
913 requesting all changes
913 requesting all changes
914 adding changesets
914 adding changesets
915 adding manifests
915 adding manifests
916 adding file changes
916 adding file changes
917 added 5 changesets with 8 changes to 6 files
917 added 5 changesets with 8 changes to 6 files
918 new changesets cc01e2b0c59f:33f7f61e6c5e
918 new changesets cc01e2b0c59f:33f7f61e6c5e
919 updating to branch default
919 updating to branch default
920 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
920 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
921 $ cd bundle1
921 $ cd bundle1
922 $ echo babar > jungle
922 $ echo babar > jungle
923 $ hg add jungle
923 $ hg add jungle
924 $ hg shelve
924 $ hg shelve
925 shelved as default
925 shelved as default
926 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
926 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
927 $ hg debugbundle .hg/shelved/*.hg
927 $ hg debugbundle .hg/shelved/*.hg
928 330882a04d2ce8487636b1fb292e5beea77fa1e3
928 330882a04d2ce8487636b1fb292e5beea77fa1e3
929 $ cd ..
929 $ cd ..
930
930
931 with general delta
931 with general delta
932
932
933 $ hg clone --pull repo bundle2 --config format.usegeneraldelta=1
933 $ hg clone --pull repo bundle2 --config format.usegeneraldelta=1
934 requesting all changes
934 requesting all changes
935 adding changesets
935 adding changesets
936 adding manifests
936 adding manifests
937 adding file changes
937 adding file changes
938 added 5 changesets with 8 changes to 6 files
938 added 5 changesets with 8 changes to 6 files
939 new changesets cc01e2b0c59f:33f7f61e6c5e
939 new changesets cc01e2b0c59f:33f7f61e6c5e
940 updating to branch default
940 updating to branch default
941 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
941 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
942 $ cd bundle2
942 $ cd bundle2
943 $ echo babar > jungle
943 $ echo babar > jungle
944 $ hg add jungle
944 $ hg add jungle
945 $ hg shelve
945 $ hg shelve
946 shelved as default
946 shelved as default
947 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
947 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
948 $ hg debugbundle .hg/shelved/*.hg
948 $ hg debugbundle .hg/shelved/*.hg
949 Stream params: {Compression: BZ}
949 Stream params: {Compression: BZ}
950 changegroup -- {nbchanges: 1, version: 02} (mandatory: True)
950 changegroup -- {nbchanges: 1, version: 02} (mandatory: True)
951 330882a04d2ce8487636b1fb292e5beea77fa1e3
951 330882a04d2ce8487636b1fb292e5beea77fa1e3
952
952
953 Test shelve --keep
953 Test shelve --keep
954
954
955 $ hg unshelve
955 $ hg unshelve
956 unshelving change 'default'
956 unshelving change 'default'
957 $ hg shelve --keep --list
957 $ hg shelve --keep --list
958 abort: options '--list' and '--keep' may not be used together
958 abort: options '--list' and '--keep' may not be used together
959 [10]
959 [10]
960 $ hg shelve --keep --patch
960 $ hg shelve --keep --patch
961 abort: options '--patch' and '--keep' may not be used together
961 abort: options '--patch' and '--keep' may not be used together
962 [10]
962 [10]
963 $ hg shelve --keep --delete
963 $ hg shelve --keep --delete
964 abort: options '--delete' and '--keep' may not be used together
964 abort: options '--delete' and '--keep' may not be used together
965 [10]
965 [10]
966 $ hg shelve --keep
966 $ hg shelve --keep
967 shelved as default
967 shelved as default
968 $ hg diff
968 $ hg diff
969 diff --git a/jungle b/jungle
969 diff --git a/jungle b/jungle
970 new file mode 100644
970 new file mode 100644
971 --- /dev/null
971 --- /dev/null
972 +++ b/jungle
972 +++ b/jungle
973 @@ -0,0 +1,1 @@
973 @@ -0,0 +1,1 @@
974 +babar
974 +babar
975
975
976 Test shelve --delete
976 Test shelve --delete
977
977
978 $ hg shelve --list
978 $ hg shelve --list
979 default (*s ago) changes to: create conflict (glob)
979 default (*s ago) changes to: create conflict (glob)
980 $ hg shelve --delete doesnotexist
980 $ hg shelve --delete doesnotexist
981 abort: shelved change 'doesnotexist' not found
981 abort: shelved change 'doesnotexist' not found
982 [255]
982 [10]
983 $ hg shelve --delete default
983 $ hg shelve --delete default
984
984
985 $ cd ..
985 $ cd ..
986
986
987 Test visibility of in-memory changes inside transaction to external hook
987 Test visibility of in-memory changes inside transaction to external hook
988 ------------------------------------------------------------------------
988 ------------------------------------------------------------------------
989
989
990 $ cd repo
990 $ cd repo
991
991
992 $ echo xxxx >> x
992 $ echo xxxx >> x
993 $ hg commit -m "#5: changes to invoke rebase"
993 $ hg commit -m "#5: changes to invoke rebase"
994
994
995 $ cat > $TESTTMP/checkvisibility.sh <<EOF
995 $ cat > $TESTTMP/checkvisibility.sh <<EOF
996 > echo "==== \$1:"
996 > echo "==== \$1:"
997 > hg parents --template "VISIBLE {rev}:{node|short}\n"
997 > hg parents --template "VISIBLE {rev}:{node|short}\n"
998 > # test that pending changes are hidden
998 > # test that pending changes are hidden
999 > unset HG_PENDING
999 > unset HG_PENDING
1000 > hg parents --template "ACTUAL {rev}:{node|short}\n"
1000 > hg parents --template "ACTUAL {rev}:{node|short}\n"
1001 > echo "===="
1001 > echo "===="
1002 > EOF
1002 > EOF
1003
1003
1004 $ cat >> .hg/hgrc <<EOF
1004 $ cat >> .hg/hgrc <<EOF
1005 > [defaults]
1005 > [defaults]
1006 > # to fix hash id of temporary revisions
1006 > # to fix hash id of temporary revisions
1007 > unshelve = --date '0 0'
1007 > unshelve = --date '0 0'
1008 > EOF
1008 > EOF
1009
1009
1010 "hg unshelve" at REV5 implies steps below:
1010 "hg unshelve" at REV5 implies steps below:
1011
1011
1012 (1) commit changes in the working directory (REV6)
1012 (1) commit changes in the working directory (REV6)
1013 (2) unbundle shelved revision (REV7)
1013 (2) unbundle shelved revision (REV7)
1014 (3) rebase: merge REV7 into REV6 (REV6 => REV6, REV7)
1014 (3) rebase: merge REV7 into REV6 (REV6 => REV6, REV7)
1015 (4) rebase: commit merged revision (REV8)
1015 (4) rebase: commit merged revision (REV8)
1016 (5) rebase: update to REV6 (REV8 => REV6)
1016 (5) rebase: update to REV6 (REV8 => REV6)
1017 (6) update to REV5 (REV6 => REV5)
1017 (6) update to REV5 (REV6 => REV5)
1018 (7) abort transaction
1018 (7) abort transaction
1019
1019
1020 == test visibility to external preupdate hook
1020 == test visibility to external preupdate hook
1021
1021
1022 $ cat >> .hg/hgrc <<EOF
1022 $ cat >> .hg/hgrc <<EOF
1023 > [hooks]
1023 > [hooks]
1024 > preupdate.visibility = sh $TESTTMP/checkvisibility.sh preupdate
1024 > preupdate.visibility = sh $TESTTMP/checkvisibility.sh preupdate
1025 > EOF
1025 > EOF
1026
1026
1027 $ echo nnnn >> n
1027 $ echo nnnn >> n
1028
1028
1029 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1029 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1030 ==== before-unshelving:
1030 ==== before-unshelving:
1031 VISIBLE (5|19):703117a2acfb (re)
1031 VISIBLE (5|19):703117a2acfb (re)
1032 ACTUAL (5|19):703117a2acfb (re)
1032 ACTUAL (5|19):703117a2acfb (re)
1033 ====
1033 ====
1034
1034
1035 $ hg unshelve --keep default
1035 $ hg unshelve --keep default
1036 temporarily committing pending changes (restore with 'hg unshelve --abort')
1036 temporarily committing pending changes (restore with 'hg unshelve --abort')
1037 rebasing shelved changes
1037 rebasing shelved changes
1038 ==== preupdate:
1038 ==== preupdate:
1039 VISIBLE (6|20):54c00d20fb3f (re)
1039 VISIBLE (6|20):54c00d20fb3f (re)
1040 ACTUAL (5|19):703117a2acfb (re)
1040 ACTUAL (5|19):703117a2acfb (re)
1041 ====
1041 ====
1042 ==== preupdate:
1042 ==== preupdate:
1043 VISIBLE (8|21):8efe6f7537dc (re)
1043 VISIBLE (8|21):8efe6f7537dc (re)
1044 ACTUAL (5|19):703117a2acfb (re)
1044 ACTUAL (5|19):703117a2acfb (re)
1045 ====
1045 ====
1046 ==== preupdate:
1046 ==== preupdate:
1047 VISIBLE (6|20):54c00d20fb3f (re)
1047 VISIBLE (6|20):54c00d20fb3f (re)
1048 ACTUAL (5|19):703117a2acfb (re)
1048 ACTUAL (5|19):703117a2acfb (re)
1049 ====
1049 ====
1050
1050
1051 $ cat >> .hg/hgrc <<EOF
1051 $ cat >> .hg/hgrc <<EOF
1052 > [hooks]
1052 > [hooks]
1053 > preupdate.visibility =
1053 > preupdate.visibility =
1054 > EOF
1054 > EOF
1055
1055
1056 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1056 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1057 ==== after-unshelving:
1057 ==== after-unshelving:
1058 VISIBLE (5|19):703117a2acfb (re)
1058 VISIBLE (5|19):703117a2acfb (re)
1059 ACTUAL (5|19):703117a2acfb (re)
1059 ACTUAL (5|19):703117a2acfb (re)
1060 ====
1060 ====
1061
1061
1062 == test visibility to external update hook
1062 == test visibility to external update hook
1063
1063
1064 $ hg update -q -C 703117a2acfb
1064 $ hg update -q -C 703117a2acfb
1065
1065
1066 $ cat >> .hg/hgrc <<EOF
1066 $ cat >> .hg/hgrc <<EOF
1067 > [hooks]
1067 > [hooks]
1068 > update.visibility = sh $TESTTMP/checkvisibility.sh update
1068 > update.visibility = sh $TESTTMP/checkvisibility.sh update
1069 > EOF
1069 > EOF
1070
1070
1071 $ echo nnnn >> n
1071 $ echo nnnn >> n
1072
1072
1073 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1073 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1074 ==== before-unshelving:
1074 ==== before-unshelving:
1075 VISIBLE (5|19):703117a2acfb (re)
1075 VISIBLE (5|19):703117a2acfb (re)
1076 ACTUAL (5|19):703117a2acfb (re)
1076 ACTUAL (5|19):703117a2acfb (re)
1077 ====
1077 ====
1078
1078
1079 $ hg unshelve --keep default
1079 $ hg unshelve --keep default
1080 temporarily committing pending changes (restore with 'hg unshelve --abort')
1080 temporarily committing pending changes (restore with 'hg unshelve --abort')
1081 rebasing shelved changes
1081 rebasing shelved changes
1082 ==== update:
1082 ==== update:
1083 VISIBLE (6|20):54c00d20fb3f (re)
1083 VISIBLE (6|20):54c00d20fb3f (re)
1084 VISIBLE 1?7:492ed9d705e5 (re)
1084 VISIBLE 1?7:492ed9d705e5 (re)
1085 ACTUAL (5|19):703117a2acfb (re)
1085 ACTUAL (5|19):703117a2acfb (re)
1086 ====
1086 ====
1087 ==== update:
1087 ==== update:
1088 VISIBLE (6|20):54c00d20fb3f (re)
1088 VISIBLE (6|20):54c00d20fb3f (re)
1089 ACTUAL (5|19):703117a2acfb (re)
1089 ACTUAL (5|19):703117a2acfb (re)
1090 ====
1090 ====
1091 ==== update:
1091 ==== update:
1092 VISIBLE (5|19):703117a2acfb (re)
1092 VISIBLE (5|19):703117a2acfb (re)
1093 ACTUAL (5|19):703117a2acfb (re)
1093 ACTUAL (5|19):703117a2acfb (re)
1094 ====
1094 ====
1095
1095
1096 $ cat >> .hg/hgrc <<EOF
1096 $ cat >> .hg/hgrc <<EOF
1097 > [hooks]
1097 > [hooks]
1098 > update.visibility =
1098 > update.visibility =
1099 > EOF
1099 > EOF
1100
1100
1101 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1101 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1102 ==== after-unshelving:
1102 ==== after-unshelving:
1103 VISIBLE (5|19):703117a2acfb (re)
1103 VISIBLE (5|19):703117a2acfb (re)
1104 ACTUAL (5|19):703117a2acfb (re)
1104 ACTUAL (5|19):703117a2acfb (re)
1105 ====
1105 ====
1106
1106
1107 $ cd ..
1107 $ cd ..
1108
1108
1109 Keep active bookmark while (un)shelving even on shared repo (issue4940)
1109 Keep active bookmark while (un)shelving even on shared repo (issue4940)
1110 -----------------------------------------------------------------------
1110 -----------------------------------------------------------------------
1111
1111
1112 $ cat <<EOF >> $HGRCPATH
1112 $ cat <<EOF >> $HGRCPATH
1113 > [extensions]
1113 > [extensions]
1114 > share =
1114 > share =
1115 > EOF
1115 > EOF
1116
1116
1117 $ hg bookmarks -R repo
1117 $ hg bookmarks -R repo
1118 test (4|13):33f7f61e6c5e (re)
1118 test (4|13):33f7f61e6c5e (re)
1119 $ hg share -B repo share
1119 $ hg share -B repo share
1120 updating working directory
1120 updating working directory
1121 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
1121 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
1122 $ cd share
1122 $ cd share
1123
1123
1124 $ hg bookmarks
1124 $ hg bookmarks
1125 test (4|13):33f7f61e6c5e (re)
1125 test (4|13):33f7f61e6c5e (re)
1126 $ hg bookmarks foo
1126 $ hg bookmarks foo
1127 $ hg bookmarks
1127 $ hg bookmarks
1128 \* foo (5|19):703117a2acfb (re)
1128 \* foo (5|19):703117a2acfb (re)
1129 test (4|13):33f7f61e6c5e (re)
1129 test (4|13):33f7f61e6c5e (re)
1130 $ echo x >> x
1130 $ echo x >> x
1131 $ hg shelve
1131 $ hg shelve
1132 shelved as foo
1132 shelved as foo
1133 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1133 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1134 $ hg bookmarks
1134 $ hg bookmarks
1135 \* foo (5|19):703117a2acfb (re)
1135 \* foo (5|19):703117a2acfb (re)
1136 test (4|13):33f7f61e6c5e (re)
1136 test (4|13):33f7f61e6c5e (re)
1137
1137
1138 $ hg unshelve
1138 $ hg unshelve
1139 unshelving change 'foo'
1139 unshelving change 'foo'
1140 $ hg bookmarks
1140 $ hg bookmarks
1141 \* foo (5|19):703117a2acfb (re)
1141 \* foo (5|19):703117a2acfb (re)
1142 test (4|13):33f7f61e6c5e (re)
1142 test (4|13):33f7f61e6c5e (re)
1143
1143
1144 $ cd ..
1144 $ cd ..
1145
1145
1146 Abort unshelve while merging (issue5123)
1146 Abort unshelve while merging (issue5123)
1147 ----------------------------------------
1147 ----------------------------------------
1148
1148
1149 $ hg init issue5123
1149 $ hg init issue5123
1150 $ cd issue5123
1150 $ cd issue5123
1151 $ echo > a
1151 $ echo > a
1152 $ hg ci -Am a
1152 $ hg ci -Am a
1153 adding a
1153 adding a
1154 $ hg co null
1154 $ hg co null
1155 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1155 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1156 $ echo > b
1156 $ echo > b
1157 $ hg ci -Am b
1157 $ hg ci -Am b
1158 adding b
1158 adding b
1159 created new head
1159 created new head
1160 $ echo > c
1160 $ echo > c
1161 $ hg add c
1161 $ hg add c
1162 $ hg shelve
1162 $ hg shelve
1163 shelved as default
1163 shelved as default
1164 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1164 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1165 $ hg co 1
1165 $ hg co 1
1166 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1166 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
1167 $ hg merge 0
1167 $ hg merge 0
1168 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1168 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1169 (branch merge, don't forget to commit)
1169 (branch merge, don't forget to commit)
1170 -- successful merge with two parents
1170 -- successful merge with two parents
1171 $ hg log -G
1171 $ hg log -G
1172 @ changeset: 1:406bf70c274f
1172 @ changeset: 1:406bf70c274f
1173 tag: tip
1173 tag: tip
1174 parent: -1:000000000000
1174 parent: -1:000000000000
1175 user: test
1175 user: test
1176 date: Thu Jan 01 00:00:00 1970 +0000
1176 date: Thu Jan 01 00:00:00 1970 +0000
1177 summary: b
1177 summary: b
1178
1178
1179 @ changeset: 0:ada8c9eb8252
1179 @ changeset: 0:ada8c9eb8252
1180 user: test
1180 user: test
1181 date: Thu Jan 01 00:00:00 1970 +0000
1181 date: Thu Jan 01 00:00:00 1970 +0000
1182 summary: a
1182 summary: a
1183
1183
1184 -- trying to pull in the shelve bits
1184 -- trying to pull in the shelve bits
1185 -- unshelve should abort otherwise, it'll eat my second parent.
1185 -- unshelve should abort otherwise, it'll eat my second parent.
1186 $ hg unshelve
1186 $ hg unshelve
1187 abort: outstanding uncommitted merge
1187 abort: outstanding uncommitted merge
1188 (use 'hg commit' or 'hg merge --abort')
1188 (use 'hg commit' or 'hg merge --abort')
1189 [20]
1189 [20]
1190
1190
1191 $ cd ..
1191 $ cd ..
1192
1192
1193 -- test for interactive mode on unshelve
1193 -- test for interactive mode on unshelve
1194
1194
1195 $ hg init a
1195 $ hg init a
1196 $ cd a
1196 $ cd a
1197 $ echo > b
1197 $ echo > b
1198 $ hg ci -Am b
1198 $ hg ci -Am b
1199 adding b
1199 adding b
1200 $ echo > c
1200 $ echo > c
1201 $ echo > d
1201 $ echo > d
1202 $ hg add .
1202 $ hg add .
1203 adding c
1203 adding c
1204 adding d
1204 adding d
1205 $ hg shelve
1205 $ hg shelve
1206 shelved as default
1206 shelved as default
1207 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1207 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1208 $ echo > e
1208 $ echo > e
1209 $ hg add e
1209 $ hg add e
1210 $ hg ci -m e
1210 $ hg ci -m e
1211 $ hg shelve --patch
1211 $ hg shelve --patch
1212 default (*s ago) changes to: b (glob)
1212 default (*s ago) changes to: b (glob)
1213
1213
1214 diff --git a/c b/c
1214 diff --git a/c b/c
1215 new file mode 100644
1215 new file mode 100644
1216 --- /dev/null
1216 --- /dev/null
1217 +++ b/c
1217 +++ b/c
1218 @@ -0,0 +1,1 @@
1218 @@ -0,0 +1,1 @@
1219 +
1219 +
1220 diff --git a/d b/d
1220 diff --git a/d b/d
1221 new file mode 100644
1221 new file mode 100644
1222 --- /dev/null
1222 --- /dev/null
1223 +++ b/d
1223 +++ b/d
1224 @@ -0,0 +1,1 @@
1224 @@ -0,0 +1,1 @@
1225 +
1225 +
1226 $ hg unshelve -i <<EOF
1226 $ hg unshelve -i <<EOF
1227 > y
1227 > y
1228 > y
1228 > y
1229 > y
1229 > y
1230 > n
1230 > n
1231 > EOF
1231 > EOF
1232 unshelving change 'default'
1232 unshelving change 'default'
1233 rebasing shelved changes
1233 rebasing shelved changes
1234 diff --git a/c b/c
1234 diff --git a/c b/c
1235 new file mode 100644
1235 new file mode 100644
1236 examine changes to 'c'?
1236 examine changes to 'c'?
1237 (enter ? for help) [Ynesfdaq?] y
1237 (enter ? for help) [Ynesfdaq?] y
1238
1238
1239 @@ -0,0 +1,1 @@
1239 @@ -0,0 +1,1 @@
1240 +
1240 +
1241 record change 1/2 to 'c'?
1241 record change 1/2 to 'c'?
1242 (enter ? for help) [Ynesfdaq?] y
1242 (enter ? for help) [Ynesfdaq?] y
1243
1243
1244 diff --git a/d b/d
1244 diff --git a/d b/d
1245 new file mode 100644
1245 new file mode 100644
1246 examine changes to 'd'?
1246 examine changes to 'd'?
1247 (enter ? for help) [Ynesfdaq?] y
1247 (enter ? for help) [Ynesfdaq?] y
1248
1248
1249 @@ -0,0 +1,1 @@
1249 @@ -0,0 +1,1 @@
1250 +
1250 +
1251 record change 2/2 to 'd'?
1251 record change 2/2 to 'd'?
1252 (enter ? for help) [Ynesfdaq?] n
1252 (enter ? for help) [Ynesfdaq?] n
1253
1253
1254 $ ls -A
1254 $ ls -A
1255 .hg
1255 .hg
1256 b
1256 b
1257 c
1257 c
1258 e
1258 e
1259 -- shelve should not contain `c` now
1259 -- shelve should not contain `c` now
1260 $ hg shelve --patch
1260 $ hg shelve --patch
1261 default (*s ago) changes to: b (glob)
1261 default (*s ago) changes to: b (glob)
1262
1262
1263 diff --git a/d b/d
1263 diff --git a/d b/d
1264 new file mode 100644
1264 new file mode 100644
1265 --- /dev/null
1265 --- /dev/null
1266 +++ b/d
1266 +++ b/d
1267 @@ -0,0 +1,1 @@
1267 @@ -0,0 +1,1 @@
1268 +
1268 +
1269 $ hg unshelve -i <<EOF
1269 $ hg unshelve -i <<EOF
1270 > y
1270 > y
1271 > y
1271 > y
1272 > EOF
1272 > EOF
1273 unshelving change 'default'
1273 unshelving change 'default'
1274 temporarily committing pending changes (restore with 'hg unshelve --abort')
1274 temporarily committing pending changes (restore with 'hg unshelve --abort')
1275 rebasing shelved changes
1275 rebasing shelved changes
1276 diff --git a/d b/d
1276 diff --git a/d b/d
1277 new file mode 100644
1277 new file mode 100644
1278 examine changes to 'd'?
1278 examine changes to 'd'?
1279 (enter ? for help) [Ynesfdaq?] y
1279 (enter ? for help) [Ynesfdaq?] y
1280
1280
1281 @@ -0,0 +1,1 @@
1281 @@ -0,0 +1,1 @@
1282 +
1282 +
1283 record this change to 'd'?
1283 record this change to 'd'?
1284 (enter ? for help) [Ynesfdaq?] y
1284 (enter ? for help) [Ynesfdaq?] y
1285
1285
1286
1286
1287 $ hg status -v
1287 $ hg status -v
1288 A c
1288 A c
1289 A d
1289 A d
1290 $ ls -A
1290 $ ls -A
1291 .hg
1291 .hg
1292 b
1292 b
1293 c
1293 c
1294 d
1294 d
1295 e
1295 e
1296 $ hg shelve --list
1296 $ hg shelve --list
1297
1297
1298 -- now, unshelve selected changes from a file
1298 -- now, unshelve selected changes from a file
1299
1299
1300 $ echo B > foo
1300 $ echo B > foo
1301 $ hg add foo
1301 $ hg add foo
1302 $ hg ci -m 'add B to foo'
1302 $ hg ci -m 'add B to foo'
1303 $ cat > foo <<EOF
1303 $ cat > foo <<EOF
1304 > A
1304 > A
1305 > B
1305 > B
1306 > C
1306 > C
1307 > EOF
1307 > EOF
1308 $ echo > garbage
1308 $ echo > garbage
1309 $ hg st
1309 $ hg st
1310 M foo
1310 M foo
1311 ? garbage
1311 ? garbage
1312 $ hg shelve --unknown
1312 $ hg shelve --unknown
1313 shelved as default
1313 shelved as default
1314 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1314 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1315 $ cat foo
1315 $ cat foo
1316 B
1316 B
1317 $ hg unshelve -i <<EOF
1317 $ hg unshelve -i <<EOF
1318 > y
1318 > y
1319 > y
1319 > y
1320 > n
1320 > n
1321 > y
1321 > y
1322 > y
1322 > y
1323 > EOF
1323 > EOF
1324 unshelving change 'default'
1324 unshelving change 'default'
1325 rebasing shelved changes
1325 rebasing shelved changes
1326 diff --git a/foo b/foo
1326 diff --git a/foo b/foo
1327 2 hunks, 2 lines changed
1327 2 hunks, 2 lines changed
1328 examine changes to 'foo'?
1328 examine changes to 'foo'?
1329 (enter ? for help) [Ynesfdaq?] y
1329 (enter ? for help) [Ynesfdaq?] y
1330
1330
1331 @@ -1,1 +1,2 @@
1331 @@ -1,1 +1,2 @@
1332 +A
1332 +A
1333 B
1333 B
1334 record change 1/3 to 'foo'?
1334 record change 1/3 to 'foo'?
1335 (enter ? for help) [Ynesfdaq?] y
1335 (enter ? for help) [Ynesfdaq?] y
1336
1336
1337 @@ -1,1 +2,2 @@
1337 @@ -1,1 +2,2 @@
1338 B
1338 B
1339 +C
1339 +C
1340 record change 2/3 to 'foo'?
1340 record change 2/3 to 'foo'?
1341 (enter ? for help) [Ynesfdaq?] n
1341 (enter ? for help) [Ynesfdaq?] n
1342
1342
1343 diff --git a/garbage b/garbage
1343 diff --git a/garbage b/garbage
1344 new file mode 100644
1344 new file mode 100644
1345 examine changes to 'garbage'?
1345 examine changes to 'garbage'?
1346 (enter ? for help) [Ynesfdaq?] y
1346 (enter ? for help) [Ynesfdaq?] y
1347
1347
1348 @@ -0,0 +1,1 @@
1348 @@ -0,0 +1,1 @@
1349 +
1349 +
1350 record change 3/3 to 'garbage'?
1350 record change 3/3 to 'garbage'?
1351 (enter ? for help) [Ynesfdaq?] y
1351 (enter ? for help) [Ynesfdaq?] y
1352
1352
1353 $ hg st
1353 $ hg st
1354 M foo
1354 M foo
1355 ? garbage
1355 ? garbage
1356 $ cat foo
1356 $ cat foo
1357 A
1357 A
1358 B
1358 B
1359 $ hg shelve --patch
1359 $ hg shelve --patch
1360 default (*s ago) changes to: add B to foo (glob)
1360 default (*s ago) changes to: add B to foo (glob)
1361
1361
1362 diff --git a/foo b/foo
1362 diff --git a/foo b/foo
1363 --- a/foo
1363 --- a/foo
1364 +++ b/foo
1364 +++ b/foo
1365 @@ -1,2 +1,3 @@
1365 @@ -1,2 +1,3 @@
1366 A
1366 A
1367 B
1367 B
1368 +C
1368 +C
1369
1369
1370 -- unshelve interactive on conflicts
1370 -- unshelve interactive on conflicts
1371
1371
1372 $ echo A >> bar1
1372 $ echo A >> bar1
1373 $ echo A >> bar2
1373 $ echo A >> bar2
1374 $ hg add bar1 bar2
1374 $ hg add bar1 bar2
1375 $ hg ci -m 'add A to bars'
1375 $ hg ci -m 'add A to bars'
1376 $ echo B >> bar1
1376 $ echo B >> bar1
1377 $ echo B >> bar2
1377 $ echo B >> bar2
1378 $ hg shelve
1378 $ hg shelve
1379 shelved as default-01
1379 shelved as default-01
1380 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1380 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1381 $ echo C >> bar1
1381 $ echo C >> bar1
1382 $ echo C >> bar2
1382 $ echo C >> bar2
1383 $ hg ci -m 'add C to bars'
1383 $ hg ci -m 'add C to bars'
1384 $ hg unshelve -i
1384 $ hg unshelve -i
1385 unshelving change 'default-01'
1385 unshelving change 'default-01'
1386 rebasing shelved changes
1386 rebasing shelved changes
1387 merging bar1
1387 merging bar1
1388 merging bar2
1388 merging bar2
1389 warning: conflicts while merging bar1! (edit, then use 'hg resolve --mark')
1389 warning: conflicts while merging bar1! (edit, then use 'hg resolve --mark')
1390 warning: conflicts while merging bar2! (edit, then use 'hg resolve --mark')
1390 warning: conflicts while merging bar2! (edit, then use 'hg resolve --mark')
1391 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1391 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1392 [240]
1392 [240]
1393
1393
1394 $ cat > bar1 <<EOF
1394 $ cat > bar1 <<EOF
1395 > A
1395 > A
1396 > B
1396 > B
1397 > C
1397 > C
1398 > EOF
1398 > EOF
1399 $ cat > bar2 <<EOF
1399 $ cat > bar2 <<EOF
1400 > A
1400 > A
1401 > B
1401 > B
1402 > C
1402 > C
1403 > EOF
1403 > EOF
1404 $ hg resolve -m bar1 bar2
1404 $ hg resolve -m bar1 bar2
1405 (no more unresolved files)
1405 (no more unresolved files)
1406 continue: hg unshelve --continue
1406 continue: hg unshelve --continue
1407
1407
1408 -- using --continue with --interactive should throw an error
1408 -- using --continue with --interactive should throw an error
1409 $ hg unshelve --continue -i
1409 $ hg unshelve --continue -i
1410 abort: cannot use both continue and interactive
1410 abort: cannot use both continue and interactive
1411 [255]
1411 [10]
1412
1412
1413 $ cat bar1
1413 $ cat bar1
1414 A
1414 A
1415 B
1415 B
1416 C
1416 C
1417
1417
1418 #if stripbased
1418 #if stripbased
1419 $ hg log -r 3:: -G
1419 $ hg log -r 3:: -G
1420 @ changeset: 5:f1d5f53e397b
1420 @ changeset: 5:f1d5f53e397b
1421 | tag: tip
1421 | tag: tip
1422 | parent: 3:e28fd7fa7938
1422 | parent: 3:e28fd7fa7938
1423 | user: shelve@localhost
1423 | user: shelve@localhost
1424 | date: Thu Jan 01 00:00:00 1970 +0000
1424 | date: Thu Jan 01 00:00:00 1970 +0000
1425 | summary: changes to: add A to bars
1425 | summary: changes to: add A to bars
1426 |
1426 |
1427 | @ changeset: 4:fe451a778c81
1427 | @ changeset: 4:fe451a778c81
1428 |/ user: test
1428 |/ user: test
1429 | date: Thu Jan 01 00:00:00 1970 +0000
1429 | date: Thu Jan 01 00:00:00 1970 +0000
1430 | summary: add C to bars
1430 | summary: add C to bars
1431 |
1431 |
1432 o changeset: 3:e28fd7fa7938
1432 o changeset: 3:e28fd7fa7938
1433 | user: test
1433 | user: test
1434 ~ date: Thu Jan 01 00:00:00 1970 +0000
1434 ~ date: Thu Jan 01 00:00:00 1970 +0000
1435 summary: add A to bars
1435 summary: add A to bars
1436
1436
1437 #endif
1437 #endif
1438
1438
1439 $ hg unshelve --continue <<EOF
1439 $ hg unshelve --continue <<EOF
1440 > y
1440 > y
1441 > y
1441 > y
1442 > y
1442 > y
1443 > n
1443 > n
1444 > EOF
1444 > EOF
1445 diff --git a/bar1 b/bar1
1445 diff --git a/bar1 b/bar1
1446 1 hunks, 1 lines changed
1446 1 hunks, 1 lines changed
1447 examine changes to 'bar1'?
1447 examine changes to 'bar1'?
1448 (enter ? for help) [Ynesfdaq?] y
1448 (enter ? for help) [Ynesfdaq?] y
1449
1449
1450 @@ -1,2 +1,3 @@
1450 @@ -1,2 +1,3 @@
1451 A
1451 A
1452 +B
1452 +B
1453 C
1453 C
1454 record change 1/2 to 'bar1'?
1454 record change 1/2 to 'bar1'?
1455 (enter ? for help) [Ynesfdaq?] y
1455 (enter ? for help) [Ynesfdaq?] y
1456
1456
1457 diff --git a/bar2 b/bar2
1457 diff --git a/bar2 b/bar2
1458 1 hunks, 1 lines changed
1458 1 hunks, 1 lines changed
1459 examine changes to 'bar2'?
1459 examine changes to 'bar2'?
1460 (enter ? for help) [Ynesfdaq?] y
1460 (enter ? for help) [Ynesfdaq?] y
1461
1461
1462 @@ -1,2 +1,3 @@
1462 @@ -1,2 +1,3 @@
1463 A
1463 A
1464 +B
1464 +B
1465 C
1465 C
1466 record change 2/2 to 'bar2'?
1466 record change 2/2 to 'bar2'?
1467 (enter ? for help) [Ynesfdaq?] n
1467 (enter ? for help) [Ynesfdaq?] n
1468
1468
1469 unshelve of 'default-01' complete
1469 unshelve of 'default-01' complete
1470
1470
1471 #if stripbased
1471 #if stripbased
1472 $ hg log -r 3:: -G
1472 $ hg log -r 3:: -G
1473 @ changeset: 4:fe451a778c81
1473 @ changeset: 4:fe451a778c81
1474 | tag: tip
1474 | tag: tip
1475 | user: test
1475 | user: test
1476 | date: Thu Jan 01 00:00:00 1970 +0000
1476 | date: Thu Jan 01 00:00:00 1970 +0000
1477 | summary: add C to bars
1477 | summary: add C to bars
1478 |
1478 |
1479 o changeset: 3:e28fd7fa7938
1479 o changeset: 3:e28fd7fa7938
1480 | user: test
1480 | user: test
1481 ~ date: Thu Jan 01 00:00:00 1970 +0000
1481 ~ date: Thu Jan 01 00:00:00 1970 +0000
1482 summary: add A to bars
1482 summary: add A to bars
1483
1483
1484 #endif
1484 #endif
1485
1485
1486 $ hg unshelve --continue
1486 $ hg unshelve --continue
1487 abort: no unshelve in progress
1487 abort: no unshelve in progress
1488 [20]
1488 [20]
1489
1489
1490 $ hg shelve --list
1490 $ hg shelve --list
1491 default-01 (*)* changes to: add A to bars (glob)
1491 default-01 (*)* changes to: add A to bars (glob)
1492 default (*)* changes to: add B to foo (glob)
1492 default (*)* changes to: add B to foo (glob)
1493 $ hg unshelve -n default-01 -i <<EOF
1493 $ hg unshelve -n default-01 -i <<EOF
1494 > y
1494 > y
1495 > y
1495 > y
1496 > EOF
1496 > EOF
1497 temporarily committing pending changes (restore with 'hg unshelve --abort')
1497 temporarily committing pending changes (restore with 'hg unshelve --abort')
1498 rebasing shelved changes
1498 rebasing shelved changes
1499 diff --git a/bar2 b/bar2
1499 diff --git a/bar2 b/bar2
1500 1 hunks, 1 lines changed
1500 1 hunks, 1 lines changed
1501 examine changes to 'bar2'?
1501 examine changes to 'bar2'?
1502 (enter ? for help) [Ynesfdaq?] y
1502 (enter ? for help) [Ynesfdaq?] y
1503
1503
1504 @@ -1,2 +1,3 @@
1504 @@ -1,2 +1,3 @@
1505 A
1505 A
1506 +B
1506 +B
1507 C
1507 C
1508 record this change to 'bar2'?
1508 record this change to 'bar2'?
1509 (enter ? for help) [Ynesfdaq?] y
1509 (enter ? for help) [Ynesfdaq?] y
1510
1510
1511 -- test for --interactive --keep
1511 -- test for --interactive --keep
1512 $ hg unshelve -i --keep
1512 $ hg unshelve -i --keep
1513 abort: --keep on --interactive is not yet supported
1513 abort: --keep on --interactive is not yet supported
1514 [255]
1514 [10]
1515
1515
1516 $ hg update -q --clean .
1516 $ hg update -q --clean .
1517
1517
1518 Test that we can successfully shelve and unshelve a file with a trailing space
1518 Test that we can successfully shelve and unshelve a file with a trailing space
1519 in the filename. Such filenames are supposedly unsupported on Windows, so we
1519 in the filename. Such filenames are supposedly unsupported on Windows, so we
1520 wrap it in the no-windows check. Also test `hg patch` of the .patch file
1520 wrap it in the no-windows check. Also test `hg patch` of the .patch file
1521 produced by `hg shelve`.
1521 produced by `hg shelve`.
1522 #if no-windows
1522 #if no-windows
1523 $ echo hi > 'my filename '
1523 $ echo hi > 'my filename '
1524 $ hg add 'my filename '
1524 $ hg add 'my filename '
1525 warning: filename ends with ' ', which is not allowed on Windows: 'my filename '
1525 warning: filename ends with ' ', which is not allowed on Windows: 'my filename '
1526 $ hg shelve
1526 $ hg shelve
1527 shelved as default-01
1527 shelved as default-01
1528 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1528 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1529 $ cp .hg/shelved/default-01.patch test_patch.patch
1529 $ cp .hg/shelved/default-01.patch test_patch.patch
1530 $ hg unshelve
1530 $ hg unshelve
1531 unshelving change 'default-01'
1531 unshelving change 'default-01'
1532 $ cat 'my filename '
1532 $ cat 'my filename '
1533 hi
1533 hi
1534 $ hg update -q --clean .
1534 $ hg update -q --clean .
1535 $ hg patch -p1 test_patch.patch
1535 $ hg patch -p1 test_patch.patch
1536 applying test_patch.patch
1536 applying test_patch.patch
1537 #endif
1537 #endif
@@ -1,997 +1,997 b''
1 #testcases stripbased phasebased
1 #testcases stripbased phasebased
2 #testcases abortflag abortcommand
2 #testcases abortflag abortcommand
3 #testcases continueflag continuecommand
3 #testcases continueflag continuecommand
4
4
5 $ cat <<EOF >> $HGRCPATH
5 $ cat <<EOF >> $HGRCPATH
6 > [extensions]
6 > [extensions]
7 > mq =
7 > mq =
8 > [defaults]
8 > [defaults]
9 > diff = --nodates --git
9 > diff = --nodates --git
10 > qnew = --date '0 0'
10 > qnew = --date '0 0'
11 > [shelve]
11 > [shelve]
12 > maxbackups = 2
12 > maxbackups = 2
13 > EOF
13 > EOF
14
14
15 #if phasebased
15 #if phasebased
16
16
17 $ cat <<EOF >> $HGRCPATH
17 $ cat <<EOF >> $HGRCPATH
18 > [format]
18 > [format]
19 > internal-phase = yes
19 > internal-phase = yes
20 > EOF
20 > EOF
21
21
22 #endif
22 #endif
23
23
24 #if abortflag
24 #if abortflag
25 $ cat >> $HGRCPATH <<EOF
25 $ cat >> $HGRCPATH <<EOF
26 > [alias]
26 > [alias]
27 > abort = unshelve --abort
27 > abort = unshelve --abort
28 > EOF
28 > EOF
29 #endif
29 #endif
30
30
31 #if continueflag
31 #if continueflag
32 $ cat >> $HGRCPATH <<EOF
32 $ cat >> $HGRCPATH <<EOF
33 > [alias]
33 > [alias]
34 > continue = unshelve --continue
34 > continue = unshelve --continue
35 > EOF
35 > EOF
36 #endif
36 #endif
37
37
38 shelve should leave dirstate clean (issue4055)
38 shelve should leave dirstate clean (issue4055)
39
39
40 $ hg init shelverebase
40 $ hg init shelverebase
41 $ cd shelverebase
41 $ cd shelverebase
42 $ printf 'x\ny\n' > x
42 $ printf 'x\ny\n' > x
43 $ echo z > z
43 $ echo z > z
44 $ hg commit -Aqm xy
44 $ hg commit -Aqm xy
45 $ echo z >> x
45 $ echo z >> x
46 $ hg commit -Aqm z
46 $ hg commit -Aqm z
47 $ hg up 5c4c67fb7dce
47 $ hg up 5c4c67fb7dce
48 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
48 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
49 $ printf 'a\nx\ny\nz\n' > x
49 $ printf 'a\nx\ny\nz\n' > x
50 $ hg commit -Aqm xyz
50 $ hg commit -Aqm xyz
51 $ echo c >> z
51 $ echo c >> z
52 $ hg shelve
52 $ hg shelve
53 shelved as default
53 shelved as default
54 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
54 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
55
55
56 $ hg rebase -d 6c103be8f4e4 --config extensions.rebase=
56 $ hg rebase -d 6c103be8f4e4 --config extensions.rebase=
57 rebasing 2:323bfa07f744( tip)? "xyz" (re)
57 rebasing 2:323bfa07f744( tip)? "xyz" (re)
58 merging x
58 merging x
59 saved backup bundle to \$TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-(78114325|7ae538ef)-rebase.hg (re)
59 saved backup bundle to \$TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-(78114325|7ae538ef)-rebase.hg (re)
60 $ hg unshelve
60 $ hg unshelve
61 unshelving change 'default'
61 unshelving change 'default'
62 rebasing shelved changes
62 rebasing shelved changes
63 $ hg status
63 $ hg status
64 M z
64 M z
65
65
66 $ cd ..
66 $ cd ..
67
67
68 shelve should only unshelve pending changes (issue4068)
68 shelve should only unshelve pending changes (issue4068)
69
69
70 $ hg init onlypendingchanges
70 $ hg init onlypendingchanges
71 $ cd onlypendingchanges
71 $ cd onlypendingchanges
72 $ touch a
72 $ touch a
73 $ hg ci -Aqm a
73 $ hg ci -Aqm a
74 $ touch b
74 $ touch b
75 $ hg ci -Aqm b
75 $ hg ci -Aqm b
76 $ hg up -q 3903775176ed
76 $ hg up -q 3903775176ed
77 $ touch c
77 $ touch c
78 $ hg ci -Aqm c
78 $ hg ci -Aqm c
79
79
80 $ touch d
80 $ touch d
81 $ hg add d
81 $ hg add d
82 $ hg shelve
82 $ hg shelve
83 shelved as default
83 shelved as default
84 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
84 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
85 $ hg up -q 0e067c57feba
85 $ hg up -q 0e067c57feba
86 $ hg unshelve
86 $ hg unshelve
87 unshelving change 'default'
87 unshelving change 'default'
88 rebasing shelved changes
88 rebasing shelved changes
89 $ hg status
89 $ hg status
90 A d
90 A d
91
91
92 unshelve should work on an ancestor of the original commit
92 unshelve should work on an ancestor of the original commit
93
93
94 $ hg shelve
94 $ hg shelve
95 shelved as default
95 shelved as default
96 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
96 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
97 $ hg up 3903775176ed
97 $ hg up 3903775176ed
98 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
98 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
99 $ hg unshelve
99 $ hg unshelve
100 unshelving change 'default'
100 unshelving change 'default'
101 rebasing shelved changes
101 rebasing shelved changes
102 $ hg status
102 $ hg status
103 A d
103 A d
104
104
105 test bug 4073 we need to enable obsolete markers for it
105 test bug 4073 we need to enable obsolete markers for it
106
106
107 $ cat >> $HGRCPATH << EOF
107 $ cat >> $HGRCPATH << EOF
108 > [experimental]
108 > [experimental]
109 > evolution.createmarkers=True
109 > evolution.createmarkers=True
110 > EOF
110 > EOF
111 $ hg shelve
111 $ hg shelve
112 shelved as default
112 shelved as default
113 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
113 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
114 $ hg debugobsolete `hg log -r 0e067c57feba -T '{node}'`
114 $ hg debugobsolete `hg log -r 0e067c57feba -T '{node}'`
115 1 new obsolescence markers
115 1 new obsolescence markers
116 obsoleted 1 changesets
116 obsoleted 1 changesets
117 $ hg unshelve
117 $ hg unshelve
118 unshelving change 'default'
118 unshelving change 'default'
119
119
120 unshelve should leave unknown files alone (issue4113)
120 unshelve should leave unknown files alone (issue4113)
121
121
122 $ echo e > e
122 $ echo e > e
123 $ hg shelve
123 $ hg shelve
124 shelved as default
124 shelved as default
125 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
125 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
126 $ hg status
126 $ hg status
127 ? e
127 ? e
128 $ hg unshelve
128 $ hg unshelve
129 unshelving change 'default'
129 unshelving change 'default'
130 $ hg status
130 $ hg status
131 A d
131 A d
132 ? e
132 ? e
133 $ cat e
133 $ cat e
134 e
134 e
135
135
136 unshelve should keep a copy of unknown files
136 unshelve should keep a copy of unknown files
137
137
138 $ hg add e
138 $ hg add e
139 $ hg shelve
139 $ hg shelve
140 shelved as default
140 shelved as default
141 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
141 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
142 $ echo z > e
142 $ echo z > e
143 $ hg unshelve
143 $ hg unshelve
144 unshelving change 'default'
144 unshelving change 'default'
145 $ cat e
145 $ cat e
146 e
146 e
147 $ cat e.orig
147 $ cat e.orig
148 z
148 z
149 $ rm e.orig
149 $ rm e.orig
150
150
151 restores backup of unknown file to right directory
151 restores backup of unknown file to right directory
152
152
153 $ hg shelve
153 $ hg shelve
154 shelved as default
154 shelved as default
155 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
155 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
156 $ echo z > e
156 $ echo z > e
157 $ mkdir dir
157 $ mkdir dir
158 $ hg unshelve --cwd dir
158 $ hg unshelve --cwd dir
159 unshelving change 'default'
159 unshelving change 'default'
160 $ rmdir dir
160 $ rmdir dir
161 $ cat e
161 $ cat e
162 e
162 e
163 $ cat e.orig
163 $ cat e.orig
164 z
164 z
165
165
166 unshelve and conflicts with tracked and untracked files
166 unshelve and conflicts with tracked and untracked files
167
167
168 preparing:
168 preparing:
169
169
170 $ rm -f *.orig
170 $ rm -f *.orig
171 $ hg ci -qm 'commit stuff'
171 $ hg ci -qm 'commit stuff'
172 $ hg phase -p null:
172 $ hg phase -p null:
173
173
174 no other changes - no merge:
174 no other changes - no merge:
175
175
176 $ echo f > f
176 $ echo f > f
177 $ hg add f
177 $ hg add f
178 $ hg shelve
178 $ hg shelve
179 shelved as default
179 shelved as default
180 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
180 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
181 $ echo g > f
181 $ echo g > f
182 $ hg unshelve
182 $ hg unshelve
183 unshelving change 'default'
183 unshelving change 'default'
184 $ hg st
184 $ hg st
185 A f
185 A f
186 ? f.orig
186 ? f.orig
187 $ cat f
187 $ cat f
188 f
188 f
189 $ cat f.orig
189 $ cat f.orig
190 g
190 g
191
191
192 other uncommitted changes - merge:
192 other uncommitted changes - merge:
193
193
194 $ hg st
194 $ hg st
195 A f
195 A f
196 ? f.orig
196 ? f.orig
197 $ hg shelve
197 $ hg shelve
198 shelved as default
198 shelved as default
199 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
199 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
200 #if repobundlerepo
200 #if repobundlerepo
201 $ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()' --hidden
201 $ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()' --hidden
202 o [48] changes to: commit stuff shelve@localhost (re)
202 o [48] changes to: commit stuff shelve@localhost (re)
203 |
203 |
204 ~
204 ~
205 #endif
205 #endif
206 $ hg log -G --template '{rev} {desc|firstline} {author}'
206 $ hg log -G --template '{rev} {desc|firstline} {author}'
207 @ [37] commit stuff test (re)
207 @ [37] commit stuff test (re)
208 |
208 |
209 | o 2 c test
209 | o 2 c test
210 |/
210 |/
211 o 0 a test
211 o 0 a test
212
212
213 $ mv f.orig f
213 $ mv f.orig f
214 $ echo 1 > a
214 $ echo 1 > a
215 $ hg unshelve --date '1073741824 0'
215 $ hg unshelve --date '1073741824 0'
216 unshelving change 'default'
216 unshelving change 'default'
217 temporarily committing pending changes (restore with 'hg unshelve --abort')
217 temporarily committing pending changes (restore with 'hg unshelve --abort')
218 rebasing shelved changes
218 rebasing shelved changes
219 merging f
219 merging f
220 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
220 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
221 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
221 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
222 [240]
222 [240]
223
223
224 #if phasebased
224 #if phasebased
225 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
225 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
226 @ 9 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
226 @ 9 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
227 |
227 |
228 | @ 8 changes to: commit stuff shelve@localhost 1970-01-01 00:00 +0000
228 | @ 8 changes to: commit stuff shelve@localhost 1970-01-01 00:00 +0000
229 |/
229 |/
230 o 7 commit stuff test 1970-01-01 00:00 +0000
230 o 7 commit stuff test 1970-01-01 00:00 +0000
231 |
231 |
232 | o 2 c test 1970-01-01 00:00 +0000
232 | o 2 c test 1970-01-01 00:00 +0000
233 |/
233 |/
234 o 0 a test 1970-01-01 00:00 +0000
234 o 0 a test 1970-01-01 00:00 +0000
235
235
236 #endif
236 #endif
237
237
238 #if stripbased
238 #if stripbased
239 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
239 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
240 @ 5 changes to: commit stuff shelve@localhost 1970-01-01 00:00 +0000
240 @ 5 changes to: commit stuff shelve@localhost 1970-01-01 00:00 +0000
241 |
241 |
242 | @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
242 | @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
243 |/
243 |/
244 o 3 commit stuff test 1970-01-01 00:00 +0000
244 o 3 commit stuff test 1970-01-01 00:00 +0000
245 |
245 |
246 | o 2 c test 1970-01-01 00:00 +0000
246 | o 2 c test 1970-01-01 00:00 +0000
247 |/
247 |/
248 o 0 a test 1970-01-01 00:00 +0000
248 o 0 a test 1970-01-01 00:00 +0000
249
249
250 #endif
250 #endif
251
251
252 $ hg st
252 $ hg st
253 M f
253 M f
254 ? f.orig
254 ? f.orig
255 $ cat f
255 $ cat f
256 <<<<<<< working-copy: d44eae5c3d33 - shelve: pending changes temporary commit
256 <<<<<<< working-copy: d44eae5c3d33 - shelve: pending changes temporary commit
257 g
257 g
258 =======
258 =======
259 f
259 f
260 >>>>>>> shelve: aef214a5229c - shelve: changes to: commit stuff
260 >>>>>>> shelve: aef214a5229c - shelve: changes to: commit stuff
261 $ cat f.orig
261 $ cat f.orig
262 g
262 g
263 $ hg unshelve --abort -t false
263 $ hg unshelve --abort -t false
264 tool option will be ignored
264 tool option will be ignored
265 unshelve of 'default' aborted
265 unshelve of 'default' aborted
266 $ hg st
266 $ hg st
267 M a
267 M a
268 ? f.orig
268 ? f.orig
269 $ cat f.orig
269 $ cat f.orig
270 g
270 g
271 $ hg unshelve
271 $ hg unshelve
272 unshelving change 'default'
272 unshelving change 'default'
273 temporarily committing pending changes (restore with 'hg unshelve --abort')
273 temporarily committing pending changes (restore with 'hg unshelve --abort')
274 rebasing shelved changes
274 rebasing shelved changes
275 $ hg st
275 $ hg st
276 M a
276 M a
277 A f
277 A f
278 ? f.orig
278 ? f.orig
279
279
280 other committed changes - merge:
280 other committed changes - merge:
281
281
282 $ hg shelve f
282 $ hg shelve f
283 shelved as default
283 shelved as default
284 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
284 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
285 $ hg ci a -m 'intermediate other change'
285 $ hg ci a -m 'intermediate other change'
286 $ mv f.orig f
286 $ mv f.orig f
287 $ hg unshelve
287 $ hg unshelve
288 unshelving change 'default'
288 unshelving change 'default'
289 rebasing shelved changes
289 rebasing shelved changes
290 merging f
290 merging f
291 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
291 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
292 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
292 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
293 [240]
293 [240]
294 $ hg st
294 $ hg st
295 M f
295 M f
296 ? f.orig
296 ? f.orig
297 $ cat f
297 $ cat f
298 <<<<<<< working-copy: 6b563750f973 - test: intermediate other change
298 <<<<<<< working-copy: 6b563750f973 - test: intermediate other change
299 g
299 g
300 =======
300 =======
301 f
301 f
302 >>>>>>> shelve: aef214a5229c - shelve: changes to: commit stuff
302 >>>>>>> shelve: aef214a5229c - shelve: changes to: commit stuff
303 $ cat f.orig
303 $ cat f.orig
304 g
304 g
305
305
306 #if abortcommand
306 #if abortcommand
307 when in dry-run mode
307 when in dry-run mode
308 $ hg abort --dry-run
308 $ hg abort --dry-run
309 unshelve in progress, will be aborted
309 unshelve in progress, will be aborted
310 #endif
310 #endif
311
311
312 $ hg abort
312 $ hg abort
313 unshelve of 'default' aborted
313 unshelve of 'default' aborted
314 $ hg st
314 $ hg st
315 ? f.orig
315 ? f.orig
316 $ cat f.orig
316 $ cat f.orig
317 g
317 g
318 $ hg shelve --delete default
318 $ hg shelve --delete default
319 $ cd ..
319 $ cd ..
320
320
321 you shouldn't be able to ask for the patch/stats of the most recent shelve if
321 you shouldn't be able to ask for the patch/stats of the most recent shelve if
322 there are no shelves
322 there are no shelves
323
323
324 $ hg init noshelves
324 $ hg init noshelves
325 $ cd noshelves
325 $ cd noshelves
326
326
327 $ hg shelve --patch
327 $ hg shelve --patch
328 abort: there are no shelves to show
328 abort: there are no shelves to show
329 [255]
329 [255]
330 $ hg shelve --stat
330 $ hg shelve --stat
331 abort: there are no shelves to show
331 abort: there are no shelves to show
332 [255]
332 [255]
333
333
334 $ cd ..
334 $ cd ..
335
335
336 test .orig files go where the user wants them to
336 test .orig files go where the user wants them to
337 ---------------------------------------------------------------
337 ---------------------------------------------------------------
338 $ hg init salvage
338 $ hg init salvage
339 $ cd salvage
339 $ cd salvage
340 $ echo 'content' > root
340 $ echo 'content' > root
341 $ hg commit -A -m 'root' -q
341 $ hg commit -A -m 'root' -q
342 $ echo '' > root
342 $ echo '' > root
343 $ hg shelve -q
343 $ hg shelve -q
344 $ echo 'contADDent' > root
344 $ echo 'contADDent' > root
345 $ hg unshelve -q --config 'ui.origbackuppath=.hg/origbackups'
345 $ hg unshelve -q --config 'ui.origbackuppath=.hg/origbackups'
346 warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
346 warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
347 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
347 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
348 [240]
348 [240]
349 $ ls .hg/origbackups
349 $ ls .hg/origbackups
350 root
350 root
351 $ rm -rf .hg/origbackups
351 $ rm -rf .hg/origbackups
352
352
353 test Abort unshelve always gets user out of the unshelved state
353 test Abort unshelve always gets user out of the unshelved state
354 ---------------------------------------------------------------
354 ---------------------------------------------------------------
355
355
356 with a corrupted shelve state file
356 with a corrupted shelve state file
357 $ sed 's/ae8c668541e8/123456789012/' .hg/shelvedstate > ../corrupt-shelvedstate
357 $ sed 's/ae8c668541e8/123456789012/' .hg/shelvedstate > ../corrupt-shelvedstate
358 $ mv ../corrupt-shelvedstate .hg/shelvestate
358 $ mv ../corrupt-shelvedstate .hg/shelvestate
359 $ hg unshelve --abort 2>&1 | grep 'aborted'
359 $ hg unshelve --abort 2>&1 | grep 'aborted'
360 unshelve of 'default' aborted
360 unshelve of 'default' aborted
361 $ hg summary
361 $ hg summary
362 parent: 0:ae8c668541e8 tip
362 parent: 0:ae8c668541e8 tip
363 root
363 root
364 branch: default
364 branch: default
365 commit: 1 modified
365 commit: 1 modified
366 update: (current)
366 update: (current)
367 phases: 1 draft
367 phases: 1 draft
368 $ hg up -C .
368 $ hg up -C .
369 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
369 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
370
370
371 $ cd ..
371 $ cd ..
372
372
373 Shelve and unshelve unknown files. For the purposes of unshelve, a shelved
373 Shelve and unshelve unknown files. For the purposes of unshelve, a shelved
374 unknown file is the same as a shelved added file, except that it will be in
374 unknown file is the same as a shelved added file, except that it will be in
375 unknown state after unshelve if and only if it was either absent or unknown
375 unknown state after unshelve if and only if it was either absent or unknown
376 before the unshelve operation.
376 before the unshelve operation.
377
377
378 $ hg init unknowns
378 $ hg init unknowns
379 $ cd unknowns
379 $ cd unknowns
380
380
381 The simplest case is if I simply have an unknown file that I shelve and unshelve
381 The simplest case is if I simply have an unknown file that I shelve and unshelve
382
382
383 $ echo unknown > unknown
383 $ echo unknown > unknown
384 $ hg status
384 $ hg status
385 ? unknown
385 ? unknown
386 $ hg shelve --unknown
386 $ hg shelve --unknown
387 shelved as default
387 shelved as default
388 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
388 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
389 $ hg status
389 $ hg status
390 $ hg unshelve
390 $ hg unshelve
391 unshelving change 'default'
391 unshelving change 'default'
392 $ hg status
392 $ hg status
393 ? unknown
393 ? unknown
394 $ rm unknown
394 $ rm unknown
395
395
396 If I shelve, add the file, and unshelve, does it stay added?
396 If I shelve, add the file, and unshelve, does it stay added?
397
397
398 $ echo unknown > unknown
398 $ echo unknown > unknown
399 $ hg shelve -u
399 $ hg shelve -u
400 shelved as default
400 shelved as default
401 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
401 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
402 $ hg status
402 $ hg status
403 $ touch unknown
403 $ touch unknown
404 $ hg add unknown
404 $ hg add unknown
405 $ hg status
405 $ hg status
406 A unknown
406 A unknown
407 $ hg unshelve
407 $ hg unshelve
408 unshelving change 'default'
408 unshelving change 'default'
409 temporarily committing pending changes (restore with 'hg unshelve --abort')
409 temporarily committing pending changes (restore with 'hg unshelve --abort')
410 rebasing shelved changes
410 rebasing shelved changes
411 merging unknown
411 merging unknown
412 $ hg status
412 $ hg status
413 A unknown
413 A unknown
414 $ hg forget unknown
414 $ hg forget unknown
415 $ rm unknown
415 $ rm unknown
416
416
417 And if I shelve, commit, then unshelve, does it become modified?
417 And if I shelve, commit, then unshelve, does it become modified?
418
418
419 $ echo unknown > unknown
419 $ echo unknown > unknown
420 $ hg shelve -u
420 $ hg shelve -u
421 shelved as default
421 shelved as default
422 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
422 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
423 $ hg status
423 $ hg status
424 $ touch unknown
424 $ touch unknown
425 $ hg add unknown
425 $ hg add unknown
426 $ hg commit -qm "Add unknown"
426 $ hg commit -qm "Add unknown"
427 $ hg status
427 $ hg status
428 $ hg unshelve
428 $ hg unshelve
429 unshelving change 'default'
429 unshelving change 'default'
430 rebasing shelved changes
430 rebasing shelved changes
431 merging unknown
431 merging unknown
432 $ hg status
432 $ hg status
433 M unknown
433 M unknown
434 $ hg remove --force unknown
434 $ hg remove --force unknown
435 $ hg commit -qm "Remove unknown"
435 $ hg commit -qm "Remove unknown"
436
436
437 $ cd ..
437 $ cd ..
438
438
439 We expects that non-bare shelve keeps newly created branch in
439 We expects that non-bare shelve keeps newly created branch in
440 working directory.
440 working directory.
441
441
442 $ hg init shelve-preserve-new-branch
442 $ hg init shelve-preserve-new-branch
443 $ cd shelve-preserve-new-branch
443 $ cd shelve-preserve-new-branch
444 $ echo "a" >> a
444 $ echo "a" >> a
445 $ hg add a
445 $ hg add a
446 $ echo "b" >> b
446 $ echo "b" >> b
447 $ hg add b
447 $ hg add b
448 $ hg commit -m "ab"
448 $ hg commit -m "ab"
449 $ echo "aa" >> a
449 $ echo "aa" >> a
450 $ echo "bb" >> b
450 $ echo "bb" >> b
451 $ hg branch new-branch
451 $ hg branch new-branch
452 marked working directory as branch new-branch
452 marked working directory as branch new-branch
453 (branches are permanent and global, did you want a bookmark?)
453 (branches are permanent and global, did you want a bookmark?)
454 $ hg status
454 $ hg status
455 M a
455 M a
456 M b
456 M b
457 $ hg branch
457 $ hg branch
458 new-branch
458 new-branch
459 $ hg shelve a
459 $ hg shelve a
460 shelved as default
460 shelved as default
461 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
461 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
462 $ hg branch
462 $ hg branch
463 new-branch
463 new-branch
464 $ hg status
464 $ hg status
465 M b
465 M b
466 $ touch "c" >> c
466 $ touch "c" >> c
467 $ hg add c
467 $ hg add c
468 $ hg status
468 $ hg status
469 M b
469 M b
470 A c
470 A c
471 $ hg shelve --exclude c
471 $ hg shelve --exclude c
472 shelved as default-01
472 shelved as default-01
473 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
473 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
474 $ hg branch
474 $ hg branch
475 new-branch
475 new-branch
476 $ hg status
476 $ hg status
477 A c
477 A c
478 $ hg shelve --include c
478 $ hg shelve --include c
479 shelved as default-02
479 shelved as default-02
480 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
480 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
481 $ hg branch
481 $ hg branch
482 new-branch
482 new-branch
483 $ hg status
483 $ hg status
484 $ echo "d" >> d
484 $ echo "d" >> d
485 $ hg add d
485 $ hg add d
486 $ hg status
486 $ hg status
487 A d
487 A d
488
488
489 We expect that bare-shelve will not keep branch in current working directory.
489 We expect that bare-shelve will not keep branch in current working directory.
490
490
491 $ hg shelve
491 $ hg shelve
492 shelved as default-03
492 shelved as default-03
493 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
493 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
494 $ hg branch
494 $ hg branch
495 default
495 default
496 $ cd ..
496 $ cd ..
497
497
498 When i shelve commit on newly created branch i expect
498 When i shelve commit on newly created branch i expect
499 that after unshelve newly created branch will be preserved.
499 that after unshelve newly created branch will be preserved.
500
500
501 $ hg init shelve_on_new_branch_simple
501 $ hg init shelve_on_new_branch_simple
502 $ cd shelve_on_new_branch_simple
502 $ cd shelve_on_new_branch_simple
503 $ echo "aaa" >> a
503 $ echo "aaa" >> a
504 $ hg commit -A -m "a"
504 $ hg commit -A -m "a"
505 adding a
505 adding a
506 $ hg branch
506 $ hg branch
507 default
507 default
508 $ hg branch test
508 $ hg branch test
509 marked working directory as branch test
509 marked working directory as branch test
510 (branches are permanent and global, did you want a bookmark?)
510 (branches are permanent and global, did you want a bookmark?)
511 $ echo "bbb" >> a
511 $ echo "bbb" >> a
512 $ hg status
512 $ hg status
513 M a
513 M a
514 $ hg shelve
514 $ hg shelve
515 shelved as default
515 shelved as default
516 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
516 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
517 $ hg branch
517 $ hg branch
518 default
518 default
519 $ echo "bbb" >> b
519 $ echo "bbb" >> b
520 $ hg status
520 $ hg status
521 ? b
521 ? b
522 $ hg unshelve
522 $ hg unshelve
523 unshelving change 'default'
523 unshelving change 'default'
524 marked working directory as branch test
524 marked working directory as branch test
525 $ hg status
525 $ hg status
526 M a
526 M a
527 ? b
527 ? b
528 $ hg branch
528 $ hg branch
529 test
529 test
530 $ cd ..
530 $ cd ..
531
531
532 When i shelve commit on newly created branch, make
532 When i shelve commit on newly created branch, make
533 some changes, unshelve it and running into merge
533 some changes, unshelve it and running into merge
534 conflicts i expect that after fixing them and
534 conflicts i expect that after fixing them and
535 running unshelve --continue newly created branch
535 running unshelve --continue newly created branch
536 will be preserved.
536 will be preserved.
537
537
538 $ hg init shelve_on_new_branch_conflict
538 $ hg init shelve_on_new_branch_conflict
539 $ cd shelve_on_new_branch_conflict
539 $ cd shelve_on_new_branch_conflict
540 $ echo "aaa" >> a
540 $ echo "aaa" >> a
541 $ hg commit -A -m "a"
541 $ hg commit -A -m "a"
542 adding a
542 adding a
543 $ hg branch
543 $ hg branch
544 default
544 default
545 $ hg branch test
545 $ hg branch test
546 marked working directory as branch test
546 marked working directory as branch test
547 (branches are permanent and global, did you want a bookmark?)
547 (branches are permanent and global, did you want a bookmark?)
548 $ echo "bbb" >> a
548 $ echo "bbb" >> a
549 $ hg status
549 $ hg status
550 M a
550 M a
551 $ hg shelve
551 $ hg shelve
552 shelved as default
552 shelved as default
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
554 $ hg branch
554 $ hg branch
555 default
555 default
556 $ echo "ccc" >> a
556 $ echo "ccc" >> a
557 $ hg status
557 $ hg status
558 M a
558 M a
559 $ hg unshelve
559 $ hg unshelve
560 unshelving change 'default'
560 unshelving change 'default'
561 temporarily committing pending changes (restore with 'hg unshelve --abort')
561 temporarily committing pending changes (restore with 'hg unshelve --abort')
562 rebasing shelved changes
562 rebasing shelved changes
563 merging a
563 merging a
564 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
564 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
565 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
565 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
566 [240]
566 [240]
567 $ echo "aaabbbccc" > a
567 $ echo "aaabbbccc" > a
568 $ rm a.orig
568 $ rm a.orig
569 $ hg resolve --mark a
569 $ hg resolve --mark a
570 (no more unresolved files)
570 (no more unresolved files)
571 continue: hg unshelve --continue
571 continue: hg unshelve --continue
572 $ hg continue
572 $ hg continue
573 marked working directory as branch test
573 marked working directory as branch test
574 unshelve of 'default' complete
574 unshelve of 'default' complete
575 $ cat a
575 $ cat a
576 aaabbbccc
576 aaabbbccc
577 $ hg status
577 $ hg status
578 M a
578 M a
579 $ hg branch
579 $ hg branch
580 test
580 test
581 $ hg commit -m "test-commit"
581 $ hg commit -m "test-commit"
582
582
583 When i shelve on test branch, update to default branch
583 When i shelve on test branch, update to default branch
584 and unshelve i expect that it will not preserve previous
584 and unshelve i expect that it will not preserve previous
585 test branch.
585 test branch.
586
586
587 $ echo "xxx" > b
587 $ echo "xxx" > b
588 $ hg add b
588 $ hg add b
589 $ hg shelve
589 $ hg shelve
590 shelved as test
590 shelved as test
591 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
591 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
592 $ hg update -r 7049e48789d7
592 $ hg update -r 7049e48789d7
593 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
593 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
594 $ hg unshelve
594 $ hg unshelve
595 unshelving change 'test'
595 unshelving change 'test'
596 rebasing shelved changes
596 rebasing shelved changes
597 $ hg status
597 $ hg status
598 A b
598 A b
599 $ hg branch
599 $ hg branch
600 default
600 default
601 $ cd ..
601 $ cd ..
602
602
603 When i unshelve resulting in merge conflicts and makes saved
603 When i unshelve resulting in merge conflicts and makes saved
604 file shelvedstate looks like in previous versions in
604 file shelvedstate looks like in previous versions in
605 mercurial(without restore branch information in 7th line) i
605 mercurial(without restore branch information in 7th line) i
606 expect that after resolving conflicts and successfully
606 expect that after resolving conflicts and successfully
607 running 'shelve --continue' the branch information won't be
607 running 'shelve --continue' the branch information won't be
608 restored and branch will be unchanged.
608 restored and branch will be unchanged.
609
609
610 shelve on new branch, conflict with previous shelvedstate
610 shelve on new branch, conflict with previous shelvedstate
611
611
612 $ hg init conflict
612 $ hg init conflict
613 $ cd conflict
613 $ cd conflict
614 $ echo "aaa" >> a
614 $ echo "aaa" >> a
615 $ hg commit -A -m "a"
615 $ hg commit -A -m "a"
616 adding a
616 adding a
617 $ hg branch
617 $ hg branch
618 default
618 default
619 $ hg branch test
619 $ hg branch test
620 marked working directory as branch test
620 marked working directory as branch test
621 (branches are permanent and global, did you want a bookmark?)
621 (branches are permanent and global, did you want a bookmark?)
622 $ echo "bbb" >> a
622 $ echo "bbb" >> a
623 $ hg status
623 $ hg status
624 M a
624 M a
625 $ hg shelve
625 $ hg shelve
626 shelved as default
626 shelved as default
627 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
627 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
628 $ hg branch
628 $ hg branch
629 default
629 default
630 $ echo "ccc" >> a
630 $ echo "ccc" >> a
631 $ hg status
631 $ hg status
632 M a
632 M a
633 $ hg unshelve
633 $ hg unshelve
634 unshelving change 'default'
634 unshelving change 'default'
635 temporarily committing pending changes (restore with 'hg unshelve --abort')
635 temporarily committing pending changes (restore with 'hg unshelve --abort')
636 rebasing shelved changes
636 rebasing shelved changes
637 merging a
637 merging a
638 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
638 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
639 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
639 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
640 [240]
640 [240]
641
641
642 Removing restore branch information from shelvedstate file(making it looks like
642 Removing restore branch information from shelvedstate file(making it looks like
643 in previous versions) and running unshelve --continue
643 in previous versions) and running unshelve --continue
644
644
645 $ cp .hg/shelvedstate .hg/shelvedstate_old
645 $ cp .hg/shelvedstate .hg/shelvedstate_old
646 $ cat .hg/shelvedstate_old | grep -v 'branchtorestore' > .hg/shelvedstate
646 $ cat .hg/shelvedstate_old | grep -v 'branchtorestore' > .hg/shelvedstate
647
647
648 $ echo "aaabbbccc" > a
648 $ echo "aaabbbccc" > a
649 $ rm a.orig
649 $ rm a.orig
650 $ hg resolve --mark a
650 $ hg resolve --mark a
651 (no more unresolved files)
651 (no more unresolved files)
652 continue: hg unshelve --continue
652 continue: hg unshelve --continue
653
653
654 #if continuecommand
654 #if continuecommand
655 $ hg continue --dry-run
655 $ hg continue --dry-run
656 unshelve in progress, will be resumed
656 unshelve in progress, will be resumed
657 #endif
657 #endif
658
658
659 $ hg continue
659 $ hg continue
660 unshelve of 'default' complete
660 unshelve of 'default' complete
661 $ cat a
661 $ cat a
662 aaabbbccc
662 aaabbbccc
663 $ hg status
663 $ hg status
664 M a
664 M a
665 $ hg branch
665 $ hg branch
666 default
666 default
667 $ cd ..
667 $ cd ..
668
668
669 On non bare shelve the branch information shouldn't be restored
669 On non bare shelve the branch information shouldn't be restored
670
670
671 $ hg init bare_shelve_on_new_branch
671 $ hg init bare_shelve_on_new_branch
672 $ cd bare_shelve_on_new_branch
672 $ cd bare_shelve_on_new_branch
673 $ echo "aaa" >> a
673 $ echo "aaa" >> a
674 $ hg commit -A -m "a"
674 $ hg commit -A -m "a"
675 adding a
675 adding a
676 $ hg branch
676 $ hg branch
677 default
677 default
678 $ hg branch test
678 $ hg branch test
679 marked working directory as branch test
679 marked working directory as branch test
680 (branches are permanent and global, did you want a bookmark?)
680 (branches are permanent and global, did you want a bookmark?)
681 $ echo "bbb" >> a
681 $ echo "bbb" >> a
682 $ hg status
682 $ hg status
683 M a
683 M a
684 $ hg shelve a
684 $ hg shelve a
685 shelved as default
685 shelved as default
686 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
686 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
687 $ hg branch
687 $ hg branch
688 test
688 test
689 $ hg branch default
689 $ hg branch default
690 marked working directory as branch default
690 marked working directory as branch default
691 (branches are permanent and global, did you want a bookmark?)
691 (branches are permanent and global, did you want a bookmark?)
692 $ echo "bbb" >> b
692 $ echo "bbb" >> b
693 $ hg status
693 $ hg status
694 ? b
694 ? b
695 $ hg unshelve
695 $ hg unshelve
696 unshelving change 'default'
696 unshelving change 'default'
697 $ hg status
697 $ hg status
698 M a
698 M a
699 ? b
699 ? b
700 $ hg branch
700 $ hg branch
701 default
701 default
702 $ cd ..
702 $ cd ..
703
703
704 Prepare unshelve with a corrupted shelvedstate
704 Prepare unshelve with a corrupted shelvedstate
705 $ hg init r1 && cd r1
705 $ hg init r1 && cd r1
706 $ echo text1 > file && hg add file
706 $ echo text1 > file && hg add file
707 $ hg shelve
707 $ hg shelve
708 shelved as default
708 shelved as default
709 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
709 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
710 $ echo text2 > file && hg ci -Am text1
710 $ echo text2 > file && hg ci -Am text1
711 adding file
711 adding file
712 $ hg unshelve
712 $ hg unshelve
713 unshelving change 'default'
713 unshelving change 'default'
714 rebasing shelved changes
714 rebasing shelved changes
715 merging file
715 merging file
716 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
716 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
717 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
717 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
718 [240]
718 [240]
719 $ echo somethingsomething > .hg/shelvedstate
719 $ echo somethingsomething > .hg/shelvedstate
720
720
721 Unshelve --continue fails with appropriate message if shelvedstate is corrupted
721 Unshelve --continue fails with appropriate message if shelvedstate is corrupted
722 $ hg continue
722 $ hg continue
723 abort: corrupted shelved state file
723 abort: corrupted shelved state file
724 (please run hg unshelve --abort to abort unshelve operation)
724 (please run hg unshelve --abort to abort unshelve operation)
725 [255]
725 [255]
726
726
727 Unshelve --abort works with a corrupted shelvedstate
727 Unshelve --abort works with a corrupted shelvedstate
728 $ hg abort
728 $ hg abort
729 abort: could not read shelved state file, your working copy may be in an unexpected state
729 abort: could not read shelved state file, your working copy may be in an unexpected state
730 please update to some commit
730 please update to some commit
731
731
732 [255]
732 [255]
733
733
734 Unshelve --abort fails with appropriate message if there's no unshelve in
734 Unshelve --abort fails with appropriate message if there's no unshelve in
735 progress
735 progress
736
736
737 #if abortflag
737 #if abortflag
738 $ hg unshelve --abort
738 $ hg unshelve --abort
739 abort: no unshelve in progress
739 abort: no unshelve in progress
740 [20]
740 [20]
741 #else
741 #else
742 $ hg abort
742 $ hg abort
743 aborting the merge, updating back to 9451eaa6eee3
743 aborting the merge, updating back to 9451eaa6eee3
744 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
744 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
745 #endif
745 #endif
746 $ cd ..
746 $ cd ..
747
747
748 Test corrupt shelves (in .hg/shelved/, not .hg/shelvestate)
748 Test corrupt shelves (in .hg/shelved/, not .hg/shelvestate)
749 $ hg init corrupt-shelves
749 $ hg init corrupt-shelves
750 $ cd corrupt-shelves
750 $ cd corrupt-shelves
751 $ mkdir .hg/shelved
751 $ mkdir .hg/shelved
752
752
753 # A (corrupt) .patch file without a .hg file
753 # A (corrupt) .patch file without a .hg file
754 $ touch .hg/shelved/junk1.patch
754 $ touch .hg/shelved/junk1.patch
755 $ hg shelve -l
755 $ hg shelve -l
756 junk1 (* ago) (glob)
756 junk1 (* ago) (glob)
757 $ hg unshelve
757 $ hg unshelve
758 unshelving change 'junk1'
758 unshelving change 'junk1'
759 abort: $ENOENT$: '$TESTTMP/corrupt-shelves/.hg/shelved/junk1.hg'
759 abort: $ENOENT$: '$TESTTMP/corrupt-shelves/.hg/shelved/junk1.hg'
760 [255]
760 [255]
761 $ hg shelve -d junk1
761 $ hg shelve -d junk1
762 $ find .hg/shelve*
762 $ find .hg/shelve*
763 .hg/shelve-backup
763 .hg/shelve-backup
764 .hg/shelve-backup/junk1.patch
764 .hg/shelve-backup/junk1.patch
765 .hg/shelved
765 .hg/shelved
766
766
767 # A .hg file without a .patch file
767 # A .hg file without a .patch file
768 $ touch .hg/shelved/junk2.hg
768 $ touch .hg/shelved/junk2.hg
769 $ hg shelve -l
769 $ hg shelve -l
770 $ hg unshelve
770 $ hg unshelve
771 abort: no shelved changes to apply!
771 abort: no shelved changes to apply!
772 [255]
772 [20]
773 $ hg shelve -d junk2
773 $ hg shelve -d junk2
774 abort: shelved change 'junk2' not found
774 abort: shelved change 'junk2' not found
775 [255]
775 [10]
776 $ find .hg/shelve*
776 $ find .hg/shelve*
777 .hg/shelve-backup
777 .hg/shelve-backup
778 .hg/shelve-backup/junk1.patch
778 .hg/shelve-backup/junk1.patch
779 .hg/shelved
779 .hg/shelved
780 .hg/shelved/junk2.hg
780 .hg/shelved/junk2.hg
781
781
782 # A file with an unexpected extension
782 # A file with an unexpected extension
783 $ touch .hg/shelved/junk3
783 $ touch .hg/shelved/junk3
784 $ hg shelve -l 2>&1 | grep ValueError
784 $ hg shelve -l 2>&1 | grep ValueError
785 ValueError: not enough values to unpack (expected 2, got 1)
785 ValueError: not enough values to unpack (expected 2, got 1)
786 $ hg unshelve 2>&1 | grep ValueError
786 $ hg unshelve 2>&1 | grep ValueError
787 ValueError: not enough values to unpack (expected 2, got 1)
787 ValueError: not enough values to unpack (expected 2, got 1)
788 $ hg shelve -d junk3
788 $ hg shelve -d junk3
789 abort: shelved change 'junk3' not found
789 abort: shelved change 'junk3' not found
790 [255]
790 [10]
791 $ find .hg/shelve*
791 $ find .hg/shelve*
792 .hg/shelve-backup
792 .hg/shelve-backup
793 .hg/shelve-backup/junk1.patch
793 .hg/shelve-backup/junk1.patch
794 .hg/shelved
794 .hg/shelved
795 .hg/shelved/junk3
795 .hg/shelved/junk3
796 .hg/shelved/junk2.hg
796 .hg/shelved/junk2.hg
797
797
798 $ cd ..
798 $ cd ..
799
799
800 Unshelve respects --keep even if user intervention is needed
800 Unshelve respects --keep even if user intervention is needed
801 $ hg init unshelvekeep && cd unshelvekeep
801 $ hg init unshelvekeep && cd unshelvekeep
802 $ echo 1 > file && hg ci -Am 1
802 $ echo 1 > file && hg ci -Am 1
803 adding file
803 adding file
804 $ echo 2 >> file
804 $ echo 2 >> file
805 $ hg shelve
805 $ hg shelve
806 shelved as default
806 shelved as default
807 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
807 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
808 $ echo 3 >> file && hg ci -Am 13
808 $ echo 3 >> file && hg ci -Am 13
809 $ hg shelve --list
809 $ hg shelve --list
810 default (*s ago) * changes to: 1 (glob)
810 default (*s ago) * changes to: 1 (glob)
811 $ hg unshelve --keep
811 $ hg unshelve --keep
812 unshelving change 'default'
812 unshelving change 'default'
813 rebasing shelved changes
813 rebasing shelved changes
814 merging file
814 merging file
815 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
815 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
816 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
816 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
817 [240]
817 [240]
818 $ hg resolve --mark file
818 $ hg resolve --mark file
819 (no more unresolved files)
819 (no more unresolved files)
820 continue: hg unshelve --continue
820 continue: hg unshelve --continue
821 $ hg continue
821 $ hg continue
822 unshelve of 'default' complete
822 unshelve of 'default' complete
823 $ hg shelve --list
823 $ hg shelve --list
824 default (*s ago) * changes to: 1 (glob)
824 default (*s ago) * changes to: 1 (glob)
825 $ cd ..
825 $ cd ..
826
826
827 Unshelving when there are deleted files does not crash (issue4176)
827 Unshelving when there are deleted files does not crash (issue4176)
828 $ hg init unshelve-deleted-file && cd unshelve-deleted-file
828 $ hg init unshelve-deleted-file && cd unshelve-deleted-file
829 $ echo a > a && echo b > b && hg ci -Am ab
829 $ echo a > a && echo b > b && hg ci -Am ab
830 adding a
830 adding a
831 adding b
831 adding b
832 $ echo aa > a && hg shelve
832 $ echo aa > a && hg shelve
833 shelved as default
833 shelved as default
834 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
834 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
835 $ rm b
835 $ rm b
836 $ hg st
836 $ hg st
837 ! b
837 ! b
838 $ hg unshelve
838 $ hg unshelve
839 unshelving change 'default'
839 unshelving change 'default'
840 $ hg shelve
840 $ hg shelve
841 shelved as default
841 shelved as default
842 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
842 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
843 $ rm a && echo b > b
843 $ rm a && echo b > b
844 $ hg st
844 $ hg st
845 ! a
845 ! a
846 $ hg unshelve
846 $ hg unshelve
847 unshelving change 'default'
847 unshelving change 'default'
848 abort: shelved change touches missing files
848 abort: shelved change touches missing files
849 (run hg status to see which files are missing)
849 (run hg status to see which files are missing)
850 [255]
850 [255]
851 $ hg st
851 $ hg st
852 ! a
852 ! a
853 $ cd ..
853 $ cd ..
854
854
855 New versions of Mercurial know how to read onld shelvedstate files
855 New versions of Mercurial know how to read onld shelvedstate files
856 $ hg init oldshelvedstate
856 $ hg init oldshelvedstate
857 $ cd oldshelvedstate
857 $ cd oldshelvedstate
858 $ echo root > root && hg ci -Am root
858 $ echo root > root && hg ci -Am root
859 adding root
859 adding root
860 $ echo 1 > a
860 $ echo 1 > a
861 $ hg add a
861 $ hg add a
862 $ hg shelve --name ashelve
862 $ hg shelve --name ashelve
863 shelved as ashelve
863 shelved as ashelve
864 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
864 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
865 $ echo 2 > a
865 $ echo 2 > a
866 $ hg ci -Am a
866 $ hg ci -Am a
867 adding a
867 adding a
868 $ hg unshelve
868 $ hg unshelve
869 unshelving change 'ashelve'
869 unshelving change 'ashelve'
870 rebasing shelved changes
870 rebasing shelved changes
871 merging a
871 merging a
872 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
872 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
873 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
873 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
874 [240]
874 [240]
875 putting v1 shelvedstate file in place of a created v2
875 putting v1 shelvedstate file in place of a created v2
876 $ cat << EOF > .hg/shelvedstate
876 $ cat << EOF > .hg/shelvedstate
877 > 1
877 > 1
878 > ashelve
878 > ashelve
879 > 8b058dae057a5a78f393f4535d9e363dd5efac9d
879 > 8b058dae057a5a78f393f4535d9e363dd5efac9d
880 > 8b058dae057a5a78f393f4535d9e363dd5efac9d
880 > 8b058dae057a5a78f393f4535d9e363dd5efac9d
881 > 8b058dae057a5a78f393f4535d9e363dd5efac9d f543b27db2cdb41737e2e0008dc524c471da1446
881 > 8b058dae057a5a78f393f4535d9e363dd5efac9d f543b27db2cdb41737e2e0008dc524c471da1446
882 > f543b27db2cdb41737e2e0008dc524c471da1446
882 > f543b27db2cdb41737e2e0008dc524c471da1446
883 >
883 >
884 > nokeep
884 > nokeep
885 > :no-active-bookmark
885 > :no-active-bookmark
886 > EOF
886 > EOF
887 $ echo 1 > a
887 $ echo 1 > a
888 $ hg resolve --mark a
888 $ hg resolve --mark a
889 (no more unresolved files)
889 (no more unresolved files)
890 continue: hg unshelve --continue
890 continue: hg unshelve --continue
891 mercurial does not crash
891 mercurial does not crash
892 $ hg continue
892 $ hg continue
893 unshelve of 'ashelve' complete
893 unshelve of 'ashelve' complete
894
894
895 #if phasebased
895 #if phasebased
896
896
897 Unshelve with some metadata file missing
897 Unshelve with some metadata file missing
898 ----------------------------------------
898 ----------------------------------------
899
899
900 $ hg shelve
900 $ hg shelve
901 shelved as default
901 shelved as default
902 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
902 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
903 $ echo 3 > a
903 $ echo 3 > a
904
904
905 Test with the `.shelve` missing, but the changeset still in the repo (non-natural case)
905 Test with the `.shelve` missing, but the changeset still in the repo (non-natural case)
906
906
907 $ rm .hg/shelved/default.shelve
907 $ rm .hg/shelved/default.shelve
908 $ hg unshelve
908 $ hg unshelve
909 unshelving change 'default'
909 unshelving change 'default'
910 temporarily committing pending changes (restore with 'hg unshelve --abort')
910 temporarily committing pending changes (restore with 'hg unshelve --abort')
911 rebasing shelved changes
911 rebasing shelved changes
912 merging a
912 merging a
913 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
913 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
914 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
914 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
915 [240]
915 [240]
916 $ hg abort
916 $ hg abort
917 unshelve of 'default' aborted
917 unshelve of 'default' aborted
918
918
919 Unshelve without .shelve metadata (can happen when upgrading a repository with old shelve)
919 Unshelve without .shelve metadata (can happen when upgrading a repository with old shelve)
920
920
921 $ cat .hg/shelved/default.shelve
921 $ cat .hg/shelved/default.shelve
922 node=82e0cb9893247d12667017593ce1e5655860f1ac
922 node=82e0cb9893247d12667017593ce1e5655860f1ac
923 $ hg strip --hidden --rev 82e0cb989324 --no-backup
923 $ hg strip --hidden --rev 82e0cb989324 --no-backup
924 $ rm .hg/shelved/default.shelve
924 $ rm .hg/shelved/default.shelve
925 $ hg unshelve
925 $ hg unshelve
926 unshelving change 'default'
926 unshelving change 'default'
927 temporarily committing pending changes (restore with 'hg unshelve --abort')
927 temporarily committing pending changes (restore with 'hg unshelve --abort')
928 rebasing shelved changes
928 rebasing shelved changes
929 merging a
929 merging a
930 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
930 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
931 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
931 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
932 [240]
932 [240]
933 $ cat .hg/shelved/default.shelve
933 $ cat .hg/shelved/default.shelve
934 node=82e0cb9893247d12667017593ce1e5655860f1ac
934 node=82e0cb9893247d12667017593ce1e5655860f1ac
935 $ hg abort
935 $ hg abort
936 unshelve of 'default' aborted
936 unshelve of 'default' aborted
937
937
938 #endif
938 #endif
939
939
940 $ cd ..
940 $ cd ..
941
941
942 Block merge abort when unshelve in progress(issue6160)
942 Block merge abort when unshelve in progress(issue6160)
943 ------------------------------------------------------
943 ------------------------------------------------------
944
944
945 $ hg init a
945 $ hg init a
946 $ cd a
946 $ cd a
947 $ echo foo > a ; hg commit -qAm "initial commit"
947 $ echo foo > a ; hg commit -qAm "initial commit"
948 $ echo bar > a
948 $ echo bar > a
949 $ hg shelve
949 $ hg shelve
950 shelved as default
950 shelved as default
951 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
951 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
952 $ echo foobar > a
952 $ echo foobar > a
953 $ hg unshelve
953 $ hg unshelve
954 unshelving change 'default'
954 unshelving change 'default'
955 temporarily committing pending changes (restore with 'hg unshelve --abort')
955 temporarily committing pending changes (restore with 'hg unshelve --abort')
956 rebasing shelved changes
956 rebasing shelved changes
957 merging a
957 merging a
958 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
958 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
959 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
959 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
960 [240]
960 [240]
961
961
962 $ hg log --template '{desc|firstline} {author} {date|isodate} \n' -r .
962 $ hg log --template '{desc|firstline} {author} {date|isodate} \n' -r .
963 pending changes temporary commit shelve@localhost 1970-01-01 00:00 +0000
963 pending changes temporary commit shelve@localhost 1970-01-01 00:00 +0000
964 $ hg merge --abort
964 $ hg merge --abort
965 abort: cannot abort merge with unshelve in progress
965 abort: cannot abort merge with unshelve in progress
966 (use 'hg unshelve --continue' or 'hg unshelve --abort')
966 (use 'hg unshelve --continue' or 'hg unshelve --abort')
967 [20]
967 [20]
968
968
969 $ hg unshelve --abort
969 $ hg unshelve --abort
970 unshelve of 'default' aborted
970 unshelve of 'default' aborted
971
971
972 $ hg log -G --template '{desc|firstline} {author} {date|isodate} \n' -r .
972 $ hg log -G --template '{desc|firstline} {author} {date|isodate} \n' -r .
973 @ initial commit test 1970-01-01 00:00 +0000
973 @ initial commit test 1970-01-01 00:00 +0000
974
974
975 $ cd ..
975 $ cd ..
976
976
977 Demonstrate that the labels are correct in the merge conflict
977 Demonstrate that the labels are correct in the merge conflict
978 -------------------------------------------------------------
978 -------------------------------------------------------------
979 $ hg init labels
979 $ hg init labels
980 $ cd labels
980 $ cd labels
981 $ echo r0 > foo
981 $ echo r0 > foo
982 $ hg ci -qAm r0
982 $ hg ci -qAm r0
983 $ echo "this will be shelved" >> foo
983 $ echo "this will be shelved" >> foo
984 $ hg shelve -q
984 $ hg shelve -q
985 $ echo "this is in wdir, conflicts with shelve" >> foo
985 $ echo "this is in wdir, conflicts with shelve" >> foo
986 $ hg unshelve -q
986 $ hg unshelve -q
987 warning: conflicts while merging foo! (edit, then use 'hg resolve --mark')
987 warning: conflicts while merging foo! (edit, then use 'hg resolve --mark')
988 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
988 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
989 [240]
989 [240]
990 $ cat foo
990 $ cat foo
991 r0
991 r0
992 <<<<<<< working-copy: 0b2fcf2a90e9 - shelve: pending changes temporary commit
992 <<<<<<< working-copy: 0b2fcf2a90e9 - shelve: pending changes temporary commit
993 this is in wdir, conflicts with shelve
993 this is in wdir, conflicts with shelve
994 =======
994 =======
995 this will be shelved
995 this will be shelved
996 >>>>>>> shelve: 9c072a2163db - shelve: changes to: r0
996 >>>>>>> shelve: 9c072a2163db - shelve: changes to: r0
997 $ cd ..
997 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now