2007-05-12 14:42:00 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
2007-11-12 10:44:16 +08:00
|
|
|
test_description='git add -u
|
2007-05-12 14:42:00 +08:00
|
|
|
|
|
|
|
This test creates a working tree state with three files:
|
|
|
|
|
|
|
|
top (previously committed, modified)
|
|
|
|
dir/sub (previously committed, modified)
|
|
|
|
dir/other (untracked)
|
|
|
|
|
2007-07-03 13:52:14 +08:00
|
|
|
and issues a git add -u with path limiting on "dir" to add
|
2007-11-12 10:44:16 +08:00
|
|
|
only the updates to dir/sub.
|
|
|
|
|
|
|
|
Also tested are "git add -u" without limiting, and "git add -u"
|
2009-01-29 06:24:53 +08:00
|
|
|
without contents changes, and other conditions'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2021-10-31 06:24:20 +08:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2007-05-12 14:42:00 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success setup '
|
|
|
|
echo initial >check &&
|
|
|
|
echo initial >top &&
|
2007-09-14 16:29:04 +08:00
|
|
|
echo initial >foo &&
|
2007-08-16 05:12:14 +08:00
|
|
|
mkdir dir1 dir2 &&
|
|
|
|
echo initial >dir1/sub1 &&
|
|
|
|
echo initial >dir1/sub2 &&
|
|
|
|
echo initial >dir2/sub3 &&
|
2007-09-14 16:29:04 +08:00
|
|
|
git add check dir1 dir2 top foo &&
|
2010-10-31 09:46:54 +08:00
|
|
|
test_tick &&
|
2008-09-03 16:59:27 +08:00
|
|
|
git commit -m initial &&
|
2007-08-16 05:12:14 +08:00
|
|
|
|
|
|
|
echo changed >check &&
|
|
|
|
echo changed >top &&
|
|
|
|
echo changed >dir2/sub3 &&
|
|
|
|
rm -f dir1/sub1 &&
|
|
|
|
echo other >dir2/other
|
2007-05-12 14:42:00 +08:00
|
|
|
'
|
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success update '
|
|
|
|
git add -u dir1 dir2
|
2007-05-12 14:42:00 +08:00
|
|
|
'
|
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success 'update noticed a removal' '
|
2008-09-03 16:59:27 +08:00
|
|
|
test "$(git ls-files dir1/sub1)" = ""
|
2007-08-16 05:12:14 +08:00
|
|
|
'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success 'update touched correct path' '
|
2008-09-03 16:59:27 +08:00
|
|
|
test "$(git diff-files --name-status dir2/sub3)" = ""
|
2007-08-16 05:12:14 +08:00
|
|
|
'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success 'update did not touch other tracked files' '
|
2008-09-03 16:59:27 +08:00
|
|
|
test "$(git diff-files --name-status check)" = "M check" &&
|
|
|
|
test "$(git diff-files --name-status top)" = "M top"
|
2007-08-16 05:12:14 +08:00
|
|
|
'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success 'update did not touch untracked files' '
|
2008-09-03 16:59:27 +08:00
|
|
|
test "$(git ls-files dir2/other)" = ""
|
2007-08-16 05:12:14 +08:00
|
|
|
'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
test_expect_success 'cache tree has not been corrupted' '
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2007-08-16 05:12:14 +08:00
|
|
|
git ls-files -s |
|
|
|
|
sed -e "s/ 0 / /" >expect &&
|
|
|
|
git ls-tree -r $(git write-tree) |
|
|
|
|
sed -e "s/ blob / /" >current &&
|
2008-03-13 05:36:36 +08:00
|
|
|
test_cmp expect current
|
2007-08-16 05:12:14 +08:00
|
|
|
|
|
|
|
'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2007-08-16 01:01:43 +08:00
|
|
|
test_expect_success 'update from a subdirectory' '
|
|
|
|
(
|
|
|
|
cd dir1 &&
|
|
|
|
echo more >sub2 &&
|
|
|
|
git add -u sub2
|
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'change gets noticed' '
|
|
|
|
|
|
|
|
test "$(git diff-files --name-status dir1)" = ""
|
|
|
|
|
|
|
|
'
|
2007-05-12 14:42:00 +08:00
|
|
|
|
2013-03-20 06:53:17 +08:00
|
|
|
test_expect_success 'non-qualified update in subdir updates from the root' '
|
2013-03-14 14:44:04 +08:00
|
|
|
(
|
|
|
|
cd dir1 &&
|
|
|
|
echo even more >>sub2 &&
|
add: simplify -u/-A without pathspec
Since Git 2.0, "add -u" and "add -A" run from a subdirectory without
any pathspec mean "everything in the working tree" (before 2.0, they
were limited to the current directory). The limiting to the current
directory was implemented by inserting "." to the command line when
the end user did not give us any pathspec. At 2.0, we updated the
code to insert ":/" (instead of '.') to consider everything from the
top-level, by using a pathspec magic "top".
The call to parse_pathspec() using the command line arguments is,
however, made with PATHSPEC_PREFER_FULL option since 5a76aff1 (add:
convert to use parse_pathspec, 2013-07-14), which predates Git 2.0.
In retrospect, there was no need to turn "adding . to limit to the
directory" into "adding :/ to unlimit to everywhere" in Git 2.0;
instead we could just have done "if there is no pathspec on the
command line, just let it be". The parse_pathspec() then would give
us a pathspec that matches everything and all is well.
Incidentally such a simplification also fixes a corner case bug that
stems from the fact that ":/" does not necessarily mean any magic.
A user would say "git --literal-pathspecs add -u :/" from the
command line when she has a directory ':' and wants to add
everything in it (and she knows that her :/ will be taken as
'everything under the sun' magic pathspec unless she disables the
magic with --literal-pathspecs). The internal use of ':/' would
behave the same way as such an explicitly given ":/" when run with
"--literal-pathspecs", and will not add everything under the sun as
the code originally intended.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2015-10-25 10:31:11 +08:00
|
|
|
git --literal-pathspecs add -u &&
|
|
|
|
echo even more >>sub2 &&
|
2013-03-14 14:44:04 +08:00
|
|
|
git add -u
|
|
|
|
) &&
|
|
|
|
git diff-files --name-only >actual &&
|
tests: use 'test_must_be_empty' instead of 'test_cmp <empty> <out>'
Using 'test_must_be_empty' is shorter and more idiomatic than
>empty &&
test_cmp empty out
as it saves the creation of an empty file. Furthermore, sometimes the
expected empty file doesn't have such a descriptive name like 'empty',
and its creation is far away from the place where it's finally used
for comparison (e.g. in 't7600-merge.sh', where two expected empty
files are created in the 'setup' test, but are used only about 500
lines later).
These cases were found by instrumenting 'test_cmp' to error out the
test script when it's used to compare empty files, and then converted
manually.
Note that even after this patch there still remain a lot of cases
where we use 'test_cmp' to check empty files:
- Sometimes the expected output is not hard-coded in the test, but
'test_cmp' is used to ensure that two similar git commands produce
the same output, and that output happens to be empty, e.g. the
test 'submodule update --merge - ignores --merge for new
submodules' in 't7406-submodule-update.sh'.
- Repetitive common tasks, including preparing the expected results
and running 'test_cmp', are often extracted into a helper
function, and some of this helper's callsites expect no output.
- For the same reason as above, the whole 'test_expect_success'
block is within a helper function, e.g. in 't3070-wildmatch.sh'.
- Or 'test_cmp' is invoked in a loop, e.g. the test 'cvs update
(-p)' in 't9400-git-cvsserver-server.sh'.
Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-20 05:57:25 +08:00
|
|
|
test_must_be_empty actual
|
2013-03-14 14:44:04 +08:00
|
|
|
'
|
|
|
|
|
2013-06-08 04:53:28 +08:00
|
|
|
test_expect_success 'replace a file with a symlink' '
|
2007-09-14 16:29:04 +08:00
|
|
|
|
|
|
|
rm foo &&
|
2013-06-08 04:53:28 +08:00
|
|
|
test_ln_s_add top foo
|
2007-09-14 16:29:04 +08:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2007-11-12 10:44:16 +08:00
|
|
|
test_expect_success 'add everything changed' '
|
|
|
|
|
|
|
|
git add -u &&
|
|
|
|
test -z "$(git diff-files)"
|
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'touch and then add -u' '
|
|
|
|
|
|
|
|
touch check &&
|
|
|
|
git add -u &&
|
|
|
|
test -z "$(git diff-files)"
|
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'touch and then add explicitly' '
|
|
|
|
|
|
|
|
touch check &&
|
|
|
|
git add check &&
|
|
|
|
test -z "$(git diff-files)"
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2011-04-13 06:50:55 +08:00
|
|
|
test_expect_success 'add -n -u should not add but just report' '
|
2008-05-22 03:04:34 +08:00
|
|
|
|
|
|
|
(
|
|
|
|
echo "add '\''check'\''" &&
|
|
|
|
echo "remove '\''top'\''"
|
|
|
|
) >expect &&
|
|
|
|
before=$(git ls-files -s check top) &&
|
2021-10-13 03:15:50 +08:00
|
|
|
git count-objects -v >objects_before &&
|
2008-05-22 03:04:34 +08:00
|
|
|
echo changed >>check &&
|
|
|
|
rm -f top &&
|
|
|
|
git add -n -u >actual &&
|
|
|
|
after=$(git ls-files -s check top) &&
|
2021-10-13 03:15:50 +08:00
|
|
|
git count-objects -v >objects_after &&
|
2008-05-22 03:04:34 +08:00
|
|
|
|
|
|
|
test "$before" = "$after" &&
|
2021-10-13 03:15:50 +08:00
|
|
|
test_cmp objects_before objects_after &&
|
2021-02-11 09:53:53 +08:00
|
|
|
test_cmp expect actual
|
2008-05-22 03:04:34 +08:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2009-01-29 06:24:53 +08:00
|
|
|
test_expect_success 'add -u resolves unmerged paths' '
|
|
|
|
git reset --hard &&
|
|
|
|
one=$(echo 1 | git hash-object -w --stdin) &&
|
|
|
|
two=$(echo 2 | git hash-object -w --stdin) &&
|
|
|
|
three=$(echo 3 | git hash-object -w --stdin) &&
|
|
|
|
{
|
|
|
|
for path in path1 path2
|
|
|
|
do
|
|
|
|
echo "100644 $one 1 $path"
|
|
|
|
echo "100644 $two 2 $path"
|
|
|
|
echo "100644 $three 3 $path"
|
|
|
|
done
|
|
|
|
echo "100644 $one 1 path3"
|
|
|
|
echo "100644 $one 1 path4"
|
|
|
|
echo "100644 $one 3 path5"
|
|
|
|
echo "100644 $one 3 path6"
|
|
|
|
} |
|
|
|
|
git update-index --index-info &&
|
|
|
|
echo 3 >path1 &&
|
|
|
|
echo 2 >path3 &&
|
|
|
|
echo 2 >path5 &&
|
|
|
|
|
2011-04-20 03:18:20 +08:00
|
|
|
# Fail to explicitly resolve removed paths with "git add"
|
|
|
|
test_must_fail git add --no-all path4 &&
|
|
|
|
test_must_fail git add --no-all path6 &&
|
2009-01-29 06:24:53 +08:00
|
|
|
|
2011-04-21 09:11:19 +08:00
|
|
|
# "add -u" should notice removals no matter what stages
|
|
|
|
# the index entries are in.
|
|
|
|
git add -u &&
|
|
|
|
git ls-files -s path1 path2 path3 path4 path5 path6 >actual &&
|
2009-01-29 06:24:53 +08:00
|
|
|
{
|
|
|
|
echo "100644 $three 0 path1"
|
|
|
|
echo "100644 $two 0 path3"
|
|
|
|
echo "100644 $two 0 path5"
|
2011-04-21 09:11:19 +08:00
|
|
|
} >expect &&
|
|
|
|
test_cmp expect actual
|
2009-01-29 06:24:53 +08:00
|
|
|
'
|
|
|
|
|
2010-02-10 06:30:48 +08:00
|
|
|
test_expect_success '"add -u non-existent" should fail' '
|
|
|
|
test_must_fail git add -u non-existent &&
|
2020-10-19 04:48:07 +08:00
|
|
|
git ls-files >actual &&
|
|
|
|
! grep "non-existent" actual
|
2010-02-10 06:30:48 +08:00
|
|
|
'
|
|
|
|
|
2007-05-12 14:42:00 +08:00
|
|
|
test_done
|