Mercurial > hg
view tests/test-revert-interactive.t @ 41987:c1d83d916e85
revert: option to choose what to keep, not what to discard
I know the you (the reader) are probably tired of discussing how `hg
revert -i -r .` should behave and so am I. And I know I'm one of the
people who argued that showing the diff from the working copy to the
parent was confusing. I think it is less confusing now that we show
the diff from the parent to the working copy, but I still find it
confusing. I think showing the diff of hunks to keep might make it
easier to understand. So that's what this patch provides an option
for.
One argument doing it this way is that most people seem to find `hg
split` natural. I suspect that is because it shows the forward diff
(from parent commit to the commit) and asks you what to put in the
first commit. I think the new "keep" mode for revert (this patch)
matches that.
In "keep" mode, all the changes are still selected by default. That
means that `hg revert -i` followed by 'A' (keep all) (or 'c' in
curses) will be different from `hg revert -a`. That's mostly because
that was simplest. It can also be argued that it's safest. But it can
also be argued that it should be consistent with `hg revert -a`.
Note that in this mode, you can edit the hunks and it will do what you
expect (e.g. add new lines to your file if you added a new lines when
editing). The test case shows that that works.
Differential Revision: https://phab.mercurial-scm.org/D6125
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Tue, 12 Mar 2019 14:17:41 -0700 |
parents | d783c937aa53 |
children | db72f9f6580e |
line wrap: on
line source
Revert interactive tests 1 add and commit file f 2 add commit file folder1/g 3 add and commit file folder2/h 4 add and commit file folder1/i 5 commit change to file f 6 commit changes to files folder1/g folder2/h 7 commit changes to files folder1/g folder2/h 8 revert interactive to commit id 2 (line 3 above), check that folder1/i is removed and 9 make workdir match 7 10 run the same test than 8 from within folder1 and check same expectations $ cat <<EOF >> $HGRCPATH > [ui] > interactive = true > [extensions] > record = > purge = > EOF $ mkdir -p a/folder1 a/folder2 $ cd a $ hg init >>> open('f', 'wb').write(b"1\n2\n3\n4\n5\n") and None $ hg add f ; hg commit -m "adding f" $ cat f > folder1/g ; hg add folder1/g ; hg commit -m "adding folder1/g" $ cat f > folder2/h ; hg add folder2/h ; hg commit -m "adding folder2/h" $ cat f > folder1/i ; hg add folder1/i ; hg commit -m "adding folder1/i" >>> open('f', 'wb').write(b"a\n1\n2\n3\n4\n5\nb\n") and None $ hg commit -m "modifying f" >>> open('folder1/g', 'wb').write(b"c\n1\n2\n3\n4\n5\nd\n") and None $ hg commit -m "modifying folder1/g" >>> open('folder2/h', 'wb').write(b"e\n1\n2\n3\n4\n5\nf\n") and None $ hg commit -m "modifying folder2/h" $ hg tip changeset: 6:59dd6e4ab63a tag: tip user: test date: Thu Jan 01 00:00:00 1970 +0000 summary: modifying folder2/h $ hg revert -i -r 2 --all -- << EOF > y > y > y > y > y > ? > y > n > n > EOF remove added file folder1/i (Yn)? y removing folder1/i diff --git a/f b/f 2 hunks, 2 lines changed examine changes to 'f'? [Ynesfdaq?] y @@ -1,6 +1,5 @@ -a 1 2 3 4 5 apply change 1/6 to 'f'? [Ynesfdaq?] y @@ -2,6 +1,5 @@ 1 2 3 4 5 -b apply change 2/6 to 'f'? [Ynesfdaq?] y diff --git a/folder1/g b/folder1/g 2 hunks, 2 lines changed examine changes to 'folder1/g'? [Ynesfdaq?] y @@ -1,6 +1,5 @@ -c 1 2 3 4 5 apply change 3/6 to 'folder1/g'? [Ynesfdaq?] ? y - yes, apply this change n - no, skip this change e - edit this change manually s - skip remaining changes to this file f - apply remaining changes to this file d - done, skip remaining changes and files a - apply all changes to all remaining files q - quit, applying no changes ? - ? (display help) apply change 3/6 to 'folder1/g'? [Ynesfdaq?] y @@ -2,6 +1,5 @@ 1 2 3 4 5 -d apply change 4/6 to 'folder1/g'? [Ynesfdaq?] n diff --git a/folder2/h b/folder2/h 2 hunks, 2 lines changed examine changes to 'folder2/h'? [Ynesfdaq?] n reverting f reverting folder1/g $ cat f 1 2 3 4 5 $ cat folder1/g 1 2 3 4 5 d $ cat folder2/h e 1 2 3 4 5 f Test that --interactive lift the need for --all $ echo q | hg revert -i -r 2 diff --git a/folder1/g b/folder1/g 1 hunks, 1 lines changed examine changes to 'folder1/g'? [Ynesfdaq?] q abort: user quit [255] $ ls folder1/ g Test that a noop revert doesn't do an unnecessary backup $ (echo y; echo n) | hg revert -i -r 2 folder1/g diff --git a/folder1/g b/folder1/g 1 hunks, 1 lines changed examine changes to 'folder1/g'? [Ynesfdaq?] y @@ -3,4 +3,3 @@ 3 4 5 -d apply this change to 'folder1/g'? [Ynesfdaq?] n $ ls folder1/ g Test --no-backup $ (echo y; echo y) | hg revert -i -C -r 2 folder1/g diff --git a/folder1/g b/folder1/g 1 hunks, 1 lines changed examine changes to 'folder1/g'? [Ynesfdaq?] y @@ -3,4 +3,3 @@ 3 4 5 -d apply this change to 'folder1/g'? [Ynesfdaq?] y $ ls folder1/ g >>> open('folder1/g', 'wb').write(b"1\n2\n3\n4\n5\nd\n") and None $ hg update -C 6 3 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg revert -i -r 2 --all -- << EOF > n > y > y > y > y > y > n > n > EOF remove added file folder1/i (Yn)? n diff --git a/f b/f 2 hunks, 2 lines changed examine changes to 'f'? [Ynesfdaq?] y @@ -1,6 +1,5 @@ -a 1 2 3 4 5 apply change 1/6 to 'f'? [Ynesfdaq?] y @@ -2,6 +1,5 @@ 1 2 3 4 5 -b apply change 2/6 to 'f'? [Ynesfdaq?] y diff --git a/folder1/g b/folder1/g 2 hunks, 2 lines changed examine changes to 'folder1/g'? [Ynesfdaq?] y @@ -1,6 +1,5 @@ -c 1 2 3 4 5 apply change 3/6 to 'folder1/g'? [Ynesfdaq?] y @@ -2,6 +1,5 @@ 1 2 3 4 5 -d apply change 4/6 to 'folder1/g'? [Ynesfdaq?] n diff --git a/folder2/h b/folder2/h 2 hunks, 2 lines changed examine changes to 'folder2/h'? [Ynesfdaq?] n reverting f reverting folder1/g $ cat f 1 2 3 4 5 $ cat folder1/g 1 2 3 4 5 d $ cat folder2/h e 1 2 3 4 5 f $ hg st M f M folder1/g $ hg revert --interactive f << EOF > y > ? > y > n > n > EOF diff --git a/f b/f 2 hunks, 2 lines changed examine changes to 'f'? [Ynesfdaq?] y @@ -1,6 +1,5 @@ -a 1 2 3 4 5 discard change 1/2 to 'f'? [Ynesfdaq?] ? y - yes, discard this change n - no, skip this change e - edit this change manually s - skip remaining changes to this file f - discard remaining changes to this file d - done, skip remaining changes and files a - discard all changes to all remaining files q - quit, discarding no changes ? - ? (display help) discard change 1/2 to 'f'? [Ynesfdaq?] y @@ -2,6 +1,5 @@ 1 2 3 4 5 -b discard change 2/2 to 'f'? [Ynesfdaq?] n $ hg st M f M folder1/g ? f.orig $ cat f a 1 2 3 4 5 $ cat f.orig 1 2 3 4 5 $ rm f.orig $ hg update -C . 2 files updated, 0 files merged, 0 files removed, 0 files unresolved Check editing files newly added by a revert 1) Create a dummy editor changing 1 to 42 $ cat > $TESTTMP/editor.sh << '__EOF__' > cat "$1" | sed "s/1/42/g" > tt > mv tt "$1" > __EOF__ 2) Add k $ printf "1\n" > k $ hg add k $ hg commit -m "add k" 3) Use interactive revert with editing (replacing +1 with +42): $ printf "0\n2\n" > k $ HGEDITOR="\"sh\" \"${TESTTMP}/editor.sh\"" hg revert -i <<EOF > y > e > EOF diff --git a/k b/k 1 hunks, 2 lines changed examine changes to 'k'? [Ynesfdaq?] y @@ -1,1 +1,2 @@ -1 +0 +2 discard this change to 'k'? [Ynesfdaq?] e reverting k $ cat k 42 $ hg update -C . 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg purge $ touch newfile $ hg add newfile $ hg status A newfile $ hg revert -i <<EOF > n > EOF forget added file newfile (Yn)? n $ hg status A newfile $ hg revert -i <<EOF > y > EOF forget added file newfile (Yn)? y forgetting newfile $ hg status ? newfile When a line without EOL is selected during "revert -i" (issue5651) $ hg init $TESTTMP/revert-i-eol $ cd $TESTTMP/revert-i-eol $ echo 0 > a $ hg ci -qAm 0 $ printf 1 >> a $ hg ci -qAm 1 $ cat a 0 1 (no-eol) $ hg revert -ir'.^' <<EOF > y > y > EOF diff --git a/a b/a 1 hunks, 1 lines changed examine changes to 'a'? [Ynesfdaq?] y @@ -1,2 +1,1 @@ 0 -1 \ No newline at end of file apply this change to 'a'? [Ynesfdaq?] y reverting a $ cat a 0 When specified pattern does not exist, we should exit early (issue5789). $ hg files a $ hg rev b b: no such file in rev b40d1912accf $ hg rev -i b b: no such file in rev b40d1912accf $ cd .. Prompt before undeleting file(issue6008) $ hg init repo $ cd repo $ echo a > a $ hg ci -qAm a $ hg rm a $ hg revert -i<<EOF > y > EOF add back removed file a (Yn)? y undeleting a $ ls a $ hg rm a $ hg revert -i<<EOF > n > EOF add back removed file a (Yn)? n $ ls $ hg revert -a undeleting a $ cd .. Test "keep" mode $ cat <<EOF >> $HGRCPATH > [experimental] > revert.interactive.select-to-keep = true > EOF $ cd repo $ printf "x\na\ny\n" > a $ hg diff diff -r cb9a9f314b8b a --- a/a Thu Jan 01 00:00:00 1970 +0000 +++ b/a Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +1,3 @@ +x a +y $ cat > $TESTTMP/editor.sh << '__EOF__' > echo "+new line" >> "$1" > __EOF__ $ HGEDITOR="\"sh\" \"${TESTTMP}/editor.sh\"" hg revert -i <<EOF > y > n > e > EOF diff --git a/a b/a 2 hunks, 2 lines changed examine changes to 'a'? [Ynesfdaq?] y @@ -1,1 +1,2 @@ +x a keep change 1/2 to 'a'? [Ynesfdaq?] n @@ -1,1 +2,2 @@ a +y keep change 2/2 to 'a'? [Ynesfdaq?] e reverting a $ cat a a y new line