##// END OF EJS Templates
shelve: move patch extension to a string constant...
Kostia Balytskyi -
r30554:1775975d default
parent child Browse files
Show More
@@ -1,973 +1,976
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 # universal extension is present in all types of shelves
67 patchextension = 'patch'
66
68
67 # we never need the user, so we use a
69 # we never need the user, so we use a
68 # generic user for all shelve operations
70 # generic user for all shelve operations
69 shelveuser = 'shelve@localhost'
71 shelveuser = 'shelve@localhost'
70
72
71 class shelvedfile(object):
73 class shelvedfile(object):
72 """Helper for the file storing a single shelve
74 """Helper for the file storing a single shelve
73
75
74 Handles common functions on shelve files (.hg/.patch) using
76 Handles common functions on shelve files (.hg/.patch) using
75 the vfs layer"""
77 the vfs layer"""
76 def __init__(self, repo, name, filetype=None):
78 def __init__(self, repo, name, filetype=None):
77 self.repo = repo
79 self.repo = repo
78 self.name = name
80 self.name = name
79 self.vfs = scmutil.vfs(repo.join(shelvedir))
81 self.vfs = scmutil.vfs(repo.join(shelvedir))
80 self.backupvfs = scmutil.vfs(repo.join(backupdir))
82 self.backupvfs = scmutil.vfs(repo.join(backupdir))
81 self.ui = self.repo.ui
83 self.ui = self.repo.ui
82 if filetype:
84 if filetype:
83 self.fname = name + '.' + filetype
85 self.fname = name + '.' + filetype
84 else:
86 else:
85 self.fname = name
87 self.fname = name
86
88
87 def exists(self):
89 def exists(self):
88 return self.vfs.exists(self.fname)
90 return self.vfs.exists(self.fname)
89
91
90 def filename(self):
92 def filename(self):
91 return self.vfs.join(self.fname)
93 return self.vfs.join(self.fname)
92
94
93 def backupfilename(self):
95 def backupfilename(self):
94 def gennames(base):
96 def gennames(base):
95 yield base
97 yield base
96 base, ext = base.rsplit('.', 1)
98 base, ext = base.rsplit('.', 1)
97 for i in itertools.count(1):
99 for i in itertools.count(1):
98 yield '%s-%d.%s' % (base, i, ext)
100 yield '%s-%d.%s' % (base, i, ext)
99
101
100 name = self.backupvfs.join(self.fname)
102 name = self.backupvfs.join(self.fname)
101 for n in gennames(name):
103 for n in gennames(name):
102 if not self.backupvfs.exists(n):
104 if not self.backupvfs.exists(n):
103 return n
105 return n
104
106
105 def movetobackup(self):
107 def movetobackup(self):
106 if not self.backupvfs.isdir():
108 if not self.backupvfs.isdir():
107 self.backupvfs.makedir()
109 self.backupvfs.makedir()
108 util.rename(self.filename(), self.backupfilename())
110 util.rename(self.filename(), self.backupfilename())
109
111
110 def stat(self):
112 def stat(self):
111 return self.vfs.stat(self.fname)
113 return self.vfs.stat(self.fname)
112
114
113 def opener(self, mode='rb'):
115 def opener(self, mode='rb'):
114 try:
116 try:
115 return self.vfs(self.fname, mode)
117 return self.vfs(self.fname, mode)
116 except IOError as err:
118 except IOError as err:
117 if err.errno != errno.ENOENT:
119 if err.errno != errno.ENOENT:
118 raise
120 raise
119 raise error.Abort(_("shelved change '%s' not found") % self.name)
121 raise error.Abort(_("shelved change '%s' not found") % self.name)
120
122
121 def applybundle(self):
123 def applybundle(self):
122 fp = self.opener()
124 fp = self.opener()
123 try:
125 try:
124 gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
126 gen = exchange.readbundle(self.repo.ui, fp, self.fname, self.vfs)
125 if not isinstance(gen, bundle2.unbundle20):
127 if not isinstance(gen, bundle2.unbundle20):
126 gen.apply(self.repo, 'unshelve',
128 gen.apply(self.repo, 'unshelve',
127 'bundle:' + self.vfs.join(self.fname),
129 'bundle:' + self.vfs.join(self.fname),
128 targetphase=phases.secret)
130 targetphase=phases.secret)
129 if isinstance(gen, bundle2.unbundle20):
131 if isinstance(gen, bundle2.unbundle20):
130 bundle2.applybundle(self.repo, gen,
132 bundle2.applybundle(self.repo, gen,
131 self.repo.currenttransaction(),
133 self.repo.currenttransaction(),
132 source='unshelve',
134 source='unshelve',
133 url='bundle:' + self.vfs.join(self.fname))
135 url='bundle:' + self.vfs.join(self.fname))
134 finally:
136 finally:
135 fp.close()
137 fp.close()
136
138
137 def bundlerepo(self):
139 def bundlerepo(self):
138 return bundlerepo.bundlerepository(self.repo.baseui, self.repo.root,
140 return bundlerepo.bundlerepository(self.repo.baseui, self.repo.root,
139 self.vfs.join(self.fname))
141 self.vfs.join(self.fname))
140 def writebundle(self, bases, node):
142 def writebundle(self, bases, node):
141 cgversion = changegroup.safeversion(self.repo)
143 cgversion = changegroup.safeversion(self.repo)
142 if cgversion == '01':
144 if cgversion == '01':
143 btype = 'HG10BZ'
145 btype = 'HG10BZ'
144 compression = None
146 compression = None
145 else:
147 else:
146 btype = 'HG20'
148 btype = 'HG20'
147 compression = 'BZ'
149 compression = 'BZ'
148
150
149 cg = changegroup.changegroupsubset(self.repo, bases, [node], 'shelve',
151 cg = changegroup.changegroupsubset(self.repo, bases, [node], 'shelve',
150 version=cgversion)
152 version=cgversion)
151 bundle2.writebundle(self.ui, cg, self.fname, btype, self.vfs,
153 bundle2.writebundle(self.ui, cg, self.fname, btype, self.vfs,
152 compression=compression)
154 compression=compression)
153
155
154 class shelvedstate(object):
156 class shelvedstate(object):
155 """Handle persistence during unshelving operations.
157 """Handle persistence during unshelving operations.
156
158
157 Handles saving and restoring a shelved state. Ensures that different
159 Handles saving and restoring a shelved state. Ensures that different
158 versions of a shelved state are possible and handles them appropriately.
160 versions of a shelved state are possible and handles them appropriately.
159 """
161 """
160 _version = 1
162 _version = 1
161 _filename = 'shelvedstate'
163 _filename = 'shelvedstate'
162 _keep = 'keep'
164 _keep = 'keep'
163 _nokeep = 'nokeep'
165 _nokeep = 'nokeep'
164
166
165 @classmethod
167 @classmethod
166 def load(cls, repo):
168 def load(cls, repo):
167 fp = repo.vfs(cls._filename)
169 fp = repo.vfs(cls._filename)
168 try:
170 try:
169 version = int(fp.readline().strip())
171 version = int(fp.readline().strip())
170
172
171 if version != cls._version:
173 if version != cls._version:
172 raise error.Abort(_('this version of shelve is incompatible '
174 raise error.Abort(_('this version of shelve is incompatible '
173 'with the version used in this repo'))
175 'with the version used in this repo'))
174 name = fp.readline().strip()
176 name = fp.readline().strip()
175 wctx = nodemod.bin(fp.readline().strip())
177 wctx = nodemod.bin(fp.readline().strip())
176 pendingctx = nodemod.bin(fp.readline().strip())
178 pendingctx = nodemod.bin(fp.readline().strip())
177 parents = [nodemod.bin(h) for h in fp.readline().split()]
179 parents = [nodemod.bin(h) for h in fp.readline().split()]
178 stripnodes = [nodemod.bin(h) for h in fp.readline().split()]
180 stripnodes = [nodemod.bin(h) for h in fp.readline().split()]
179 branchtorestore = fp.readline().strip()
181 branchtorestore = fp.readline().strip()
180 keep = fp.readline().strip() == cls._keep
182 keep = fp.readline().strip() == cls._keep
181 except (ValueError, TypeError) as err:
183 except (ValueError, TypeError) as err:
182 raise error.CorruptedState(str(err))
184 raise error.CorruptedState(str(err))
183 finally:
185 finally:
184 fp.close()
186 fp.close()
185
187
186 try:
188 try:
187 obj = cls()
189 obj = cls()
188 obj.name = name
190 obj.name = name
189 obj.wctx = repo[wctx]
191 obj.wctx = repo[wctx]
190 obj.pendingctx = repo[pendingctx]
192 obj.pendingctx = repo[pendingctx]
191 obj.parents = parents
193 obj.parents = parents
192 obj.stripnodes = stripnodes
194 obj.stripnodes = stripnodes
193 obj.branchtorestore = branchtorestore
195 obj.branchtorestore = branchtorestore
194 obj.keep = keep
196 obj.keep = keep
195 except error.RepoLookupError as err:
197 except error.RepoLookupError as err:
196 raise error.CorruptedState(str(err))
198 raise error.CorruptedState(str(err))
197
199
198 return obj
200 return obj
199
201
200 @classmethod
202 @classmethod
201 def save(cls, repo, name, originalwctx, pendingctx, stripnodes,
203 def save(cls, repo, name, originalwctx, pendingctx, stripnodes,
202 branchtorestore, keep=False):
204 branchtorestore, keep=False):
203 fp = repo.vfs(cls._filename, 'wb')
205 fp = repo.vfs(cls._filename, 'wb')
204 fp.write('%i\n' % cls._version)
206 fp.write('%i\n' % cls._version)
205 fp.write('%s\n' % name)
207 fp.write('%s\n' % name)
206 fp.write('%s\n' % nodemod.hex(originalwctx.node()))
208 fp.write('%s\n' % nodemod.hex(originalwctx.node()))
207 fp.write('%s\n' % nodemod.hex(pendingctx.node()))
209 fp.write('%s\n' % nodemod.hex(pendingctx.node()))
208 fp.write('%s\n' %
210 fp.write('%s\n' %
209 ' '.join([nodemod.hex(p) for p in repo.dirstate.parents()]))
211 ' '.join([nodemod.hex(p) for p in repo.dirstate.parents()]))
210 fp.write('%s\n' %
212 fp.write('%s\n' %
211 ' '.join([nodemod.hex(n) for n in stripnodes]))
213 ' '.join([nodemod.hex(n) for n in stripnodes]))
212 fp.write('%s\n' % branchtorestore)
214 fp.write('%s\n' % branchtorestore)
213 fp.write('%s\n' % (cls._keep if keep else cls._nokeep))
215 fp.write('%s\n' % (cls._keep if keep else cls._nokeep))
214 fp.close()
216 fp.close()
215
217
216 @classmethod
218 @classmethod
217 def clear(cls, repo):
219 def clear(cls, repo):
218 util.unlinkpath(repo.join(cls._filename), ignoremissing=True)
220 util.unlinkpath(repo.join(cls._filename), ignoremissing=True)
219
221
220 def cleanupoldbackups(repo):
222 def cleanupoldbackups(repo):
221 vfs = scmutil.vfs(repo.join(backupdir))
223 vfs = scmutil.vfs(repo.join(backupdir))
222 maxbackups = repo.ui.configint('shelve', 'maxbackups', 10)
224 maxbackups = repo.ui.configint('shelve', 'maxbackups', 10)
223 hgfiles = [f for f in vfs.listdir() if f.endswith('.hg')]
225 hgfiles = [f for f in vfs.listdir()
226 if f.endswith('.' + patchextension)]
224 hgfiles = sorted([(vfs.stat(f).st_mtime, f) for f in hgfiles])
227 hgfiles = sorted([(vfs.stat(f).st_mtime, f) for f in hgfiles])
225 if 0 < maxbackups and maxbackups < len(hgfiles):
228 if 0 < maxbackups and maxbackups < len(hgfiles):
226 bordermtime = hgfiles[-maxbackups][0]
229 bordermtime = hgfiles[-maxbackups][0]
227 else:
230 else:
228 bordermtime = None
231 bordermtime = None
229 for mtime, f in hgfiles[:len(hgfiles) - maxbackups]:
232 for mtime, f in hgfiles[:len(hgfiles) - maxbackups]:
230 if mtime == bordermtime:
233 if mtime == bordermtime:
231 # keep it, because timestamp can't decide exact order of backups
234 # keep it, because timestamp can't decide exact order of backups
232 continue
235 continue
233 base = f[:-3]
236 base = f[:-(1 + len(patchextension))]
234 for ext in shelvefileextensions:
237 for ext in shelvefileextensions:
235 try:
238 try:
236 vfs.unlink(base + '.' + ext)
239 vfs.unlink(base + '.' + ext)
237 except OSError as err:
240 except OSError as err:
238 if err.errno != errno.ENOENT:
241 if err.errno != errno.ENOENT:
239 raise
242 raise
240
243
241 def _aborttransaction(repo):
244 def _aborttransaction(repo):
242 '''Abort current transaction for shelve/unshelve, but keep dirstate
245 '''Abort current transaction for shelve/unshelve, but keep dirstate
243 '''
246 '''
244 tr = repo.currenttransaction()
247 tr = repo.currenttransaction()
245 repo.dirstate.savebackup(tr, suffix='.shelve')
248 repo.dirstate.savebackup(tr, suffix='.shelve')
246 tr.abort()
249 tr.abort()
247 repo.dirstate.restorebackup(None, suffix='.shelve')
250 repo.dirstate.restorebackup(None, suffix='.shelve')
248
251
249 def createcmd(ui, repo, pats, opts):
252 def createcmd(ui, repo, pats, opts):
250 """subcommand that creates a new shelve"""
253 """subcommand that creates a new shelve"""
251 with repo.wlock():
254 with repo.wlock():
252 cmdutil.checkunfinished(repo)
255 cmdutil.checkunfinished(repo)
253 return _docreatecmd(ui, repo, pats, opts)
256 return _docreatecmd(ui, repo, pats, opts)
254
257
255 def getshelvename(repo, parent, opts):
258 def getshelvename(repo, parent, opts):
256 """Decide on the name this shelve is going to have"""
259 """Decide on the name this shelve is going to have"""
257 def gennames():
260 def gennames():
258 yield label
261 yield label
259 for i in xrange(1, 100):
262 for i in xrange(1, 100):
260 yield '%s-%02d' % (label, i)
263 yield '%s-%02d' % (label, i)
261 name = opts.get('name')
264 name = opts.get('name')
262 label = repo._activebookmark or parent.branch() or 'default'
265 label = repo._activebookmark or parent.branch() or 'default'
263 # slashes aren't allowed in filenames, therefore we rename it
266 # slashes aren't allowed in filenames, therefore we rename it
264 label = label.replace('/', '_')
267 label = label.replace('/', '_')
265
268
266 if name:
269 if name:
267 if shelvedfile(repo, name, 'hg').exists():
270 if shelvedfile(repo, name, patchextension).exists():
268 e = _("a shelved change named '%s' already exists") % name
271 e = _("a shelved change named '%s' already exists") % name
269 raise error.Abort(e)
272 raise error.Abort(e)
270 else:
273 else:
271 for n in gennames():
274 for n in gennames():
272 if not shelvedfile(repo, n, 'hg').exists():
275 if not shelvedfile(repo, n, patchextension).exists():
273 name = n
276 name = n
274 break
277 break
275 else:
278 else:
276 raise error.Abort(_("too many shelved changes named '%s'") % label)
279 raise error.Abort(_("too many shelved changes named '%s'") % label)
277
280
278 # ensure we are not creating a subdirectory or a hidden file
281 # ensure we are not creating a subdirectory or a hidden file
279 if '/' in name or '\\' in name:
282 if '/' in name or '\\' in name:
280 raise error.Abort(_('shelved change names may not contain slashes'))
283 raise error.Abort(_('shelved change names may not contain slashes'))
281 if name.startswith('.'):
284 if name.startswith('.'):
282 raise error.Abort(_("shelved change names may not start with '.'"))
285 raise error.Abort(_("shelved change names may not start with '.'"))
283 return name
286 return name
284
287
285 def mutableancestors(ctx):
288 def mutableancestors(ctx):
286 """return all mutable ancestors for ctx (included)
289 """return all mutable ancestors for ctx (included)
287
290
288 Much faster than the revset ancestors(ctx) & draft()"""
291 Much faster than the revset ancestors(ctx) & draft()"""
289 seen = set([nodemod.nullrev])
292 seen = set([nodemod.nullrev])
290 visit = collections.deque()
293 visit = collections.deque()
291 visit.append(ctx)
294 visit.append(ctx)
292 while visit:
295 while visit:
293 ctx = visit.popleft()
296 ctx = visit.popleft()
294 yield ctx.node()
297 yield ctx.node()
295 for parent in ctx.parents():
298 for parent in ctx.parents():
296 rev = parent.rev()
299 rev = parent.rev()
297 if rev not in seen:
300 if rev not in seen:
298 seen.add(rev)
301 seen.add(rev)
299 if parent.mutable():
302 if parent.mutable():
300 visit.append(parent)
303 visit.append(parent)
301
304
302 def getcommitfunc(extra, interactive, editor=False):
305 def getcommitfunc(extra, interactive, editor=False):
303 def commitfunc(ui, repo, message, match, opts):
306 def commitfunc(ui, repo, message, match, opts):
304 hasmq = util.safehasattr(repo, 'mq')
307 hasmq = util.safehasattr(repo, 'mq')
305 if hasmq:
308 if hasmq:
306 saved, repo.mq.checkapplied = repo.mq.checkapplied, False
309 saved, repo.mq.checkapplied = repo.mq.checkapplied, False
307 backup = repo.ui.backupconfig('phases', 'new-commit')
310 backup = repo.ui.backupconfig('phases', 'new-commit')
308 try:
311 try:
309 repo.ui.setconfig('phases', 'new-commit', phases.secret)
312 repo.ui.setconfig('phases', 'new-commit', phases.secret)
310 editor_ = False
313 editor_ = False
311 if editor:
314 if editor:
312 editor_ = cmdutil.getcommiteditor(editform='shelve.shelve',
315 editor_ = cmdutil.getcommiteditor(editform='shelve.shelve',
313 **opts)
316 **opts)
314 return repo.commit(message, shelveuser, opts.get('date'), match,
317 return repo.commit(message, shelveuser, opts.get('date'), match,
315 editor=editor_, extra=extra)
318 editor=editor_, extra=extra)
316 finally:
319 finally:
317 repo.ui.restoreconfig(backup)
320 repo.ui.restoreconfig(backup)
318 if hasmq:
321 if hasmq:
319 repo.mq.checkapplied = saved
322 repo.mq.checkapplied = saved
320
323
321 def interactivecommitfunc(ui, repo, *pats, **opts):
324 def interactivecommitfunc(ui, repo, *pats, **opts):
322 match = scmutil.match(repo['.'], pats, {})
325 match = scmutil.match(repo['.'], pats, {})
323 message = opts['message']
326 message = opts['message']
324 return commitfunc(ui, repo, message, match, opts)
327 return commitfunc(ui, repo, message, match, opts)
325
328
326 return interactivecommitfunc if interactive else commitfunc
329 return interactivecommitfunc if interactive else commitfunc
327
330
328 def _nothingtoshelvemessaging(ui, repo, pats, opts):
331 def _nothingtoshelvemessaging(ui, repo, pats, opts):
329 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
332 stat = repo.status(match=scmutil.match(repo[None], pats, opts))
330 if stat.deleted:
333 if stat.deleted:
331 ui.status(_("nothing changed (%d missing files, see "
334 ui.status(_("nothing changed (%d missing files, see "
332 "'hg status')\n") % len(stat.deleted))
335 "'hg status')\n") % len(stat.deleted))
333 else:
336 else:
334 ui.status(_("nothing changed\n"))
337 ui.status(_("nothing changed\n"))
335
338
336 def _shelvecreatedcommit(repo, node, name):
339 def _shelvecreatedcommit(repo, node, name):
337 bases = list(mutableancestors(repo[node]))
340 bases = list(mutableancestors(repo[node]))
338 shelvedfile(repo, name, 'hg').writebundle(bases, node)
341 shelvedfile(repo, name, 'hg').writebundle(bases, node)
339 cmdutil.export(repo, [node],
342 cmdutil.export(repo, [node],
340 fp=shelvedfile(repo, name, 'patch').opener('wb'),
343 fp=shelvedfile(repo, name, patchextension).opener('wb'),
341 opts=mdiff.diffopts(git=True))
344 opts=mdiff.diffopts(git=True))
342
345
343 def _includeunknownfiles(repo, pats, opts, extra):
346 def _includeunknownfiles(repo, pats, opts, extra):
344 s = repo.status(match=scmutil.match(repo[None], pats, opts),
347 s = repo.status(match=scmutil.match(repo[None], pats, opts),
345 unknown=True)
348 unknown=True)
346 if s.unknown:
349 if s.unknown:
347 extra['shelve_unknown'] = '\0'.join(s.unknown)
350 extra['shelve_unknown'] = '\0'.join(s.unknown)
348 repo[None].add(s.unknown)
351 repo[None].add(s.unknown)
349
352
350 def _finishshelve(repo):
353 def _finishshelve(repo):
351 _aborttransaction(repo)
354 _aborttransaction(repo)
352
355
353 def _docreatecmd(ui, repo, pats, opts):
356 def _docreatecmd(ui, repo, pats, opts):
354 wctx = repo[None]
357 wctx = repo[None]
355 parents = wctx.parents()
358 parents = wctx.parents()
356 if len(parents) > 1:
359 if len(parents) > 1:
357 raise error.Abort(_('cannot shelve while merging'))
360 raise error.Abort(_('cannot shelve while merging'))
358 parent = parents[0]
361 parent = parents[0]
359 origbranch = wctx.branch()
362 origbranch = wctx.branch()
360
363
361 if parent.node() != nodemod.nullid:
364 if parent.node() != nodemod.nullid:
362 desc = "changes to: %s" % parent.description().split('\n', 1)[0]
365 desc = "changes to: %s" % parent.description().split('\n', 1)[0]
363 else:
366 else:
364 desc = '(changes in empty repository)'
367 desc = '(changes in empty repository)'
365
368
366 if not opts.get('message'):
369 if not opts.get('message'):
367 opts['message'] = desc
370 opts['message'] = desc
368
371
369 lock = tr = None
372 lock = tr = None
370 try:
373 try:
371 lock = repo.lock()
374 lock = repo.lock()
372
375
373 # use an uncommitted transaction to generate the bundle to avoid
376 # use an uncommitted transaction to generate the bundle to avoid
374 # pull races. ensure we don't print the abort message to stderr.
377 # pull races. ensure we don't print the abort message to stderr.
375 tr = repo.transaction('commit', report=lambda x: None)
378 tr = repo.transaction('commit', report=lambda x: None)
376
379
377 interactive = opts.get('interactive', False)
380 interactive = opts.get('interactive', False)
378 includeunknown = (opts.get('unknown', False) and
381 includeunknown = (opts.get('unknown', False) and
379 not opts.get('addremove', False))
382 not opts.get('addremove', False))
380
383
381 name = getshelvename(repo, parent, opts)
384 name = getshelvename(repo, parent, opts)
382 extra = {}
385 extra = {}
383 if includeunknown:
386 if includeunknown:
384 _includeunknownfiles(repo, pats, opts, extra)
387 _includeunknownfiles(repo, pats, opts, extra)
385
388
386 if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts):
389 if _iswctxonnewbranch(repo) and not _isbareshelve(pats, opts):
387 # In non-bare shelve we don't store newly created branch
390 # In non-bare shelve we don't store newly created branch
388 # at bundled commit
391 # at bundled commit
389 repo.dirstate.setbranch(repo['.'].branch())
392 repo.dirstate.setbranch(repo['.'].branch())
390
393
391 commitfunc = getcommitfunc(extra, interactive, editor=True)
394 commitfunc = getcommitfunc(extra, interactive, editor=True)
392 if not interactive:
395 if not interactive:
393 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
396 node = cmdutil.commit(ui, repo, commitfunc, pats, opts)
394 else:
397 else:
395 node = cmdutil.dorecord(ui, repo, commitfunc, None,
398 node = cmdutil.dorecord(ui, repo, commitfunc, None,
396 False, cmdutil.recordfilter, *pats, **opts)
399 False, cmdutil.recordfilter, *pats, **opts)
397 if not node:
400 if not node:
398 _nothingtoshelvemessaging(ui, repo, pats, opts)
401 _nothingtoshelvemessaging(ui, repo, pats, opts)
399 return 1
402 return 1
400
403
401 _shelvecreatedcommit(repo, node, name)
404 _shelvecreatedcommit(repo, node, name)
402
405
403 if ui.formatted():
406 if ui.formatted():
404 desc = util.ellipsis(desc, ui.termwidth())
407 desc = util.ellipsis(desc, ui.termwidth())
405 ui.status(_('shelved as %s\n') % name)
408 ui.status(_('shelved as %s\n') % name)
406 hg.update(repo, parent.node())
409 hg.update(repo, parent.node())
407 if origbranch != repo['.'].branch() and not _isbareshelve(pats, opts):
410 if origbranch != repo['.'].branch() and not _isbareshelve(pats, opts):
408 repo.dirstate.setbranch(origbranch)
411 repo.dirstate.setbranch(origbranch)
409
412
410 _finishshelve(repo)
413 _finishshelve(repo)
411 finally:
414 finally:
412 lockmod.release(tr, lock)
415 lockmod.release(tr, lock)
413
416
414 def _isbareshelve(pats, opts):
417 def _isbareshelve(pats, opts):
415 return (not pats
418 return (not pats
416 and not opts.get('interactive', False)
419 and not opts.get('interactive', False)
417 and not opts.get('include', False)
420 and not opts.get('include', False)
418 and not opts.get('exclude', False))
421 and not opts.get('exclude', False))
419
422
420 def _iswctxonnewbranch(repo):
423 def _iswctxonnewbranch(repo):
421 return repo[None].branch() != repo['.'].branch()
424 return repo[None].branch() != repo['.'].branch()
422
425
423 def cleanupcmd(ui, repo):
426 def cleanupcmd(ui, repo):
424 """subcommand that deletes all shelves"""
427 """subcommand that deletes all shelves"""
425
428
426 with repo.wlock():
429 with repo.wlock():
427 for (name, _type) in repo.vfs.readdir(shelvedir):
430 for (name, _type) in repo.vfs.readdir(shelvedir):
428 suffix = name.rsplit('.', 1)[-1]
431 suffix = name.rsplit('.', 1)[-1]
429 if suffix in shelvefileextensions:
432 if suffix in shelvefileextensions:
430 shelvedfile(repo, name).movetobackup()
433 shelvedfile(repo, name).movetobackup()
431 cleanupoldbackups(repo)
434 cleanupoldbackups(repo)
432
435
433 def deletecmd(ui, repo, pats):
436 def deletecmd(ui, repo, pats):
434 """subcommand that deletes a specific shelve"""
437 """subcommand that deletes a specific shelve"""
435 if not pats:
438 if not pats:
436 raise error.Abort(_('no shelved changes specified!'))
439 raise error.Abort(_('no shelved changes specified!'))
437 with repo.wlock():
440 with repo.wlock():
438 try:
441 try:
439 for name in pats:
442 for name in pats:
440 for suffix in shelvefileextensions:
443 for suffix in shelvefileextensions:
441 shfile = shelvedfile(repo, name, suffix)
444 shfile = shelvedfile(repo, name, suffix)
442 # patch file is necessary, as it should
445 # patch file is necessary, as it should
443 # be present for any kind of shelve,
446 # be present for any kind of shelve,
444 # but the .hg file is optional as in future we
447 # but the .hg file is optional as in future we
445 # will add obsolete shelve with does not create a
448 # will add obsolete shelve with does not create a
446 # bundle
449 # bundle
447 if shfile.exists() or suffix == 'patch':
450 if shfile.exists() or suffix == patchextension:
448 shfile.movetobackup()
451 shfile.movetobackup()
449 cleanupoldbackups(repo)
452 cleanupoldbackups(repo)
450 except OSError as err:
453 except OSError as err:
451 if err.errno != errno.ENOENT:
454 if err.errno != errno.ENOENT:
452 raise
455 raise
453 raise error.Abort(_("shelved change '%s' not found") % name)
456 raise error.Abort(_("shelved change '%s' not found") % name)
454
457
455 def listshelves(repo):
458 def listshelves(repo):
456 """return all shelves in repo as list of (time, filename)"""
459 """return all shelves in repo as list of (time, filename)"""
457 try:
460 try:
458 names = repo.vfs.readdir(shelvedir)
461 names = repo.vfs.readdir(shelvedir)
459 except OSError as err:
462 except OSError as err:
460 if err.errno != errno.ENOENT:
463 if err.errno != errno.ENOENT:
461 raise
464 raise
462 return []
465 return []
463 info = []
466 info = []
464 for (name, _type) in names:
467 for (name, _type) in names:
465 pfx, sfx = name.rsplit('.', 1)
468 pfx, sfx = name.rsplit('.', 1)
466 if not pfx or sfx != 'patch':
469 if not pfx or sfx != patchextension:
467 continue
470 continue
468 st = shelvedfile(repo, name).stat()
471 st = shelvedfile(repo, name).stat()
469 info.append((st.st_mtime, shelvedfile(repo, pfx).filename()))
472 info.append((st.st_mtime, shelvedfile(repo, pfx).filename()))
470 return sorted(info, reverse=True)
473 return sorted(info, reverse=True)
471
474
472 def listcmd(ui, repo, pats, opts):
475 def listcmd(ui, repo, pats, opts):
473 """subcommand that displays the list of shelves"""
476 """subcommand that displays the list of shelves"""
474 pats = set(pats)
477 pats = set(pats)
475 width = 80
478 width = 80
476 if not ui.plain():
479 if not ui.plain():
477 width = ui.termwidth()
480 width = ui.termwidth()
478 namelabel = 'shelve.newest'
481 namelabel = 'shelve.newest'
479 for mtime, name in listshelves(repo):
482 for mtime, name in listshelves(repo):
480 sname = util.split(name)[1]
483 sname = util.split(name)[1]
481 if pats and sname not in pats:
484 if pats and sname not in pats:
482 continue
485 continue
483 ui.write(sname, label=namelabel)
486 ui.write(sname, label=namelabel)
484 namelabel = 'shelve.name'
487 namelabel = 'shelve.name'
485 if ui.quiet:
488 if ui.quiet:
486 ui.write('\n')
489 ui.write('\n')
487 continue
490 continue
488 ui.write(' ' * (16 - len(sname)))
491 ui.write(' ' * (16 - len(sname)))
489 used = 16
492 used = 16
490 age = '(%s)' % templatefilters.age(util.makedate(mtime), abbrev=True)
493 age = '(%s)' % templatefilters.age(util.makedate(mtime), abbrev=True)
491 ui.write(age, label='shelve.age')
494 ui.write(age, label='shelve.age')
492 ui.write(' ' * (12 - len(age)))
495 ui.write(' ' * (12 - len(age)))
493 used += 12
496 used += 12
494 with open(name + '.patch', 'rb') as fp:
497 with open(name + '.' + patchextension, 'rb') as fp:
495 while True:
498 while True:
496 line = fp.readline()
499 line = fp.readline()
497 if not line:
500 if not line:
498 break
501 break
499 if not line.startswith('#'):
502 if not line.startswith('#'):
500 desc = line.rstrip()
503 desc = line.rstrip()
501 if ui.formatted():
504 if ui.formatted():
502 desc = util.ellipsis(desc, width - used)
505 desc = util.ellipsis(desc, width - used)
503 ui.write(desc)
506 ui.write(desc)
504 break
507 break
505 ui.write('\n')
508 ui.write('\n')
506 if not (opts['patch'] or opts['stat']):
509 if not (opts['patch'] or opts['stat']):
507 continue
510 continue
508 difflines = fp.readlines()
511 difflines = fp.readlines()
509 if opts['patch']:
512 if opts['patch']:
510 for chunk, label in patch.difflabel(iter, difflines):
513 for chunk, label in patch.difflabel(iter, difflines):
511 ui.write(chunk, label=label)
514 ui.write(chunk, label=label)
512 if opts['stat']:
515 if opts['stat']:
513 for chunk, label in patch.diffstatui(difflines, width=width):
516 for chunk, label in patch.diffstatui(difflines, width=width):
514 ui.write(chunk, label=label)
517 ui.write(chunk, label=label)
515
518
516 def singlepatchcmds(ui, repo, pats, opts, subcommand):
519 def singlepatchcmds(ui, repo, pats, opts, subcommand):
517 """subcommand that displays a single shelf"""
520 """subcommand that displays a single shelf"""
518 if len(pats) != 1:
521 if len(pats) != 1:
519 raise error.Abort(_("--%s expects a single shelf") % subcommand)
522 raise error.Abort(_("--%s expects a single shelf") % subcommand)
520 shelfname = pats[0]
523 shelfname = pats[0]
521
524
522 if not shelvedfile(repo, shelfname, 'patch').exists():
525 if not shelvedfile(repo, shelfname, patchextension).exists():
523 raise error.Abort(_("cannot find shelf %s") % shelfname)
526 raise error.Abort(_("cannot find shelf %s") % shelfname)
524
527
525 listcmd(ui, repo, pats, opts)
528 listcmd(ui, repo, pats, opts)
526
529
527 def checkparents(repo, state):
530 def checkparents(repo, state):
528 """check parent while resuming an unshelve"""
531 """check parent while resuming an unshelve"""
529 if state.parents != repo.dirstate.parents():
532 if state.parents != repo.dirstate.parents():
530 raise error.Abort(_('working directory parents do not match unshelve '
533 raise error.Abort(_('working directory parents do not match unshelve '
531 'state'))
534 'state'))
532
535
533 def pathtofiles(repo, files):
536 def pathtofiles(repo, files):
534 cwd = repo.getcwd()
537 cwd = repo.getcwd()
535 return [repo.pathto(f, cwd) for f in files]
538 return [repo.pathto(f, cwd) for f in files]
536
539
537 def unshelveabort(ui, repo, state, opts):
540 def unshelveabort(ui, repo, state, opts):
538 """subcommand that abort an in-progress unshelve"""
541 """subcommand that abort an in-progress unshelve"""
539 with repo.lock():
542 with repo.lock():
540 try:
543 try:
541 checkparents(repo, state)
544 checkparents(repo, state)
542
545
543 util.rename(repo.join('unshelverebasestate'),
546 util.rename(repo.join('unshelverebasestate'),
544 repo.join('rebasestate'))
547 repo.join('rebasestate'))
545 try:
548 try:
546 rebase.rebase(ui, repo, **{
549 rebase.rebase(ui, repo, **{
547 'abort' : True
550 'abort' : True
548 })
551 })
549 except Exception:
552 except Exception:
550 util.rename(repo.join('rebasestate'),
553 util.rename(repo.join('rebasestate'),
551 repo.join('unshelverebasestate'))
554 repo.join('unshelverebasestate'))
552 raise
555 raise
553
556
554 mergefiles(ui, repo, state.wctx, state.pendingctx)
557 mergefiles(ui, repo, state.wctx, state.pendingctx)
555 repair.strip(ui, repo, state.stripnodes, backup=False,
558 repair.strip(ui, repo, state.stripnodes, backup=False,
556 topic='shelve')
559 topic='shelve')
557 finally:
560 finally:
558 shelvedstate.clear(repo)
561 shelvedstate.clear(repo)
559 ui.warn(_("unshelve of '%s' aborted\n") % state.name)
562 ui.warn(_("unshelve of '%s' aborted\n") % state.name)
560
563
561 def mergefiles(ui, repo, wctx, shelvectx):
564 def mergefiles(ui, repo, wctx, shelvectx):
562 """updates to wctx and merges the changes from shelvectx into the
565 """updates to wctx and merges the changes from shelvectx into the
563 dirstate."""
566 dirstate."""
564 oldquiet = ui.quiet
567 oldquiet = ui.quiet
565 try:
568 try:
566 ui.quiet = True
569 ui.quiet = True
567 hg.update(repo, wctx.node())
570 hg.update(repo, wctx.node())
568 files = []
571 files = []
569 files.extend(shelvectx.files())
572 files.extend(shelvectx.files())
570 files.extend(shelvectx.parents()[0].files())
573 files.extend(shelvectx.parents()[0].files())
571
574
572 # revert will overwrite unknown files, so move them out of the way
575 # revert will overwrite unknown files, so move them out of the way
573 for file in repo.status(unknown=True).unknown:
576 for file in repo.status(unknown=True).unknown:
574 if file in files:
577 if file in files:
575 util.rename(file, scmutil.origpath(ui, repo, file))
578 util.rename(file, scmutil.origpath(ui, repo, file))
576 ui.pushbuffer(True)
579 ui.pushbuffer(True)
577 cmdutil.revert(ui, repo, shelvectx, repo.dirstate.parents(),
580 cmdutil.revert(ui, repo, shelvectx, repo.dirstate.parents(),
578 *pathtofiles(repo, files),
581 *pathtofiles(repo, files),
579 **{'no_backup': True})
582 **{'no_backup': True})
580 ui.popbuffer()
583 ui.popbuffer()
581 finally:
584 finally:
582 ui.quiet = oldquiet
585 ui.quiet = oldquiet
583
586
584 def restorebranch(ui, repo, branchtorestore):
587 def restorebranch(ui, repo, branchtorestore):
585 if branchtorestore and branchtorestore != repo.dirstate.branch():
588 if branchtorestore and branchtorestore != repo.dirstate.branch():
586 repo.dirstate.setbranch(branchtorestore)
589 repo.dirstate.setbranch(branchtorestore)
587 ui.status(_('marked working directory as branch %s\n')
590 ui.status(_('marked working directory as branch %s\n')
588 % branchtorestore)
591 % branchtorestore)
589
592
590 def unshelvecleanup(ui, repo, name, opts):
593 def unshelvecleanup(ui, repo, name, opts):
591 """remove related files after an unshelve"""
594 """remove related files after an unshelve"""
592 if not opts.get('keep'):
595 if not opts.get('keep'):
593 for filetype in shelvefileextensions:
596 for filetype in shelvefileextensions:
594 shfile = shelvedfile(repo, name, filetype)
597 shfile = shelvedfile(repo, name, filetype)
595 if shfile.exists():
598 if shfile.exists():
596 shfile.movetobackup()
599 shfile.movetobackup()
597 cleanupoldbackups(repo)
600 cleanupoldbackups(repo)
598
601
599 def unshelvecontinue(ui, repo, state, opts):
602 def unshelvecontinue(ui, repo, state, opts):
600 """subcommand to continue an in-progress unshelve"""
603 """subcommand to continue an in-progress unshelve"""
601 # We're finishing off a merge. First parent is our original
604 # We're finishing off a merge. First parent is our original
602 # parent, second is the temporary "fake" commit we're unshelving.
605 # parent, second is the temporary "fake" commit we're unshelving.
603 with repo.lock():
606 with repo.lock():
604 checkparents(repo, state)
607 checkparents(repo, state)
605 ms = merge.mergestate.read(repo)
608 ms = merge.mergestate.read(repo)
606 if [f for f in ms if ms[f] == 'u']:
609 if [f for f in ms if ms[f] == 'u']:
607 raise error.Abort(
610 raise error.Abort(
608 _("unresolved conflicts, can't continue"),
611 _("unresolved conflicts, can't continue"),
609 hint=_("see 'hg resolve', then 'hg unshelve --continue'"))
612 hint=_("see 'hg resolve', then 'hg unshelve --continue'"))
610
613
611 util.rename(repo.join('unshelverebasestate'),
614 util.rename(repo.join('unshelverebasestate'),
612 repo.join('rebasestate'))
615 repo.join('rebasestate'))
613 try:
616 try:
614 rebase.rebase(ui, repo, **{
617 rebase.rebase(ui, repo, **{
615 'continue' : True
618 'continue' : True
616 })
619 })
617 except Exception:
620 except Exception:
618 util.rename(repo.join('rebasestate'),
621 util.rename(repo.join('rebasestate'),
619 repo.join('unshelverebasestate'))
622 repo.join('unshelverebasestate'))
620 raise
623 raise
621
624
622 shelvectx = repo['tip']
625 shelvectx = repo['tip']
623 if not shelvectx in state.pendingctx.children():
626 if not shelvectx in state.pendingctx.children():
624 # rebase was a no-op, so it produced no child commit
627 # rebase was a no-op, so it produced no child commit
625 shelvectx = state.pendingctx
628 shelvectx = state.pendingctx
626 else:
629 else:
627 # only strip the shelvectx if the rebase produced it
630 # only strip the shelvectx if the rebase produced it
628 state.stripnodes.append(shelvectx.node())
631 state.stripnodes.append(shelvectx.node())
629
632
630 mergefiles(ui, repo, state.wctx, shelvectx)
633 mergefiles(ui, repo, state.wctx, shelvectx)
631 restorebranch(ui, repo, state.branchtorestore)
634 restorebranch(ui, repo, state.branchtorestore)
632
635
633 repair.strip(ui, repo, state.stripnodes, backup=False, topic='shelve')
636 repair.strip(ui, repo, state.stripnodes, backup=False, topic='shelve')
634 shelvedstate.clear(repo)
637 shelvedstate.clear(repo)
635 unshelvecleanup(ui, repo, state.name, opts)
638 unshelvecleanup(ui, repo, state.name, opts)
636 ui.status(_("unshelve of '%s' complete\n") % state.name)
639 ui.status(_("unshelve of '%s' complete\n") % state.name)
637
640
638 def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
641 def _commitworkingcopychanges(ui, repo, opts, tmpwctx):
639 """Temporarily commit working copy changes before moving unshelve commit"""
642 """Temporarily commit working copy changes before moving unshelve commit"""
640 # Store pending changes in a commit and remember added in case a shelve
643 # Store pending changes in a commit and remember added in case a shelve
641 # contains unknown files that are part of the pending change
644 # contains unknown files that are part of the pending change
642 s = repo.status()
645 s = repo.status()
643 addedbefore = frozenset(s.added)
646 addedbefore = frozenset(s.added)
644 if not (s.modified or s.added or s.removed or s.deleted):
647 if not (s.modified or s.added or s.removed or s.deleted):
645 return tmpwctx, addedbefore
648 return tmpwctx, addedbefore
646 ui.status(_("temporarily committing pending changes "
649 ui.status(_("temporarily committing pending changes "
647 "(restore with 'hg unshelve --abort')\n"))
650 "(restore with 'hg unshelve --abort')\n"))
648 commitfunc = getcommitfunc(extra=None, interactive=False,
651 commitfunc = getcommitfunc(extra=None, interactive=False,
649 editor=False)
652 editor=False)
650 tempopts = {}
653 tempopts = {}
651 tempopts['message'] = "pending changes temporary commit"
654 tempopts['message'] = "pending changes temporary commit"
652 tempopts['date'] = opts.get('date')
655 tempopts['date'] = opts.get('date')
653 ui.quiet = True
656 ui.quiet = True
654 node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
657 node = cmdutil.commit(ui, repo, commitfunc, [], tempopts)
655 tmpwctx = repo[node]
658 tmpwctx = repo[node]
656 return tmpwctx, addedbefore
659 return tmpwctx, addedbefore
657
660
658 def _unshelverestorecommit(ui, repo, basename, oldquiet):
661 def _unshelverestorecommit(ui, repo, basename, oldquiet):
659 """Recreate commit in the repository during the unshelve"""
662 """Recreate commit in the repository during the unshelve"""
660 ui.quiet = True
663 ui.quiet = True
661 shelvedfile(repo, basename, 'hg').applybundle()
664 shelvedfile(repo, basename, 'hg').applybundle()
662 shelvectx = repo['tip']
665 shelvectx = repo['tip']
663 ui.quiet = oldquiet
666 ui.quiet = oldquiet
664 return repo, shelvectx
667 return repo, shelvectx
665
668
666 def _rebaserestoredcommit(ui, repo, opts, tr, oldtiprev, basename, pctx,
669 def _rebaserestoredcommit(ui, repo, opts, tr, oldtiprev, basename, pctx,
667 tmpwctx, shelvectx, branchtorestore):
670 tmpwctx, shelvectx, branchtorestore):
668 """Rebase restored commit from its original location to a destination"""
671 """Rebase restored commit from its original location to a destination"""
669 # If the shelve is not immediately on top of the commit
672 # If the shelve is not immediately on top of the commit
670 # we'll be merging with, rebase it to be on top.
673 # we'll be merging with, rebase it to be on top.
671 if tmpwctx.node() == shelvectx.parents()[0].node():
674 if tmpwctx.node() == shelvectx.parents()[0].node():
672 return shelvectx
675 return shelvectx
673
676
674 ui.status(_('rebasing shelved changes\n'))
677 ui.status(_('rebasing shelved changes\n'))
675 try:
678 try:
676 rebase.rebase(ui, repo, **{
679 rebase.rebase(ui, repo, **{
677 'rev': [shelvectx.rev()],
680 'rev': [shelvectx.rev()],
678 'dest': str(tmpwctx.rev()),
681 'dest': str(tmpwctx.rev()),
679 'keep': True,
682 'keep': True,
680 'tool': opts.get('tool', ''),
683 'tool': opts.get('tool', ''),
681 })
684 })
682 except error.InterventionRequired:
685 except error.InterventionRequired:
683 tr.close()
686 tr.close()
684
687
685 stripnodes = [repo.changelog.node(rev)
688 stripnodes = [repo.changelog.node(rev)
686 for rev in xrange(oldtiprev, len(repo))]
689 for rev in xrange(oldtiprev, len(repo))]
687 shelvedstate.save(repo, basename, pctx, tmpwctx, stripnodes,
690 shelvedstate.save(repo, basename, pctx, tmpwctx, stripnodes,
688 branchtorestore, opts.get('keep'))
691 branchtorestore, opts.get('keep'))
689
692
690 util.rename(repo.join('rebasestate'),
693 util.rename(repo.join('rebasestate'),
691 repo.join('unshelverebasestate'))
694 repo.join('unshelverebasestate'))
692 raise error.InterventionRequired(
695 raise error.InterventionRequired(
693 _("unresolved conflicts (see 'hg resolve', then "
696 _("unresolved conflicts (see 'hg resolve', then "
694 "'hg unshelve --continue')"))
697 "'hg unshelve --continue')"))
695
698
696 # refresh ctx after rebase completes
699 # refresh ctx after rebase completes
697 shelvectx = repo['tip']
700 shelvectx = repo['tip']
698
701
699 if not shelvectx in tmpwctx.children():
702 if not shelvectx in tmpwctx.children():
700 # rebase was a no-op, so it produced no child commit
703 # rebase was a no-op, so it produced no child commit
701 shelvectx = tmpwctx
704 shelvectx = tmpwctx
702 return shelvectx
705 return shelvectx
703
706
704 def _forgetunknownfiles(repo, shelvectx, addedbefore):
707 def _forgetunknownfiles(repo, shelvectx, addedbefore):
705 # Forget any files that were unknown before the shelve, unknown before
708 # Forget any files that were unknown before the shelve, unknown before
706 # unshelve started, but are now added.
709 # unshelve started, but are now added.
707 shelveunknown = shelvectx.extra().get('shelve_unknown')
710 shelveunknown = shelvectx.extra().get('shelve_unknown')
708 if not shelveunknown:
711 if not shelveunknown:
709 return
712 return
710 shelveunknown = frozenset(shelveunknown.split('\0'))
713 shelveunknown = frozenset(shelveunknown.split('\0'))
711 addedafter = frozenset(repo.status().added)
714 addedafter = frozenset(repo.status().added)
712 toforget = (addedafter & shelveunknown) - addedbefore
715 toforget = (addedafter & shelveunknown) - addedbefore
713 repo[None].forget(toforget)
716 repo[None].forget(toforget)
714
717
715 def _finishunshelve(repo, oldtiprev, tr):
718 def _finishunshelve(repo, oldtiprev, tr):
716 # The transaction aborting will strip all the commits for us,
719 # The transaction aborting will strip all the commits for us,
717 # but it doesn't update the inmemory structures, so addchangegroup
720 # but it doesn't update the inmemory structures, so addchangegroup
718 # hooks still fire and try to operate on the missing commits.
721 # hooks still fire and try to operate on the missing commits.
719 # Clean up manually to prevent this.
722 # Clean up manually to prevent this.
720 repo.unfiltered().changelog.strip(oldtiprev, tr)
723 repo.unfiltered().changelog.strip(oldtiprev, tr)
721 _aborttransaction(repo)
724 _aborttransaction(repo)
722
725
723 @command('unshelve',
726 @command('unshelve',
724 [('a', 'abort', None,
727 [('a', 'abort', None,
725 _('abort an incomplete unshelve operation')),
728 _('abort an incomplete unshelve operation')),
726 ('c', 'continue', None,
729 ('c', 'continue', None,
727 _('continue an incomplete unshelve operation')),
730 _('continue an incomplete unshelve operation')),
728 ('k', 'keep', None,
731 ('k', 'keep', None,
729 _('keep shelve after unshelving')),
732 _('keep shelve after unshelving')),
730 ('t', 'tool', '', _('specify merge tool')),
733 ('t', 'tool', '', _('specify merge tool')),
731 ('', 'date', '',
734 ('', 'date', '',
732 _('set date for temporary commits (DEPRECATED)'), _('DATE'))],
735 _('set date for temporary commits (DEPRECATED)'), _('DATE'))],
733 _('hg unshelve [SHELVED]'))
736 _('hg unshelve [SHELVED]'))
734 def unshelve(ui, repo, *shelved, **opts):
737 def unshelve(ui, repo, *shelved, **opts):
735 """restore a shelved change to the working directory
738 """restore a shelved change to the working directory
736
739
737 This command accepts an optional name of a shelved change to
740 This command accepts an optional name of a shelved change to
738 restore. If none is given, the most recent shelved change is used.
741 restore. If none is given, the most recent shelved change is used.
739
742
740 If a shelved change is applied successfully, the bundle that
743 If a shelved change is applied successfully, the bundle that
741 contains the shelved changes is moved to a backup location
744 contains the shelved changes is moved to a backup location
742 (.hg/shelve-backup).
745 (.hg/shelve-backup).
743
746
744 Since you can restore a shelved change on top of an arbitrary
747 Since you can restore a shelved change on top of an arbitrary
745 commit, it is possible that unshelving will result in a conflict
748 commit, it is possible that unshelving will result in a conflict
746 between your changes and the commits you are unshelving onto. If
749 between your changes and the commits you are unshelving onto. If
747 this occurs, you must resolve the conflict, then use
750 this occurs, you must resolve the conflict, then use
748 ``--continue`` to complete the unshelve operation. (The bundle
751 ``--continue`` to complete the unshelve operation. (The bundle
749 will not be moved until you successfully complete the unshelve.)
752 will not be moved until you successfully complete the unshelve.)
750
753
751 (Alternatively, you can use ``--abort`` to abandon an unshelve
754 (Alternatively, you can use ``--abort`` to abandon an unshelve
752 that causes a conflict. This reverts the unshelved changes, and
755 that causes a conflict. This reverts the unshelved changes, and
753 leaves the bundle in place.)
756 leaves the bundle in place.)
754
757
755 If bare shelved change(when no files are specified, without interactive,
758 If bare shelved change(when no files are specified, without interactive,
756 include and exclude option) was done on newly created branch it would
759 include and exclude option) was done on newly created branch it would
757 restore branch information to the working directory.
760 restore branch information to the working directory.
758
761
759 After a successful unshelve, the shelved changes are stored in a
762 After a successful unshelve, the shelved changes are stored in a
760 backup directory. Only the N most recent backups are kept. N
763 backup directory. Only the N most recent backups are kept. N
761 defaults to 10 but can be overridden using the ``shelve.maxbackups``
764 defaults to 10 but can be overridden using the ``shelve.maxbackups``
762 configuration option.
765 configuration option.
763
766
764 .. container:: verbose
767 .. container:: verbose
765
768
766 Timestamp in seconds is used to decide order of backups. More
769 Timestamp in seconds is used to decide order of backups. More
767 than ``maxbackups`` backups are kept, if same timestamp
770 than ``maxbackups`` backups are kept, if same timestamp
768 prevents from deciding exact order of them, for safety.
771 prevents from deciding exact order of them, for safety.
769 """
772 """
770 with repo.wlock():
773 with repo.wlock():
771 return _dounshelve(ui, repo, *shelved, **opts)
774 return _dounshelve(ui, repo, *shelved, **opts)
772
775
773 def _dounshelve(ui, repo, *shelved, **opts):
776 def _dounshelve(ui, repo, *shelved, **opts):
774 abortf = opts.get('abort')
777 abortf = opts.get('abort')
775 continuef = opts.get('continue')
778 continuef = opts.get('continue')
776 if not abortf and not continuef:
779 if not abortf and not continuef:
777 cmdutil.checkunfinished(repo)
780 cmdutil.checkunfinished(repo)
778
781
779 if abortf or continuef:
782 if abortf or continuef:
780 if abortf and continuef:
783 if abortf and continuef:
781 raise error.Abort(_('cannot use both abort and continue'))
784 raise error.Abort(_('cannot use both abort and continue'))
782 if shelved:
785 if shelved:
783 raise error.Abort(_('cannot combine abort/continue with '
786 raise error.Abort(_('cannot combine abort/continue with '
784 'naming a shelved change'))
787 'naming a shelved change'))
785 if abortf and opts.get('tool', False):
788 if abortf and opts.get('tool', False):
786 ui.warn(_('tool option will be ignored\n'))
789 ui.warn(_('tool option will be ignored\n'))
787
790
788 try:
791 try:
789 state = shelvedstate.load(repo)
792 state = shelvedstate.load(repo)
790 if opts.get('keep') is None:
793 if opts.get('keep') is None:
791 opts['keep'] = state.keep
794 opts['keep'] = state.keep
792 except IOError as err:
795 except IOError as err:
793 if err.errno != errno.ENOENT:
796 if err.errno != errno.ENOENT:
794 raise
797 raise
795 cmdutil.wrongtooltocontinue(repo, _('unshelve'))
798 cmdutil.wrongtooltocontinue(repo, _('unshelve'))
796 except error.CorruptedState as err:
799 except error.CorruptedState as err:
797 ui.debug(str(err) + '\n')
800 ui.debug(str(err) + '\n')
798 if continuef:
801 if continuef:
799 msg = _('corrupted shelved state file')
802 msg = _('corrupted shelved state file')
800 hint = _('please run hg unshelve --abort to abort unshelve '
803 hint = _('please run hg unshelve --abort to abort unshelve '
801 'operation')
804 'operation')
802 raise error.Abort(msg, hint=hint)
805 raise error.Abort(msg, hint=hint)
803 elif abortf:
806 elif abortf:
804 msg = _('could not read shelved state file, your working copy '
807 msg = _('could not read shelved state file, your working copy '
805 'may be in an unexpected state\nplease update to some '
808 'may be in an unexpected state\nplease update to some '
806 'commit\n')
809 'commit\n')
807 ui.warn(msg)
810 ui.warn(msg)
808 shelvedstate.clear(repo)
811 shelvedstate.clear(repo)
809 return
812 return
810
813
811 if abortf:
814 if abortf:
812 return unshelveabort(ui, repo, state, opts)
815 return unshelveabort(ui, repo, state, opts)
813 elif continuef:
816 elif continuef:
814 return unshelvecontinue(ui, repo, state, opts)
817 return unshelvecontinue(ui, repo, state, opts)
815 elif len(shelved) > 1:
818 elif len(shelved) > 1:
816 raise error.Abort(_('can only unshelve one change at a time'))
819 raise error.Abort(_('can only unshelve one change at a time'))
817 elif not shelved:
820 elif not shelved:
818 shelved = listshelves(repo)
821 shelved = listshelves(repo)
819 if not shelved:
822 if not shelved:
820 raise error.Abort(_('no shelved changes to apply!'))
823 raise error.Abort(_('no shelved changes to apply!'))
821 basename = util.split(shelved[0][1])[1]
824 basename = util.split(shelved[0][1])[1]
822 ui.status(_("unshelving change '%s'\n") % basename)
825 ui.status(_("unshelving change '%s'\n") % basename)
823 else:
826 else:
824 basename = shelved[0]
827 basename = shelved[0]
825
828
826 if not shelvedfile(repo, basename, 'patch').exists():
829 if not shelvedfile(repo, basename, patchextension).exists():
827 raise error.Abort(_("shelved change '%s' not found") % basename)
830 raise error.Abort(_("shelved change '%s' not found") % basename)
828
831
829 oldquiet = ui.quiet
832 oldquiet = ui.quiet
830 lock = tr = None
833 lock = tr = None
831 forcemerge = ui.backupconfig('ui', 'forcemerge')
834 forcemerge = ui.backupconfig('ui', 'forcemerge')
832 try:
835 try:
833 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'unshelve')
836 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'unshelve')
834 lock = repo.lock()
837 lock = repo.lock()
835
838
836 tr = repo.transaction('unshelve', report=lambda x: None)
839 tr = repo.transaction('unshelve', report=lambda x: None)
837 oldtiprev = len(repo)
840 oldtiprev = len(repo)
838
841
839 pctx = repo['.']
842 pctx = repo['.']
840 tmpwctx = pctx
843 tmpwctx = pctx
841 # The goal is to have a commit structure like so:
844 # The goal is to have a commit structure like so:
842 # ...-> pctx -> tmpwctx -> shelvectx
845 # ...-> pctx -> tmpwctx -> shelvectx
843 # where tmpwctx is an optional commit with the user's pending changes
846 # where tmpwctx is an optional commit with the user's pending changes
844 # and shelvectx is the unshelved changes. Then we merge it all down
847 # and shelvectx is the unshelved changes. Then we merge it all down
845 # to the original pctx.
848 # to the original pctx.
846
849
847 tmpwctx, addedbefore = _commitworkingcopychanges(ui, repo, opts,
850 tmpwctx, addedbefore = _commitworkingcopychanges(ui, repo, opts,
848 tmpwctx)
851 tmpwctx)
849
852
850 repo, shelvectx = _unshelverestorecommit(ui, repo, basename, oldquiet)
853 repo, shelvectx = _unshelverestorecommit(ui, repo, basename, oldquiet)
851
854
852 branchtorestore = ''
855 branchtorestore = ''
853 if shelvectx.branch() != shelvectx.p1().branch():
856 if shelvectx.branch() != shelvectx.p1().branch():
854 branchtorestore = shelvectx.branch()
857 branchtorestore = shelvectx.branch()
855
858
856 shelvectx = _rebaserestoredcommit(ui, repo, opts, tr, oldtiprev,
859 shelvectx = _rebaserestoredcommit(ui, repo, opts, tr, oldtiprev,
857 basename, pctx, tmpwctx, shelvectx,
860 basename, pctx, tmpwctx, shelvectx,
858 branchtorestore)
861 branchtorestore)
859 mergefiles(ui, repo, pctx, shelvectx)
862 mergefiles(ui, repo, pctx, shelvectx)
860 restorebranch(ui, repo, branchtorestore)
863 restorebranch(ui, repo, branchtorestore)
861 _forgetunknownfiles(repo, shelvectx, addedbefore)
864 _forgetunknownfiles(repo, shelvectx, addedbefore)
862
865
863 shelvedstate.clear(repo)
866 shelvedstate.clear(repo)
864 _finishunshelve(repo, oldtiprev, tr)
867 _finishunshelve(repo, oldtiprev, tr)
865 unshelvecleanup(ui, repo, basename, opts)
868 unshelvecleanup(ui, repo, basename, opts)
866 finally:
869 finally:
867 ui.quiet = oldquiet
870 ui.quiet = oldquiet
868 if tr:
871 if tr:
869 tr.release()
872 tr.release()
870 lockmod.release(lock)
873 lockmod.release(lock)
871 ui.restoreconfig(forcemerge)
874 ui.restoreconfig(forcemerge)
872
875
873 @command('shelve',
876 @command('shelve',
874 [('A', 'addremove', None,
877 [('A', 'addremove', None,
875 _('mark new/missing files as added/removed before shelving')),
878 _('mark new/missing files as added/removed before shelving')),
876 ('u', 'unknown', None,
879 ('u', 'unknown', None,
877 _('store unknown files in the shelve')),
880 _('store unknown files in the shelve')),
878 ('', 'cleanup', None,
881 ('', 'cleanup', None,
879 _('delete all shelved changes')),
882 _('delete all shelved changes')),
880 ('', 'date', '',
883 ('', 'date', '',
881 _('shelve with the specified commit date'), _('DATE')),
884 _('shelve with the specified commit date'), _('DATE')),
882 ('d', 'delete', None,
885 ('d', 'delete', None,
883 _('delete the named shelved change(s)')),
886 _('delete the named shelved change(s)')),
884 ('e', 'edit', False,
887 ('e', 'edit', False,
885 _('invoke editor on commit messages')),
888 _('invoke editor on commit messages')),
886 ('l', 'list', None,
889 ('l', 'list', None,
887 _('list current shelves')),
890 _('list current shelves')),
888 ('m', 'message', '',
891 ('m', 'message', '',
889 _('use text as shelve message'), _('TEXT')),
892 _('use text as shelve message'), _('TEXT')),
890 ('n', 'name', '',
893 ('n', 'name', '',
891 _('use the given name for the shelved commit'), _('NAME')),
894 _('use the given name for the shelved commit'), _('NAME')),
892 ('p', 'patch', None,
895 ('p', 'patch', None,
893 _('show patch')),
896 _('show patch')),
894 ('i', 'interactive', None,
897 ('i', 'interactive', None,
895 _('interactive mode, only works while creating a shelve')),
898 _('interactive mode, only works while creating a shelve')),
896 ('', 'stat', None,
899 ('', 'stat', None,
897 _('output diffstat-style summary of changes'))] + commands.walkopts,
900 _('output diffstat-style summary of changes'))] + commands.walkopts,
898 _('hg shelve [OPTION]... [FILE]...'))
901 _('hg shelve [OPTION]... [FILE]...'))
899 def shelvecmd(ui, repo, *pats, **opts):
902 def shelvecmd(ui, repo, *pats, **opts):
900 '''save and set aside changes from the working directory
903 '''save and set aside changes from the working directory
901
904
902 Shelving takes files that "hg status" reports as not clean, saves
905 Shelving takes files that "hg status" reports as not clean, saves
903 the modifications to a bundle (a shelved change), and reverts the
906 the modifications to a bundle (a shelved change), and reverts the
904 files so that their state in the working directory becomes clean.
907 files so that their state in the working directory becomes clean.
905
908
906 To restore these changes to the working directory, using "hg
909 To restore these changes to the working directory, using "hg
907 unshelve"; this will work even if you switch to a different
910 unshelve"; this will work even if you switch to a different
908 commit.
911 commit.
909
912
910 When no files are specified, "hg shelve" saves all not-clean
913 When no files are specified, "hg shelve" saves all not-clean
911 files. If specific files or directories are named, only changes to
914 files. If specific files or directories are named, only changes to
912 those files are shelved.
915 those files are shelved.
913
916
914 In bare shelve (when no files are specified, without interactive,
917 In bare shelve (when no files are specified, without interactive,
915 include and exclude option), shelving remembers information if the
918 include and exclude option), shelving remembers information if the
916 working directory was on newly created branch, in other words working
919 working directory was on newly created branch, in other words working
917 directory was on different branch than its first parent. In this
920 directory was on different branch than its first parent. In this
918 situation unshelving restores branch information to the working directory.
921 situation unshelving restores branch information to the working directory.
919
922
920 Each shelved change has a name that makes it easier to find later.
923 Each shelved change has a name that makes it easier to find later.
921 The name of a shelved change defaults to being based on the active
924 The name of a shelved change defaults to being based on the active
922 bookmark, or if there is no active bookmark, the current named
925 bookmark, or if there is no active bookmark, the current named
923 branch. To specify a different name, use ``--name``.
926 branch. To specify a different name, use ``--name``.
924
927
925 To see a list of existing shelved changes, use the ``--list``
928 To see a list of existing shelved changes, use the ``--list``
926 option. For each shelved change, this will print its name, age,
929 option. For each shelved change, this will print its name, age,
927 and description; use ``--patch`` or ``--stat`` for more details.
930 and description; use ``--patch`` or ``--stat`` for more details.
928
931
929 To delete specific shelved changes, use ``--delete``. To delete
932 To delete specific shelved changes, use ``--delete``. To delete
930 all shelved changes, use ``--cleanup``.
933 all shelved changes, use ``--cleanup``.
931 '''
934 '''
932 allowables = [
935 allowables = [
933 ('addremove', set(['create'])), # 'create' is pseudo action
936 ('addremove', set(['create'])), # 'create' is pseudo action
934 ('unknown', set(['create'])),
937 ('unknown', set(['create'])),
935 ('cleanup', set(['cleanup'])),
938 ('cleanup', set(['cleanup'])),
936 # ('date', set(['create'])), # ignored for passing '--date "0 0"' in tests
939 # ('date', set(['create'])), # ignored for passing '--date "0 0"' in tests
937 ('delete', set(['delete'])),
940 ('delete', set(['delete'])),
938 ('edit', set(['create'])),
941 ('edit', set(['create'])),
939 ('list', set(['list'])),
942 ('list', set(['list'])),
940 ('message', set(['create'])),
943 ('message', set(['create'])),
941 ('name', set(['create'])),
944 ('name', set(['create'])),
942 ('patch', set(['patch', 'list'])),
945 ('patch', set(['patch', 'list'])),
943 ('stat', set(['stat', 'list'])),
946 ('stat', set(['stat', 'list'])),
944 ]
947 ]
945 def checkopt(opt):
948 def checkopt(opt):
946 if opts.get(opt):
949 if opts.get(opt):
947 for i, allowable in allowables:
950 for i, allowable in allowables:
948 if opts[i] and opt not in allowable:
951 if opts[i] and opt not in allowable:
949 raise error.Abort(_("options '--%s' and '--%s' may not be "
952 raise error.Abort(_("options '--%s' and '--%s' may not be "
950 "used together") % (opt, i))
953 "used together") % (opt, i))
951 return True
954 return True
952 if checkopt('cleanup'):
955 if checkopt('cleanup'):
953 if pats:
956 if pats:
954 raise error.Abort(_("cannot specify names when using '--cleanup'"))
957 raise error.Abort(_("cannot specify names when using '--cleanup'"))
955 return cleanupcmd(ui, repo)
958 return cleanupcmd(ui, repo)
956 elif checkopt('delete'):
959 elif checkopt('delete'):
957 return deletecmd(ui, repo, pats)
960 return deletecmd(ui, repo, pats)
958 elif checkopt('list'):
961 elif checkopt('list'):
959 return listcmd(ui, repo, pats, opts)
962 return listcmd(ui, repo, pats, opts)
960 elif checkopt('patch'):
963 elif checkopt('patch'):
961 return singlepatchcmds(ui, repo, pats, opts, subcommand='patch')
964 return singlepatchcmds(ui, repo, pats, opts, subcommand='patch')
962 elif checkopt('stat'):
965 elif checkopt('stat'):
963 return singlepatchcmds(ui, repo, pats, opts, subcommand='stat')
966 return singlepatchcmds(ui, repo, pats, opts, subcommand='stat')
964 else:
967 else:
965 return createcmd(ui, repo, pats, opts)
968 return createcmd(ui, repo, pats, opts)
966
969
967 def extsetup(ui):
970 def extsetup(ui):
968 cmdutil.unfinishedstates.append(
971 cmdutil.unfinishedstates.append(
969 [shelvedstate._filename, False, False,
972 [shelvedstate._filename, False, False,
970 _('unshelve already in progress'),
973 _('unshelve already in progress'),
971 _("use 'hg unshelve --continue' or 'hg unshelve --abort'")])
974 _("use 'hg unshelve --continue' or 'hg unshelve --abort'")])
972 cmdutil.afterresolvedstates.append(
975 cmdutil.afterresolvedstates.append(
973 [shelvedstate._filename, _('hg unshelve --continue')])
976 [shelvedstate._filename, _('hg unshelve --continue')])
@@ -1,1657 +1,1657
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.patch
199 .hg/shelve-backup/default.hg: file
199 .hg/shelve-backup/default.patch: file
200 $ touch -t 200001010000 .hg/shelve-backup/default.hg
200 $ touch -t 200001010000 .hg/shelve-backup/default.patch
201 $ f -t .hg/shelve-backup/default-1.hg
201 $ f -t .hg/shelve-backup/default-1.patch
202 .hg/shelve-backup/default-1.hg: file
202 .hg/shelve-backup/default-1.patch: file
203 $ touch -t 200001010000 .hg/shelve-backup/default-1.hg
203 $ touch -t 200001010000 .hg/shelve-backup/default-1.patch
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 $ cd ..
1386 $ cd ..
1387
1387
1388 When i shelve commit on newly created branch i expect
1388 When i shelve commit on newly created branch i expect
1389 that after unshelve newly created branch will be preserved.
1389 that after unshelve newly created branch will be preserved.
1390
1390
1391 $ hg init shelve_on_new_branch_simple
1391 $ hg init shelve_on_new_branch_simple
1392 $ cd shelve_on_new_branch_simple
1392 $ cd shelve_on_new_branch_simple
1393 $ echo "aaa" >> a
1393 $ echo "aaa" >> a
1394 $ hg commit -A -m "a"
1394 $ hg commit -A -m "a"
1395 adding a
1395 adding a
1396 $ hg branch
1396 $ hg branch
1397 default
1397 default
1398 $ hg branch test
1398 $ hg branch test
1399 marked working directory as branch test
1399 marked working directory as branch test
1400 (branches are permanent and global, did you want a bookmark?)
1400 (branches are permanent and global, did you want a bookmark?)
1401 $ echo "bbb" >> a
1401 $ echo "bbb" >> a
1402 $ hg status
1402 $ hg status
1403 M a
1403 M a
1404 $ hg shelve
1404 $ hg shelve
1405 shelved as default
1405 shelved as default
1406 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1406 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1407 $ hg branch
1407 $ hg branch
1408 default
1408 default
1409 $ echo "bbb" >> b
1409 $ echo "bbb" >> b
1410 $ hg status
1410 $ hg status
1411 ? b
1411 ? b
1412 $ hg unshelve
1412 $ hg unshelve
1413 unshelving change 'default'
1413 unshelving change 'default'
1414 marked working directory as branch test
1414 marked working directory as branch test
1415 $ hg status
1415 $ hg status
1416 M a
1416 M a
1417 ? b
1417 ? b
1418 $ hg branch
1418 $ hg branch
1419 test
1419 test
1420 $ cd ..
1420 $ cd ..
1421
1421
1422 When i shelve commit on newly created branch, make
1422 When i shelve commit on newly created branch, make
1423 some changes, unshelve it and running into merge
1423 some changes, unshelve it and running into merge
1424 conflicts i expect that after fixing them and
1424 conflicts i expect that after fixing them and
1425 running unshelve --continue newly created branch
1425 running unshelve --continue newly created branch
1426 will be preserved.
1426 will be preserved.
1427
1427
1428 $ hg init shelve_on_new_branch_conflict
1428 $ hg init shelve_on_new_branch_conflict
1429 $ cd shelve_on_new_branch_conflict
1429 $ cd shelve_on_new_branch_conflict
1430 $ echo "aaa" >> a
1430 $ echo "aaa" >> a
1431 $ hg commit -A -m "a"
1431 $ hg commit -A -m "a"
1432 adding a
1432 adding a
1433 $ hg branch
1433 $ hg branch
1434 default
1434 default
1435 $ hg branch test
1435 $ hg branch test
1436 marked working directory as branch test
1436 marked working directory as branch test
1437 (branches are permanent and global, did you want a bookmark?)
1437 (branches are permanent and global, did you want a bookmark?)
1438 $ echo "bbb" >> a
1438 $ echo "bbb" >> a
1439 $ hg status
1439 $ hg status
1440 M a
1440 M a
1441 $ hg shelve
1441 $ hg shelve
1442 shelved as default
1442 shelved as default
1443 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1443 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1444 $ hg branch
1444 $ hg branch
1445 default
1445 default
1446 $ echo "ccc" >> a
1446 $ echo "ccc" >> a
1447 $ hg status
1447 $ hg status
1448 M a
1448 M a
1449 $ hg unshelve
1449 $ hg unshelve
1450 unshelving change 'default'
1450 unshelving change 'default'
1451 temporarily committing pending changes (restore with 'hg unshelve --abort')
1451 temporarily committing pending changes (restore with 'hg unshelve --abort')
1452 rebasing shelved changes
1452 rebasing shelved changes
1453 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1453 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1454 merging a
1454 merging a
1455 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
1455 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
1456 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1456 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1457 [1]
1457 [1]
1458 $ echo "aaabbbccc" > a
1458 $ echo "aaabbbccc" > a
1459 $ rm a.orig
1459 $ rm a.orig
1460 $ hg resolve --mark a
1460 $ hg resolve --mark a
1461 (no more unresolved files)
1461 (no more unresolved files)
1462 continue: hg unshelve --continue
1462 continue: hg unshelve --continue
1463 $ hg unshelve --continue
1463 $ hg unshelve --continue
1464 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1464 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1465 marked working directory as branch test
1465 marked working directory as branch test
1466 unshelve of 'default' complete
1466 unshelve of 'default' complete
1467 $ cat a
1467 $ cat a
1468 aaabbbccc
1468 aaabbbccc
1469 $ hg status
1469 $ hg status
1470 M a
1470 M a
1471 $ hg branch
1471 $ hg branch
1472 test
1472 test
1473 $ hg commit -m "test-commit"
1473 $ hg commit -m "test-commit"
1474
1474
1475 When i shelve on test branch, update to default branch
1475 When i shelve on test branch, update to default branch
1476 and unshelve i expect that it will not preserve previous
1476 and unshelve i expect that it will not preserve previous
1477 test branch.
1477 test branch.
1478
1478
1479 $ echo "xxx" > b
1479 $ echo "xxx" > b
1480 $ hg add b
1480 $ hg add b
1481 $ hg shelve
1481 $ hg shelve
1482 shelved as test
1482 shelved as test
1483 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1483 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1484 $ hg update -r default
1484 $ hg update -r default
1485 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1485 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1486 $ hg unshelve
1486 $ hg unshelve
1487 unshelving change 'test'
1487 unshelving change 'test'
1488 rebasing shelved changes
1488 rebasing shelved changes
1489 rebasing 2:357525f34729 "changes to: test-commit" (tip)
1489 rebasing 2:357525f34729 "changes to: test-commit" (tip)
1490 $ hg status
1490 $ hg status
1491 A b
1491 A b
1492 $ hg branch
1492 $ hg branch
1493 default
1493 default
1494 $ cd ..
1494 $ cd ..
1495
1495
1496 When i unshelve resulting in merge conflicts and makes saved
1496 When i unshelve resulting in merge conflicts and makes saved
1497 file shelvedstate looks like in previous versions in
1497 file shelvedstate looks like in previous versions in
1498 mercurial(without restore branch information in 7th line) i
1498 mercurial(without restore branch information in 7th line) i
1499 expect that after resolving conflicts and successfully
1499 expect that after resolving conflicts and successfully
1500 running 'shelve --continue' the branch information won't be
1500 running 'shelve --continue' the branch information won't be
1501 restored and branch will be unchanged.
1501 restored and branch will be unchanged.
1502
1502
1503 shelve on new branch, conflict with previous shelvedstate
1503 shelve on new branch, conflict with previous shelvedstate
1504
1504
1505 $ hg init conflict
1505 $ hg init conflict
1506 $ cd conflict
1506 $ cd conflict
1507 $ echo "aaa" >> a
1507 $ echo "aaa" >> a
1508 $ hg commit -A -m "a"
1508 $ hg commit -A -m "a"
1509 adding a
1509 adding a
1510 $ hg branch
1510 $ hg branch
1511 default
1511 default
1512 $ hg branch test
1512 $ hg branch test
1513 marked working directory as branch test
1513 marked working directory as branch test
1514 (branches are permanent and global, did you want a bookmark?)
1514 (branches are permanent and global, did you want a bookmark?)
1515 $ echo "bbb" >> a
1515 $ echo "bbb" >> a
1516 $ hg status
1516 $ hg status
1517 M a
1517 M a
1518 $ hg shelve
1518 $ hg shelve
1519 shelved as default
1519 shelved as default
1520 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1520 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1521 $ hg branch
1521 $ hg branch
1522 default
1522 default
1523 $ echo "ccc" >> a
1523 $ echo "ccc" >> a
1524 $ hg status
1524 $ hg status
1525 M a
1525 M a
1526 $ hg unshelve
1526 $ hg unshelve
1527 unshelving change 'default'
1527 unshelving change 'default'
1528 temporarily committing pending changes (restore with 'hg unshelve --abort')
1528 temporarily committing pending changes (restore with 'hg unshelve --abort')
1529 rebasing shelved changes
1529 rebasing shelved changes
1530 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1530 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1531 merging a
1531 merging a
1532 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
1532 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
1533 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1533 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1534 [1]
1534 [1]
1535
1535
1536 Removing restore branch information from shelvedstate file(making it looks like
1536 Removing restore branch information from shelvedstate file(making it looks like
1537 in previous versions) and running unshelve --continue
1537 in previous versions) and running unshelve --continue
1538
1538
1539 $ head -n 6 < .hg/shelvedstate > .hg/shelvedstate_oldformat
1539 $ head -n 6 < .hg/shelvedstate > .hg/shelvedstate_oldformat
1540 $ rm .hg/shelvedstate
1540 $ rm .hg/shelvedstate
1541 $ mv .hg/shelvedstate_oldformat .hg/shelvedstate
1541 $ mv .hg/shelvedstate_oldformat .hg/shelvedstate
1542
1542
1543 $ echo "aaabbbccc" > a
1543 $ echo "aaabbbccc" > a
1544 $ rm a.orig
1544 $ rm a.orig
1545 $ hg resolve --mark a
1545 $ hg resolve --mark a
1546 (no more unresolved files)
1546 (no more unresolved files)
1547 continue: hg unshelve --continue
1547 continue: hg unshelve --continue
1548 $ hg unshelve --continue
1548 $ hg unshelve --continue
1549 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1549 rebasing 2:425c97ef07f3 "changes to: a" (tip)
1550 unshelve of 'default' complete
1550 unshelve of 'default' complete
1551 $ cat a
1551 $ cat a
1552 aaabbbccc
1552 aaabbbccc
1553 $ hg status
1553 $ hg status
1554 M a
1554 M a
1555 $ hg branch
1555 $ hg branch
1556 default
1556 default
1557 $ cd ..
1557 $ cd ..
1558
1558
1559 On non bare shelve the branch information shouldn't be restored
1559 On non bare shelve the branch information shouldn't be restored
1560
1560
1561 $ hg init bare_shelve_on_new_branch
1561 $ hg init bare_shelve_on_new_branch
1562 $ cd bare_shelve_on_new_branch
1562 $ cd bare_shelve_on_new_branch
1563 $ echo "aaa" >> a
1563 $ echo "aaa" >> a
1564 $ hg commit -A -m "a"
1564 $ hg commit -A -m "a"
1565 adding a
1565 adding a
1566 $ hg branch
1566 $ hg branch
1567 default
1567 default
1568 $ hg branch test
1568 $ hg branch test
1569 marked working directory as branch test
1569 marked working directory as branch test
1570 (branches are permanent and global, did you want a bookmark?)
1570 (branches are permanent and global, did you want a bookmark?)
1571 $ echo "bbb" >> a
1571 $ echo "bbb" >> a
1572 $ hg status
1572 $ hg status
1573 M a
1573 M a
1574 $ hg shelve a
1574 $ hg shelve a
1575 shelved as default
1575 shelved as default
1576 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1576 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1577 $ hg branch
1577 $ hg branch
1578 test
1578 test
1579 $ hg branch default
1579 $ hg branch default
1580 marked working directory as branch default
1580 marked working directory as branch default
1581 (branches are permanent and global, did you want a bookmark?)
1581 (branches are permanent and global, did you want a bookmark?)
1582 $ echo "bbb" >> b
1582 $ echo "bbb" >> b
1583 $ hg status
1583 $ hg status
1584 ? b
1584 ? b
1585 $ hg unshelve
1585 $ hg unshelve
1586 unshelving change 'default'
1586 unshelving change 'default'
1587 $ hg status
1587 $ hg status
1588 M a
1588 M a
1589 ? b
1589 ? b
1590 $ hg branch
1590 $ hg branch
1591 default
1591 default
1592 $ cd ..
1592 $ cd ..
1593
1593
1594 Prepare unshelve with a corrupted shelvedstate
1594 Prepare unshelve with a corrupted shelvedstate
1595 $ hg init r1 && cd r1
1595 $ hg init r1 && cd r1
1596 $ echo text1 > file && hg add file
1596 $ echo text1 > file && hg add file
1597 $ hg shelve
1597 $ hg shelve
1598 shelved as default
1598 shelved as default
1599 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1599 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1600 $ echo text2 > file && hg ci -Am text1
1600 $ echo text2 > file && hg ci -Am text1
1601 adding file
1601 adding file
1602 $ hg unshelve
1602 $ hg unshelve
1603 unshelving change 'default'
1603 unshelving change 'default'
1604 rebasing shelved changes
1604 rebasing shelved changes
1605 rebasing 1:396ea74229f9 "(changes in empty repository)" (tip)
1605 rebasing 1:396ea74229f9 "(changes in empty repository)" (tip)
1606 merging file
1606 merging file
1607 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
1607 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
1608 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1608 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1609 [1]
1609 [1]
1610 $ echo somethingsomething > .hg/shelvedstate
1610 $ echo somethingsomething > .hg/shelvedstate
1611
1611
1612 Unshelve --continue fails with appropriate message if shelvedstate is corrupted
1612 Unshelve --continue fails with appropriate message if shelvedstate is corrupted
1613 $ hg unshelve --continue
1613 $ hg unshelve --continue
1614 abort: corrupted shelved state file
1614 abort: corrupted shelved state file
1615 (please run hg unshelve --abort to abort unshelve operation)
1615 (please run hg unshelve --abort to abort unshelve operation)
1616 [255]
1616 [255]
1617
1617
1618 Unshelve --abort works with a corrupted shelvedstate
1618 Unshelve --abort works with a corrupted shelvedstate
1619 $ hg unshelve --abort
1619 $ hg unshelve --abort
1620 could not read shelved state file, your working copy may be in an unexpected state
1620 could not read shelved state file, your working copy may be in an unexpected state
1621 please update to some commit
1621 please update to some commit
1622
1622
1623 Unshelve --abort fails with appropriate message if there's no unshelve in
1623 Unshelve --abort fails with appropriate message if there's no unshelve in
1624 progress
1624 progress
1625 $ hg unshelve --abort
1625 $ hg unshelve --abort
1626 abort: no unshelve in progress
1626 abort: no unshelve in progress
1627 [255]
1627 [255]
1628 $ cd ..
1628 $ cd ..
1629
1629
1630 Unshelve respects --keep even if user intervention is needed
1630 Unshelve respects --keep even if user intervention is needed
1631 $ hg init unshelvekeep && cd unshelvekeep
1631 $ hg init unshelvekeep && cd unshelvekeep
1632 $ echo 1 > file && hg ci -Am 1
1632 $ echo 1 > file && hg ci -Am 1
1633 adding file
1633 adding file
1634 $ echo 2 >> file
1634 $ echo 2 >> file
1635 $ hg shelve
1635 $ hg shelve
1636 shelved as default
1636 shelved as default
1637 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1637 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1638 $ echo 3 >> file && hg ci -Am 13
1638 $ echo 3 >> file && hg ci -Am 13
1639 $ hg shelve --list
1639 $ hg shelve --list
1640 default (1s ago) changes to: 1
1640 default (1s ago) changes to: 1
1641 $ hg unshelve --keep
1641 $ hg unshelve --keep
1642 unshelving change 'default'
1642 unshelving change 'default'
1643 rebasing shelved changes
1643 rebasing shelved changes
1644 rebasing 2:3fbe6fbb0bef "changes to: 1" (tip)
1644 rebasing 2:3fbe6fbb0bef "changes to: 1" (tip)
1645 merging file
1645 merging file
1646 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
1646 warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
1647 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1647 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1648 [1]
1648 [1]
1649 $ hg resolve --mark file
1649 $ hg resolve --mark file
1650 (no more unresolved files)
1650 (no more unresolved files)
1651 continue: hg unshelve --continue
1651 continue: hg unshelve --continue
1652 $ hg unshelve --continue
1652 $ hg unshelve --continue
1653 rebasing 2:3fbe6fbb0bef "changes to: 1" (tip)
1653 rebasing 2:3fbe6fbb0bef "changes to: 1" (tip)
1654 unshelve of 'default' complete
1654 unshelve of 'default' complete
1655 $ hg shelve --list
1655 $ hg shelve --list
1656 default (*s ago) changes to: 1 (glob)
1656 default (*s ago) changes to: 1 (glob)
1657 $ cd ..
1657 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now