mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-10 08:22:54 -05:00
Giving "git last-modified" a tree (not a commit-ish) died an uncontrolled death, which has been corrected. * tc/last-modified-not-a-tree: last-modified: verify revision argument is a commit-ish last-modified: remove double error message last-modified: fix memory leak when more than one commit is given last-modified: rewrite error message when more than one commit given
288 lines
5.5 KiB
Bash
Executable File
288 lines
5.5 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
test_description='last-modified tests'
|
|
|
|
. ./test-lib.sh
|
|
|
|
test_expect_success 'setup' '
|
|
test_commit 1 file &&
|
|
mkdir a &&
|
|
test_commit 2 a/file &&
|
|
git tag -mA t2 2 &&
|
|
mkdir a/b &&
|
|
test_commit 3 a/b/file
|
|
'
|
|
|
|
check_last_modified() {
|
|
local indir= &&
|
|
while test $# != 0
|
|
do
|
|
case "$1" in
|
|
-C)
|
|
indir="$2"
|
|
shift
|
|
;;
|
|
*)
|
|
break
|
|
;;
|
|
esac &&
|
|
shift
|
|
done &&
|
|
|
|
cat >expect &&
|
|
git ${indir:+-C "$indir"} last-modified "$@" >tmp.1 &&
|
|
git name-rev --annotate-stdin --name-only --tags --exclude=t2 \
|
|
<tmp.1 >tmp.2 &&
|
|
tr '\t' ' ' <tmp.2 >actual &&
|
|
test_cmp expect actual
|
|
}
|
|
|
|
test_expect_success 'last-modified non-recursive' '
|
|
check_last_modified <<-\EOF
|
|
3 a
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified recursive' '
|
|
check_last_modified -r <<-\EOF
|
|
3 a/b/file
|
|
2 a/file
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified on annotated tag' '
|
|
check_last_modified t2 <<-\EOF
|
|
2 a
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified recursive with show-trees' '
|
|
check_last_modified -r -t <<-\EOF
|
|
3 a/b
|
|
3 a/b/file
|
|
3 a
|
|
2 a/file
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified non-recursive with show-trees' '
|
|
check_last_modified -t <<-\EOF
|
|
3 a
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified subdir' '
|
|
check_last_modified a <<-\EOF
|
|
3 a
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified in sparse checkout' '
|
|
test_when_finished "git sparse-checkout disable" &&
|
|
git sparse-checkout set b &&
|
|
check_last_modified -- a <<-\EOF
|
|
3 a
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified subdir recursive' '
|
|
check_last_modified -r a <<-\EOF
|
|
3 a/b/file
|
|
2 a/file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified subdir non-recursive' '
|
|
check_last_modified a <<-\EOF
|
|
3 a
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified path in subdir non-recursive' '
|
|
check_last_modified a/file <<-\EOF
|
|
2 a/file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified subdir with wildcard non-recursive' '
|
|
check_last_modified a/* <<-\EOF
|
|
3 a/b
|
|
2 a/file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified with negative max-depth' '
|
|
check_last_modified --max-depth=-1 <<-\EOF
|
|
3 a/b/file
|
|
2 a/file
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified with max-depth of 1' '
|
|
check_last_modified --max-depth=1 <<-\EOF
|
|
3 a/b
|
|
2 a/file
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified from non-HEAD commit' '
|
|
check_last_modified HEAD^ <<-\EOF
|
|
2 a
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified from subdir defaults to root' '
|
|
check_last_modified -C a <<-\EOF
|
|
3 a
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified from subdir uses relative pathspecs' '
|
|
check_last_modified -C a -r b <<-\EOF
|
|
3 a/b/file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'limit last-modified traversal by count' '
|
|
check_last_modified -1 <<-\EOF
|
|
3 a
|
|
^2 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'limit last-modified traversal by commit' '
|
|
check_last_modified HEAD~2..HEAD <<-\EOF
|
|
3 a
|
|
^1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'only last-modified files in the current tree' '
|
|
git rm -rf a &&
|
|
git commit -m "remove a" &&
|
|
check_last_modified <<-\EOF
|
|
1 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'subdirectory modified via merge' '
|
|
test_when_finished rm -rf repo &&
|
|
git init repo &&
|
|
(
|
|
cd repo &&
|
|
test_commit base &&
|
|
git switch --create left &&
|
|
mkdir subdir &&
|
|
test_commit left subdir/left &&
|
|
git switch --create right base &&
|
|
mkdir subdir &&
|
|
test_commit right subdir/right &&
|
|
git switch - &&
|
|
test_merge merge right &&
|
|
check_last_modified <<-\EOF
|
|
merge subdir
|
|
base base.t
|
|
EOF
|
|
)
|
|
'
|
|
|
|
test_expect_success 'cross merge boundaries in blaming' '
|
|
git checkout HEAD^0 &&
|
|
git rm -rf . &&
|
|
test_commit m1 &&
|
|
git checkout HEAD^ &&
|
|
git rm -rf . &&
|
|
test_commit m2 &&
|
|
git merge m1 &&
|
|
check_last_modified <<-\EOF
|
|
m2 m2.t
|
|
m1 m1.t
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'last-modified merge for resolved conflicts' '
|
|
git checkout HEAD^0 &&
|
|
git rm -rf . &&
|
|
test_commit c1 conflict &&
|
|
git checkout HEAD^ &&
|
|
git rm -rf . &&
|
|
test_commit c2 conflict &&
|
|
test_must_fail git merge c1 &&
|
|
test_commit resolved conflict &&
|
|
check_last_modified conflict <<-\EOF
|
|
resolved conflict
|
|
EOF
|
|
'
|
|
|
|
|
|
# Consider `file` with this content through history:
|
|
#
|
|
# A---B---B-------B---B
|
|
# \ /
|
|
# C---D
|
|
test_expect_success 'last-modified merge ignores content from branch' '
|
|
git checkout HEAD^0 &&
|
|
git rm -rf . &&
|
|
test_commit a1 file A &&
|
|
test_commit a2 file B &&
|
|
test_commit a3 file C &&
|
|
test_commit a4 file D &&
|
|
git checkout a2 &&
|
|
git merge --no-commit --no-ff a4 &&
|
|
git checkout a2 -- file &&
|
|
git merge --continue &&
|
|
check_last_modified <<-\EOF
|
|
a2 file
|
|
EOF
|
|
'
|
|
|
|
# Consider `file` with this content through history:
|
|
#
|
|
# A---B---B---C---D---B---B
|
|
# \ /
|
|
# B-------B
|
|
test_expect_success 'last-modified merge undoes changes' '
|
|
git checkout HEAD^0 &&
|
|
git rm -rf . &&
|
|
test_commit b1 file A &&
|
|
test_commit b2 file B &&
|
|
test_commit b3 file C &&
|
|
test_commit b4 file D &&
|
|
git checkout b2 &&
|
|
test_commit b5 file2 2 &&
|
|
git checkout b4 &&
|
|
git merge --no-commit --no-ff b5 &&
|
|
git checkout b2 -- file &&
|
|
git merge --continue &&
|
|
check_last_modified <<-\EOF
|
|
b5 file2
|
|
b2 file
|
|
EOF
|
|
'
|
|
|
|
test_expect_success 'cannot run last-modified on two commits' '
|
|
test_must_fail git last-modified HEAD HEAD~1 2>err &&
|
|
test_grep "last-modified can only operate on one commit at a time" err
|
|
'
|
|
|
|
test_expect_success 'last-modified complains about unknown arguments' '
|
|
test_must_fail git last-modified --foo 2>err &&
|
|
test_grep "unknown last-modified argument: --foo" err
|
|
'
|
|
|
|
test_expect_success 'last-modified expects commit-ish' '
|
|
test_must_fail git last-modified HEAD^{tree} 2>err &&
|
|
test_grep "revision argument ${SQ}HEAD^{tree}${SQ} is a tree, not a commit-ish" err
|
|
'
|
|
|
|
test_done
|