git/t/t8020-last-modified.sh

228 lines
4.3 KiB
Bash
Executable File

#!/bin/sh
test_description='last-modified tests'
. ./test-lib.sh
test_expect_success 'setup' '
test_commit 1 file &&
TREE1=$(git rev-parse HEAD^{tree}) &&
mkdir a &&
test_commit 2 a/file &&
mkdir a/b &&
test_commit 3 a/b/file &&
TREE3=$(git rev-parse HEAD^{tree})
'
test_expect_success 'cannot run last-modified on two trees' '
test_must_fail git last-modified HEAD HEAD~1
'
check_last_modified() {
local indir= &&
while test $# != 0
do
case "$1" in
-C)
indir="$2"
shift
;;
*)
break
;;
esac &&
shift
done &&
cat >expect &&
test_when_finished "rm -f tmp.*" &&
git ${indir:+-C "$indir"} last-modified "$@" >tmp.1 &&
git name-rev --annotate-stdin --name-only --tags \
<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 extended output' '
check_last_modified --extended <<-EOF
path a
commit 3
tree $TREE3
parent 2
author A U Thor <author@example.com> 1112912113 -0700
committer C O Mitter <committer@example.com> 1112912113 -0700
3
path file
commit 1
tree $TREE1
author A U Thor <author@example.com> 1112911993 -0700
committer C O Mitter <committer@example.com> 1112911993 -0700
1
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 recursive with tree' '
check_last_modified -t <<-\EOF
3 a
3 a/b
3 a/b/file
2 a/file
1 file
EOF
'
test_expect_success 'last-modified subdir' '
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 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 '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 'last-modified complains about unknown arguments' '
test_must_fail git last-modified --foo 2>err &&
grep "unknown last-modified argument: --foo" err
'
test_done