##// END OF EJS Templates
share: wrap bmstore._writerepo for transaction sensitivity (issue4940)...
FUJIWARA Katsunori -
r26933:a7eecd02 stable
parent child Browse files
Show More
@@ -1,175 +1,176 b''
1 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
1 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com>
2 #
2 #
3 # This software may be used and distributed according to the terms of the
3 # This software may be used and distributed according to the terms of the
4 # GNU General Public License version 2 or any later version.
4 # GNU General Public License version 2 or any later version.
5
5
6 '''share a common history between several working directories
6 '''share a common history between several working directories
7
7
8 Automatic Pooled Storage for Clones
8 Automatic Pooled Storage for Clones
9 -----------------------------------
9 -----------------------------------
10
10
11 When this extension is active, :hg:`clone` can be configured to
11 When this extension is active, :hg:`clone` can be configured to
12 automatically share/pool storage across multiple clones. This
12 automatically share/pool storage across multiple clones. This
13 mode effectively converts :hg:`clone` to :hg:`clone` + :hg:`share`.
13 mode effectively converts :hg:`clone` to :hg:`clone` + :hg:`share`.
14 The benefit of using this mode is the automatic management of
14 The benefit of using this mode is the automatic management of
15 store paths and intelligent pooling of related repositories.
15 store paths and intelligent pooling of related repositories.
16
16
17 The following ``share.`` config options influence this feature:
17 The following ``share.`` config options influence this feature:
18
18
19 ``share.pool``
19 ``share.pool``
20 Filesystem path where shared repository data will be stored. When
20 Filesystem path where shared repository data will be stored. When
21 defined, :hg:`clone` will automatically use shared repository
21 defined, :hg:`clone` will automatically use shared repository
22 storage instead of creating a store inside each clone.
22 storage instead of creating a store inside each clone.
23
23
24 ``share.poolnaming``
24 ``share.poolnaming``
25 How directory names in ``share.pool`` are constructed.
25 How directory names in ``share.pool`` are constructed.
26
26
27 "identity" means the name is derived from the first changeset in the
27 "identity" means the name is derived from the first changeset in the
28 repository. In this mode, different remotes share storage if their
28 repository. In this mode, different remotes share storage if their
29 root/initial changeset is identical. In this mode, the local shared
29 root/initial changeset is identical. In this mode, the local shared
30 repository is an aggregate of all encountered remote repositories.
30 repository is an aggregate of all encountered remote repositories.
31
31
32 "remote" means the name is derived from the source repository's
32 "remote" means the name is derived from the source repository's
33 path or URL. In this mode, storage is only shared if the path or URL
33 path or URL. In this mode, storage is only shared if the path or URL
34 requested in the :hg:`clone` command matches exactly to a repository
34 requested in the :hg:`clone` command matches exactly to a repository
35 that was cloned before.
35 that was cloned before.
36
36
37 The default naming mode is "identity."
37 The default naming mode is "identity."
38 '''
38 '''
39
39
40 from mercurial.i18n import _
40 from mercurial.i18n import _
41 from mercurial import cmdutil, commands, hg, util, extensions, bookmarks, error
41 from mercurial import cmdutil, commands, hg, util, extensions, bookmarks, error
42 from mercurial.hg import repository, parseurl
42 from mercurial.hg import repository, parseurl
43 import errno
43 import errno
44
44
45 cmdtable = {}
45 cmdtable = {}
46 command = cmdutil.command(cmdtable)
46 command = cmdutil.command(cmdtable)
47 # Note for extension authors: ONLY specify testedwith = 'internal' for
47 # Note for extension authors: ONLY specify testedwith = 'internal' for
48 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
48 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
49 # be specifying the version(s) of Mercurial they are tested with, or
49 # be specifying the version(s) of Mercurial they are tested with, or
50 # leave the attribute unspecified.
50 # leave the attribute unspecified.
51 testedwith = 'internal'
51 testedwith = 'internal'
52
52
53 @command('share',
53 @command('share',
54 [('U', 'noupdate', None, _('do not create a working directory')),
54 [('U', 'noupdate', None, _('do not create a working directory')),
55 ('B', 'bookmarks', None, _('also share bookmarks'))],
55 ('B', 'bookmarks', None, _('also share bookmarks'))],
56 _('[-U] [-B] SOURCE [DEST]'),
56 _('[-U] [-B] SOURCE [DEST]'),
57 norepo=True)
57 norepo=True)
58 def share(ui, source, dest=None, noupdate=False, bookmarks=False):
58 def share(ui, source, dest=None, noupdate=False, bookmarks=False):
59 """create a new shared repository
59 """create a new shared repository
60
60
61 Initialize a new repository and working directory that shares its
61 Initialize a new repository and working directory that shares its
62 history (and optionally bookmarks) with another repository.
62 history (and optionally bookmarks) with another repository.
63
63
64 .. note::
64 .. note::
65
65
66 using rollback or extensions that destroy/modify history (mq,
66 using rollback or extensions that destroy/modify history (mq,
67 rebase, etc.) can cause considerable confusion with shared
67 rebase, etc.) can cause considerable confusion with shared
68 clones. In particular, if two shared clones are both updated to
68 clones. In particular, if two shared clones are both updated to
69 the same changeset, and one of them destroys that changeset
69 the same changeset, and one of them destroys that changeset
70 with rollback, the other clone will suddenly stop working: all
70 with rollback, the other clone will suddenly stop working: all
71 operations will fail with "abort: working directory has unknown
71 operations will fail with "abort: working directory has unknown
72 parent". The only known workaround is to use debugsetparents on
72 parent". The only known workaround is to use debugsetparents on
73 the broken clone to reset it to a changeset that still exists.
73 the broken clone to reset it to a changeset that still exists.
74 """
74 """
75
75
76 return hg.share(ui, source, dest, not noupdate, bookmarks)
76 return hg.share(ui, source, dest, not noupdate, bookmarks)
77
77
78 @command('unshare', [], '')
78 @command('unshare', [], '')
79 def unshare(ui, repo):
79 def unshare(ui, repo):
80 """convert a shared repository to a normal one
80 """convert a shared repository to a normal one
81
81
82 Copy the store data to the repo and remove the sharedpath data.
82 Copy the store data to the repo and remove the sharedpath data.
83 """
83 """
84
84
85 if not repo.shared():
85 if not repo.shared():
86 raise error.Abort(_("this is not a shared repo"))
86 raise error.Abort(_("this is not a shared repo"))
87
87
88 destlock = lock = None
88 destlock = lock = None
89 lock = repo.lock()
89 lock = repo.lock()
90 try:
90 try:
91 # we use locks here because if we race with commit, we
91 # we use locks here because if we race with commit, we
92 # can end up with extra data in the cloned revlogs that's
92 # can end up with extra data in the cloned revlogs that's
93 # not pointed to by changesets, thus causing verify to
93 # not pointed to by changesets, thus causing verify to
94 # fail
94 # fail
95
95
96 destlock = hg.copystore(ui, repo, repo.path)
96 destlock = hg.copystore(ui, repo, repo.path)
97
97
98 sharefile = repo.join('sharedpath')
98 sharefile = repo.join('sharedpath')
99 util.rename(sharefile, sharefile + '.old')
99 util.rename(sharefile, sharefile + '.old')
100
100
101 repo.requirements.discard('sharedpath')
101 repo.requirements.discard('sharedpath')
102 repo._writerequirements()
102 repo._writerequirements()
103 finally:
103 finally:
104 destlock and destlock.release()
104 destlock and destlock.release()
105 lock and lock.release()
105 lock and lock.release()
106
106
107 # update store, spath, svfs and sjoin of repo
107 # update store, spath, svfs and sjoin of repo
108 repo.unfiltered().__init__(repo.baseui, repo.root)
108 repo.unfiltered().__init__(repo.baseui, repo.root)
109
109
110 # Wrap clone command to pass auto share options.
110 # Wrap clone command to pass auto share options.
111 def clone(orig, ui, source, *args, **opts):
111 def clone(orig, ui, source, *args, **opts):
112 pool = ui.config('share', 'pool', None)
112 pool = ui.config('share', 'pool', None)
113 if pool:
113 if pool:
114 pool = util.expandpath(pool)
114 pool = util.expandpath(pool)
115
115
116 opts['shareopts'] = dict(
116 opts['shareopts'] = dict(
117 pool=pool,
117 pool=pool,
118 mode=ui.config('share', 'poolnaming', 'identity'),
118 mode=ui.config('share', 'poolnaming', 'identity'),
119 )
119 )
120
120
121 return orig(ui, source, *args, **opts)
121 return orig(ui, source, *args, **opts)
122
122
123 def extsetup(ui):
123 def extsetup(ui):
124 extensions.wrapfunction(bookmarks.bmstore, 'getbkfile', getbkfile)
124 extensions.wrapfunction(bookmarks.bmstore, 'getbkfile', getbkfile)
125 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', recordchange)
125 extensions.wrapfunction(bookmarks.bmstore, 'recordchange', recordchange)
126 extensions.wrapfunction(bookmarks.bmstore, 'write', write)
126 extensions.wrapfunction(bookmarks.bmstore, '_writerepo', writerepo)
127 extensions.wrapcommand(commands.table, 'clone', clone)
127 extensions.wrapcommand(commands.table, 'clone', clone)
128
128
129 def _hassharedbookmarks(repo):
129 def _hassharedbookmarks(repo):
130 """Returns whether this repo has shared bookmarks"""
130 """Returns whether this repo has shared bookmarks"""
131 try:
131 try:
132 shared = repo.vfs.read('shared').splitlines()
132 shared = repo.vfs.read('shared').splitlines()
133 except IOError as inst:
133 except IOError as inst:
134 if inst.errno != errno.ENOENT:
134 if inst.errno != errno.ENOENT:
135 raise
135 raise
136 return False
136 return False
137 return 'bookmarks' in shared
137 return 'bookmarks' in shared
138
138
139 def _getsrcrepo(repo):
139 def _getsrcrepo(repo):
140 """
140 """
141 Returns the source repository object for a given shared repository.
141 Returns the source repository object for a given shared repository.
142 If repo is not a shared repository, return None.
142 If repo is not a shared repository, return None.
143 """
143 """
144 if repo.sharedpath == repo.path:
144 if repo.sharedpath == repo.path:
145 return None
145 return None
146
146
147 # the sharedpath always ends in the .hg; we want the path to the repo
147 # the sharedpath always ends in the .hg; we want the path to the repo
148 source = repo.vfs.split(repo.sharedpath)[0]
148 source = repo.vfs.split(repo.sharedpath)[0]
149 srcurl, branches = parseurl(source)
149 srcurl, branches = parseurl(source)
150 return repository(repo.ui, srcurl)
150 return repository(repo.ui, srcurl)
151
151
152 def getbkfile(orig, self, repo):
152 def getbkfile(orig, self, repo):
153 if _hassharedbookmarks(repo):
153 if _hassharedbookmarks(repo):
154 srcrepo = _getsrcrepo(repo)
154 srcrepo = _getsrcrepo(repo)
155 if srcrepo is not None:
155 if srcrepo is not None:
156 repo = srcrepo
156 repo = srcrepo
157 return orig(self, repo)
157 return orig(self, repo)
158
158
159 def recordchange(orig, self, tr):
159 def recordchange(orig, self, tr):
160 # Continue with write to local bookmarks file as usual
160 # Continue with write to local bookmarks file as usual
161 orig(self, tr)
161 orig(self, tr)
162
162
163 if _hassharedbookmarks(self._repo):
163 if _hassharedbookmarks(self._repo):
164 srcrepo = _getsrcrepo(self._repo)
164 srcrepo = _getsrcrepo(self._repo)
165 if srcrepo is not None:
165 if srcrepo is not None:
166 category = 'share-bookmarks'
166 category = 'share-bookmarks'
167 tr.addpostclose(category, lambda tr: self._writerepo(srcrepo))
167 tr.addpostclose(category, lambda tr: self._writerepo(srcrepo))
168
168
169 def write(orig, self):
169 def writerepo(orig, self, repo):
170 # First write local bookmarks file in case we ever unshare
170 # First write local bookmarks file in case we ever unshare
171 orig(self)
171 orig(self, repo)
172
172 if _hassharedbookmarks(self._repo):
173 if _hassharedbookmarks(self._repo):
173 srcrepo = _getsrcrepo(self._repo)
174 srcrepo = _getsrcrepo(self._repo)
174 if srcrepo is not None:
175 if srcrepo is not None:
175 self._writerepo(srcrepo)
176 orig(self, srcrepo)
@@ -1,1176 +1,1215 b''
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 Each shelved change has a name that makes it easier to find later. The
39 Each shelved change has a name that makes it easier to find later. The
40 name of a shelved change defaults to being based on the active bookmark,
40 name of a shelved change defaults to being based on the active bookmark,
41 or if there is no active bookmark, the current named branch. To specify a
41 or if there is no active bookmark, the current named branch. To specify a
42 different name, use "--name".
42 different name, use "--name".
43
43
44 To see a list of existing shelved changes, use the "--list" option. For
44 To see a list of existing shelved changes, use the "--list" option. For
45 each shelved change, this will print its name, age, and description; use "
45 each shelved change, this will print its name, age, and description; use "
46 --patch" or "--stat" for more details.
46 --patch" or "--stat" for more details.
47
47
48 To delete specific shelved changes, use "--delete". To delete all shelved
48 To delete specific shelved changes, use "--delete". To delete all shelved
49 changes, use "--cleanup".
49 changes, use "--cleanup".
50
50
51 (use "hg help -e shelve" to show help for the shelve extension)
51 (use "hg help -e shelve" to show help for the shelve extension)
52
52
53 options ([+] can be repeated):
53 options ([+] can be repeated):
54
54
55 -A --addremove mark new/missing files as added/removed before
55 -A --addremove mark new/missing files as added/removed before
56 shelving
56 shelving
57 --cleanup delete all shelved changes
57 --cleanup delete all shelved changes
58 --date DATE shelve with the specified commit date
58 --date DATE shelve with the specified commit date
59 -d --delete delete the named shelved change(s)
59 -d --delete delete the named shelved change(s)
60 -e --edit invoke editor on commit messages
60 -e --edit invoke editor on commit messages
61 -l --list list current shelves
61 -l --list list current shelves
62 -m --message TEXT use text as shelve message
62 -m --message TEXT use text as shelve message
63 -n --name NAME use the given name for the shelved commit
63 -n --name NAME use the given name for the shelved commit
64 -p --patch show patch
64 -p --patch show patch
65 -i --interactive interactive mode, only works while creating a shelve
65 -i --interactive interactive mode, only works while creating a shelve
66 --stat output diffstat-style summary of changes
66 --stat output diffstat-style summary of changes
67 -I --include PATTERN [+] include names matching the given patterns
67 -I --include PATTERN [+] include names matching the given patterns
68 -X --exclude PATTERN [+] exclude names matching the given patterns
68 -X --exclude PATTERN [+] exclude names matching the given patterns
69 --mq operate on patch repository
69 --mq operate on patch repository
70
70
71 (some details hidden, use --verbose to show complete help)
71 (some details hidden, use --verbose to show complete help)
72
72
73 shelving in an empty repo should be possible
73 shelving in an empty repo should be possible
74 (this tests also that editor is not invoked, if '--edit' is not
74 (this tests also that editor is not invoked, if '--edit' is not
75 specified)
75 specified)
76
76
77 $ HGEDITOR=cat hg shelve
77 $ HGEDITOR=cat hg shelve
78 shelved as default
78 shelved as default
79 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
79 0 files updated, 0 files merged, 5 files removed, 0 files unresolved
80
80
81 $ hg unshelve
81 $ hg unshelve
82 unshelving change 'default'
82 unshelving change 'default'
83
83
84 $ hg commit -q -m 'initial commit'
84 $ hg commit -q -m 'initial commit'
85
85
86 $ hg shelve
86 $ hg shelve
87 nothing changed
87 nothing changed
88 [1]
88 [1]
89
89
90 make sure shelve files were backed up
90 make sure shelve files were backed up
91
91
92 $ ls .hg/shelve-backup
92 $ ls .hg/shelve-backup
93 default.hg
93 default.hg
94 default.patch
94 default.patch
95
95
96 create an mq patch - shelving should work fine with a patch applied
96 create an mq patch - shelving should work fine with a patch applied
97
97
98 $ echo n > n
98 $ echo n > n
99 $ hg add n
99 $ hg add n
100 $ hg commit n -m second
100 $ hg commit n -m second
101 $ hg qnew second.patch
101 $ hg qnew second.patch
102
102
103 shelve a change that we will delete later
103 shelve a change that we will delete later
104
104
105 $ echo a >> a/a
105 $ echo a >> a/a
106 $ hg shelve
106 $ hg shelve
107 shelved as default
107 shelved as default
108 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
108 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
109
109
110 set up some more complex changes to shelve
110 set up some more complex changes to shelve
111
111
112 $ echo a >> a/a
112 $ echo a >> a/a
113 $ hg mv b b.rename
113 $ hg mv b b.rename
114 moving b/b to b.rename/b (glob)
114 moving b/b to b.rename/b (glob)
115 $ hg cp c c.copy
115 $ hg cp c c.copy
116 $ hg status -C
116 $ hg status -C
117 M a/a
117 M a/a
118 A b.rename/b
118 A b.rename/b
119 b/b
119 b/b
120 A c.copy
120 A c.copy
121 c
121 c
122 R b/b
122 R b/b
123
123
124 prevent some foot-shooting
124 prevent some foot-shooting
125
125
126 $ hg shelve -n foo/bar
126 $ hg shelve -n foo/bar
127 abort: shelved change names may not contain slashes
127 abort: shelved change names may not contain slashes
128 [255]
128 [255]
129 $ hg shelve -n .baz
129 $ hg shelve -n .baz
130 abort: shelved change names may not start with '.'
130 abort: shelved change names may not start with '.'
131 [255]
131 [255]
132
132
133 the common case - no options or filenames
133 the common case - no options or filenames
134
134
135 $ hg shelve
135 $ hg shelve
136 shelved as default-01
136 shelved as default-01
137 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
137 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
138 $ hg status -C
138 $ hg status -C
139
139
140 ensure that our shelved changes exist
140 ensure that our shelved changes exist
141
141
142 $ hg shelve -l
142 $ hg shelve -l
143 default-01 (*)* changes to '[mq]: second.patch' (glob)
143 default-01 (*)* changes to '[mq]: second.patch' (glob)
144 default (*)* changes to '[mq]: second.patch' (glob)
144 default (*)* changes to '[mq]: second.patch' (glob)
145
145
146 $ hg shelve -l -p default
146 $ hg shelve -l -p default
147 default (*)* changes to '[mq]: second.patch' (glob)
147 default (*)* changes to '[mq]: second.patch' (glob)
148
148
149 diff --git a/a/a b/a/a
149 diff --git a/a/a b/a/a
150 --- a/a/a
150 --- a/a/a
151 +++ b/a/a
151 +++ b/a/a
152 @@ -1,1 +1,2 @@
152 @@ -1,1 +1,2 @@
153 a
153 a
154 +a
154 +a
155
155
156 $ hg shelve --list --addremove
156 $ hg shelve --list --addremove
157 abort: options '--list' and '--addremove' may not be used together
157 abort: options '--list' and '--addremove' may not be used together
158 [255]
158 [255]
159
159
160 delete our older shelved change
160 delete our older shelved change
161
161
162 $ hg shelve -d default
162 $ hg shelve -d default
163 $ hg qfinish -a -q
163 $ hg qfinish -a -q
164
164
165 ensure shelve backups aren't overwritten
165 ensure shelve backups aren't overwritten
166
166
167 $ ls .hg/shelve-backup/
167 $ ls .hg/shelve-backup/
168 default-1.hg
168 default-1.hg
169 default-1.patch
169 default-1.patch
170 default.hg
170 default.hg
171 default.patch
171 default.patch
172
172
173 local edits should not prevent a shelved change from applying
173 local edits should not prevent a shelved change from applying
174
174
175 $ printf "z\na\n" > a/a
175 $ printf "z\na\n" > a/a
176 $ hg unshelve --keep
176 $ hg unshelve --keep
177 unshelving change 'default-01'
177 unshelving change 'default-01'
178 temporarily committing pending changes (restore with 'hg unshelve --abort')
178 temporarily committing pending changes (restore with 'hg unshelve --abort')
179 rebasing shelved changes
179 rebasing shelved changes
180 rebasing 4:4702e8911fe0 "changes to '[mq]: second.patch'" (tip)
180 rebasing 4:4702e8911fe0 "changes to '[mq]: second.patch'" (tip)
181 merging a/a
181 merging a/a
182
182
183 $ hg revert --all -q
183 $ hg revert --all -q
184 $ rm a/a.orig b.rename/b c.copy
184 $ rm a/a.orig b.rename/b c.copy
185
185
186 apply it and make sure our state is as expected
186 apply it and make sure our state is as expected
187
187
188 (this also tests that same timestamp prevents backups from being
188 (this also tests that same timestamp prevents backups from being
189 removed, even though there are more than 'maxbackups' backups)
189 removed, even though there are more than 'maxbackups' backups)
190
190
191 $ f -t .hg/shelve-backup/default.hg
191 $ f -t .hg/shelve-backup/default.hg
192 .hg/shelve-backup/default.hg: file
192 .hg/shelve-backup/default.hg: file
193 $ touch -t 200001010000 .hg/shelve-backup/default.hg
193 $ touch -t 200001010000 .hg/shelve-backup/default.hg
194 $ f -t .hg/shelve-backup/default-1.hg
194 $ f -t .hg/shelve-backup/default-1.hg
195 .hg/shelve-backup/default-1.hg: file
195 .hg/shelve-backup/default-1.hg: file
196 $ touch -t 200001010000 .hg/shelve-backup/default-1.hg
196 $ touch -t 200001010000 .hg/shelve-backup/default-1.hg
197
197
198 $ hg unshelve
198 $ hg unshelve
199 unshelving change 'default-01'
199 unshelving change 'default-01'
200 $ hg status -C
200 $ hg status -C
201 M a/a
201 M a/a
202 A b.rename/b
202 A b.rename/b
203 b/b
203 b/b
204 A c.copy
204 A c.copy
205 c
205 c
206 R b/b
206 R b/b
207 $ hg shelve -l
207 $ hg shelve -l
208
208
209 (both of default.hg and default-1.hg should be still kept, because it
209 (both of default.hg and default-1.hg should be still kept, because it
210 is difficult to decide actual order of them from same timestamp)
210 is difficult to decide actual order of them from same timestamp)
211
211
212 $ ls .hg/shelve-backup/
212 $ ls .hg/shelve-backup/
213 default-01.hg
213 default-01.hg
214 default-01.patch
214 default-01.patch
215 default-1.hg
215 default-1.hg
216 default-1.patch
216 default-1.patch
217 default.hg
217 default.hg
218 default.patch
218 default.patch
219
219
220 $ hg unshelve
220 $ hg unshelve
221 abort: no shelved changes to apply!
221 abort: no shelved changes to apply!
222 [255]
222 [255]
223 $ hg unshelve foo
223 $ hg unshelve foo
224 abort: shelved change 'foo' not found
224 abort: shelved change 'foo' not found
225 [255]
225 [255]
226
226
227 named shelves, specific filenames, and "commit messages" should all work
227 named shelves, specific filenames, and "commit messages" should all work
228 (this tests also that editor is invoked, if '--edit' is specified)
228 (this tests also that editor is invoked, if '--edit' is specified)
229
229
230 $ hg status -C
230 $ hg status -C
231 M a/a
231 M a/a
232 A b.rename/b
232 A b.rename/b
233 b/b
233 b/b
234 A c.copy
234 A c.copy
235 c
235 c
236 R b/b
236 R b/b
237 $ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
237 $ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
238 wat
238 wat
239
239
240
240
241 HG: Enter commit message. Lines beginning with 'HG:' are removed.
241 HG: Enter commit message. Lines beginning with 'HG:' are removed.
242 HG: Leave message empty to abort commit.
242 HG: Leave message empty to abort commit.
243 HG: --
243 HG: --
244 HG: user: shelve@localhost
244 HG: user: shelve@localhost
245 HG: branch 'default'
245 HG: branch 'default'
246 HG: changed a/a
246 HG: changed a/a
247
247
248 expect "a" to no longer be present, but status otherwise unchanged
248 expect "a" to no longer be present, but status otherwise unchanged
249
249
250 $ hg status -C
250 $ hg status -C
251 A b.rename/b
251 A b.rename/b
252 b/b
252 b/b
253 A c.copy
253 A c.copy
254 c
254 c
255 R b/b
255 R b/b
256 $ hg shelve -l --stat
256 $ hg shelve -l --stat
257 wibble (*) wat (glob)
257 wibble (*) wat (glob)
258 a/a | 1 +
258 a/a | 1 +
259 1 files changed, 1 insertions(+), 0 deletions(-)
259 1 files changed, 1 insertions(+), 0 deletions(-)
260
260
261 and now "a/a" should reappear
261 and now "a/a" should reappear
262
262
263 $ cd a
263 $ cd a
264 $ hg unshelve -q wibble
264 $ hg unshelve -q wibble
265 $ cd ..
265 $ cd ..
266 $ hg status -C
266 $ hg status -C
267 M a/a
267 M a/a
268 A b.rename/b
268 A b.rename/b
269 b/b
269 b/b
270 A c.copy
270 A c.copy
271 c
271 c
272 R b/b
272 R b/b
273
273
274 ensure old shelve backups are being deleted automatically
274 ensure old shelve backups are being deleted automatically
275
275
276 $ ls .hg/shelve-backup/
276 $ ls .hg/shelve-backup/
277 default-01.hg
277 default-01.hg
278 default-01.patch
278 default-01.patch
279 wibble.hg
279 wibble.hg
280 wibble.patch
280 wibble.patch
281
281
282 cause unshelving to result in a merge with 'a' conflicting
282 cause unshelving to result in a merge with 'a' conflicting
283
283
284 $ hg shelve -q
284 $ hg shelve -q
285 $ echo c>>a/a
285 $ echo c>>a/a
286 $ hg commit -m second
286 $ hg commit -m second
287 $ hg tip --template '{files}\n'
287 $ hg tip --template '{files}\n'
288 a/a
288 a/a
289
289
290 add an unrelated change that should be preserved
290 add an unrelated change that should be preserved
291
291
292 $ mkdir foo
292 $ mkdir foo
293 $ echo foo > foo/foo
293 $ echo foo > foo/foo
294 $ hg add foo/foo
294 $ hg add foo/foo
295
295
296 force a conflicted merge to occur
296 force a conflicted merge to occur
297
297
298 $ hg unshelve
298 $ hg unshelve
299 unshelving change 'default'
299 unshelving change 'default'
300 temporarily committing pending changes (restore with 'hg unshelve --abort')
300 temporarily committing pending changes (restore with 'hg unshelve --abort')
301 rebasing shelved changes
301 rebasing shelved changes
302 rebasing 5:4702e8911fe0 "changes to '[mq]: second.patch'" (tip)
302 rebasing 5:4702e8911fe0 "changes to '[mq]: second.patch'" (tip)
303 merging a/a
303 merging a/a
304 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
304 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
305 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
305 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
306 [1]
306 [1]
307
307
308 ensure that we have a merge with unresolved conflicts
308 ensure that we have a merge with unresolved conflicts
309
309
310 $ hg heads -q --template '{rev}\n'
310 $ hg heads -q --template '{rev}\n'
311 5
311 5
312 4
312 4
313 $ hg parents -q --template '{rev}\n'
313 $ hg parents -q --template '{rev}\n'
314 4
314 4
315 5
315 5
316 $ hg status
316 $ hg status
317 M a/a
317 M a/a
318 M b.rename/b
318 M b.rename/b
319 M c.copy
319 M c.copy
320 R b/b
320 R b/b
321 ? a/a.orig
321 ? a/a.orig
322 $ hg diff
322 $ hg diff
323 diff --git a/a/a b/a/a
323 diff --git a/a/a b/a/a
324 --- a/a/a
324 --- a/a/a
325 +++ b/a/a
325 +++ b/a/a
326 @@ -1,2 +1,6 @@
326 @@ -1,2 +1,6 @@
327 a
327 a
328 +<<<<<<< dest: * - shelve: pending changes temporary commit (glob)
328 +<<<<<<< dest: * - shelve: pending changes temporary commit (glob)
329 c
329 c
330 +=======
330 +=======
331 +a
331 +a
332 +>>>>>>> source: 4702e8911fe0 - shelve: changes to '[mq]: second.patch'
332 +>>>>>>> source: 4702e8911fe0 - shelve: changes to '[mq]: second.patch'
333 diff --git a/b/b b/b.rename/b
333 diff --git a/b/b b/b.rename/b
334 rename from b/b
334 rename from b/b
335 rename to b.rename/b
335 rename to b.rename/b
336 diff --git a/c b/c.copy
336 diff --git a/c b/c.copy
337 copy from c
337 copy from c
338 copy to c.copy
338 copy to c.copy
339 $ hg resolve -l
339 $ hg resolve -l
340 U a/a
340 U a/a
341
341
342 $ hg shelve
342 $ hg shelve
343 abort: unshelve already in progress
343 abort: unshelve already in progress
344 (use 'hg unshelve --continue' or 'hg unshelve --abort')
344 (use 'hg unshelve --continue' or 'hg unshelve --abort')
345 [255]
345 [255]
346
346
347 abort the unshelve and be happy
347 abort the unshelve and be happy
348
348
349 $ hg status
349 $ hg status
350 M a/a
350 M a/a
351 M b.rename/b
351 M b.rename/b
352 M c.copy
352 M c.copy
353 R b/b
353 R b/b
354 ? a/a.orig
354 ? a/a.orig
355 $ hg unshelve -a
355 $ hg unshelve -a
356 rebase aborted
356 rebase aborted
357 unshelve of 'default' aborted
357 unshelve of 'default' aborted
358 $ hg heads -q
358 $ hg heads -q
359 3:2e69b451d1ea
359 3:2e69b451d1ea
360 $ hg parents
360 $ hg parents
361 changeset: 3:2e69b451d1ea
361 changeset: 3:2e69b451d1ea
362 tag: tip
362 tag: tip
363 user: test
363 user: test
364 date: Thu Jan 01 00:00:00 1970 +0000
364 date: Thu Jan 01 00:00:00 1970 +0000
365 summary: second
365 summary: second
366
366
367 $ hg resolve -l
367 $ hg resolve -l
368 $ hg status
368 $ hg status
369 A foo/foo
369 A foo/foo
370 ? a/a.orig
370 ? a/a.orig
371
371
372 try to continue with no unshelve underway
372 try to continue with no unshelve underway
373
373
374 $ hg unshelve -c
374 $ hg unshelve -c
375 abort: no unshelve operation underway
375 abort: no unshelve operation underway
376 [255]
376 [255]
377 $ hg status
377 $ hg status
378 A foo/foo
378 A foo/foo
379 ? a/a.orig
379 ? a/a.orig
380
380
381 redo the unshelve to get a conflict
381 redo the unshelve to get a conflict
382
382
383 $ hg unshelve -q
383 $ hg unshelve -q
384 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
384 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
385 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
385 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
386 [1]
386 [1]
387
387
388 attempt to continue
388 attempt to continue
389
389
390 $ hg unshelve -c
390 $ hg unshelve -c
391 abort: unresolved conflicts, can't continue
391 abort: unresolved conflicts, can't continue
392 (see 'hg resolve', then 'hg unshelve --continue')
392 (see 'hg resolve', then 'hg unshelve --continue')
393 [255]
393 [255]
394
394
395 $ hg revert -r . a/a
395 $ hg revert -r . a/a
396 $ hg resolve -m a/a
396 $ hg resolve -m a/a
397 (no more unresolved files)
397 (no more unresolved files)
398
398
399 $ hg commit -m 'commit while unshelve in progress'
399 $ hg commit -m 'commit while unshelve in progress'
400 abort: unshelve already in progress
400 abort: unshelve already in progress
401 (use 'hg unshelve --continue' or 'hg unshelve --abort')
401 (use 'hg unshelve --continue' or 'hg unshelve --abort')
402 [255]
402 [255]
403
403
404 $ hg unshelve -c
404 $ hg unshelve -c
405 rebasing 5:4702e8911fe0 "changes to '[mq]: second.patch'" (tip)
405 rebasing 5:4702e8911fe0 "changes to '[mq]: second.patch'" (tip)
406 unshelve of 'default' complete
406 unshelve of 'default' complete
407
407
408 ensure the repo is as we hope
408 ensure the repo is as we hope
409
409
410 $ hg parents
410 $ hg parents
411 changeset: 3:2e69b451d1ea
411 changeset: 3:2e69b451d1ea
412 tag: tip
412 tag: tip
413 user: test
413 user: test
414 date: Thu Jan 01 00:00:00 1970 +0000
414 date: Thu Jan 01 00:00:00 1970 +0000
415 summary: second
415 summary: second
416
416
417 $ hg heads -q
417 $ hg heads -q
418 3:2e69b451d1ea
418 3:2e69b451d1ea
419
419
420 $ hg status -C
420 $ hg status -C
421 A b.rename/b
421 A b.rename/b
422 b/b
422 b/b
423 A c.copy
423 A c.copy
424 c
424 c
425 A foo/foo
425 A foo/foo
426 R b/b
426 R b/b
427 ? a/a.orig
427 ? a/a.orig
428
428
429 there should be no shelves left
429 there should be no shelves left
430
430
431 $ hg shelve -l
431 $ hg shelve -l
432
432
433 #if execbit
433 #if execbit
434
434
435 ensure that metadata-only changes are shelved
435 ensure that metadata-only changes are shelved
436
436
437 $ chmod +x a/a
437 $ chmod +x a/a
438 $ hg shelve -q -n execbit a/a
438 $ hg shelve -q -n execbit a/a
439 $ hg status a/a
439 $ hg status a/a
440 $ hg unshelve -q execbit
440 $ hg unshelve -q execbit
441 $ hg status a/a
441 $ hg status a/a
442 M a/a
442 M a/a
443 $ hg revert a/a
443 $ hg revert a/a
444
444
445 #endif
445 #endif
446
446
447 #if symlink
447 #if symlink
448
448
449 $ rm a/a
449 $ rm a/a
450 $ ln -s foo a/a
450 $ ln -s foo a/a
451 $ hg shelve -q -n symlink a/a
451 $ hg shelve -q -n symlink a/a
452 $ hg status a/a
452 $ hg status a/a
453 $ hg unshelve -q symlink
453 $ hg unshelve -q symlink
454 $ hg status a/a
454 $ hg status a/a
455 M a/a
455 M a/a
456 $ hg revert a/a
456 $ hg revert a/a
457
457
458 #endif
458 #endif
459
459
460 set up another conflict between a commit and a shelved change
460 set up another conflict between a commit and a shelved change
461
461
462 $ hg revert -q -C -a
462 $ hg revert -q -C -a
463 $ rm a/a.orig b.rename/b c.copy
463 $ rm a/a.orig b.rename/b c.copy
464 $ echo a >> a/a
464 $ echo a >> a/a
465 $ hg shelve -q
465 $ hg shelve -q
466 $ echo x >> a/a
466 $ echo x >> a/a
467 $ hg ci -m 'create conflict'
467 $ hg ci -m 'create conflict'
468 $ hg add foo/foo
468 $ hg add foo/foo
469
469
470 if we resolve a conflict while unshelving, the unshelve should succeed
470 if we resolve a conflict while unshelving, the unshelve should succeed
471
471
472 $ HGMERGE=true hg unshelve
472 $ HGMERGE=true hg unshelve
473 unshelving change 'default'
473 unshelving change 'default'
474 temporarily committing pending changes (restore with 'hg unshelve --abort')
474 temporarily committing pending changes (restore with 'hg unshelve --abort')
475 rebasing shelved changes
475 rebasing shelved changes
476 rebasing 6:c5e6910e7601 "changes to 'second'" (tip)
476 rebasing 6:c5e6910e7601 "changes to 'second'" (tip)
477 merging a/a
477 merging a/a
478 note: rebase of 6:c5e6910e7601 created no changes to commit
478 note: rebase of 6:c5e6910e7601 created no changes to commit
479 $ hg parents -q
479 $ hg parents -q
480 4:33f7f61e6c5e
480 4:33f7f61e6c5e
481 $ hg shelve -l
481 $ hg shelve -l
482 $ hg status
482 $ hg status
483 A foo/foo
483 A foo/foo
484 $ cat a/a
484 $ cat a/a
485 a
485 a
486 c
486 c
487 x
487 x
488
488
489 test keep and cleanup
489 test keep and cleanup
490
490
491 $ hg shelve
491 $ hg shelve
492 shelved as default
492 shelved as default
493 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
493 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
494 $ hg shelve --list
494 $ hg shelve --list
495 default (*) changes to 'create conflict' (glob)
495 default (*) changes to 'create conflict' (glob)
496 $ hg unshelve --keep
496 $ hg unshelve --keep
497 unshelving change 'default'
497 unshelving change 'default'
498 $ hg shelve --list
498 $ hg shelve --list
499 default (*) changes to 'create conflict' (glob)
499 default (*) changes to 'create conflict' (glob)
500 $ hg shelve --cleanup
500 $ hg shelve --cleanup
501 $ hg shelve --list
501 $ hg shelve --list
502
502
503 $ hg shelve --cleanup --delete
503 $ hg shelve --cleanup --delete
504 abort: options '--cleanup' and '--delete' may not be used together
504 abort: options '--cleanup' and '--delete' may not be used together
505 [255]
505 [255]
506 $ hg shelve --cleanup --patch
506 $ hg shelve --cleanup --patch
507 abort: options '--cleanup' and '--patch' may not be used together
507 abort: options '--cleanup' and '--patch' may not be used together
508 [255]
508 [255]
509 $ hg shelve --cleanup --message MESSAGE
509 $ hg shelve --cleanup --message MESSAGE
510 abort: options '--cleanup' and '--message' may not be used together
510 abort: options '--cleanup' and '--message' may not be used together
511 [255]
511 [255]
512
512
513 test bookmarks
513 test bookmarks
514
514
515 $ hg bookmark test
515 $ hg bookmark test
516 $ hg bookmark
516 $ hg bookmark
517 * test 4:33f7f61e6c5e
517 * test 4:33f7f61e6c5e
518 $ hg shelve
518 $ hg shelve
519 shelved as test
519 shelved as test
520 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
520 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
521 $ hg bookmark
521 $ hg bookmark
522 * test 4:33f7f61e6c5e
522 * test 4:33f7f61e6c5e
523 $ hg unshelve
523 $ hg unshelve
524 unshelving change 'test'
524 unshelving change 'test'
525 $ hg bookmark
525 $ hg bookmark
526 * test 4:33f7f61e6c5e
526 * test 4:33f7f61e6c5e
527
527
528 shelve should still work even if mq is disabled
528 shelve should still work even if mq is disabled
529
529
530 $ hg --config extensions.mq=! shelve
530 $ hg --config extensions.mq=! shelve
531 shelved as test
531 shelved as test
532 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
532 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
533 $ hg --config extensions.mq=! shelve --list
533 $ hg --config extensions.mq=! shelve --list
534 test (*) changes to 'create conflict' (glob)
534 test (*) changes to 'create conflict' (glob)
535 $ hg bookmark
535 $ hg bookmark
536 * test 4:33f7f61e6c5e
536 * test 4:33f7f61e6c5e
537 $ hg --config extensions.mq=! unshelve
537 $ hg --config extensions.mq=! unshelve
538 unshelving change 'test'
538 unshelving change 'test'
539 $ hg bookmark
539 $ hg bookmark
540 * test 4:33f7f61e6c5e
540 * test 4:33f7f61e6c5e
541
541
542 shelve should leave dirstate clean (issue4055)
542 shelve should leave dirstate clean (issue4055)
543
543
544 $ cd ..
544 $ cd ..
545 $ hg init shelverebase
545 $ hg init shelverebase
546 $ cd shelverebase
546 $ cd shelverebase
547 $ printf 'x\ny\n' > x
547 $ printf 'x\ny\n' > x
548 $ echo z > z
548 $ echo z > z
549 $ hg commit -Aqm xy
549 $ hg commit -Aqm xy
550 $ echo z >> x
550 $ echo z >> x
551 $ hg commit -Aqm z
551 $ hg commit -Aqm z
552 $ hg up 0
552 $ hg up 0
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
554 $ printf 'a\nx\ny\nz\n' > x
554 $ printf 'a\nx\ny\nz\n' > x
555 $ hg commit -Aqm xyz
555 $ hg commit -Aqm xyz
556 $ echo c >> z
556 $ echo c >> z
557 $ hg shelve
557 $ hg shelve
558 shelved as default
558 shelved as default
559 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
559 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
560 $ hg rebase -d 1 --config extensions.rebase=
560 $ hg rebase -d 1 --config extensions.rebase=
561 rebasing 2:323bfa07f744 "xyz" (tip)
561 rebasing 2:323bfa07f744 "xyz" (tip)
562 merging x
562 merging x
563 saved backup bundle to $TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-78114325-backup.hg (glob)
563 saved backup bundle to $TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-78114325-backup.hg (glob)
564 $ hg unshelve
564 $ hg unshelve
565 unshelving change 'default'
565 unshelving change 'default'
566 rebasing shelved changes
566 rebasing shelved changes
567 rebasing 4:b8fefe789ed0 "changes to 'xyz'" (tip)
567 rebasing 4:b8fefe789ed0 "changes to 'xyz'" (tip)
568 $ hg status
568 $ hg status
569 M z
569 M z
570
570
571 $ cd ..
571 $ cd ..
572
572
573 shelve should only unshelve pending changes (issue4068)
573 shelve should only unshelve pending changes (issue4068)
574
574
575 $ hg init onlypendingchanges
575 $ hg init onlypendingchanges
576 $ cd onlypendingchanges
576 $ cd onlypendingchanges
577 $ touch a
577 $ touch a
578 $ hg ci -Aqm a
578 $ hg ci -Aqm a
579 $ touch b
579 $ touch b
580 $ hg ci -Aqm b
580 $ hg ci -Aqm b
581 $ hg up -q 0
581 $ hg up -q 0
582 $ touch c
582 $ touch c
583 $ hg ci -Aqm c
583 $ hg ci -Aqm c
584
584
585 $ touch d
585 $ touch d
586 $ hg add d
586 $ hg add d
587 $ hg shelve
587 $ hg shelve
588 shelved as default
588 shelved as default
589 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
589 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
590 $ hg up -q 1
590 $ hg up -q 1
591 $ hg unshelve
591 $ hg unshelve
592 unshelving change 'default'
592 unshelving change 'default'
593 rebasing shelved changes
593 rebasing shelved changes
594 rebasing 3:0cae6656c016 "changes to 'c'" (tip)
594 rebasing 3:0cae6656c016 "changes to 'c'" (tip)
595 $ hg status
595 $ hg status
596 A d
596 A d
597
597
598 unshelve should work on an ancestor of the original commit
598 unshelve should work on an ancestor of the original commit
599
599
600 $ hg shelve
600 $ hg shelve
601 shelved as default
601 shelved as default
602 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
602 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
603 $ hg up 0
603 $ hg up 0
604 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
604 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
605 $ hg unshelve
605 $ hg unshelve
606 unshelving change 'default'
606 unshelving change 'default'
607 rebasing shelved changes
607 rebasing shelved changes
608 rebasing 3:be58f65f55fb "changes to 'b'" (tip)
608 rebasing 3:be58f65f55fb "changes to 'b'" (tip)
609 $ hg status
609 $ hg status
610 A d
610 A d
611
611
612 test bug 4073 we need to enable obsolete markers for it
612 test bug 4073 we need to enable obsolete markers for it
613
613
614 $ cat >> $HGRCPATH << EOF
614 $ cat >> $HGRCPATH << EOF
615 > [experimental]
615 > [experimental]
616 > evolution=createmarkers
616 > evolution=createmarkers
617 > EOF
617 > EOF
618 $ hg shelve
618 $ hg shelve
619 shelved as default
619 shelved as default
620 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
620 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
621 $ hg debugobsolete `hg --debug id -i -r 1`
621 $ hg debugobsolete `hg --debug id -i -r 1`
622 $ hg unshelve
622 $ hg unshelve
623 unshelving change 'default'
623 unshelving change 'default'
624
624
625 unshelve should leave unknown files alone (issue4113)
625 unshelve should leave unknown files alone (issue4113)
626
626
627 $ echo e > e
627 $ echo e > e
628 $ hg shelve
628 $ hg shelve
629 shelved as default
629 shelved as default
630 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
630 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
631 $ hg status
631 $ hg status
632 ? e
632 ? e
633 $ hg unshelve
633 $ hg unshelve
634 unshelving change 'default'
634 unshelving change 'default'
635 $ hg status
635 $ hg status
636 A d
636 A d
637 ? e
637 ? e
638 $ cat e
638 $ cat e
639 e
639 e
640
640
641 unshelve should keep a copy of unknown files
641 unshelve should keep a copy of unknown files
642
642
643 $ hg add e
643 $ hg add e
644 $ hg shelve
644 $ hg shelve
645 shelved as default
645 shelved as default
646 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
646 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
647 $ echo z > e
647 $ echo z > e
648 $ hg unshelve
648 $ hg unshelve
649 unshelving change 'default'
649 unshelving change 'default'
650 $ cat e
650 $ cat e
651 e
651 e
652 $ cat e.orig
652 $ cat e.orig
653 z
653 z
654
654
655
655
656 unshelve and conflicts with tracked and untracked files
656 unshelve and conflicts with tracked and untracked files
657
657
658 preparing:
658 preparing:
659
659
660 $ rm *.orig
660 $ rm *.orig
661 $ hg ci -qm 'commit stuff'
661 $ hg ci -qm 'commit stuff'
662 $ hg phase -p null:
662 $ hg phase -p null:
663
663
664 no other changes - no merge:
664 no other changes - no merge:
665
665
666 $ echo f > f
666 $ echo f > f
667 $ hg add f
667 $ hg add f
668 $ hg shelve
668 $ hg shelve
669 shelved as default
669 shelved as default
670 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
670 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
671 $ echo g > f
671 $ echo g > f
672 $ hg unshelve
672 $ hg unshelve
673 unshelving change 'default'
673 unshelving change 'default'
674 $ hg st
674 $ hg st
675 A f
675 A f
676 ? f.orig
676 ? f.orig
677 $ cat f
677 $ cat f
678 f
678 f
679 $ cat f.orig
679 $ cat f.orig
680 g
680 g
681
681
682 other uncommitted changes - merge:
682 other uncommitted changes - merge:
683
683
684 $ hg st
684 $ hg st
685 A f
685 A f
686 ? f.orig
686 ? f.orig
687 $ hg shelve
687 $ hg shelve
688 shelved as default
688 shelved as default
689 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
689 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
690 $ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()'
690 $ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()'
691 o 4 changes to 'commit stuff' shelve@localhost
691 o 4 changes to 'commit stuff' shelve@localhost
692 |
692 |
693 $ hg log -G --template '{rev} {desc|firstline} {author}'
693 $ hg log -G --template '{rev} {desc|firstline} {author}'
694 @ 3 commit stuff test
694 @ 3 commit stuff test
695 |
695 |
696 | o 2 c test
696 | o 2 c test
697 |/
697 |/
698 o 0 a test
698 o 0 a test
699
699
700 $ mv f.orig f
700 $ mv f.orig f
701 $ echo 1 > a
701 $ echo 1 > a
702 $ hg unshelve --date '1073741824 0'
702 $ hg unshelve --date '1073741824 0'
703 unshelving change 'default'
703 unshelving change 'default'
704 temporarily committing pending changes (restore with 'hg unshelve --abort')
704 temporarily committing pending changes (restore with 'hg unshelve --abort')
705 rebasing shelved changes
705 rebasing shelved changes
706 rebasing 5:23b29cada8ba "changes to 'commit stuff'" (tip)
706 rebasing 5:23b29cada8ba "changes to 'commit stuff'" (tip)
707 merging f
707 merging f
708 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
708 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
709 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
709 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
710 [1]
710 [1]
711 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
711 $ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
712 @ 5 changes to 'commit stuff' shelve@localhost 1970-01-01 00:00 +0000
712 @ 5 changes to 'commit stuff' shelve@localhost 1970-01-01 00:00 +0000
713 |
713 |
714 | @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
714 | @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
715 |/
715 |/
716 o 3 commit stuff test 1970-01-01 00:00 +0000
716 o 3 commit stuff test 1970-01-01 00:00 +0000
717 |
717 |
718 | o 2 c test 1970-01-01 00:00 +0000
718 | o 2 c test 1970-01-01 00:00 +0000
719 |/
719 |/
720 o 0 a test 1970-01-01 00:00 +0000
720 o 0 a test 1970-01-01 00:00 +0000
721
721
722 $ hg st
722 $ hg st
723 M f
723 M f
724 ? f.orig
724 ? f.orig
725 $ cat f
725 $ cat f
726 <<<<<<< dest: 5f6b880e719b - shelve: pending changes temporary commit
726 <<<<<<< dest: 5f6b880e719b - shelve: pending changes temporary commit
727 g
727 g
728 =======
728 =======
729 f
729 f
730 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
730 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
731 $ cat f.orig
731 $ cat f.orig
732 g
732 g
733 $ hg unshelve --abort
733 $ hg unshelve --abort
734 rebase aborted
734 rebase aborted
735 unshelve of 'default' aborted
735 unshelve of 'default' aborted
736 $ hg st
736 $ hg st
737 M a
737 M a
738 ? f.orig
738 ? f.orig
739 $ cat f.orig
739 $ cat f.orig
740 g
740 g
741 $ hg unshelve
741 $ hg unshelve
742 unshelving change 'default'
742 unshelving change 'default'
743 temporarily committing pending changes (restore with 'hg unshelve --abort')
743 temporarily committing pending changes (restore with 'hg unshelve --abort')
744 rebasing shelved changes
744 rebasing shelved changes
745 rebasing 5:23b29cada8ba "changes to 'commit stuff'" (tip)
745 rebasing 5:23b29cada8ba "changes to 'commit stuff'" (tip)
746 $ hg st
746 $ hg st
747 M a
747 M a
748 A f
748 A f
749 ? f.orig
749 ? f.orig
750
750
751 other committed changes - merge:
751 other committed changes - merge:
752
752
753 $ hg shelve f
753 $ hg shelve f
754 shelved as default
754 shelved as default
755 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
755 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
756 $ hg ci a -m 'intermediate other change'
756 $ hg ci a -m 'intermediate other change'
757 $ mv f.orig f
757 $ mv f.orig f
758 $ hg unshelve
758 $ hg unshelve
759 unshelving change 'default'
759 unshelving change 'default'
760 rebasing shelved changes
760 rebasing shelved changes
761 rebasing 5:23b29cada8ba "changes to 'commit stuff'" (tip)
761 rebasing 5:23b29cada8ba "changes to 'commit stuff'" (tip)
762 merging f
762 merging f
763 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
763 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
764 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
764 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
765 [1]
765 [1]
766 $ hg st
766 $ hg st
767 M f
767 M f
768 ? f.orig
768 ? f.orig
769 $ cat f
769 $ cat f
770 <<<<<<< dest: * - test: intermediate other change (glob)
770 <<<<<<< dest: * - test: intermediate other change (glob)
771 g
771 g
772 =======
772 =======
773 f
773 f
774 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
774 >>>>>>> source: 23b29cada8ba - shelve: changes to 'commit stuff'
775 $ cat f.orig
775 $ cat f.orig
776 g
776 g
777 $ hg unshelve --abort
777 $ hg unshelve --abort
778 rebase aborted
778 rebase aborted
779 unshelve of 'default' aborted
779 unshelve of 'default' aborted
780 $ hg st
780 $ hg st
781 ? f.orig
781 ? f.orig
782 $ cat f.orig
782 $ cat f.orig
783 g
783 g
784 $ hg shelve --delete default
784 $ hg shelve --delete default
785
785
786 Recreate some conflict again
786 Recreate some conflict again
787
787
788 $ cd ../repo
788 $ cd ../repo
789 $ hg up -C -r 3
789 $ hg up -C -r 3
790 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
790 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
791 (leaving bookmark test)
791 (leaving bookmark test)
792 $ echo y >> a/a
792 $ echo y >> a/a
793 $ hg shelve
793 $ hg shelve
794 shelved as default
794 shelved as default
795 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
795 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
796 $ hg up test
796 $ hg up test
797 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
797 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
798 (activating bookmark test)
798 (activating bookmark test)
799 $ hg bookmark
799 $ hg bookmark
800 * test 4:33f7f61e6c5e
800 * test 4:33f7f61e6c5e
801 $ hg unshelve
801 $ hg unshelve
802 unshelving change 'default'
802 unshelving change 'default'
803 rebasing shelved changes
803 rebasing shelved changes
804 rebasing 5:4b555fdb4e96 "changes to 'second'" (tip)
804 rebasing 5:4b555fdb4e96 "changes to 'second'" (tip)
805 merging a/a
805 merging a/a
806 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
806 warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
807 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
807 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
808 [1]
808 [1]
809 $ hg bookmark
809 $ hg bookmark
810 test 4:33f7f61e6c5e
810 test 4:33f7f61e6c5e
811
811
812 Test that resolving all conflicts in one direction (so that the rebase
812 Test that resolving all conflicts in one direction (so that the rebase
813 is a no-op), works (issue4398)
813 is a no-op), works (issue4398)
814
814
815 $ hg revert -a -r .
815 $ hg revert -a -r .
816 reverting a/a (glob)
816 reverting a/a (glob)
817 $ hg resolve -m a/a
817 $ hg resolve -m a/a
818 (no more unresolved files)
818 (no more unresolved files)
819 $ hg unshelve -c
819 $ hg unshelve -c
820 rebasing 5:4b555fdb4e96 "changes to 'second'" (tip)
820 rebasing 5:4b555fdb4e96 "changes to 'second'" (tip)
821 note: rebase of 5:4b555fdb4e96 created no changes to commit
821 note: rebase of 5:4b555fdb4e96 created no changes to commit
822 unshelve of 'default' complete
822 unshelve of 'default' complete
823 $ hg bookmark
823 $ hg bookmark
824 * test 4:33f7f61e6c5e
824 * test 4:33f7f61e6c5e
825 $ hg diff
825 $ hg diff
826 $ hg status
826 $ hg status
827 ? a/a.orig
827 ? a/a.orig
828 ? foo/foo
828 ? foo/foo
829 $ hg summary
829 $ hg summary
830 parent: 4:33f7f61e6c5e tip
830 parent: 4:33f7f61e6c5e tip
831 create conflict
831 create conflict
832 branch: default
832 branch: default
833 bookmarks: *test
833 bookmarks: *test
834 commit: 2 unknown (clean)
834 commit: 2 unknown (clean)
835 update: (current)
835 update: (current)
836 phases: 5 draft
836 phases: 5 draft
837
837
838 $ hg shelve --delete --stat
838 $ hg shelve --delete --stat
839 abort: options '--delete' and '--stat' may not be used together
839 abort: options '--delete' and '--stat' may not be used together
840 [255]
840 [255]
841 $ hg shelve --delete --name NAME
841 $ hg shelve --delete --name NAME
842 abort: options '--delete' and '--name' may not be used together
842 abort: options '--delete' and '--name' may not be used together
843 [255]
843 [255]
844
844
845 Test interactive shelve
845 Test interactive shelve
846 $ cat <<EOF >> $HGRCPATH
846 $ cat <<EOF >> $HGRCPATH
847 > [ui]
847 > [ui]
848 > interactive = true
848 > interactive = true
849 > EOF
849 > EOF
850 $ echo 'a' >> a/b
850 $ echo 'a' >> a/b
851 $ cat a/a >> a/b
851 $ cat a/a >> a/b
852 $ echo 'x' >> a/b
852 $ echo 'x' >> a/b
853 $ mv a/b a/a
853 $ mv a/b a/a
854 $ echo 'a' >> foo/foo
854 $ echo 'a' >> foo/foo
855 $ hg st
855 $ hg st
856 M a/a
856 M a/a
857 ? a/a.orig
857 ? a/a.orig
858 ? foo/foo
858 ? foo/foo
859 $ cat a/a
859 $ cat a/a
860 a
860 a
861 a
861 a
862 c
862 c
863 x
863 x
864 x
864 x
865 $ cat foo/foo
865 $ cat foo/foo
866 foo
866 foo
867 a
867 a
868 $ hg shelve --interactive --config ui.interactive=false
868 $ hg shelve --interactive --config ui.interactive=false
869 abort: running non-interactively
869 abort: running non-interactively
870 [255]
870 [255]
871 $ hg shelve --interactive << EOF
871 $ hg shelve --interactive << EOF
872 > y
872 > y
873 > y
873 > y
874 > n
874 > n
875 > EOF
875 > EOF
876 diff --git a/a/a b/a/a
876 diff --git a/a/a b/a/a
877 2 hunks, 2 lines changed
877 2 hunks, 2 lines changed
878 examine changes to 'a/a'? [Ynesfdaq?] y
878 examine changes to 'a/a'? [Ynesfdaq?] y
879
879
880 @@ -1,3 +1,4 @@
880 @@ -1,3 +1,4 @@
881 +a
881 +a
882 a
882 a
883 c
883 c
884 x
884 x
885 record change 1/2 to 'a/a'? [Ynesfdaq?] y
885 record change 1/2 to 'a/a'? [Ynesfdaq?] y
886
886
887 @@ -1,3 +2,4 @@
887 @@ -1,3 +2,4 @@
888 a
888 a
889 c
889 c
890 x
890 x
891 +x
891 +x
892 record change 2/2 to 'a/a'? [Ynesfdaq?] n
892 record change 2/2 to 'a/a'? [Ynesfdaq?] n
893
893
894 shelved as test
894 shelved as test
895 merging a/a
895 merging a/a
896 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
896 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
897 $ cat a/a
897 $ cat a/a
898 a
898 a
899 c
899 c
900 x
900 x
901 x
901 x
902 $ cat foo/foo
902 $ cat foo/foo
903 foo
903 foo
904 a
904 a
905 $ hg st
905 $ hg st
906 M a/a
906 M a/a
907 ? foo/foo
907 ? foo/foo
908 $ hg bookmark
908 $ hg bookmark
909 * test 4:33f7f61e6c5e
909 * test 4:33f7f61e6c5e
910 $ hg unshelve
910 $ hg unshelve
911 unshelving change 'test'
911 unshelving change 'test'
912 temporarily committing pending changes (restore with 'hg unshelve --abort')
912 temporarily committing pending changes (restore with 'hg unshelve --abort')
913 rebasing shelved changes
913 rebasing shelved changes
914 rebasing 6:65b5d1c34c34 "changes to 'create conflict'" (tip)
914 rebasing 6:65b5d1c34c34 "changes to 'create conflict'" (tip)
915 merging a/a
915 merging a/a
916 $ hg bookmark
916 $ hg bookmark
917 * test 4:33f7f61e6c5e
917 * test 4:33f7f61e6c5e
918 $ cat a/a
918 $ cat a/a
919 a
919 a
920 a
920 a
921 c
921 c
922 x
922 x
923 x
923 x
924
924
925 shelve --patch and shelve --stat should work with a single valid shelfname
925 shelve --patch and shelve --stat should work with a single valid shelfname
926
926
927 $ hg up --clean .
927 $ hg up --clean .
928 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
928 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
929 (leaving bookmark test)
929 (leaving bookmark test)
930 $ hg shelve --list
930 $ hg shelve --list
931 $ echo 'patch a' > shelf-patch-a
931 $ echo 'patch a' > shelf-patch-a
932 $ hg add shelf-patch-a
932 $ hg add shelf-patch-a
933 $ hg shelve
933 $ hg shelve
934 shelved as default
934 shelved as default
935 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
935 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
936 $ echo 'patch b' > shelf-patch-b
936 $ echo 'patch b' > shelf-patch-b
937 $ hg add shelf-patch-b
937 $ hg add shelf-patch-b
938 $ hg shelve
938 $ hg shelve
939 shelved as default-01
939 shelved as default-01
940 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
940 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
941 $ hg shelve --patch default default-01
941 $ hg shelve --patch default default-01
942 abort: --patch expects a single shelf
942 abort: --patch expects a single shelf
943 [255]
943 [255]
944 $ hg shelve --stat default default-01
944 $ hg shelve --stat default default-01
945 abort: --stat expects a single shelf
945 abort: --stat expects a single shelf
946 [255]
946 [255]
947 $ hg shelve --patch default
947 $ hg shelve --patch default
948 default (* ago) changes to 'create conflict' (glob)
948 default (* ago) changes to 'create conflict' (glob)
949
949
950 diff --git a/shelf-patch-a b/shelf-patch-a
950 diff --git a/shelf-patch-a b/shelf-patch-a
951 new file mode 100644
951 new file mode 100644
952 --- /dev/null
952 --- /dev/null
953 +++ b/shelf-patch-a
953 +++ b/shelf-patch-a
954 @@ -0,0 +1,1 @@
954 @@ -0,0 +1,1 @@
955 +patch a
955 +patch a
956 $ hg shelve --stat default
956 $ hg shelve --stat default
957 default (* ago) changes to 'create conflict' (glob)
957 default (* ago) changes to 'create conflict' (glob)
958 shelf-patch-a | 1 +
958 shelf-patch-a | 1 +
959 1 files changed, 1 insertions(+), 0 deletions(-)
959 1 files changed, 1 insertions(+), 0 deletions(-)
960 $ hg shelve --patch nonexistentshelf
960 $ hg shelve --patch nonexistentshelf
961 abort: cannot find shelf nonexistentshelf
961 abort: cannot find shelf nonexistentshelf
962 [255]
962 [255]
963 $ hg shelve --stat nonexistentshelf
963 $ hg shelve --stat nonexistentshelf
964 abort: cannot find shelf nonexistentshelf
964 abort: cannot find shelf nonexistentshelf
965 [255]
965 [255]
966
966
967 $ cd ..
967 $ cd ..
968
968
969 Shelve from general delta repo uses bundle2 on disk
969 Shelve from general delta repo uses bundle2 on disk
970 --------------------------------------------------
970 --------------------------------------------------
971
971
972 no general delta
972 no general delta
973
973
974 $ hg clone --pull repo bundle1 --config format.generaldelta=0
974 $ hg clone --pull repo bundle1 --config format.generaldelta=0
975 requesting all changes
975 requesting all changes
976 adding changesets
976 adding changesets
977 adding manifests
977 adding manifests
978 adding file changes
978 adding file changes
979 added 5 changesets with 8 changes to 6 files
979 added 5 changesets with 8 changes to 6 files
980 updating to branch default
980 updating to branch default
981 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
981 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
982 $ cd bundle1
982 $ cd bundle1
983 $ echo babar > jungle
983 $ echo babar > jungle
984 $ hg add jungle
984 $ hg add jungle
985 $ hg shelve
985 $ hg shelve
986 shelved as default
986 shelved as default
987 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
987 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
988 $ hg debugbundle .hg/shelved/*.hg
988 $ hg debugbundle .hg/shelved/*.hg
989 7e30d8ac6f23cfc84330fd7e698730374615d21a
989 7e30d8ac6f23cfc84330fd7e698730374615d21a
990 $ cd ..
990 $ cd ..
991
991
992 with general delta
992 with general delta
993
993
994 $ hg clone --pull repo bundle2 --config format.generaldelta=1
994 $ hg clone --pull repo bundle2 --config format.generaldelta=1
995 requesting all changes
995 requesting all changes
996 adding changesets
996 adding changesets
997 adding manifests
997 adding manifests
998 adding file changes
998 adding file changes
999 added 5 changesets with 8 changes to 6 files
999 added 5 changesets with 8 changes to 6 files
1000 updating to branch default
1000 updating to branch default
1001 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
1001 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
1002 $ cd bundle2
1002 $ cd bundle2
1003 $ echo babar > jungle
1003 $ echo babar > jungle
1004 $ hg add jungle
1004 $ hg add jungle
1005 $ hg shelve
1005 $ hg shelve
1006 shelved as default
1006 shelved as default
1007 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1007 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1008 $ hg debugbundle .hg/shelved/*.hg
1008 $ hg debugbundle .hg/shelved/*.hg
1009 Stream params: {'Compression': 'BZ'}
1009 Stream params: {'Compression': 'BZ'}
1010 changegroup -- "{'version': '02'}"
1010 changegroup -- "{'version': '02'}"
1011 7e30d8ac6f23cfc84330fd7e698730374615d21a
1011 7e30d8ac6f23cfc84330fd7e698730374615d21a
1012 $ cd ..
1012 $ cd ..
1013
1013
1014 Test visibility of in-memory changes inside transaction to external hook
1014 Test visibility of in-memory changes inside transaction to external hook
1015 ------------------------------------------------------------------------
1015 ------------------------------------------------------------------------
1016
1016
1017 $ cd repo
1017 $ cd repo
1018
1018
1019 $ echo xxxx >> x
1019 $ echo xxxx >> x
1020 $ hg commit -m "#5: changes to invoke rebase"
1020 $ hg commit -m "#5: changes to invoke rebase"
1021
1021
1022 $ cat > $TESTTMP/checkvisibility.sh <<EOF
1022 $ cat > $TESTTMP/checkvisibility.sh <<EOF
1023 > echo "==== \$1:"
1023 > echo "==== \$1:"
1024 > hg parents --template "VISIBLE {rev}:{node|short}\n"
1024 > hg parents --template "VISIBLE {rev}:{node|short}\n"
1025 > # test that pending changes are hidden
1025 > # test that pending changes are hidden
1026 > unset HG_PENDING
1026 > unset HG_PENDING
1027 > hg parents --template "ACTUAL {rev}:{node|short}\n"
1027 > hg parents --template "ACTUAL {rev}:{node|short}\n"
1028 > echo "===="
1028 > echo "===="
1029 > EOF
1029 > EOF
1030
1030
1031 $ cat >> .hg/hgrc <<EOF
1031 $ cat >> .hg/hgrc <<EOF
1032 > [defaults]
1032 > [defaults]
1033 > # to fix hash id of temporary revisions
1033 > # to fix hash id of temporary revisions
1034 > unshelve = --date '0 0'
1034 > unshelve = --date '0 0'
1035 > EOF
1035 > EOF
1036
1036
1037 "hg unshelve" at REV5 implies steps below:
1037 "hg unshelve" at REV5 implies steps below:
1038
1038
1039 (1) commit changes in the working directory (REV6)
1039 (1) commit changes in the working directory (REV6)
1040 (2) unbundle shelved revision (REV7)
1040 (2) unbundle shelved revision (REV7)
1041 (3) rebase: merge REV7 into REV6 (REV6 => REV6, REV7)
1041 (3) rebase: merge REV7 into REV6 (REV6 => REV6, REV7)
1042 (4) rebase: commit merged revision (REV8)
1042 (4) rebase: commit merged revision (REV8)
1043 (5) rebase: update to REV6 (REV8 => REV6)
1043 (5) rebase: update to REV6 (REV8 => REV6)
1044 (6) update to REV5 (REV6 => REV5)
1044 (6) update to REV5 (REV6 => REV5)
1045 (7) abort transaction
1045 (7) abort transaction
1046
1046
1047 == test visibility to external preupdate hook
1047 == test visibility to external preupdate hook
1048
1048
1049 $ cat >> .hg/hgrc <<EOF
1049 $ cat >> .hg/hgrc <<EOF
1050 > [hooks]
1050 > [hooks]
1051 > preupdate.visibility = sh $TESTTMP/checkvisibility.sh preupdate
1051 > preupdate.visibility = sh $TESTTMP/checkvisibility.sh preupdate
1052 > EOF
1052 > EOF
1053
1053
1054 $ echo nnnn >> n
1054 $ echo nnnn >> n
1055
1055
1056 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1056 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1057 ==== before-unshelving:
1057 ==== before-unshelving:
1058 VISIBLE 5:703117a2acfb
1058 VISIBLE 5:703117a2acfb
1059 ACTUAL 5:703117a2acfb
1059 ACTUAL 5:703117a2acfb
1060 ====
1060 ====
1061
1061
1062 $ hg unshelve --keep default
1062 $ hg unshelve --keep default
1063 temporarily committing pending changes (restore with 'hg unshelve --abort')
1063 temporarily committing pending changes (restore with 'hg unshelve --abort')
1064 rebasing shelved changes
1064 rebasing shelved changes
1065 rebasing 7:fcbb97608399 "changes to 'create conflict'" (tip)
1065 rebasing 7:fcbb97608399 "changes to 'create conflict'" (tip)
1066 ==== preupdate:
1066 ==== preupdate:
1067 VISIBLE 6:66b86db80ee4
1067 VISIBLE 6:66b86db80ee4
1068 ACTUAL 5:703117a2acfb
1068 ACTUAL 5:703117a2acfb
1069 ====
1069 ====
1070 ==== preupdate:
1070 ==== preupdate:
1071 VISIBLE 8:cb2a4e59c2d5
1071 VISIBLE 8:cb2a4e59c2d5
1072 ACTUAL 5:703117a2acfb
1072 ACTUAL 5:703117a2acfb
1073 ====
1073 ====
1074 ==== preupdate:
1074 ==== preupdate:
1075 VISIBLE 6:66b86db80ee4
1075 VISIBLE 6:66b86db80ee4
1076 ACTUAL 5:703117a2acfb
1076 ACTUAL 5:703117a2acfb
1077 ====
1077 ====
1078
1078
1079 $ cat >> .hg/hgrc <<EOF
1079 $ cat >> .hg/hgrc <<EOF
1080 > [hooks]
1080 > [hooks]
1081 > preupdate.visibility =
1081 > preupdate.visibility =
1082 > EOF
1082 > EOF
1083
1083
1084 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1084 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1085 ==== after-unshelving:
1085 ==== after-unshelving:
1086 VISIBLE 5:703117a2acfb
1086 VISIBLE 5:703117a2acfb
1087 ACTUAL 5:703117a2acfb
1087 ACTUAL 5:703117a2acfb
1088 ====
1088 ====
1089
1089
1090 == test visibility to external update hook
1090 == test visibility to external update hook
1091
1091
1092 $ hg update -q -C 5
1092 $ hg update -q -C 5
1093
1093
1094 $ cat >> .hg/hgrc <<EOF
1094 $ cat >> .hg/hgrc <<EOF
1095 > [hooks]
1095 > [hooks]
1096 > update.visibility = sh $TESTTMP/checkvisibility.sh update
1096 > update.visibility = sh $TESTTMP/checkvisibility.sh update
1097 > EOF
1097 > EOF
1098
1098
1099 $ echo nnnn >> n
1099 $ echo nnnn >> n
1100
1100
1101 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1101 $ sh $TESTTMP/checkvisibility.sh before-unshelving
1102 ==== before-unshelving:
1102 ==== before-unshelving:
1103 VISIBLE 5:703117a2acfb
1103 VISIBLE 5:703117a2acfb
1104 ACTUAL 5:703117a2acfb
1104 ACTUAL 5:703117a2acfb
1105 ====
1105 ====
1106
1106
1107 $ hg unshelve --keep default
1107 $ hg unshelve --keep default
1108 temporarily committing pending changes (restore with 'hg unshelve --abort')
1108 temporarily committing pending changes (restore with 'hg unshelve --abort')
1109 rebasing shelved changes
1109 rebasing shelved changes
1110 rebasing 7:fcbb97608399 "changes to 'create conflict'" (tip)
1110 rebasing 7:fcbb97608399 "changes to 'create conflict'" (tip)
1111 ==== update:
1111 ==== update:
1112 VISIBLE 6:66b86db80ee4
1112 VISIBLE 6:66b86db80ee4
1113 VISIBLE 7:fcbb97608399
1113 VISIBLE 7:fcbb97608399
1114 ACTUAL 5:703117a2acfb
1114 ACTUAL 5:703117a2acfb
1115 ====
1115 ====
1116 ==== update:
1116 ==== update:
1117 VISIBLE 6:66b86db80ee4
1117 VISIBLE 6:66b86db80ee4
1118 ACTUAL 5:703117a2acfb
1118 ACTUAL 5:703117a2acfb
1119 ====
1119 ====
1120 ==== update:
1120 ==== update:
1121 VISIBLE 5:703117a2acfb
1121 VISIBLE 5:703117a2acfb
1122 ACTUAL 5:703117a2acfb
1122 ACTUAL 5:703117a2acfb
1123 ====
1123 ====
1124
1124
1125 $ cat >> .hg/hgrc <<EOF
1125 $ cat >> .hg/hgrc <<EOF
1126 > [hooks]
1126 > [hooks]
1127 > update.visibility =
1127 > update.visibility =
1128 > EOF
1128 > EOF
1129
1129
1130 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1130 $ sh $TESTTMP/checkvisibility.sh after-unshelving
1131 ==== after-unshelving:
1131 ==== after-unshelving:
1132 VISIBLE 5:703117a2acfb
1132 VISIBLE 5:703117a2acfb
1133 ACTUAL 5:703117a2acfb
1133 ACTUAL 5:703117a2acfb
1134 ====
1134 ====
1135
1135
1136 $ cd ..
1136 $ cd ..
1137
1137
1138 test Abort unshelve always gets user out of the unshelved state
1138 test Abort unshelve always gets user out of the unshelved state
1139 ---------------------------------------------------------------
1139 ---------------------------------------------------------------
1140 $ hg init salvage
1140 $ hg init salvage
1141 $ cd salvage
1141 $ cd salvage
1142 $ echo 'content' > root
1142 $ echo 'content' > root
1143 $ hg commit -A -m 'root' -q
1143 $ hg commit -A -m 'root' -q
1144 $ echo '' > root
1144 $ echo '' > root
1145 $ hg shelve -q
1145 $ hg shelve -q
1146 $ echo 'contADDent' > root
1146 $ echo 'contADDent' > root
1147 $ hg unshelve -q
1147 $ hg unshelve -q
1148 warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
1148 warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
1149 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1149 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1150 [1]
1150 [1]
1151 Wreak havoc on the unshelve process
1151 Wreak havoc on the unshelve process
1152 $ rm .hg/unshelverebasestate
1152 $ rm .hg/unshelverebasestate
1153 $ hg unshelve --abort
1153 $ hg unshelve --abort
1154 unshelve of 'default' aborted
1154 unshelve of 'default' aborted
1155 abort: No such file or directory
1155 abort: No such file or directory
1156 [255]
1156 [255]
1157 Can the user leave the current state?
1157 Can the user leave the current state?
1158 $ hg up -C .
1158 $ hg up -C .
1159 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1159 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1160
1160
1161 Try again but with a corrupted shelve state file
1161 Try again but with a corrupted shelve state file
1162 $ hg strip -r 2 -r 1 -q
1162 $ hg strip -r 2 -r 1 -q
1163 $ hg up -r 0 -q
1163 $ hg up -r 0 -q
1164 $ echo '' > root
1164 $ echo '' > root
1165 $ hg shelve -q
1165 $ hg shelve -q
1166 $ echo 'contADDent' > root
1166 $ echo 'contADDent' > root
1167 $ hg unshelve -q
1167 $ hg unshelve -q
1168 warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
1168 warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
1169 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1169 unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
1170 [1]
1170 [1]
1171 $ sed 's/ae8c668541e8/123456789012/' .hg/shelvedstate > ../corrupt-shelvedstate
1171 $ sed 's/ae8c668541e8/123456789012/' .hg/shelvedstate > ../corrupt-shelvedstate
1172 $ mv ../corrupt-shelvedstate .hg/histedit-state
1172 $ mv ../corrupt-shelvedstate .hg/histedit-state
1173 $ hg unshelve --abort 2>&1 | grep 'rebase aborted'
1173 $ hg unshelve --abort 2>&1 | grep 'rebase aborted'
1174 rebase aborted
1174 rebase aborted
1175 $ hg up -C .
1175 $ hg up -C .
1176 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1176 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1177
1178 $ cd ..
1179
1180 Keep active bookmark while (un)shelving even on shared repo (issue4940)
1181 -----------------------------------------------------------------------
1182
1183 $ cat <<EOF >> $HGRCPATH
1184 > [extensions]
1185 > share =
1186 > EOF
1187
1188 $ hg bookmarks -R repo
1189 test 4:33f7f61e6c5e
1190 $ hg share -B repo share
1191 updating working directory
1192 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
1193 $ cd share
1194
1195 $ hg bookmarks
1196 test 4:33f7f61e6c5e
1197 $ hg bookmarks foo
1198 $ hg bookmarks
1199 * foo 5:703117a2acfb
1200 test 4:33f7f61e6c5e
1201 $ echo x >> x
1202 $ hg shelve
1203 shelved as foo
1204 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1205 $ hg bookmarks
1206 * foo 5:703117a2acfb
1207 test 4:33f7f61e6c5e
1208
1209 $ hg unshelve
1210 unshelving change 'foo'
1211 $ hg bookmarks
1212 * foo 5:703117a2acfb
1213 test 4:33f7f61e6c5e
1214
1215 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now