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