2014-11-04 17:41:46 +03:00
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extensions]
|
|
|
|
> mq =
|
|
|
|
> shelve =
|
|
|
|
> [defaults]
|
|
|
|
> diff = --nodates --git
|
|
|
|
> qnew = --date '0 0'
|
2015-07-01 23:14:03 +03:00
|
|
|
> [shelve]
|
|
|
|
> maxbackups = 2
|
2014-11-04 17:41:46 +03:00
|
|
|
> EOF
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
$ hg init repo
|
|
|
|
$ cd repo
|
|
|
|
$ mkdir a b
|
|
|
|
$ echo a > a/a
|
|
|
|
$ echo b > b/b
|
|
|
|
$ echo c > c
|
|
|
|
$ echo d > d
|
|
|
|
$ echo x > x
|
|
|
|
$ hg addremove -q
|
|
|
|
|
2015-03-26 01:52:28 +03:00
|
|
|
shelve has a help message
|
|
|
|
$ hg shelve -h
|
|
|
|
hg shelve [OPTION]... [FILE]...
|
|
|
|
|
|
|
|
save and set aside changes from the working directory
|
|
|
|
|
|
|
|
Shelving takes files that "hg status" reports as not clean, saves the
|
|
|
|
modifications to a bundle (a shelved change), and reverts the files so
|
|
|
|
that their state in the working directory becomes clean.
|
|
|
|
|
|
|
|
To restore these changes to the working directory, using "hg unshelve";
|
|
|
|
this will work even if you switch to a different commit.
|
|
|
|
|
|
|
|
When no files are specified, "hg shelve" saves all not-clean files. If
|
|
|
|
specific files or directories are named, only changes to those files are
|
|
|
|
shelved.
|
|
|
|
|
2016-11-15 00:43:25 +03:00
|
|
|
In bare shelve (when no files are specified, without interactive, include
|
2016-02-10 04:23:27 +03:00
|
|
|
and exclude option), shelving remembers information if the working
|
|
|
|
directory was on newly created branch, in other words working directory
|
|
|
|
was on different branch than its first parent. In this situation
|
|
|
|
unshelving restores branch information to the working directory.
|
|
|
|
|
2015-03-26 01:52:28 +03:00
|
|
|
Each shelved change has a name that makes it easier to find later. The
|
|
|
|
name of a shelved change defaults to being based on the active bookmark,
|
|
|
|
or if there is no active bookmark, the current named branch. To specify a
|
|
|
|
different name, use "--name".
|
|
|
|
|
|
|
|
To see a list of existing shelved changes, use the "--list" option. For
|
|
|
|
each shelved change, this will print its name, age, and description; use "
|
|
|
|
--patch" or "--stat" for more details.
|
|
|
|
|
|
|
|
To delete specific shelved changes, use "--delete". To delete all shelved
|
|
|
|
changes, use "--cleanup".
|
|
|
|
|
2016-09-21 02:47:46 +03:00
|
|
|
(use 'hg help -e shelve' to show help for the shelve extension)
|
2015-03-26 01:52:28 +03:00
|
|
|
|
|
|
|
options ([+] can be repeated):
|
|
|
|
|
help: backout 6f89f03ad369 (mark boolean flags with [no-] in help) for now
The ability to negate any boolean flags itself is great, but I think we are not
ready to expose the help side of it yet.
First, while there exist a handful of such flags whose default value can be
changed (eg: git diff, patchwork confirmation), there is only a few of them. The
users who benefit the most from this change are alias users and large
installation that can deploy extension to change behavior (eg: facebook
tweakdefault). So the majority of user who will be affected by a large change
to command help that is not yet relevant to them. (I expect this to become
relevant when ui.progressive start to exists).
Below is an example of the impact of the new help on 'hg help diff':
-r --rev REV [+] revision
-c --change REV change made by revision
-a --[no-]text treat all files as text
-g --[no-]git use git extended diff format
--[no-]nodates omit dates from diff headers
--[no-]noprefix omit a/ and b/ prefixes from filenames
-p --[no-]show-function show which function each change is in
--[no-]reverse produce a diff that undoes the changes
-w --[no-]ignore-all-space ignore white space when comparing lines
-b --[no-]ignore-space-change ignore changes in the amount of white space
-B --[no-]ignore-blank-lines ignore changes whose lines are all blank
-U --unified NUM number of lines of context to show
--[no-]stat output diffstat-style summary of changes
--root DIR produce diffs relative to subdirectory
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
-S --[no-]subrepos recurse into subrepositories
Another issue with the current state of help, the default value for the
flag is not conveyed to the user. For example in the 'backout' help, there is
no real distinction between "--[no-]backup" (default to True) and "--[no-]keep"
(default) to False:
--[no-]backup no backups
--[no-]keep do not modify working directory during strip
In addition, I've discussed with Augie Fackler and the last batch of the work on
this have burned him out quite some. Therefore he is not intending to perform
any more work on this topic. Quoting him, he would rather see the help part
backed out than spending more time on it.
I do not think we are ready to expose this to users in 4.0 (freeze in a week),
especially because we cannot expect quick improvement on these aspect as this
topic no longer have an owner. We should be able to reintroduce that change in
the future when someone get back on it and the main issues are solves:
* Introduction of ui.progressive makes it relevant for a majority of user,
* Current default value are efficiently conveyed to the user.
(In addition, the excerpt from diff help show that we still have some issue with
some negative option like '--nodates' so further improvement are probably
welcome there.)
2016-10-09 04:11:18 +03:00
|
|
|
-A --addremove mark new/missing files as added/removed before
|
2015-03-26 01:52:28 +03:00
|
|
|
shelving
|
help: backout 6f89f03ad369 (mark boolean flags with [no-] in help) for now
The ability to negate any boolean flags itself is great, but I think we are not
ready to expose the help side of it yet.
First, while there exist a handful of such flags whose default value can be
changed (eg: git diff, patchwork confirmation), there is only a few of them. The
users who benefit the most from this change are alias users and large
installation that can deploy extension to change behavior (eg: facebook
tweakdefault). So the majority of user who will be affected by a large change
to command help that is not yet relevant to them. (I expect this to become
relevant when ui.progressive start to exists).
Below is an example of the impact of the new help on 'hg help diff':
-r --rev REV [+] revision
-c --change REV change made by revision
-a --[no-]text treat all files as text
-g --[no-]git use git extended diff format
--[no-]nodates omit dates from diff headers
--[no-]noprefix omit a/ and b/ prefixes from filenames
-p --[no-]show-function show which function each change is in
--[no-]reverse produce a diff that undoes the changes
-w --[no-]ignore-all-space ignore white space when comparing lines
-b --[no-]ignore-space-change ignore changes in the amount of white space
-B --[no-]ignore-blank-lines ignore changes whose lines are all blank
-U --unified NUM number of lines of context to show
--[no-]stat output diffstat-style summary of changes
--root DIR produce diffs relative to subdirectory
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
-S --[no-]subrepos recurse into subrepositories
Another issue with the current state of help, the default value for the
flag is not conveyed to the user. For example in the 'backout' help, there is
no real distinction between "--[no-]backup" (default to True) and "--[no-]keep"
(default) to False:
--[no-]backup no backups
--[no-]keep do not modify working directory during strip
In addition, I've discussed with Augie Fackler and the last batch of the work on
this have burned him out quite some. Therefore he is not intending to perform
any more work on this topic. Quoting him, he would rather see the help part
backed out than spending more time on it.
I do not think we are ready to expose this to users in 4.0 (freeze in a week),
especially because we cannot expect quick improvement on these aspect as this
topic no longer have an owner. We should be able to reintroduce that change in
the future when someone get back on it and the main issues are solves:
* Introduction of ui.progressive makes it relevant for a majority of user,
* Current default value are efficiently conveyed to the user.
(In addition, the excerpt from diff help show that we still have some issue with
some negative option like '--nodates' so further improvement are probably
welcome there.)
2016-10-09 04:11:18 +03:00
|
|
|
-u --unknown store unknown files in the shelve
|
|
|
|
--cleanup delete all shelved changes
|
2015-03-26 01:52:28 +03:00
|
|
|
--date DATE shelve with the specified commit date
|
help: backout 6f89f03ad369 (mark boolean flags with [no-] in help) for now
The ability to negate any boolean flags itself is great, but I think we are not
ready to expose the help side of it yet.
First, while there exist a handful of such flags whose default value can be
changed (eg: git diff, patchwork confirmation), there is only a few of them. The
users who benefit the most from this change are alias users and large
installation that can deploy extension to change behavior (eg: facebook
tweakdefault). So the majority of user who will be affected by a large change
to command help that is not yet relevant to them. (I expect this to become
relevant when ui.progressive start to exists).
Below is an example of the impact of the new help on 'hg help diff':
-r --rev REV [+] revision
-c --change REV change made by revision
-a --[no-]text treat all files as text
-g --[no-]git use git extended diff format
--[no-]nodates omit dates from diff headers
--[no-]noprefix omit a/ and b/ prefixes from filenames
-p --[no-]show-function show which function each change is in
--[no-]reverse produce a diff that undoes the changes
-w --[no-]ignore-all-space ignore white space when comparing lines
-b --[no-]ignore-space-change ignore changes in the amount of white space
-B --[no-]ignore-blank-lines ignore changes whose lines are all blank
-U --unified NUM number of lines of context to show
--[no-]stat output diffstat-style summary of changes
--root DIR produce diffs relative to subdirectory
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
-S --[no-]subrepos recurse into subrepositories
Another issue with the current state of help, the default value for the
flag is not conveyed to the user. For example in the 'backout' help, there is
no real distinction between "--[no-]backup" (default to True) and "--[no-]keep"
(default) to False:
--[no-]backup no backups
--[no-]keep do not modify working directory during strip
In addition, I've discussed with Augie Fackler and the last batch of the work on
this have burned him out quite some. Therefore he is not intending to perform
any more work on this topic. Quoting him, he would rather see the help part
backed out than spending more time on it.
I do not think we are ready to expose this to users in 4.0 (freeze in a week),
especially because we cannot expect quick improvement on these aspect as this
topic no longer have an owner. We should be able to reintroduce that change in
the future when someone get back on it and the main issues are solves:
* Introduction of ui.progressive makes it relevant for a majority of user,
* Current default value are efficiently conveyed to the user.
(In addition, the excerpt from diff help show that we still have some issue with
some negative option like '--nodates' so further improvement are probably
welcome there.)
2016-10-09 04:11:18 +03:00
|
|
|
-d --delete delete the named shelved change(s)
|
|
|
|
-e --edit invoke editor on commit messages
|
|
|
|
-l --list list current shelves
|
2015-03-26 01:52:28 +03:00
|
|
|
-m --message TEXT use text as shelve message
|
|
|
|
-n --name NAME use the given name for the shelved commit
|
help: backout 6f89f03ad369 (mark boolean flags with [no-] in help) for now
The ability to negate any boolean flags itself is great, but I think we are not
ready to expose the help side of it yet.
First, while there exist a handful of such flags whose default value can be
changed (eg: git diff, patchwork confirmation), there is only a few of them. The
users who benefit the most from this change are alias users and large
installation that can deploy extension to change behavior (eg: facebook
tweakdefault). So the majority of user who will be affected by a large change
to command help that is not yet relevant to them. (I expect this to become
relevant when ui.progressive start to exists).
Below is an example of the impact of the new help on 'hg help diff':
-r --rev REV [+] revision
-c --change REV change made by revision
-a --[no-]text treat all files as text
-g --[no-]git use git extended diff format
--[no-]nodates omit dates from diff headers
--[no-]noprefix omit a/ and b/ prefixes from filenames
-p --[no-]show-function show which function each change is in
--[no-]reverse produce a diff that undoes the changes
-w --[no-]ignore-all-space ignore white space when comparing lines
-b --[no-]ignore-space-change ignore changes in the amount of white space
-B --[no-]ignore-blank-lines ignore changes whose lines are all blank
-U --unified NUM number of lines of context to show
--[no-]stat output diffstat-style summary of changes
--root DIR produce diffs relative to subdirectory
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
-S --[no-]subrepos recurse into subrepositories
Another issue with the current state of help, the default value for the
flag is not conveyed to the user. For example in the 'backout' help, there is
no real distinction between "--[no-]backup" (default to True) and "--[no-]keep"
(default) to False:
--[no-]backup no backups
--[no-]keep do not modify working directory during strip
In addition, I've discussed with Augie Fackler and the last batch of the work on
this have burned him out quite some. Therefore he is not intending to perform
any more work on this topic. Quoting him, he would rather see the help part
backed out than spending more time on it.
I do not think we are ready to expose this to users in 4.0 (freeze in a week),
especially because we cannot expect quick improvement on these aspect as this
topic no longer have an owner. We should be able to reintroduce that change in
the future when someone get back on it and the main issues are solves:
* Introduction of ui.progressive makes it relevant for a majority of user,
* Current default value are efficiently conveyed to the user.
(In addition, the excerpt from diff help show that we still have some issue with
some negative option like '--nodates' so further improvement are probably
welcome there.)
2016-10-09 04:11:18 +03:00
|
|
|
-p --patch show patch
|
|
|
|
-i --interactive interactive mode, only works while creating a shelve
|
|
|
|
--stat output diffstat-style summary of changes
|
2015-03-26 01:52:28 +03:00
|
|
|
-I --include PATTERN [+] include names matching the given patterns
|
|
|
|
-X --exclude PATTERN [+] exclude names matching the given patterns
|
help: backout 6f89f03ad369 (mark boolean flags with [no-] in help) for now
The ability to negate any boolean flags itself is great, but I think we are not
ready to expose the help side of it yet.
First, while there exist a handful of such flags whose default value can be
changed (eg: git diff, patchwork confirmation), there is only a few of them. The
users who benefit the most from this change are alias users and large
installation that can deploy extension to change behavior (eg: facebook
tweakdefault). So the majority of user who will be affected by a large change
to command help that is not yet relevant to them. (I expect this to become
relevant when ui.progressive start to exists).
Below is an example of the impact of the new help on 'hg help diff':
-r --rev REV [+] revision
-c --change REV change made by revision
-a --[no-]text treat all files as text
-g --[no-]git use git extended diff format
--[no-]nodates omit dates from diff headers
--[no-]noprefix omit a/ and b/ prefixes from filenames
-p --[no-]show-function show which function each change is in
--[no-]reverse produce a diff that undoes the changes
-w --[no-]ignore-all-space ignore white space when comparing lines
-b --[no-]ignore-space-change ignore changes in the amount of white space
-B --[no-]ignore-blank-lines ignore changes whose lines are all blank
-U --unified NUM number of lines of context to show
--[no-]stat output diffstat-style summary of changes
--root DIR produce diffs relative to subdirectory
-I --include PATTERN [+] include names matching the given patterns
-X --exclude PATTERN [+] exclude names matching the given patterns
-S --[no-]subrepos recurse into subrepositories
Another issue with the current state of help, the default value for the
flag is not conveyed to the user. For example in the 'backout' help, there is
no real distinction between "--[no-]backup" (default to True) and "--[no-]keep"
(default) to False:
--[no-]backup no backups
--[no-]keep do not modify working directory during strip
In addition, I've discussed with Augie Fackler and the last batch of the work on
this have burned him out quite some. Therefore he is not intending to perform
any more work on this topic. Quoting him, he would rather see the help part
backed out than spending more time on it.
I do not think we are ready to expose this to users in 4.0 (freeze in a week),
especially because we cannot expect quick improvement on these aspect as this
topic no longer have an owner. We should be able to reintroduce that change in
the future when someone get back on it and the main issues are solves:
* Introduction of ui.progressive makes it relevant for a majority of user,
* Current default value are efficiently conveyed to the user.
(In addition, the excerpt from diff help show that we still have some issue with
some negative option like '--nodates' so further improvement are probably
welcome there.)
2016-10-09 04:11:18 +03:00
|
|
|
--mq operate on patch repository
|
2015-03-26 01:52:28 +03:00
|
|
|
|
|
|
|
(some details hidden, use --verbose to show complete help)
|
|
|
|
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
shelving in an empty repo should be possible
|
2014-06-20 11:15:38 +04:00
|
|
|
(this tests also that editor is not invoked, if '--edit' is not
|
|
|
|
specified)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
2014-06-20 11:15:38 +04:00
|
|
|
$ HGEDITOR=cat hg shelve
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 5 files removed, 0 files unresolved
|
|
|
|
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
|
|
|
|
$ hg commit -q -m 'initial commit'
|
|
|
|
|
|
|
|
$ hg shelve
|
|
|
|
nothing changed
|
|
|
|
[1]
|
|
|
|
|
2015-07-01 23:13:02 +03:00
|
|
|
make sure shelve files were backed up
|
|
|
|
|
|
|
|
$ ls .hg/shelve-backup
|
|
|
|
default.hg
|
|
|
|
default.patch
|
|
|
|
|
2016-12-22 20:57:32 +03:00
|
|
|
checks to make sure we dont create a directory or
|
|
|
|
hidden file while choosing a new shelve name
|
|
|
|
|
|
|
|
when we are given a name
|
|
|
|
|
|
|
|
$ hg shelve -n foo/bar
|
2016-12-22 17:05:30 +03:00
|
|
|
abort: shelved change names can not contain slashes
|
2016-12-22 20:57:32 +03:00
|
|
|
[255]
|
|
|
|
$ hg shelve -n .baz
|
2016-12-22 17:05:30 +03:00
|
|
|
abort: shelved change names can not start with '.'
|
2016-12-22 20:57:32 +03:00
|
|
|
[255]
|
|
|
|
$ hg shelve -n foo\\bar
|
2016-12-22 17:05:30 +03:00
|
|
|
abort: shelved change names can not contain slashes
|
2016-12-22 20:57:32 +03:00
|
|
|
[255]
|
|
|
|
|
|
|
|
when shelve has to choose itself
|
|
|
|
|
|
|
|
$ hg branch x/y -q
|
|
|
|
$ hg commit -q -m "Branch commit 0"
|
|
|
|
$ hg shelve
|
|
|
|
nothing changed
|
|
|
|
[1]
|
|
|
|
$ hg branch .x -q
|
|
|
|
$ hg commit -q -m "Branch commit 1"
|
|
|
|
$ hg shelve
|
2016-12-22 17:05:30 +03:00
|
|
|
nothing changed
|
|
|
|
[1]
|
2016-12-22 20:57:32 +03:00
|
|
|
$ hg branch x\\y -q
|
|
|
|
$ hg commit -q -m "Branch commit 2"
|
|
|
|
$ hg shelve
|
2016-12-22 17:05:30 +03:00
|
|
|
nothing changed
|
|
|
|
[1]
|
2016-12-22 20:57:32 +03:00
|
|
|
|
|
|
|
cleaning the branches made for name checking tests
|
|
|
|
|
|
|
|
$ hg up default -q
|
|
|
|
$ hg strip 3 -q
|
|
|
|
$ hg strip 2 -q
|
|
|
|
$ hg strip 1 -q
|
|
|
|
|
2013-08-29 20:22:15 +04:00
|
|
|
create an mq patch - shelving should work fine with a patch applied
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
$ echo n > n
|
|
|
|
$ hg add n
|
|
|
|
$ hg commit n -m second
|
2013-08-29 20:22:15 +04:00
|
|
|
$ hg qnew second.patch
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
shelve a change that we will delete later
|
|
|
|
|
|
|
|
$ echo a >> a/a
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
|
|
|
|
set up some more complex changes to shelve
|
|
|
|
|
|
|
|
$ echo a >> a/a
|
|
|
|
$ hg mv b b.rename
|
|
|
|
moving b/b to b.rename/b (glob)
|
|
|
|
$ hg cp c c.copy
|
|
|
|
$ hg status -C
|
|
|
|
M a/a
|
|
|
|
A b.rename/b
|
|
|
|
b/b
|
|
|
|
A c.copy
|
|
|
|
c
|
|
|
|
R b/b
|
|
|
|
|
|
|
|
the common case - no options or filenames
|
|
|
|
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default-01
|
|
|
|
2 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
|
|
$ hg status -C
|
|
|
|
|
|
|
|
ensure that our shelved changes exist
|
|
|
|
|
|
|
|
$ hg shelve -l
|
2015-11-23 08:40:23 +03:00
|
|
|
default-01 (*)* changes to: [mq]: second.patch (glob)
|
|
|
|
default (*)* changes to: [mq]: second.patch (glob)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
$ hg shelve -l -p default
|
2015-11-23 08:40:23 +03:00
|
|
|
default (*)* changes to: [mq]: second.patch (glob)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
diff --git a/a/a b/a/a
|
|
|
|
--- a/a/a
|
|
|
|
+++ b/a/a
|
|
|
|
@@ -1,1 +1,2 @@
|
|
|
|
a
|
|
|
|
+a
|
|
|
|
|
2014-06-05 17:20:32 +04:00
|
|
|
$ hg shelve --list --addremove
|
|
|
|
abort: options '--list' and '--addremove' may not be used together
|
|
|
|
[255]
|
|
|
|
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
delete our older shelved change
|
|
|
|
|
|
|
|
$ hg shelve -d default
|
2013-08-29 20:22:15 +04:00
|
|
|
$ hg qfinish -a -q
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
2015-07-01 23:13:02 +03:00
|
|
|
ensure shelve backups aren't overwritten
|
|
|
|
|
|
|
|
$ ls .hg/shelve-backup/
|
|
|
|
default-1.hg
|
|
|
|
default-1.patch
|
|
|
|
default.hg
|
|
|
|
default.patch
|
|
|
|
|
2013-10-24 00:12:48 +04:00
|
|
|
local edits should not prevent a shelved change from applying
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
2013-10-24 00:12:48 +04:00
|
|
|
$ printf "z\na\n" > a/a
|
|
|
|
$ hg unshelve --keep
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
unshelving change 'default-01'
|
2014-02-10 03:54:27 +04:00
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 4:32c69314e062 "changes to: [mq]: second.patch" (tip)
|
2013-10-24 00:12:48 +04:00
|
|
|
merging a/a
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
2013-10-24 00:12:48 +04:00
|
|
|
$ hg revert --all -q
|
|
|
|
$ rm a/a.orig b.rename/b c.copy
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
apply it and make sure our state is as expected
|
|
|
|
|
2015-07-13 17:34:12 +03:00
|
|
|
(this also tests that same timestamp prevents backups from being
|
|
|
|
removed, even though there are more than 'maxbackups' backups)
|
|
|
|
|
2016-11-29 18:20:03 +03:00
|
|
|
$ f -t .hg/shelve-backup/default.patch
|
|
|
|
.hg/shelve-backup/default.patch: file
|
|
|
|
$ touch -t 200001010000 .hg/shelve-backup/default.patch
|
|
|
|
$ f -t .hg/shelve-backup/default-1.patch
|
|
|
|
.hg/shelve-backup/default-1.patch: file
|
|
|
|
$ touch -t 200001010000 .hg/shelve-backup/default-1.patch
|
2015-07-13 17:34:12 +03:00
|
|
|
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default-01'
|
|
|
|
$ hg status -C
|
|
|
|
M a/a
|
|
|
|
A b.rename/b
|
|
|
|
b/b
|
|
|
|
A c.copy
|
|
|
|
c
|
|
|
|
R b/b
|
|
|
|
$ hg shelve -l
|
|
|
|
|
2015-07-13 17:34:12 +03:00
|
|
|
(both of default.hg and default-1.hg should be still kept, because it
|
|
|
|
is difficult to decide actual order of them from same timestamp)
|
|
|
|
|
|
|
|
$ ls .hg/shelve-backup/
|
|
|
|
default-01.hg
|
|
|
|
default-01.patch
|
|
|
|
default-1.hg
|
|
|
|
default-1.patch
|
|
|
|
default.hg
|
|
|
|
default.patch
|
|
|
|
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg unshelve
|
|
|
|
abort: no shelved changes to apply!
|
|
|
|
[255]
|
|
|
|
$ hg unshelve foo
|
|
|
|
abort: shelved change 'foo' not found
|
|
|
|
[255]
|
|
|
|
|
|
|
|
named shelves, specific filenames, and "commit messages" should all work
|
2014-06-20 11:15:38 +04:00
|
|
|
(this tests also that editor is invoked, if '--edit' is specified)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
$ hg status -C
|
|
|
|
M a/a
|
|
|
|
A b.rename/b
|
|
|
|
b/b
|
|
|
|
A c.copy
|
|
|
|
c
|
|
|
|
R b/b
|
2014-06-20 11:15:38 +04:00
|
|
|
$ HGEDITOR=cat hg shelve -q -n wibble -m wat -e a
|
|
|
|
wat
|
|
|
|
|
|
|
|
|
|
|
|
HG: Enter commit message. Lines beginning with 'HG:' are removed.
|
|
|
|
HG: Leave message empty to abort commit.
|
|
|
|
HG: --
|
|
|
|
HG: user: shelve@localhost
|
|
|
|
HG: branch 'default'
|
|
|
|
HG: changed a/a
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
expect "a" to no longer be present, but status otherwise unchanged
|
|
|
|
|
|
|
|
$ hg status -C
|
|
|
|
A b.rename/b
|
|
|
|
b/b
|
|
|
|
A c.copy
|
|
|
|
c
|
|
|
|
R b/b
|
|
|
|
$ hg shelve -l --stat
|
2013-10-01 14:20:31 +04:00
|
|
|
wibble (*) wat (glob)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
a/a | 1 +
|
|
|
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
|
|
|
|
|
|
|
and now "a/a" should reappear
|
|
|
|
|
2013-10-22 07:41:05 +04:00
|
|
|
$ cd a
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg unshelve -q wibble
|
2013-10-22 07:41:05 +04:00
|
|
|
$ cd ..
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg status -C
|
|
|
|
M a/a
|
|
|
|
A b.rename/b
|
|
|
|
b/b
|
|
|
|
A c.copy
|
|
|
|
c
|
|
|
|
R b/b
|
|
|
|
|
2015-07-01 23:14:03 +03:00
|
|
|
ensure old shelve backups are being deleted automatically
|
|
|
|
|
|
|
|
$ ls .hg/shelve-backup/
|
|
|
|
default-01.hg
|
|
|
|
default-01.patch
|
|
|
|
wibble.hg
|
|
|
|
wibble.patch
|
|
|
|
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
cause unshelving to result in a merge with 'a' conflicting
|
|
|
|
|
|
|
|
$ hg shelve -q
|
|
|
|
$ echo c>>a/a
|
|
|
|
$ hg commit -m second
|
|
|
|
$ hg tip --template '{files}\n'
|
|
|
|
a/a
|
|
|
|
|
|
|
|
add an unrelated change that should be preserved
|
|
|
|
|
|
|
|
$ mkdir foo
|
|
|
|
$ echo foo > foo/foo
|
|
|
|
$ hg add foo/foo
|
|
|
|
|
|
|
|
force a conflicted merge to occur
|
|
|
|
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
2014-02-10 03:54:27 +04:00
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:32c69314e062 "changes to: [mq]: second.patch" (tip)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
merging a/a
|
2015-10-09 23:54:52 +03:00
|
|
|
warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
|
|
|
|
ensure that we have a merge with unresolved conflicts
|
|
|
|
|
2013-10-24 00:12:48 +04:00
|
|
|
$ hg heads -q --template '{rev}\n'
|
|
|
|
5
|
|
|
|
4
|
|
|
|
$ hg parents -q --template '{rev}\n'
|
|
|
|
4
|
|
|
|
5
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg status
|
|
|
|
M a/a
|
|
|
|
M b.rename/b
|
|
|
|
M c.copy
|
|
|
|
R b/b
|
|
|
|
? a/a.orig
|
|
|
|
$ hg diff
|
|
|
|
diff --git a/a/a b/a/a
|
|
|
|
--- a/a/a
|
|
|
|
+++ b/a/a
|
|
|
|
@@ -1,2 +1,6 @@
|
|
|
|
a
|
2016-11-20 02:41:37 +03:00
|
|
|
+<<<<<<< dest: * - shelve: pending changes temporary commit (glob)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
c
|
|
|
|
+=======
|
|
|
|
+a
|
2015-11-23 08:40:23 +03:00
|
|
|
+>>>>>>> source: 32c69314e062 - shelve: changes to: [mq]: second.patch
|
2014-10-14 02:55:45 +04:00
|
|
|
diff --git a/b/b b/b.rename/b
|
|
|
|
rename from b/b
|
|
|
|
rename to b.rename/b
|
|
|
|
diff --git a/c b/c.copy
|
|
|
|
copy from c
|
|
|
|
copy to c.copy
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg resolve -l
|
|
|
|
U a/a
|
|
|
|
|
|
|
|
$ hg shelve
|
|
|
|
abort: unshelve already in progress
|
|
|
|
(use 'hg unshelve --continue' or 'hg unshelve --abort')
|
|
|
|
[255]
|
|
|
|
|
|
|
|
abort the unshelve and be happy
|
|
|
|
|
|
|
|
$ hg status
|
|
|
|
M a/a
|
|
|
|
M b.rename/b
|
|
|
|
M c.copy
|
|
|
|
R b/b
|
|
|
|
? a/a.orig
|
|
|
|
$ hg unshelve -a
|
2013-10-24 00:12:48 +04:00
|
|
|
rebase aborted
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
unshelve of 'default' aborted
|
|
|
|
$ hg heads -q
|
2013-08-29 20:22:15 +04:00
|
|
|
3:2e69b451d1ea
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg parents
|
2013-08-29 20:22:15 +04:00
|
|
|
changeset: 3:2e69b451d1ea
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
tag: tip
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: second
|
|
|
|
|
|
|
|
$ hg resolve -l
|
|
|
|
$ hg status
|
|
|
|
A foo/foo
|
|
|
|
? a/a.orig
|
|
|
|
|
|
|
|
try to continue with no unshelve underway
|
|
|
|
|
|
|
|
$ hg unshelve -c
|
2016-02-04 06:47:38 +03:00
|
|
|
abort: no unshelve in progress
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
[255]
|
|
|
|
$ hg status
|
|
|
|
A foo/foo
|
|
|
|
? a/a.orig
|
|
|
|
|
|
|
|
redo the unshelve to get a conflict
|
|
|
|
|
|
|
|
$ hg unshelve -q
|
2015-10-09 23:54:52 +03:00
|
|
|
warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
|
|
|
|
attempt to continue
|
|
|
|
|
|
|
|
$ hg unshelve -c
|
|
|
|
abort: unresolved conflicts, can't continue
|
|
|
|
(see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[255]
|
|
|
|
|
|
|
|
$ hg revert -r . a/a
|
|
|
|
$ hg resolve -m a/a
|
2014-07-26 05:32:49 +04:00
|
|
|
(no more unresolved files)
|
2016-01-06 01:23:27 +03:00
|
|
|
continue: hg unshelve --continue
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
2013-10-28 20:03:43 +04:00
|
|
|
$ hg commit -m 'commit while unshelve in progress'
|
|
|
|
abort: unshelve already in progress
|
|
|
|
(use 'hg unshelve --continue' or 'hg unshelve --abort')
|
|
|
|
[255]
|
|
|
|
|
2016-02-04 06:47:38 +03:00
|
|
|
$ hg graft --continue
|
|
|
|
abort: no graft in progress
|
|
|
|
(continue: hg unshelve --continue)
|
|
|
|
[255]
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg unshelve -c
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:32c69314e062 "changes to: [mq]: second.patch" (tip)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
unshelve of 'default' complete
|
|
|
|
|
|
|
|
ensure the repo is as we hope
|
|
|
|
|
|
|
|
$ hg parents
|
2013-08-29 20:22:15 +04:00
|
|
|
changeset: 3:2e69b451d1ea
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
tag: tip
|
|
|
|
user: test
|
|
|
|
date: Thu Jan 01 00:00:00 1970 +0000
|
|
|
|
summary: second
|
|
|
|
|
|
|
|
$ hg heads -q
|
2013-08-29 20:22:15 +04:00
|
|
|
3:2e69b451d1ea
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
|
|
|
|
$ hg status -C
|
2013-10-24 00:12:48 +04:00
|
|
|
A b.rename/b
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
b/b
|
2013-10-24 00:12:48 +04:00
|
|
|
A c.copy
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
c
|
|
|
|
A foo/foo
|
|
|
|
R b/b
|
|
|
|
? a/a.orig
|
|
|
|
|
|
|
|
there should be no shelves left
|
|
|
|
|
|
|
|
$ hg shelve -l
|
|
|
|
|
|
|
|
#if execbit
|
|
|
|
|
|
|
|
ensure that metadata-only changes are shelved
|
|
|
|
|
|
|
|
$ chmod +x a/a
|
|
|
|
$ hg shelve -q -n execbit a/a
|
|
|
|
$ hg status a/a
|
|
|
|
$ hg unshelve -q execbit
|
|
|
|
$ hg status a/a
|
|
|
|
M a/a
|
|
|
|
$ hg revert a/a
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if symlink
|
|
|
|
|
|
|
|
$ rm a/a
|
|
|
|
$ ln -s foo a/a
|
|
|
|
$ hg shelve -q -n symlink a/a
|
|
|
|
$ hg status a/a
|
2017-02-19 12:56:08 +03:00
|
|
|
$ hg unshelve -q -n symlink
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg status a/a
|
|
|
|
M a/a
|
|
|
|
$ hg revert a/a
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
set up another conflict between a commit and a shelved change
|
|
|
|
|
|
|
|
$ hg revert -q -C -a
|
2013-10-24 00:12:48 +04:00
|
|
|
$ rm a/a.orig b.rename/b c.copy
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ echo a >> a/a
|
|
|
|
$ hg shelve -q
|
|
|
|
$ echo x >> a/a
|
|
|
|
$ hg ci -m 'create conflict'
|
|
|
|
$ hg add foo/foo
|
|
|
|
|
|
|
|
if we resolve a conflict while unshelving, the unshelve should succeed
|
|
|
|
|
2015-11-19 02:11:23 +03:00
|
|
|
$ hg unshelve --tool :merge-other --keep
|
|
|
|
unshelving change 'default'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 6:2f694dd83a13 "changes to: second" (tip)
|
2015-11-19 02:11:23 +03:00
|
|
|
merging a/a
|
|
|
|
$ hg parents -q
|
|
|
|
4:33f7f61e6c5e
|
|
|
|
$ hg shelve -l
|
2015-11-23 08:40:23 +03:00
|
|
|
default (*)* changes to: second (glob)
|
2015-11-19 02:11:23 +03:00
|
|
|
$ hg status
|
|
|
|
M a/a
|
|
|
|
A foo/foo
|
|
|
|
$ cat a/a
|
|
|
|
a
|
|
|
|
c
|
|
|
|
a
|
|
|
|
$ cat > a/a << EOF
|
|
|
|
> a
|
|
|
|
> c
|
|
|
|
> x
|
|
|
|
> EOF
|
|
|
|
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ HGMERGE=true hg unshelve
|
|
|
|
unshelving change 'default'
|
2014-02-10 03:54:27 +04:00
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 6:2f694dd83a13 "changes to: second" (tip)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
merging a/a
|
2015-11-23 08:40:23 +03:00
|
|
|
note: rebase of 6:2f694dd83a13 created no changes to commit
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg parents -q
|
2013-10-12 04:19:40 +04:00
|
|
|
4:33f7f61e6c5e
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg shelve -l
|
|
|
|
$ hg status
|
|
|
|
A foo/foo
|
|
|
|
$ cat a/a
|
|
|
|
a
|
|
|
|
c
|
|
|
|
x
|
|
|
|
|
|
|
|
test keep and cleanup
|
|
|
|
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg shelve --list
|
2015-11-23 08:40:23 +03:00
|
|
|
default (*)* changes to: create conflict (glob)
|
2015-11-19 02:04:03 +03:00
|
|
|
$ hg unshelve -k
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
unshelving change 'default'
|
|
|
|
$ hg shelve --list
|
2015-11-23 08:40:23 +03:00
|
|
|
default (*)* changes to: create conflict (glob)
|
shelve: add a shelve extension to save/restore working changes
This extension saves shelved changes using a temporary draft commit,
and bundles the temporary commit and its draft ancestors, then
strips them.
This strategy makes it possible to use Mercurial's bundle and merge
machinery to resolve conflicts if necessary when unshelving, even
when the destination commit or its ancestors have been amended,
squashed, or evolved. (Once a change has been unshelved, its
associated unbundled commits are either rolled back or stripped.)
Storing the shelved change as a bundle also avoids the difficulty
that hidden commits would cause, of making it impossible to amend
the parent if it is a draft commits (a common scenario).
Although this extension shares its name and some functionality with
the third party hgshelve extension, it has little else in common.
Notably, the hgshelve extension shelves changes as unified diffs,
which makes conflict resolution a matter of finding .rej files and
conflict markers, and cleaning up the mess by hand.
We do not yet allow hunk-level choosing of changes to record.
Compared to the hgshelve extension, this is a small regression in
usability, but we hope to integrate that at a later point, once the
record machinery becomes more reusable and robust.
2013-08-29 20:22:13 +04:00
|
|
|
$ hg shelve --cleanup
|
|
|
|
$ hg shelve --list
|
2013-10-03 21:41:25 +04:00
|
|
|
|
2014-06-05 17:20:32 +04:00
|
|
|
$ hg shelve --cleanup --delete
|
|
|
|
abort: options '--cleanup' and '--delete' may not be used together
|
|
|
|
[255]
|
|
|
|
$ hg shelve --cleanup --patch
|
|
|
|
abort: options '--cleanup' and '--patch' may not be used together
|
|
|
|
[255]
|
|
|
|
$ hg shelve --cleanup --message MESSAGE
|
|
|
|
abort: options '--cleanup' and '--message' may not be used together
|
|
|
|
[255]
|
|
|
|
|
2013-10-03 21:41:25 +04:00
|
|
|
test bookmarks
|
|
|
|
|
|
|
|
$ hg bookmark test
|
|
|
|
$ hg bookmark
|
2013-10-12 04:19:40 +04:00
|
|
|
* test 4:33f7f61e6c5e
|
2013-10-03 21:41:25 +04:00
|
|
|
$ hg shelve
|
|
|
|
shelved as test
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg bookmark
|
2013-10-12 04:19:40 +04:00
|
|
|
* test 4:33f7f61e6c5e
|
2013-10-03 21:41:25 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'test'
|
|
|
|
$ hg bookmark
|
2013-10-12 04:19:40 +04:00
|
|
|
* test 4:33f7f61e6c5e
|
2013-10-10 01:15:20 +04:00
|
|
|
|
|
|
|
shelve should still work even if mq is disabled
|
|
|
|
|
|
|
|
$ hg --config extensions.mq=! shelve
|
|
|
|
shelved as test
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg --config extensions.mq=! shelve --list
|
2015-11-23 08:40:23 +03:00
|
|
|
test (*)* changes to: create conflict (glob)
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
* test 4:33f7f61e6c5e
|
2013-10-10 01:15:20 +04:00
|
|
|
$ hg --config extensions.mq=! unshelve
|
|
|
|
unshelving change 'test'
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
* test 4:33f7f61e6c5e
|
2013-10-12 04:19:40 +04:00
|
|
|
|
2014-08-15 19:47:03 +04:00
|
|
|
shelve should leave dirstate clean (issue4055)
|
2013-10-12 04:19:40 +04:00
|
|
|
|
|
|
|
$ cd ..
|
|
|
|
$ hg init shelverebase
|
|
|
|
$ cd shelverebase
|
|
|
|
$ printf 'x\ny\n' > x
|
|
|
|
$ echo z > z
|
|
|
|
$ hg commit -Aqm xy
|
|
|
|
$ echo z >> x
|
|
|
|
$ hg commit -Aqm z
|
|
|
|
$ hg up 0
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ printf 'a\nx\ny\nz\n' > x
|
|
|
|
$ hg commit -Aqm xyz
|
|
|
|
$ echo c >> z
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg rebase -d 1 --config extensions.rebase=
|
2014-12-09 05:45:26 +03:00
|
|
|
rebasing 2:323bfa07f744 "xyz" (tip)
|
2013-10-12 04:19:40 +04:00
|
|
|
merging x
|
2017-07-08 04:51:46 +03:00
|
|
|
saved backup bundle to $TESTTMP/shelverebase/.hg/strip-backup/323bfa07f744-78114325-rebase.hg (glob)
|
2013-10-12 04:19:40 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
2014-02-10 03:54:27 +04:00
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 4:82a0d7d6ba61 "changes to: xyz" (tip)
|
2013-10-12 04:19:40 +04:00
|
|
|
$ hg status
|
|
|
|
M z
|
|
|
|
|
|
|
|
$ cd ..
|
2013-10-24 00:12:48 +04:00
|
|
|
|
2014-08-15 19:47:03 +04:00
|
|
|
shelve should only unshelve pending changes (issue4068)
|
2013-10-24 00:12:48 +04:00
|
|
|
|
|
|
|
$ hg init onlypendingchanges
|
|
|
|
$ cd onlypendingchanges
|
|
|
|
$ touch a
|
|
|
|
$ hg ci -Aqm a
|
|
|
|
$ touch b
|
|
|
|
$ hg ci -Aqm b
|
|
|
|
$ hg up -q 0
|
|
|
|
$ touch c
|
|
|
|
$ hg ci -Aqm c
|
|
|
|
|
|
|
|
$ touch d
|
|
|
|
$ hg add d
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg up -q 1
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
2014-02-10 03:54:27 +04:00
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 3:958bcbd1776e "changes to: c" (tip)
|
2013-10-24 00:12:48 +04:00
|
|
|
$ hg status
|
|
|
|
A d
|
|
|
|
|
|
|
|
unshelve should work on an ancestor of the original commit
|
|
|
|
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg up 0
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
2014-02-10 03:54:27 +04:00
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 3:013284d9655e "changes to: b" (tip)
|
2013-10-24 00:12:48 +04:00
|
|
|
$ hg status
|
|
|
|
A d
|
|
|
|
|
2013-11-08 08:36:26 +04:00
|
|
|
test bug 4073 we need to enable obsolete markers for it
|
|
|
|
|
2014-10-15 00:34:25 +04:00
|
|
|
$ cat >> $HGRCPATH << EOF
|
|
|
|
> [experimental]
|
|
|
|
> evolution=createmarkers
|
2013-11-08 08:36:26 +04:00
|
|
|
> EOF
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg debugobsolete `hg --debug id -i -r 1`
|
2017-07-16 03:33:14 +03:00
|
|
|
obsoleted 1 changesets
|
2013-11-08 08:36:26 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
|
2013-11-27 04:30:52 +04:00
|
|
|
unshelve should leave unknown files alone (issue4113)
|
|
|
|
|
|
|
|
$ echo e > e
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg status
|
|
|
|
? e
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
$ hg status
|
|
|
|
A d
|
|
|
|
? e
|
|
|
|
$ cat e
|
|
|
|
e
|
|
|
|
|
|
|
|
unshelve should keep a copy of unknown files
|
|
|
|
|
|
|
|
$ hg add e
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 2 files removed, 0 files unresolved
|
|
|
|
$ echo z > e
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
$ cat e
|
|
|
|
e
|
|
|
|
$ cat e.orig
|
|
|
|
z
|
|
|
|
|
2014-02-10 03:54:40 +04:00
|
|
|
|
2014-04-08 01:10:20 +04:00
|
|
|
unshelve and conflicts with tracked and untracked files
|
2014-02-10 03:54:40 +04:00
|
|
|
|
|
|
|
preparing:
|
|
|
|
|
|
|
|
$ rm *.orig
|
|
|
|
$ hg ci -qm 'commit stuff'
|
|
|
|
$ hg phase -p null:
|
|
|
|
|
|
|
|
no other changes - no merge:
|
|
|
|
|
|
|
|
$ echo f > f
|
|
|
|
$ hg add f
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
2014-04-08 01:10:20 +04:00
|
|
|
$ echo g > f
|
2014-02-10 03:54:40 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
$ hg st
|
|
|
|
A f
|
|
|
|
? f.orig
|
|
|
|
$ cat f
|
|
|
|
f
|
|
|
|
$ cat f.orig
|
2014-04-08 01:10:20 +04:00
|
|
|
g
|
2014-02-10 03:54:40 +04:00
|
|
|
|
|
|
|
other uncommitted changes - merge:
|
|
|
|
|
|
|
|
$ hg st
|
|
|
|
A f
|
|
|
|
? f.orig
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
2014-02-11 01:56:10 +04:00
|
|
|
$ hg log -G --template '{rev} {desc|firstline} {author}' -R bundle://.hg/shelved/default.hg -r 'bundle()'
|
2015-11-23 08:40:23 +03:00
|
|
|
o 4 changes to: commit stuff shelve@localhost
|
2014-02-10 03:54:40 +04:00
|
|
|
|
|
2016-03-23 23:34:47 +03:00
|
|
|
~
|
2014-02-10 03:54:40 +04:00
|
|
|
$ hg log -G --template '{rev} {desc|firstline} {author}'
|
|
|
|
@ 3 commit stuff test
|
|
|
|
|
|
|
|
|
| o 2 c test
|
|
|
|
|/
|
|
|
|
o 0 a test
|
|
|
|
|
|
|
|
$ mv f.orig f
|
2014-04-08 01:10:20 +04:00
|
|
|
$ echo 1 > a
|
2014-04-08 01:10:20 +04:00
|
|
|
$ hg unshelve --date '1073741824 0'
|
2014-02-10 03:54:40 +04:00
|
|
|
unshelving change 'default'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:81152db69da7 "changes to: commit stuff" (tip)
|
2014-02-10 03:54:40 +04:00
|
|
|
merging f
|
2015-10-09 23:54:52 +03:00
|
|
|
warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
|
2014-02-10 03:54:40 +04:00
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
2014-04-08 01:10:20 +04:00
|
|
|
$ hg log -G --template '{rev} {desc|firstline} {author} {date|isodate}'
|
2015-11-23 08:40:23 +03:00
|
|
|
@ 5 changes to: commit stuff shelve@localhost 1970-01-01 00:00 +0000
|
2014-02-10 03:54:40 +04:00
|
|
|
|
|
2014-04-08 01:10:20 +04:00
|
|
|
| @ 4 pending changes temporary commit shelve@localhost 2004-01-10 13:37 +0000
|
2014-02-10 03:54:40 +04:00
|
|
|
|/
|
2014-04-08 01:10:20 +04:00
|
|
|
o 3 commit stuff test 1970-01-01 00:00 +0000
|
2014-02-10 03:54:40 +04:00
|
|
|
|
|
2014-04-08 01:10:20 +04:00
|
|
|
| o 2 c test 1970-01-01 00:00 +0000
|
2014-02-10 03:54:40 +04:00
|
|
|
|/
|
2014-04-08 01:10:20 +04:00
|
|
|
o 0 a test 1970-01-01 00:00 +0000
|
2014-02-10 03:54:40 +04:00
|
|
|
|
|
|
|
$ hg st
|
|
|
|
M f
|
|
|
|
? f.orig
|
|
|
|
$ cat f
|
2016-11-20 02:41:37 +03:00
|
|
|
<<<<<<< dest: 5f6b880e719b - shelve: pending changes temporary commit
|
2014-04-08 01:10:20 +04:00
|
|
|
g
|
2014-02-10 03:54:40 +04:00
|
|
|
=======
|
|
|
|
f
|
2015-11-23 08:40:23 +03:00
|
|
|
>>>>>>> source: 81152db69da7 - shelve: changes to: commit stuff
|
2014-02-10 03:54:40 +04:00
|
|
|
$ cat f.orig
|
2014-04-08 01:10:20 +04:00
|
|
|
g
|
2015-11-19 02:11:23 +03:00
|
|
|
$ hg unshelve --abort -t false
|
|
|
|
tool option will be ignored
|
2014-02-10 03:54:40 +04:00
|
|
|
rebase aborted
|
|
|
|
unshelve of 'default' aborted
|
|
|
|
$ hg st
|
|
|
|
M a
|
|
|
|
? f.orig
|
|
|
|
$ cat f.orig
|
2014-04-08 01:10:20 +04:00
|
|
|
g
|
2014-02-10 03:54:40 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:81152db69da7 "changes to: commit stuff" (tip)
|
2014-02-10 03:54:40 +04:00
|
|
|
$ hg st
|
|
|
|
M a
|
|
|
|
A f
|
|
|
|
? f.orig
|
|
|
|
|
|
|
|
other committed changes - merge:
|
|
|
|
|
|
|
|
$ hg shelve f
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg ci a -m 'intermediate other change'
|
|
|
|
$ mv f.orig f
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:81152db69da7 "changes to: commit stuff" (tip)
|
2014-02-10 03:54:40 +04:00
|
|
|
merging f
|
2015-10-09 23:54:52 +03:00
|
|
|
warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
|
2014-02-10 03:54:40 +04:00
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
$ hg st
|
|
|
|
M f
|
|
|
|
? f.orig
|
|
|
|
$ cat f
|
2016-11-20 02:41:37 +03:00
|
|
|
<<<<<<< dest: * - test: intermediate other change (glob)
|
2014-04-08 01:10:20 +04:00
|
|
|
g
|
2014-02-10 03:54:40 +04:00
|
|
|
=======
|
|
|
|
f
|
2015-11-23 08:40:23 +03:00
|
|
|
>>>>>>> source: 81152db69da7 - shelve: changes to: commit stuff
|
2014-02-10 03:54:40 +04:00
|
|
|
$ cat f.orig
|
2014-04-08 01:10:20 +04:00
|
|
|
g
|
2014-02-10 03:54:40 +04:00
|
|
|
$ hg unshelve --abort
|
|
|
|
rebase aborted
|
|
|
|
unshelve of 'default' aborted
|
2014-04-08 01:10:20 +04:00
|
|
|
$ hg st
|
|
|
|
? f.orig
|
|
|
|
$ cat f.orig
|
|
|
|
g
|
2014-02-10 03:54:40 +04:00
|
|
|
$ hg shelve --delete default
|
|
|
|
|
2014-10-08 15:47:11 +04:00
|
|
|
Recreate some conflict again
|
|
|
|
|
|
|
|
$ cd ../repo
|
|
|
|
$ hg up -C -r 3
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
(leaving bookmark test)
|
|
|
|
$ echo y >> a/a
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg up test
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
(activating bookmark test)
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
* test 4:33f7f61e6c5e
|
2014-10-08 15:47:11 +04:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:e42a7da90865 "changes to: second" (tip)
|
2014-10-08 15:47:11 +04:00
|
|
|
merging a/a
|
2015-10-09 23:54:52 +03:00
|
|
|
warning: conflicts while merging a/a! (edit, then use 'hg resolve --mark')
|
2014-10-08 15:47:11 +04:00
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
test 4:33f7f61e6c5e
|
2014-10-08 15:47:11 +04:00
|
|
|
|
|
|
|
Test that resolving all conflicts in one direction (so that the rebase
|
|
|
|
is a no-op), works (issue4398)
|
|
|
|
|
|
|
|
$ hg revert -a -r .
|
|
|
|
reverting a/a (glob)
|
|
|
|
$ hg resolve -m a/a
|
|
|
|
(no more unresolved files)
|
2016-01-06 01:23:27 +03:00
|
|
|
continue: hg unshelve --continue
|
2014-10-08 15:47:11 +04:00
|
|
|
$ hg unshelve -c
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 5:e42a7da90865 "changes to: second" (tip)
|
|
|
|
note: rebase of 5:e42a7da90865 created no changes to commit
|
2014-10-08 15:47:11 +04:00
|
|
|
unshelve of 'default' complete
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
* test 4:33f7f61e6c5e
|
2014-10-08 15:47:11 +04:00
|
|
|
$ hg diff
|
|
|
|
$ hg status
|
|
|
|
? a/a.orig
|
|
|
|
? foo/foo
|
|
|
|
$ hg summary
|
|
|
|
parent: 4:33f7f61e6c5e tip
|
|
|
|
create conflict
|
|
|
|
branch: default
|
|
|
|
bookmarks: *test
|
|
|
|
commit: 2 unknown (clean)
|
|
|
|
update: (current)
|
2015-05-29 23:23:58 +03:00
|
|
|
phases: 5 draft
|
2014-10-08 15:47:11 +04:00
|
|
|
|
2014-06-05 17:20:32 +04:00
|
|
|
$ hg shelve --delete --stat
|
|
|
|
abort: options '--delete' and '--stat' may not be used together
|
|
|
|
[255]
|
|
|
|
$ hg shelve --delete --name NAME
|
|
|
|
abort: options '--delete' and '--name' may not be used together
|
|
|
|
[255]
|
|
|
|
|
2015-03-26 01:53:30 +03:00
|
|
|
Test interactive shelve
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [ui]
|
|
|
|
> interactive = true
|
|
|
|
> EOF
|
|
|
|
$ echo 'a' >> a/b
|
|
|
|
$ cat a/a >> a/b
|
|
|
|
$ echo 'x' >> a/b
|
|
|
|
$ mv a/b a/a
|
|
|
|
$ echo 'a' >> foo/foo
|
|
|
|
$ hg st
|
|
|
|
M a/a
|
|
|
|
? a/a.orig
|
|
|
|
? foo/foo
|
|
|
|
$ cat a/a
|
|
|
|
a
|
|
|
|
a
|
|
|
|
c
|
|
|
|
x
|
|
|
|
x
|
|
|
|
$ cat foo/foo
|
|
|
|
foo
|
|
|
|
a
|
2015-07-14 22:45:58 +03:00
|
|
|
$ hg shelve --interactive --config ui.interactive=false
|
|
|
|
abort: running non-interactively
|
|
|
|
[255]
|
2015-03-26 01:53:30 +03:00
|
|
|
$ hg shelve --interactive << EOF
|
|
|
|
> y
|
|
|
|
> y
|
|
|
|
> n
|
|
|
|
> EOF
|
|
|
|
diff --git a/a/a b/a/a
|
|
|
|
2 hunks, 2 lines changed
|
|
|
|
examine changes to 'a/a'? [Ynesfdaq?] y
|
|
|
|
|
|
|
|
@@ -1,3 +1,4 @@
|
|
|
|
+a
|
|
|
|
a
|
|
|
|
c
|
|
|
|
x
|
|
|
|
record change 1/2 to 'a/a'? [Ynesfdaq?] y
|
|
|
|
|
|
|
|
@@ -1,3 +2,4 @@
|
|
|
|
a
|
|
|
|
c
|
|
|
|
x
|
|
|
|
+x
|
|
|
|
record change 2/2 to 'a/a'? [Ynesfdaq?] n
|
|
|
|
|
|
|
|
shelved as test
|
|
|
|
merging a/a
|
|
|
|
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ cat a/a
|
|
|
|
a
|
|
|
|
c
|
|
|
|
x
|
|
|
|
x
|
|
|
|
$ cat foo/foo
|
|
|
|
foo
|
|
|
|
a
|
|
|
|
$ hg st
|
|
|
|
M a/a
|
|
|
|
? foo/foo
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
* test 4:33f7f61e6c5e
|
2015-03-26 01:53:30 +03:00
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'test'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 6:96a1354f65f6 "changes to: create conflict" (tip)
|
2015-03-26 01:53:30 +03:00
|
|
|
merging a/a
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
$ hg bookmark
|
|
|
|
* test 4:33f7f61e6c5e
|
2015-03-26 01:53:30 +03:00
|
|
|
$ cat a/a
|
|
|
|
a
|
|
|
|
a
|
|
|
|
c
|
|
|
|
x
|
|
|
|
x
|
2015-04-14 23:23:54 +03:00
|
|
|
|
2017-01-13 22:53:07 +03:00
|
|
|
shelve --patch and shelve --stat should work with valid shelfnames
|
2015-04-14 23:23:54 +03:00
|
|
|
|
|
|
|
$ hg up --clean .
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
bookmarks: use recordchange instead of writing if transaction is active
Before this patch, 'bmstore.write()' always write in-memory bookmark
changes into '.hg/bookmarks' regardless of transaction activity.
If 'bmstore.write()' is invoked inside a transaction and it writes
changes into '.hg/bookmarks', then:
- original bookmarks aren't restored at failure of that transaction
This breaks "all or nothing" policy of the transaction.
BTW, "hg rollback" can restore bookmarks successfully even before
this patch, because original bookmarks are saved into
'.hg/journal.bookmarks' at the beginning of the transaction, and
it (actually renamed as '.hg/undo.bookmarks') is used by "hg
rollback".
- uncommitted bookmark changes are visible to other processes
This is a kind of "dirty read"
For example, 'rebase.rebase()' implies 'bmstore.write()', and it may
be executed inside the transaction of "hg unshelve". Then, intentional
aborting at the end of "hg unshelve" transaction doesn't restore
original bookmarks (this is obviously a bug).
This patch uses 'bmstore.recordchange()' instead of actual writing by
'bmstore._writerepo()', if any transaction is active
This patch also removes meaningless restoring bmstore explicitly at
the end of "hg shelve".
This patch doesn't choose fixing each 'bmstore.write()' callers as
like below, because writing similar code here and there is very
redundant.
before:
bmstore.write()
after:
tr = repo.currenttransaction()
if tr:
bmstore.recordchange(tr)
else:
bmstore.write()
Even though 'bmstore.write()' itself may have to be discarded by
putting bookmark operations into transaction scope, this patch chose
fixing it to implement "transactional dirstate" at first.
2015-10-07 19:41:30 +03:00
|
|
|
(leaving bookmark test)
|
2015-04-14 23:23:54 +03:00
|
|
|
$ hg shelve --list
|
|
|
|
$ echo 'patch a' > shelf-patch-a
|
|
|
|
$ hg add shelf-patch-a
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ echo 'patch b' > shelf-patch-b
|
|
|
|
$ hg add shelf-patch-b
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default-01
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg shelve --patch default default-01
|
2017-01-13 22:53:07 +03:00
|
|
|
default-01 (*)* changes to: create conflict (glob)
|
|
|
|
|
|
|
|
diff --git a/shelf-patch-b b/shelf-patch-b
|
|
|
|
new file mode 100644
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/shelf-patch-b
|
|
|
|
@@ -0,0 +1,1 @@
|
|
|
|
+patch b
|
|
|
|
default (*)* changes to: create conflict (glob)
|
|
|
|
|
|
|
|
diff --git a/shelf-patch-a b/shelf-patch-a
|
|
|
|
new file mode 100644
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/shelf-patch-a
|
|
|
|
@@ -0,0 +1,1 @@
|
|
|
|
+patch a
|
2015-04-14 23:23:54 +03:00
|
|
|
$ hg shelve --stat default default-01
|
2017-01-13 22:53:07 +03:00
|
|
|
default-01 (*)* changes to: create conflict (glob)
|
|
|
|
shelf-patch-b | 1 +
|
|
|
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
|
|
|
default (*)* changes to: create conflict (glob)
|
|
|
|
shelf-patch-a | 1 +
|
|
|
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
2015-04-14 23:23:54 +03:00
|
|
|
$ hg shelve --patch default
|
2015-11-23 08:40:23 +03:00
|
|
|
default (*)* changes to: create conflict (glob)
|
2015-04-14 23:23:54 +03:00
|
|
|
|
|
|
|
diff --git a/shelf-patch-a b/shelf-patch-a
|
|
|
|
new file mode 100644
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/shelf-patch-a
|
|
|
|
@@ -0,0 +1,1 @@
|
|
|
|
+patch a
|
|
|
|
$ hg shelve --stat default
|
2015-11-23 08:40:23 +03:00
|
|
|
default (*)* changes to: create conflict (glob)
|
2015-04-14 23:23:54 +03:00
|
|
|
shelf-patch-a | 1 +
|
|
|
|
1 files changed, 1 insertions(+), 0 deletions(-)
|
|
|
|
$ hg shelve --patch nonexistentshelf
|
|
|
|
abort: cannot find shelf nonexistentshelf
|
|
|
|
[255]
|
|
|
|
$ hg shelve --stat nonexistentshelf
|
|
|
|
abort: cannot find shelf nonexistentshelf
|
|
|
|
[255]
|
2017-01-13 22:53:07 +03:00
|
|
|
$ hg shelve --patch default nonexistentshelf
|
|
|
|
abort: cannot find shelf nonexistentshelf
|
|
|
|
[255]
|
|
|
|
$ hg shelve --patch
|
|
|
|
abort: --patch expects at least one shelf
|
|
|
|
[255]
|
2015-04-14 23:23:54 +03:00
|
|
|
|
2015-10-02 01:08:00 +03:00
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
Shelve from general delta repo uses bundle2 on disk
|
|
|
|
--------------------------------------------------
|
|
|
|
|
|
|
|
no general delta
|
|
|
|
|
2015-11-12 13:52:19 +03:00
|
|
|
$ hg clone --pull repo bundle1 --config format.usegeneraldelta=0
|
2015-10-02 01:08:00 +03:00
|
|
|
requesting all changes
|
|
|
|
adding changesets
|
|
|
|
adding manifests
|
|
|
|
adding file changes
|
|
|
|
added 5 changesets with 8 changes to 6 files
|
|
|
|
updating to branch default
|
|
|
|
6 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ cd bundle1
|
|
|
|
$ echo babar > jungle
|
|
|
|
$ hg add jungle
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg debugbundle .hg/shelved/*.hg
|
2015-11-23 08:40:23 +03:00
|
|
|
45993d65fe9dc3c6d8764b9c3b07fa831ee7d92d
|
2015-10-02 01:08:00 +03:00
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
with general delta
|
|
|
|
|
2015-11-12 13:52:19 +03:00
|
|
|
$ hg clone --pull repo bundle2 --config format.usegeneraldelta=1
|
2015-10-02 01:08:00 +03:00
|
|
|
requesting all changes
|
|
|
|
adding changesets
|
|
|
|
adding manifests
|
|
|
|
adding file changes
|
|
|
|
added 5 changesets with 8 changes to 6 files
|
|
|
|
updating to branch default
|
|
|
|
6 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ cd bundle2
|
|
|
|
$ echo babar > jungle
|
|
|
|
$ hg add jungle
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg debugbundle .hg/shelved/*.hg
|
2016-07-18 01:10:30 +03:00
|
|
|
Stream params: sortdict([('Compression', 'BZ')])
|
2016-07-18 01:13:51 +03:00
|
|
|
changegroup -- "sortdict([('version', '02'), ('nbchanges', '1')])"
|
2015-11-23 08:40:23 +03:00
|
|
|
45993d65fe9dc3c6d8764b9c3b07fa831ee7d92d
|
2015-10-02 01:08:00 +03:00
|
|
|
$ cd ..
|
2015-10-15 06:35:06 +03:00
|
|
|
|
2015-10-16 19:15:34 +03:00
|
|
|
Test visibility of in-memory changes inside transaction to external hook
|
|
|
|
------------------------------------------------------------------------
|
|
|
|
|
|
|
|
$ cd repo
|
|
|
|
|
|
|
|
$ echo xxxx >> x
|
|
|
|
$ hg commit -m "#5: changes to invoke rebase"
|
|
|
|
|
|
|
|
$ cat > $TESTTMP/checkvisibility.sh <<EOF
|
|
|
|
> echo "==== \$1:"
|
|
|
|
> hg parents --template "VISIBLE {rev}:{node|short}\n"
|
|
|
|
> # test that pending changes are hidden
|
|
|
|
> unset HG_PENDING
|
|
|
|
> hg parents --template "ACTUAL {rev}:{node|short}\n"
|
|
|
|
> echo "===="
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ cat >> .hg/hgrc <<EOF
|
|
|
|
> [defaults]
|
|
|
|
> # to fix hash id of temporary revisions
|
|
|
|
> unshelve = --date '0 0'
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
"hg unshelve" at REV5 implies steps below:
|
|
|
|
|
|
|
|
(1) commit changes in the working directory (REV6)
|
|
|
|
(2) unbundle shelved revision (REV7)
|
|
|
|
(3) rebase: merge REV7 into REV6 (REV6 => REV6, REV7)
|
|
|
|
(4) rebase: commit merged revision (REV8)
|
|
|
|
(5) rebase: update to REV6 (REV8 => REV6)
|
|
|
|
(6) update to REV5 (REV6 => REV5)
|
|
|
|
(7) abort transaction
|
|
|
|
|
|
|
|
== test visibility to external preupdate hook
|
|
|
|
|
|
|
|
$ cat >> .hg/hgrc <<EOF
|
|
|
|
> [hooks]
|
|
|
|
> preupdate.visibility = sh $TESTTMP/checkvisibility.sh preupdate
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ echo nnnn >> n
|
|
|
|
|
|
|
|
$ sh $TESTTMP/checkvisibility.sh before-unshelving
|
|
|
|
==== before-unshelving:
|
|
|
|
VISIBLE 5:703117a2acfb
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
|
|
|
|
$ hg unshelve --keep default
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 7:206bf5d4f922 "changes to: create conflict" (tip)
|
2015-10-16 19:15:34 +03:00
|
|
|
==== preupdate:
|
|
|
|
VISIBLE 6:66b86db80ee4
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
==== preupdate:
|
2015-11-23 08:40:23 +03:00
|
|
|
VISIBLE 8:a0e04704317e
|
2015-10-16 19:15:34 +03:00
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
==== preupdate:
|
|
|
|
VISIBLE 6:66b86db80ee4
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
|
|
|
|
$ cat >> .hg/hgrc <<EOF
|
|
|
|
> [hooks]
|
|
|
|
> preupdate.visibility =
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ sh $TESTTMP/checkvisibility.sh after-unshelving
|
|
|
|
==== after-unshelving:
|
|
|
|
VISIBLE 5:703117a2acfb
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
|
merge: make in-memory changes visible to external update hooks
c67339617276 (while 3.4 code-freeze) made all 'update' hooks run after
releasing wlock for visibility of in-memory dirstate changes. But this
breaks paired invocation of 'preupdate' and 'update' hooks.
For example, 'hg backout --merge' for TARGET revision, which isn't
parent of CURRENT, consists of steps below:
1. update from CURRENT to TARGET
2. commit BACKOUT revision, which backs TARGET out
3. update from BACKOUT to CURRENT
4. merge TARGET into CURRENT
Then, we expects hooks to run in the order below:
- 'preupdate' on CURRENT for (1)
- 'update' on TARGET for (1)
- 'preupdate' on BACKOUT for (3)
- 'update' on CURRENT for (3)
- 'preupdate' on TARGET for (4)
- 'update' on CURRENT/TARGET for (4)
But hooks actually run in the order below:
- 'preupdate' on CURRENT for (1)
- 'preupdate' on BACKOUT for (3)
- 'preupdate' on TARGET for (4)
- 'update' on TARGET for (1), but actually on CURRENT/TARGET
- 'update' on CURRENT for (3), but actually on CURRENT/TARGET
- 'update' on CURRENT for (4), but actually on CURRENT/TARGET
Root cause of the issue focused by c67339617276 is that external
'update' hook process can't view in-memory changes (especially, of
dirstate), because they aren't written out until the end of
transaction (or wlock).
Now, hooks can be invoked just after updating, because previous
patches made in-memory changes visible to external process.
This patch may break backward compatibility from the point of view of
"scheduling hook execution", but should be reasonable because 'update'
hooks had been executed in this order before 3.4.
This patch tests "hg backout" and "hg unshelve", because the former
activates the transaction before 'update' hook invocation, but the
former doesn't.
2015-10-16 19:15:34 +03:00
|
|
|
== test visibility to external update hook
|
|
|
|
|
|
|
|
$ hg update -q -C 5
|
|
|
|
|
|
|
|
$ cat >> .hg/hgrc <<EOF
|
|
|
|
> [hooks]
|
|
|
|
> update.visibility = sh $TESTTMP/checkvisibility.sh update
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ echo nnnn >> n
|
|
|
|
|
|
|
|
$ sh $TESTTMP/checkvisibility.sh before-unshelving
|
|
|
|
==== before-unshelving:
|
|
|
|
VISIBLE 5:703117a2acfb
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
|
|
|
|
$ hg unshelve --keep default
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
2015-11-23 08:40:23 +03:00
|
|
|
rebasing 7:206bf5d4f922 "changes to: create conflict" (tip)
|
merge: make in-memory changes visible to external update hooks
c67339617276 (while 3.4 code-freeze) made all 'update' hooks run after
releasing wlock for visibility of in-memory dirstate changes. But this
breaks paired invocation of 'preupdate' and 'update' hooks.
For example, 'hg backout --merge' for TARGET revision, which isn't
parent of CURRENT, consists of steps below:
1. update from CURRENT to TARGET
2. commit BACKOUT revision, which backs TARGET out
3. update from BACKOUT to CURRENT
4. merge TARGET into CURRENT
Then, we expects hooks to run in the order below:
- 'preupdate' on CURRENT for (1)
- 'update' on TARGET for (1)
- 'preupdate' on BACKOUT for (3)
- 'update' on CURRENT for (3)
- 'preupdate' on TARGET for (4)
- 'update' on CURRENT/TARGET for (4)
But hooks actually run in the order below:
- 'preupdate' on CURRENT for (1)
- 'preupdate' on BACKOUT for (3)
- 'preupdate' on TARGET for (4)
- 'update' on TARGET for (1), but actually on CURRENT/TARGET
- 'update' on CURRENT for (3), but actually on CURRENT/TARGET
- 'update' on CURRENT for (4), but actually on CURRENT/TARGET
Root cause of the issue focused by c67339617276 is that external
'update' hook process can't view in-memory changes (especially, of
dirstate), because they aren't written out until the end of
transaction (or wlock).
Now, hooks can be invoked just after updating, because previous
patches made in-memory changes visible to external process.
This patch may break backward compatibility from the point of view of
"scheduling hook execution", but should be reasonable because 'update'
hooks had been executed in this order before 3.4.
This patch tests "hg backout" and "hg unshelve", because the former
activates the transaction before 'update' hook invocation, but the
former doesn't.
2015-10-16 19:15:34 +03:00
|
|
|
==== update:
|
|
|
|
VISIBLE 6:66b86db80ee4
|
2015-11-23 08:40:23 +03:00
|
|
|
VISIBLE 7:206bf5d4f922
|
merge: make in-memory changes visible to external update hooks
c67339617276 (while 3.4 code-freeze) made all 'update' hooks run after
releasing wlock for visibility of in-memory dirstate changes. But this
breaks paired invocation of 'preupdate' and 'update' hooks.
For example, 'hg backout --merge' for TARGET revision, which isn't
parent of CURRENT, consists of steps below:
1. update from CURRENT to TARGET
2. commit BACKOUT revision, which backs TARGET out
3. update from BACKOUT to CURRENT
4. merge TARGET into CURRENT
Then, we expects hooks to run in the order below:
- 'preupdate' on CURRENT for (1)
- 'update' on TARGET for (1)
- 'preupdate' on BACKOUT for (3)
- 'update' on CURRENT for (3)
- 'preupdate' on TARGET for (4)
- 'update' on CURRENT/TARGET for (4)
But hooks actually run in the order below:
- 'preupdate' on CURRENT for (1)
- 'preupdate' on BACKOUT for (3)
- 'preupdate' on TARGET for (4)
- 'update' on TARGET for (1), but actually on CURRENT/TARGET
- 'update' on CURRENT for (3), but actually on CURRENT/TARGET
- 'update' on CURRENT for (4), but actually on CURRENT/TARGET
Root cause of the issue focused by c67339617276 is that external
'update' hook process can't view in-memory changes (especially, of
dirstate), because they aren't written out until the end of
transaction (or wlock).
Now, hooks can be invoked just after updating, because previous
patches made in-memory changes visible to external process.
This patch may break backward compatibility from the point of view of
"scheduling hook execution", but should be reasonable because 'update'
hooks had been executed in this order before 3.4.
This patch tests "hg backout" and "hg unshelve", because the former
activates the transaction before 'update' hook invocation, but the
former doesn't.
2015-10-16 19:15:34 +03:00
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
==== update:
|
|
|
|
VISIBLE 6:66b86db80ee4
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
==== update:
|
|
|
|
VISIBLE 5:703117a2acfb
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
|
|
|
|
$ cat >> .hg/hgrc <<EOF
|
|
|
|
> [hooks]
|
|
|
|
> update.visibility =
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ sh $TESTTMP/checkvisibility.sh after-unshelving
|
|
|
|
==== after-unshelving:
|
|
|
|
VISIBLE 5:703117a2acfb
|
|
|
|
ACTUAL 5:703117a2acfb
|
|
|
|
====
|
|
|
|
|
2015-10-16 19:15:34 +03:00
|
|
|
$ cd ..
|
|
|
|
|
2015-11-11 01:41:14 +03:00
|
|
|
test .orig files go where the user wants them to
|
2015-10-15 06:35:06 +03:00
|
|
|
---------------------------------------------------------------
|
|
|
|
$ hg init salvage
|
|
|
|
$ cd salvage
|
|
|
|
$ echo 'content' > root
|
|
|
|
$ hg commit -A -m 'root' -q
|
|
|
|
$ echo '' > root
|
|
|
|
$ hg shelve -q
|
|
|
|
$ echo 'contADDent' > root
|
2015-11-11 01:41:14 +03:00
|
|
|
$ hg unshelve -q --config 'ui.origbackuppath=.hg/origbackups'
|
2015-10-15 06:35:06 +03:00
|
|
|
warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
2015-11-11 01:41:14 +03:00
|
|
|
$ ls .hg/origbackups
|
|
|
|
root.orig
|
|
|
|
$ rm -rf .hg/origbackups
|
|
|
|
|
|
|
|
test Abort unshelve always gets user out of the unshelved state
|
|
|
|
---------------------------------------------------------------
|
2015-10-15 06:35:06 +03:00
|
|
|
Wreak havoc on the unshelve process
|
|
|
|
$ rm .hg/unshelverebasestate
|
|
|
|
$ hg unshelve --abort
|
|
|
|
unshelve of 'default' aborted
|
2015-11-09 21:12:35 +03:00
|
|
|
abort: (No such file or directory|The system cannot find the file specified) (re)
|
2015-10-15 06:35:06 +03:00
|
|
|
[255]
|
|
|
|
Can the user leave the current state?
|
|
|
|
$ hg up -C .
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
|
|
|
|
Try again but with a corrupted shelve state file
|
|
|
|
$ hg strip -r 2 -r 1 -q
|
|
|
|
$ hg up -r 0 -q
|
|
|
|
$ echo '' > root
|
|
|
|
$ hg shelve -q
|
|
|
|
$ echo 'contADDent' > root
|
|
|
|
$ hg unshelve -q
|
|
|
|
warning: conflicts while merging root! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
$ sed 's/ae8c668541e8/123456789012/' .hg/shelvedstate > ../corrupt-shelvedstate
|
|
|
|
$ mv ../corrupt-shelvedstate .hg/histedit-state
|
2015-10-16 03:32:01 +03:00
|
|
|
$ hg unshelve --abort 2>&1 | grep 'rebase aborted'
|
2015-10-15 06:35:06 +03:00
|
|
|
rebase aborted
|
|
|
|
$ hg up -C .
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
2015-11-12 20:36:30 +03:00
|
|
|
|
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
Keep active bookmark while (un)shelving even on shared repo (issue4940)
|
|
|
|
-----------------------------------------------------------------------
|
|
|
|
|
|
|
|
$ cat <<EOF >> $HGRCPATH
|
|
|
|
> [extensions]
|
|
|
|
> share =
|
|
|
|
> EOF
|
|
|
|
|
|
|
|
$ hg bookmarks -R repo
|
|
|
|
test 4:33f7f61e6c5e
|
|
|
|
$ hg share -B repo share
|
|
|
|
updating working directory
|
|
|
|
6 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ cd share
|
|
|
|
|
|
|
|
$ hg bookmarks
|
|
|
|
test 4:33f7f61e6c5e
|
|
|
|
$ hg bookmarks foo
|
|
|
|
$ hg bookmarks
|
|
|
|
* foo 5:703117a2acfb
|
|
|
|
test 4:33f7f61e6c5e
|
|
|
|
$ echo x >> x
|
|
|
|
$ hg shelve
|
|
|
|
shelved as foo
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg bookmarks
|
|
|
|
* foo 5:703117a2acfb
|
|
|
|
test 4:33f7f61e6c5e
|
|
|
|
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'foo'
|
|
|
|
$ hg bookmarks
|
|
|
|
* foo 5:703117a2acfb
|
|
|
|
test 4:33f7f61e6c5e
|
|
|
|
|
|
|
|
$ cd ..
|
2016-01-14 21:03:31 +03:00
|
|
|
|
|
|
|
Shelve and unshelve unknown files. For the purposes of unshelve, a shelved
|
|
|
|
unknown file is the same as a shelved added file, except that it will be in
|
|
|
|
unknown state after unshelve if and only if it was either absent or unknown
|
|
|
|
before the unshelve operation.
|
|
|
|
|
|
|
|
$ hg init unknowns
|
|
|
|
$ cd unknowns
|
|
|
|
|
|
|
|
The simplest case is if I simply have an unknown file that I shelve and unshelve
|
|
|
|
|
|
|
|
$ echo unknown > unknown
|
|
|
|
$ hg status
|
|
|
|
? unknown
|
|
|
|
$ hg shelve --unknown
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg status
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
$ hg status
|
|
|
|
? unknown
|
|
|
|
$ rm unknown
|
|
|
|
|
|
|
|
If I shelve, add the file, and unshelve, does it stay added?
|
|
|
|
|
|
|
|
$ echo unknown > unknown
|
|
|
|
$ hg shelve -u
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg status
|
|
|
|
$ touch unknown
|
|
|
|
$ hg add unknown
|
|
|
|
$ hg status
|
|
|
|
A unknown
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 1:098df96e7410 "(changes in empty repository)" (tip)
|
|
|
|
merging unknown
|
|
|
|
$ hg status
|
|
|
|
A unknown
|
|
|
|
$ hg forget unknown
|
|
|
|
$ rm unknown
|
|
|
|
|
|
|
|
And if I shelve, commit, then unshelve, does it become modified?
|
|
|
|
|
|
|
|
$ echo unknown > unknown
|
|
|
|
$ hg shelve -u
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg status
|
|
|
|
$ touch unknown
|
|
|
|
$ hg add unknown
|
|
|
|
$ hg commit -qm "Add unknown"
|
|
|
|
$ hg status
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 1:098df96e7410 "(changes in empty repository)" (tip)
|
|
|
|
merging unknown
|
|
|
|
$ hg status
|
|
|
|
M unknown
|
|
|
|
$ hg remove --force unknown
|
|
|
|
$ hg commit -qm "Remove unknown"
|
|
|
|
|
|
|
|
$ cd ..
|
2016-03-12 20:36:31 +03:00
|
|
|
|
|
|
|
We expects that non-bare shelve keeps newly created branch in
|
|
|
|
working directory.
|
|
|
|
|
|
|
|
$ hg init shelve-preserve-new-branch
|
|
|
|
$ cd shelve-preserve-new-branch
|
|
|
|
$ echo "a" >> a
|
|
|
|
$ hg add a
|
|
|
|
$ echo "b" >> b
|
|
|
|
$ hg add b
|
|
|
|
$ hg commit -m "ab"
|
|
|
|
$ echo "aa" >> a
|
|
|
|
$ echo "bb" >> b
|
|
|
|
$ hg branch new-branch
|
|
|
|
marked working directory as branch new-branch
|
|
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
M b
|
|
|
|
$ hg branch
|
|
|
|
new-branch
|
|
|
|
$ hg shelve a
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
new-branch
|
|
|
|
$ hg status
|
|
|
|
M b
|
|
|
|
$ touch "c" >> c
|
|
|
|
$ hg add c
|
|
|
|
$ hg status
|
|
|
|
M b
|
|
|
|
A c
|
|
|
|
$ hg shelve --exclude c
|
|
|
|
shelved as default-01
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
new-branch
|
|
|
|
$ hg status
|
|
|
|
A c
|
|
|
|
$ hg shelve --include c
|
|
|
|
shelved as default-02
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
new-branch
|
|
|
|
$ hg status
|
|
|
|
$ echo "d" >> d
|
|
|
|
$ hg add d
|
|
|
|
$ hg status
|
|
|
|
A d
|
|
|
|
|
|
|
|
We expect that bare-shelve will not keep branch in current working directory.
|
|
|
|
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default-03
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
default
|
2016-11-29 15:11:05 +03:00
|
|
|
$ cd ..
|
2016-03-12 20:36:31 +03:00
|
|
|
|
2016-02-10 04:23:27 +03:00
|
|
|
When i shelve commit on newly created branch i expect
|
|
|
|
that after unshelve newly created branch will be preserved.
|
|
|
|
|
|
|
|
$ hg init shelve_on_new_branch_simple
|
|
|
|
$ cd shelve_on_new_branch_simple
|
|
|
|
$ echo "aaa" >> a
|
|
|
|
$ hg commit -A -m "a"
|
|
|
|
adding a
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ hg branch test
|
|
|
|
marked working directory as branch test
|
|
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
|
|
$ echo "bbb" >> a
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ echo "bbb" >> b
|
|
|
|
$ hg status
|
|
|
|
? b
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
marked working directory as branch test
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
? b
|
|
|
|
$ hg branch
|
|
|
|
test
|
2016-11-29 15:11:05 +03:00
|
|
|
$ cd ..
|
2016-02-10 04:23:27 +03:00
|
|
|
|
|
|
|
When i shelve commit on newly created branch, make
|
|
|
|
some changes, unshelve it and running into merge
|
|
|
|
conflicts i expect that after fixing them and
|
|
|
|
running unshelve --continue newly created branch
|
|
|
|
will be preserved.
|
|
|
|
|
|
|
|
$ hg init shelve_on_new_branch_conflict
|
|
|
|
$ cd shelve_on_new_branch_conflict
|
|
|
|
$ echo "aaa" >> a
|
|
|
|
$ hg commit -A -m "a"
|
|
|
|
adding a
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ hg branch test
|
|
|
|
marked working directory as branch test
|
|
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
|
|
$ echo "bbb" >> a
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ echo "ccc" >> a
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 2:425c97ef07f3 "changes to: a" (tip)
|
|
|
|
merging a
|
|
|
|
warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
$ echo "aaabbbccc" > a
|
|
|
|
$ rm a.orig
|
|
|
|
$ hg resolve --mark a
|
|
|
|
(no more unresolved files)
|
|
|
|
continue: hg unshelve --continue
|
|
|
|
$ hg unshelve --continue
|
|
|
|
rebasing 2:425c97ef07f3 "changes to: a" (tip)
|
|
|
|
marked working directory as branch test
|
|
|
|
unshelve of 'default' complete
|
|
|
|
$ cat a
|
|
|
|
aaabbbccc
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg branch
|
|
|
|
test
|
|
|
|
$ hg commit -m "test-commit"
|
|
|
|
|
|
|
|
When i shelve on test branch, update to default branch
|
|
|
|
and unshelve i expect that it will not preserve previous
|
|
|
|
test branch.
|
|
|
|
|
|
|
|
$ echo "xxx" > b
|
|
|
|
$ hg add b
|
|
|
|
$ hg shelve
|
|
|
|
shelved as test
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ hg update -r default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'test'
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 2:357525f34729 "changes to: test-commit" (tip)
|
|
|
|
$ hg status
|
|
|
|
A b
|
|
|
|
$ hg branch
|
|
|
|
default
|
2016-11-29 15:11:05 +03:00
|
|
|
$ cd ..
|
2016-02-10 04:23:27 +03:00
|
|
|
|
|
|
|
When i unshelve resulting in merge conflicts and makes saved
|
|
|
|
file shelvedstate looks like in previous versions in
|
|
|
|
mercurial(without restore branch information in 7th line) i
|
2016-10-18 00:16:55 +03:00
|
|
|
expect that after resolving conflicts and successfully
|
2016-02-10 04:23:27 +03:00
|
|
|
running 'shelve --continue' the branch information won't be
|
|
|
|
restored and branch will be unchanged.
|
|
|
|
|
2016-04-16 05:53:53 +03:00
|
|
|
shelve on new branch, conflict with previous shelvedstate
|
|
|
|
|
|
|
|
$ hg init conflict
|
|
|
|
$ cd conflict
|
2016-02-10 04:23:27 +03:00
|
|
|
$ echo "aaa" >> a
|
|
|
|
$ hg commit -A -m "a"
|
|
|
|
adding a
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ hg branch test
|
|
|
|
marked working directory as branch test
|
|
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
|
|
$ echo "bbb" >> a
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ echo "ccc" >> a
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
temporarily committing pending changes (restore with 'hg unshelve --abort')
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 2:425c97ef07f3 "changes to: a" (tip)
|
|
|
|
merging a
|
|
|
|
warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
|
|
|
|
Removing restore branch information from shelvedstate file(making it looks like
|
|
|
|
in previous versions) and running unshelve --continue
|
|
|
|
|
2017-05-14 00:52:29 +03:00
|
|
|
$ cp .hg/shelvedstate .hg/shelvedstate_old
|
|
|
|
$ cat .hg/shelvedstate_old | grep -v 'branchtorestore' > .hg/shelvedstate
|
2016-02-10 04:23:27 +03:00
|
|
|
|
|
|
|
$ echo "aaabbbccc" > a
|
|
|
|
$ rm a.orig
|
|
|
|
$ hg resolve --mark a
|
|
|
|
(no more unresolved files)
|
|
|
|
continue: hg unshelve --continue
|
|
|
|
$ hg unshelve --continue
|
|
|
|
rebasing 2:425c97ef07f3 "changes to: a" (tip)
|
|
|
|
unshelve of 'default' complete
|
|
|
|
$ cat a
|
|
|
|
aaabbbccc
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg branch
|
|
|
|
default
|
2016-11-29 15:11:05 +03:00
|
|
|
$ cd ..
|
2016-02-10 04:23:27 +03:00
|
|
|
|
|
|
|
On non bare shelve the branch information shouldn't be restored
|
|
|
|
|
|
|
|
$ hg init bare_shelve_on_new_branch
|
|
|
|
$ cd bare_shelve_on_new_branch
|
|
|
|
$ echo "aaa" >> a
|
|
|
|
$ hg commit -A -m "a"
|
|
|
|
adding a
|
|
|
|
$ hg branch
|
|
|
|
default
|
|
|
|
$ hg branch test
|
|
|
|
marked working directory as branch test
|
|
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
|
|
$ echo "bbb" >> a
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
$ hg shelve a
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ hg branch
|
|
|
|
test
|
|
|
|
$ hg branch default
|
|
|
|
marked working directory as branch default
|
|
|
|
(branches are permanent and global, did you want a bookmark?)
|
|
|
|
$ echo "bbb" >> b
|
|
|
|
$ hg status
|
|
|
|
? b
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
$ hg status
|
|
|
|
M a
|
|
|
|
? b
|
|
|
|
$ hg branch
|
|
|
|
default
|
2016-07-13 18:16:18 +03:00
|
|
|
$ cd ..
|
|
|
|
|
2016-10-18 00:16:55 +03:00
|
|
|
Prepare unshelve with a corrupted shelvedstate
|
2016-07-13 18:16:18 +03:00
|
|
|
$ hg init r1 && cd r1
|
|
|
|
$ echo text1 > file && hg add file
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ echo text2 > file && hg ci -Am text1
|
|
|
|
adding file
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 1:396ea74229f9 "(changes in empty repository)" (tip)
|
|
|
|
merging file
|
|
|
|
warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
$ echo somethingsomething > .hg/shelvedstate
|
|
|
|
|
|
|
|
Unshelve --continue fails with appropriate message if shelvedstate is corrupted
|
|
|
|
$ hg unshelve --continue
|
|
|
|
abort: corrupted shelved state file
|
|
|
|
(please run hg unshelve --abort to abort unshelve operation)
|
|
|
|
[255]
|
|
|
|
|
|
|
|
Unshelve --abort works with a corrupted shelvedstate
|
|
|
|
$ hg unshelve --abort
|
|
|
|
could not read shelved state file, your working copy may be in an unexpected state
|
|
|
|
please update to some commit
|
|
|
|
|
|
|
|
Unshelve --abort fails with appropriate message if there's no unshelve in
|
|
|
|
progress
|
|
|
|
$ hg unshelve --abort
|
|
|
|
abort: no unshelve in progress
|
|
|
|
[255]
|
|
|
|
$ cd ..
|
2016-11-24 01:58:52 +03:00
|
|
|
|
|
|
|
Unshelve respects --keep even if user intervention is needed
|
2016-11-29 15:11:05 +03:00
|
|
|
$ hg init unshelvekeep && cd unshelvekeep
|
2016-11-24 01:58:52 +03:00
|
|
|
$ echo 1 > file && hg ci -Am 1
|
|
|
|
adding file
|
|
|
|
$ echo 2 >> file
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ echo 3 >> file && hg ci -Am 13
|
|
|
|
$ hg shelve --list
|
2017-03-09 01:29:25 +03:00
|
|
|
default (*s ago) changes to: 1 (glob)
|
2016-11-24 01:58:52 +03:00
|
|
|
$ hg unshelve --keep
|
|
|
|
unshelving change 'default'
|
|
|
|
rebasing shelved changes
|
2016-11-29 15:11:05 +03:00
|
|
|
rebasing 2:3fbe6fbb0bef "changes to: 1" (tip)
|
2016-11-24 01:58:52 +03:00
|
|
|
merging file
|
|
|
|
warning: conflicts while merging file! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
$ hg resolve --mark file
|
|
|
|
(no more unresolved files)
|
|
|
|
continue: hg unshelve --continue
|
|
|
|
$ hg unshelve --continue
|
2016-11-29 15:11:05 +03:00
|
|
|
rebasing 2:3fbe6fbb0bef "changes to: 1" (tip)
|
2016-11-24 01:58:52 +03:00
|
|
|
unshelve of 'default' complete
|
|
|
|
$ hg shelve --list
|
2016-11-29 15:11:05 +03:00
|
|
|
default (*s ago) changes to: 1 (glob)
|
|
|
|
$ cd ..
|
2017-01-19 20:48:40 +03:00
|
|
|
|
|
|
|
Unshelving when there are deleted files does not crash (issue4176)
|
|
|
|
$ hg init unshelve-deleted-file && cd unshelve-deleted-file
|
|
|
|
$ echo a > a && echo b > b && hg ci -Am ab
|
|
|
|
adding a
|
|
|
|
adding b
|
|
|
|
$ echo aa > a && hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ rm b
|
|
|
|
$ hg st
|
|
|
|
! b
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
$ hg shelve
|
|
|
|
shelved as default
|
|
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
|
|
$ rm a && echo b > b
|
|
|
|
$ hg st
|
|
|
|
! a
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'default'
|
|
|
|
abort: shelved change touches missing files
|
|
|
|
(run hg status to see which files are missing)
|
|
|
|
[255]
|
|
|
|
$ hg st
|
|
|
|
! a
|
2017-05-14 00:52:29 +03:00
|
|
|
$ cd ..
|
|
|
|
|
|
|
|
New versions of Mercurial know how to read onld shelvedstate files
|
|
|
|
$ hg init oldshelvedstate
|
|
|
|
$ cd oldshelvedstate
|
|
|
|
$ echo root > root && hg ci -Am root
|
|
|
|
adding root
|
|
|
|
$ echo 1 > a
|
|
|
|
$ hg add a
|
|
|
|
$ hg shelve --name ashelve
|
|
|
|
shelved as ashelve
|
|
|
|
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
|
|
|
|
$ echo 2 > a
|
|
|
|
$ hg ci -Am a
|
|
|
|
adding a
|
|
|
|
$ hg unshelve
|
|
|
|
unshelving change 'ashelve'
|
|
|
|
rebasing shelved changes
|
|
|
|
rebasing 2:003d2d94241c "changes to: root" (tip)
|
|
|
|
merging a
|
|
|
|
warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
|
|
|
|
unresolved conflicts (see 'hg resolve', then 'hg unshelve --continue')
|
|
|
|
[1]
|
|
|
|
putting v1 shelvedstate file in place of a created v2
|
|
|
|
$ cat << EOF > .hg/shelvedstate
|
|
|
|
> 1
|
|
|
|
> ashelve
|
|
|
|
> 8b058dae057a5a78f393f4535d9e363dd5efac9d
|
|
|
|
> 8b058dae057a5a78f393f4535d9e363dd5efac9d
|
|
|
|
> 8b058dae057a5a78f393f4535d9e363dd5efac9d 003d2d94241cc7aff0c3a148e966d6a4a377f3a7
|
|
|
|
> 003d2d94241cc7aff0c3a148e966d6a4a377f3a7
|
|
|
|
>
|
|
|
|
> nokeep
|
|
|
|
> :no-active-bookmark
|
|
|
|
> EOF
|
|
|
|
$ echo 1 > a
|
|
|
|
$ hg resolve --mark a
|
|
|
|
(no more unresolved files)
|
|
|
|
continue: hg unshelve --continue
|
|
|
|
mercurial does not crash
|
|
|
|
$ hg unshelve --continue
|
|
|
|
rebasing 2:003d2d94241c "changes to: root" (tip)
|
|
|
|
unshelve of 'ashelve' complete
|
|
|
|
$ cd ..
|
|
|
|
|