mirror of
https://github.com/git/git
synced 2024-09-12 21:04:12 +00:00
2d27daa91d
When cherry-pick or revert is called on a list of commits, and a conflict encountered somewhere in the middle, the data in ".git/sequencer" is required to continue the operation. However, when a conflict is encountered in the very last commit, the user will have to "continue" after resolving the conflict and committing just so that the sequencer state is removed. This is how the current "rebase -i" script works as well. $ git cherry-pick foo..bar ... conflict encountered while picking "bar" ... $ echo "resolved" >problematicfile $ git add problematicfile $ git commit $ git cherry-pick --continue # This would be a no-op Change this so that the sequencer state is cleared when a conflict is encountered in the last commit. Incidentally, this patch makes sure that some existing tests don't break when features like "--reset" and "--continue" are implemented later in the series. A better way to implement this feature is to get the last "git commit" to remove the sequencer state. However, that requires tighter coupling between "git commit" and the sequencer, a goal that can be pursued once the sequencer is made more general. Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com> Acked-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
110 lines
3 KiB
Bash
Executable file
110 lines
3 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
test_description='Test cherry-pick continuation features
|
|
|
|
+ anotherpick: rewrites foo to d
|
|
+ picked: rewrites foo to c
|
|
+ unrelatedpick: rewrites unrelated to reallyunrelated
|
|
+ base: rewrites foo to b
|
|
+ initial: writes foo as a, unrelated as unrelated
|
|
|
|
'
|
|
|
|
. ./test-lib.sh
|
|
|
|
pristine_detach () {
|
|
git cherry-pick --reset &&
|
|
git checkout -f "$1^0" &&
|
|
git read-tree -u --reset HEAD &&
|
|
git clean -d -f -f -q -x
|
|
}
|
|
|
|
test_expect_success setup '
|
|
echo unrelated >unrelated &&
|
|
git add unrelated &&
|
|
test_commit initial foo a &&
|
|
test_commit base foo b &&
|
|
test_commit unrelatedpick unrelated reallyunrelated &&
|
|
test_commit picked foo c &&
|
|
test_commit anotherpick foo d &&
|
|
git config advice.detachedhead false
|
|
|
|
'
|
|
|
|
test_expect_success 'cherry-pick persists data on failure' '
|
|
pristine_detach initial &&
|
|
test_must_fail git cherry-pick -s base..anotherpick &&
|
|
test_path_is_dir .git/sequencer &&
|
|
test_path_is_file .git/sequencer/head &&
|
|
test_path_is_file .git/sequencer/todo &&
|
|
test_path_is_file .git/sequencer/opts
|
|
'
|
|
|
|
test_expect_success 'cherry-pick persists opts correctly' '
|
|
pristine_detach initial &&
|
|
test_must_fail git cherry-pick -s -m 1 --strategy=recursive -X patience -X ours base..anotherpick &&
|
|
test_path_is_dir .git/sequencer &&
|
|
test_path_is_file .git/sequencer/head &&
|
|
test_path_is_file .git/sequencer/todo &&
|
|
test_path_is_file .git/sequencer/opts &&
|
|
echo "true" >expect &&
|
|
git config --file=.git/sequencer/opts --get-all options.signoff >actual &&
|
|
test_cmp expect actual &&
|
|
echo "1" >expect &&
|
|
git config --file=.git/sequencer/opts --get-all options.mainline >actual &&
|
|
test_cmp expect actual &&
|
|
echo "recursive" >expect &&
|
|
git config --file=.git/sequencer/opts --get-all options.strategy >actual &&
|
|
test_cmp expect actual &&
|
|
cat >expect <<-\EOF &&
|
|
patience
|
|
ours
|
|
EOF
|
|
git config --file=.git/sequencer/opts --get-all options.strategy-option >actual &&
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_expect_success 'cherry-pick cleans up sequencer state upon success' '
|
|
pristine_detach initial &&
|
|
git cherry-pick initial..picked &&
|
|
test_path_is_missing .git/sequencer
|
|
'
|
|
|
|
test_expect_success '--reset does not complain when no cherry-pick is in progress' '
|
|
pristine_detach initial &&
|
|
git cherry-pick --reset
|
|
'
|
|
|
|
test_expect_success '--reset cleans up sequencer state' '
|
|
pristine_detach initial &&
|
|
test_must_fail git cherry-pick base..picked &&
|
|
git cherry-pick --reset &&
|
|
test_path_is_missing .git/sequencer
|
|
'
|
|
|
|
test_expect_success 'cherry-pick cleans up sequencer state when one commit is left' '
|
|
pristine_detach initial &&
|
|
test_must_fail git cherry-pick base..picked &&
|
|
test_path_is_missing .git/sequencer &&
|
|
echo "resolved" >foo &&
|
|
git add foo &&
|
|
git commit &&
|
|
{
|
|
git rev-list HEAD |
|
|
git diff-tree --root --stdin |
|
|
sed "s/$_x40/OBJID/g"
|
|
} >actual &&
|
|
cat >expect <<-\EOF &&
|
|
OBJID
|
|
:100644 100644 OBJID OBJID M foo
|
|
OBJID
|
|
:100644 100644 OBJID OBJID M unrelated
|
|
OBJID
|
|
:000000 100644 OBJID OBJID A foo
|
|
:000000 100644 OBJID OBJID A unrelated
|
|
EOF
|
|
test_cmp expect actual
|
|
'
|
|
|
|
test_done
|