2008-02-13 11:50:51 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='add -i basic tests'
|
|
|
|
. ./test-lib.sh
|
2010-08-13 22:40:04 +02:00
|
|
|
. "$TEST_DIRECTORY"/lib-prereq-FILEMODE.sh
|
2008-02-13 11:50:51 +01:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
if ! test_have_prereq PERL
|
|
|
|
then
|
|
|
|
skip_all='skipping add -i tests, perl not available'
|
|
|
|
test_done
|
|
|
|
fi
|
|
|
|
|
|
|
|
test_expect_success 'setup (initial)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
echo content >file &&
|
|
|
|
git add file &&
|
|
|
|
echo more >>file &&
|
|
|
|
echo lines >>file
|
|
|
|
'
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'status works (initial)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
git add -i </dev/null >output &&
|
|
|
|
grep "+1/-0 *+2/-0 file" output
|
|
|
|
'
|
2010-08-13 22:40:05 +02:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2008-02-13 11:50:51 +01:00
|
|
|
cat >expected <<EOF
|
|
|
|
new file mode 100644
|
|
|
|
index 0000000..d95f3ad
|
|
|
|
--- /dev/null
|
|
|
|
+++ b/file
|
|
|
|
@@ -0,0 +1 @@
|
|
|
|
+content
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'diff works (initial)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
(echo d; echo 1) | git add -i >output &&
|
|
|
|
sed -ne "/new file/,/content/p" <output >diff &&
|
2008-03-12 22:36:36 +01:00
|
|
|
test_cmp expected diff
|
2008-02-13 11:50:51 +01:00
|
|
|
'
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'revert works (initial)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
git add file &&
|
|
|
|
(echo r; echo 1) | git add -i &&
|
|
|
|
git ls-files >output &&
|
|
|
|
! grep . output
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup (commit)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
echo baseline >file &&
|
|
|
|
git add file &&
|
|
|
|
git commit -m commit &&
|
|
|
|
echo content >>file &&
|
|
|
|
git add file &&
|
|
|
|
echo more >>file &&
|
|
|
|
echo lines >>file
|
|
|
|
'
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'status works (commit)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
git add -i </dev/null >output &&
|
|
|
|
grep "+1/-0 *+2/-0 file" output
|
|
|
|
'
|
2010-08-13 22:40:05 +02:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2008-02-13 11:50:51 +01:00
|
|
|
cat >expected <<EOF
|
|
|
|
index 180b47c..b6f2c08 100644
|
|
|
|
--- a/file
|
|
|
|
+++ b/file
|
|
|
|
@@ -1 +1,2 @@
|
|
|
|
baseline
|
|
|
|
+content
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'diff works (commit)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
(echo d; echo 1) | git add -i >output &&
|
|
|
|
sed -ne "/^index/,/content/p" <output >diff &&
|
2008-03-12 22:36:36 +01:00
|
|
|
test_cmp expected diff
|
2008-02-13 11:50:51 +01:00
|
|
|
'
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'revert works (commit)' '
|
2008-02-13 11:50:51 +01:00
|
|
|
git add file &&
|
|
|
|
(echo r; echo 1) | git add -i &&
|
|
|
|
git add -i </dev/null >output &&
|
|
|
|
grep "unchanged *+3/-0 file" output
|
|
|
|
'
|
|
|
|
|
2010-08-13 22:40:05 +02:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2008-07-03 00:00:00 +02:00
|
|
|
cat >expected <<EOF
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup fake editor' '
|
2011-05-05 20:28:52 +02:00
|
|
|
>fake_editor.sh &&
|
2010-08-13 22:40:05 +02:00
|
|
|
chmod a+x fake_editor.sh &&
|
2011-05-05 20:28:52 +02:00
|
|
|
test_set_editor "$(pwd)/fake_editor.sh"
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'dummy edit works' '
|
2008-07-03 00:00:00 +02:00
|
|
|
(echo e; echo a) | git add -p &&
|
|
|
|
git diff > diff &&
|
|
|
|
test_cmp expected diff
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup patch' '
|
2008-07-03 00:00:00 +02:00
|
|
|
cat >patch <<EOF
|
|
|
|
@@ -1,1 +1,4 @@
|
|
|
|
this
|
|
|
|
+patch
|
2010-08-13 22:40:05 +02:00
|
|
|
-does not
|
2008-07-03 00:00:00 +02:00
|
|
|
apply
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup fake editor' '
|
2010-08-13 22:40:05 +02:00
|
|
|
echo "#!$SHELL_PATH" >fake_editor.sh &&
|
|
|
|
cat >>fake_editor.sh <<\EOF &&
|
2008-07-03 00:00:00 +02:00
|
|
|
mv -f "$1" oldpatch &&
|
|
|
|
mv -f patch "$1"
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
chmod a+x fake_editor.sh &&
|
|
|
|
test_set_editor "$(pwd)/fake_editor.sh"
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'bad edit rejected' '
|
2008-07-03 00:00:00 +02:00
|
|
|
git reset &&
|
|
|
|
(echo e; echo n; echo d) | git add -p >output &&
|
|
|
|
grep "hunk does not apply" output
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup patch' '
|
2008-07-03 00:00:00 +02:00
|
|
|
cat >patch <<EOF
|
|
|
|
this patch
|
|
|
|
is garbage
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'garbage edit rejected' '
|
2008-07-03 00:00:00 +02:00
|
|
|
git reset &&
|
|
|
|
(echo e; echo n; echo d) | git add -p >output &&
|
|
|
|
grep "hunk does not apply" output
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup patch' '
|
2008-07-03 00:00:00 +02:00
|
|
|
cat >patch <<EOF
|
|
|
|
@@ -1,0 +1,0 @@
|
|
|
|
baseline
|
|
|
|
+content
|
|
|
|
+newcontent
|
|
|
|
+lines
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2008-07-03 00:00:00 +02:00
|
|
|
cat >expected <<EOF
|
|
|
|
diff --git a/file b/file
|
|
|
|
index b5dd6c9..f910ae9 100644
|
|
|
|
--- a/file
|
|
|
|
+++ b/file
|
|
|
|
@@ -1,4 +1,4 @@
|
|
|
|
baseline
|
|
|
|
content
|
|
|
|
-newcontent
|
|
|
|
+more
|
|
|
|
lines
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'real edit works' '
|
2008-07-03 00:00:00 +02:00
|
|
|
(echo e; echo n; echo d) | git add -p &&
|
|
|
|
git diff >output &&
|
|
|
|
test_cmp expected output
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'skip files similarly as commit -a' '
|
2009-10-10 17:51:45 +02:00
|
|
|
git reset &&
|
|
|
|
echo file >.gitignore &&
|
|
|
|
echo changed >file &&
|
|
|
|
echo y | git add -p file &&
|
|
|
|
git diff >output &&
|
|
|
|
git reset &&
|
|
|
|
git commit -am commit &&
|
|
|
|
git diff >expected &&
|
|
|
|
test_cmp expected output &&
|
|
|
|
git reset --hard HEAD^
|
|
|
|
'
|
|
|
|
rm -f .gitignore
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success FILEMODE 'patch does not affect mode' '
|
2008-03-27 08:30:43 +01:00
|
|
|
git reset --hard &&
|
|
|
|
echo content >>file &&
|
|
|
|
chmod +x file &&
|
2008-03-27 08:32:25 +01:00
|
|
|
printf "n\\ny\\n" | git add -p &&
|
2008-03-27 08:30:43 +01:00
|
|
|
git show :file | grep content &&
|
|
|
|
git diff file | grep "new mode"
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success FILEMODE 'stage mode but not hunk' '
|
2008-03-27 08:32:25 +01:00
|
|
|
git reset --hard &&
|
|
|
|
echo content >>file &&
|
|
|
|
chmod +x file &&
|
|
|
|
printf "y\\nn\\n" | git add -p &&
|
|
|
|
git diff --cached file | grep "new mode" &&
|
|
|
|
git diff file | grep "+content"
|
|
|
|
'
|
|
|
|
|
git add -p: demonstrate failure when staging both mode and hunk
When trying to stage changes to file which has also pending `chmod +x`,
`git add -p` produces lots of 'Use of uninitialized value ...' warnings
and fails to do the job:
$ echo content >> file
$ chmod +x file
$ git add -p
diff --git a/file b/file
index e69de29..d95f3ad
--- a/file
+++ b/file
old mode 100644
new mode 100755
Stage mode change [y,n,q,a,d,/,j,J,g,?]? y
@@ -0,0 +1 @@
+content
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? y
Use of uninitialized value $o_ofs in addition (+) at .../git-add--interactive line 776.
Use of uninitialized value $ofs in numeric le (<=) at .../git-add--interactive line 806.
Use of uninitialized value $o0_ofs in concatenation (.) or string at .../git-add--interactive line 830.
Use of uninitialized value $n0_ofs in concatenation (.) or string at .../git-add--interactive line 830.
Use of uninitialized value $o_ofs in addition (+) at .../git-add--interactive line 776.
fatal: corrupt patch at line 5
diff --git a/file b/file
index e69de29..d95f3ad
--- a/file
+++ b/file
@@ -,0 + @@
+content
Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-08-15 14:26:49 +02:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success FILEMODE 'stage mode and hunk' '
|
git add -p: demonstrate failure when staging both mode and hunk
When trying to stage changes to file which has also pending `chmod +x`,
`git add -p` produces lots of 'Use of uninitialized value ...' warnings
and fails to do the job:
$ echo content >> file
$ chmod +x file
$ git add -p
diff --git a/file b/file
index e69de29..d95f3ad
--- a/file
+++ b/file
old mode 100644
new mode 100755
Stage mode change [y,n,q,a,d,/,j,J,g,?]? y
@@ -0,0 +1 @@
+content
Stage this hunk [y,n,q,a,d,/,K,g,e,?]? y
Use of uninitialized value $o_ofs in addition (+) at .../git-add--interactive line 776.
Use of uninitialized value $ofs in numeric le (<=) at .../git-add--interactive line 806.
Use of uninitialized value $o0_ofs in concatenation (.) or string at .../git-add--interactive line 830.
Use of uninitialized value $n0_ofs in concatenation (.) or string at .../git-add--interactive line 830.
Use of uninitialized value $o_ofs in addition (+) at .../git-add--interactive line 776.
fatal: corrupt patch at line 5
diff --git a/file b/file
index e69de29..d95f3ad
--- a/file
+++ b/file
@@ -,0 + @@
+content
Signed-off-by: Kirill Smelkov <kirr@mns.spb.ru>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-08-15 14:26:49 +02:00
|
|
|
git reset --hard &&
|
|
|
|
echo content >>file &&
|
|
|
|
chmod +x file &&
|
|
|
|
printf "y\\ny\\n" | git add -p &&
|
|
|
|
git diff --cached file | grep "new mode" &&
|
|
|
|
git diff --cached file | grep "+content" &&
|
|
|
|
test -z "$(git diff file)"
|
|
|
|
'
|
|
|
|
|
2008-05-20 23:59:32 +02:00
|
|
|
# end of tests disabled when filemode is not usable
|
2008-03-27 08:32:25 +01:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup again' '
|
2009-05-25 14:07:55 +02:00
|
|
|
git reset --hard &&
|
|
|
|
test_chmod +x file &&
|
|
|
|
echo content >>file
|
|
|
|
'
|
|
|
|
|
2009-05-16 05:10:19 +02:00
|
|
|
# Write the patch file with a new line at the top and bottom
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup patch' '
|
2009-05-16 05:10:19 +02:00
|
|
|
cat >patch <<EOF
|
|
|
|
index 180b47c..b6f2c08 100644
|
|
|
|
--- a/file
|
|
|
|
+++ b/file
|
|
|
|
@@ -1,2 +1,4 @@
|
|
|
|
+firstline
|
|
|
|
baseline
|
|
|
|
content
|
|
|
|
+lastline
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2009-05-16 05:10:19 +02:00
|
|
|
# Expected output, similar to the patch but w/ diff at the top
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2009-05-16 05:10:19 +02:00
|
|
|
cat >expected <<EOF
|
|
|
|
diff --git a/file b/file
|
|
|
|
index b6f2c08..61b9053 100755
|
|
|
|
--- a/file
|
|
|
|
+++ b/file
|
|
|
|
@@ -1,2 +1,4 @@
|
|
|
|
+firstline
|
|
|
|
baseline
|
|
|
|
content
|
|
|
|
+lastline
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2009-05-16 05:10:19 +02:00
|
|
|
# Test splitting the first patch, then adding both
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'add first line works' '
|
2009-05-16 05:10:19 +02:00
|
|
|
git commit -am "clear local changes" &&
|
|
|
|
git apply patch &&
|
|
|
|
(echo s; echo y; echo y) | git add -p file &&
|
|
|
|
git diff --cached > diff &&
|
|
|
|
test_cmp expected diff
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2009-12-08 08:49:35 +01:00
|
|
|
cat >expected <<EOF
|
|
|
|
diff --git a/non-empty b/non-empty
|
|
|
|
deleted file mode 100644
|
|
|
|
index d95f3ad..0000000
|
|
|
|
--- a/non-empty
|
|
|
|
+++ /dev/null
|
|
|
|
@@ -1 +0,0 @@
|
|
|
|
-content
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'deleting a non-empty file' '
|
2009-12-08 08:49:35 +01:00
|
|
|
git reset --hard &&
|
|
|
|
echo content >non-empty &&
|
|
|
|
git add non-empty &&
|
|
|
|
git commit -m non-empty &&
|
|
|
|
rm non-empty &&
|
|
|
|
echo y | git add -p non-empty &&
|
|
|
|
git diff --cached >diff &&
|
|
|
|
test_cmp expected diff
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'setup expected' '
|
2009-10-28 01:52:57 +01:00
|
|
|
cat >expected <<EOF
|
|
|
|
diff --git a/empty b/empty
|
|
|
|
deleted file mode 100644
|
|
|
|
index e69de29..0000000
|
|
|
|
EOF
|
2010-08-13 22:40:05 +02:00
|
|
|
'
|
2009-10-28 01:52:57 +01:00
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'deleting an empty file' '
|
2009-10-28 01:52:57 +01:00
|
|
|
git reset --hard &&
|
|
|
|
> empty &&
|
|
|
|
git add empty &&
|
|
|
|
git commit -m empty &&
|
|
|
|
rm empty &&
|
|
|
|
echo y | git add -p empty &&
|
|
|
|
git diff --cached >diff &&
|
|
|
|
test_cmp expected diff
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'split hunk setup' '
|
2011-04-29 21:41:16 +02:00
|
|
|
git reset --hard &&
|
|
|
|
for i in 10 20 30 40 50 60
|
|
|
|
do
|
|
|
|
echo $i
|
|
|
|
done >test &&
|
|
|
|
git add test &&
|
|
|
|
test_tick &&
|
|
|
|
git commit -m test &&
|
|
|
|
|
|
|
|
for i in 10 15 20 21 22 23 24 30 40 50 60
|
|
|
|
do
|
|
|
|
echo $i
|
|
|
|
done >test
|
|
|
|
'
|
|
|
|
|
2013-08-24 22:13:32 +02:00
|
|
|
test_expect_success 'split hunk "add -p (edit)"' '
|
2011-04-29 21:41:16 +02:00
|
|
|
# Split, say Edit and do nothing. Then:
|
|
|
|
#
|
|
|
|
# 1. Broken version results in a patch that does not apply and
|
|
|
|
# only takes [y/n] (edit again) so the first q is discarded
|
|
|
|
# and then n attempts to discard the edit. Repeat q enough
|
|
|
|
# times to get out.
|
|
|
|
#
|
|
|
|
# 2. Correct version applies the (not)edited version, and asks
|
2013-04-12 00:36:10 +02:00
|
|
|
# about the next hunk, against which we say q and program
|
2011-04-29 21:41:16 +02:00
|
|
|
# exits.
|
|
|
|
for a in s e q n q q
|
|
|
|
do
|
|
|
|
echo $a
|
|
|
|
done |
|
|
|
|
EDITOR=: git add -p &&
|
|
|
|
git diff >actual &&
|
|
|
|
! grep "^+15" actual
|
|
|
|
'
|
|
|
|
|
add--interactive: ignore unmerged entries in patch mode
When "add -p" sees an unmerged entry, it shows the combined
diff and then immediately skips the hunk. This can be
confusing in a variety of ways, depending on whether there
are other changes to stage (in which case you get the
superfluous combined diff output in between other hunks) or
not (in which case you get the combined diff and the program
exits immediately, rather than seeing "No changes").
The current behavior was not planned, and is just what the
implementation happens to do. Instead, let's explicitly
remove unmerged entries from our list of modified files, and
print a warning that we are ignoring them.
We can cheaply find which entries are unmerged by adding
"--raw" output to the "diff-files --numstat" we already run.
There is one non-obvious thing we must change when parsing
this combined output. Before this patch, when we saw a
numstat line for a file that did not have index changes, we
would create a new record with 'unchanged' in the 'INDEX'
field. Because "--raw" comes before "--numstat", we must
move this special-case down to the raw-line case (and it is
sufficient to move it rather than handle it in both places,
since any file which has a --numstat will also have a --raw
entry).
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2012-04-05 14:30:08 +02:00
|
|
|
test_expect_success 'patch mode ignores unmerged entries' '
|
|
|
|
git reset --hard &&
|
|
|
|
test_commit conflict &&
|
|
|
|
test_commit non-conflict &&
|
|
|
|
git checkout -b side &&
|
|
|
|
test_commit side conflict.t &&
|
|
|
|
git checkout master &&
|
|
|
|
test_commit master conflict.t &&
|
|
|
|
test_must_fail git merge side &&
|
|
|
|
echo changed >non-conflict.t &&
|
|
|
|
echo y | git add -p >output &&
|
|
|
|
! grep a/conflict.t output &&
|
|
|
|
cat >expected <<-\EOF &&
|
|
|
|
* Unmerged path conflict.t
|
|
|
|
diff --git a/non-conflict.t b/non-conflict.t
|
|
|
|
index f766221..5ea2ed4 100644
|
|
|
|
--- a/non-conflict.t
|
|
|
|
+++ b/non-conflict.t
|
|
|
|
@@ -1 +1 @@
|
|
|
|
-non-conflict
|
|
|
|
+changed
|
|
|
|
EOF
|
|
|
|
git diff --cached >diff &&
|
|
|
|
test_cmp expected diff
|
|
|
|
'
|
|
|
|
|
2008-02-13 11:50:51 +01:00
|
|
|
test_done
|