#!/bin/sh # # Copyright (c) 2019 Stefan Sperling # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. . ./common.sh blame_cmp() { local testroot="$1" local file="$2" local xfail="$3" (cd $testroot/wt && got blame "$file" | cut -d ' ' -f 2 \ > $testroot/${file}.blame.got) (cd $testroot/repo && git reset --hard master > /dev/null) (cd $testroot/repo && git blame "$file" | cut -d ' ' -f 1 \ > $testroot/${file}.blame.git) cmp -s $testroot/${file}.blame.git $testroot/${file}.blame.got ret=$? if [ $ret -ne 0 -a "$xfail" = "" ]; then diff -u $testroot/${file}.blame.git $testroot/${file}.blame.got return 1 fi return "$ret" } test_blame_basic() { local testroot=`test_init blame_basic` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi echo 1 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` echo 2 >> $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 2" > /dev/null) local commit2=`git_show_head $testroot/repo` echo 3 >> $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 3" > /dev/null) local commit3=`git_show_head $testroot/repo` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) local short_commit1=`trim_obj_id 32 $commit1` local short_commit2=`trim_obj_id 32 $commit2` local short_commit3=`trim_obj_id 32 $commit3` d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected echo "2) $short_commit2 $d $GOT_AUTHOR_8 2" >> $testroot/stdout.expected echo "3) $short_commit3 $d $GOT_AUTHOR_8 3" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_blame_tag() { local testroot=`test_init blame_tag` local tag=1.0.0 got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi echo 1 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` echo 2 >> $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 2" > /dev/null) local commit2=`git_show_head $testroot/repo` (cd $testroot/repo && git tag -a -m "test" $tag) echo 3 >> $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 3" > /dev/null) local commit3=`git_show_head $testroot/repo` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame -c $tag alpha > $testroot/stdout) local short_commit1=`trim_obj_id 32 $commit1` local short_commit2=`trim_obj_id 32 $commit2` d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected echo "2) $short_commit2 $d $GOT_AUTHOR_8 2" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_blame_file_single_line() { local testroot=`test_init blame_file_single_line` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi echo 1 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) local short_commit1=`trim_obj_id 32 $commit1` d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_blame_file_single_line_no_newline() { local testroot=`test_init blame_file_single_line_no_newline` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi echo -n 1 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) local short_commit1=`trim_obj_id 32 $commit1` d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout fi test_done "$testroot" "$ret" } test_blame_all_lines_replaced() { local testroot=`test_init blame_all_lines_replaced` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi jot 8 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` local short_commit1=`trim_obj_id 32 $commit1` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected echo "2) $short_commit1 $d $GOT_AUTHOR_8 2" >> $testroot/stdout.expected echo "3) $short_commit1 $d $GOT_AUTHOR_8 3" >> $testroot/stdout.expected echo "4) $short_commit1 $d $GOT_AUTHOR_8 4" >> $testroot/stdout.expected echo "5) $short_commit1 $d $GOT_AUTHOR_8 5" >> $testroot/stdout.expected echo "6) $short_commit1 $d $GOT_AUTHOR_8 6" >> $testroot/stdout.expected echo "7) $short_commit1 $d $GOT_AUTHOR_8 7" >> $testroot/stdout.expected echo "8) $short_commit1 $d $GOT_AUTHOR_8 8" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout fi test_done "$testroot" "$ret" } test_blame_lines_shifted_up() { local testroot=`test_init blame_lines_shifted_up` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi jot 8 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` local short_commit1=`trim_obj_id 32 $commit1` local author_time=`git_show_author_time $testroot/repo` ed -s $testroot/wt/alpha <<-\EOF g/^[345]$/d w EOF (cd $testroot/wt && got commit -m "change 2" > /dev/null) local commit2=`git_show_head $testroot/repo` local short_commit2=`trim_obj_id 32 $commit2` jot 2 > $testroot/wt/alpha echo foo >> $testroot/wt/alpha echo bar >> $testroot/wt/alpha echo baz >> $testroot/wt/alpha jot 8 6 8 1 >> $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 3" > /dev/null) local commit3=`git_show_head $testroot/repo` local short_commit3=`trim_obj_id 32 $commit3` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected echo "2) $short_commit1 $d $GOT_AUTHOR_8 2" >> $testroot/stdout.expected echo "3) $short_commit3 $d $GOT_AUTHOR_8 foo" >> $testroot/stdout.expected echo "4) $short_commit3 $d $GOT_AUTHOR_8 bar" >> $testroot/stdout.expected echo "5) $short_commit3 $d $GOT_AUTHOR_8 baz" >> $testroot/stdout.expected echo "6) $short_commit1 $d $GOT_AUTHOR_8 6" >> $testroot/stdout.expected echo "7) $short_commit1 $d $GOT_AUTHOR_8 7" >> $testroot/stdout.expected echo "8) $short_commit1 $d $GOT_AUTHOR_8 8" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_blame_lines_shifted_down() { local testroot=`test_init blame_lines_shifted_down` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi jot 8 > $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_head $testroot/repo` local short_commit1=`trim_obj_id 32 $commit1` local author_time=`git_show_author_time $testroot/repo` ed -s $testroot/wt/alpha <<-\EOF g/^8$/d w EOF (cd $testroot/wt && got commit -m "change 2" > /dev/null) local commit2=`git_show_head $testroot/repo` local short_commit2=`trim_obj_id 32 $commit2` jot 2 > $testroot/wt/alpha echo foo >> $testroot/wt/alpha echo bar >> $testroot/wt/alpha echo baz >> $testroot/wt/alpha jot 8 3 8 1 >> $testroot/wt/alpha (cd $testroot/wt && got commit -m "change 3" > /dev/null) local commit3=`git_show_head $testroot/repo` local short_commit3=`trim_obj_id 32 $commit3` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) d=`date -u -r $author_time +"%G-%m-%d"` echo "01) $short_commit1 $d $GOT_AUTHOR_8 1" \ > $testroot/stdout.expected echo "02) $short_commit1 $d $GOT_AUTHOR_8 2" \ >> $testroot/stdout.expected echo "03) $short_commit3 $d $GOT_AUTHOR_8 foo" \ >> $testroot/stdout.expected echo "04) $short_commit3 $d $GOT_AUTHOR_8 bar" \ >> $testroot/stdout.expected echo "05) $short_commit3 $d $GOT_AUTHOR_8 baz" \ >> $testroot/stdout.expected echo "06) $short_commit1 $d $GOT_AUTHOR_8 3" \ >> $testroot/stdout.expected echo "07) $short_commit1 $d $GOT_AUTHOR_8 4" \ >> $testroot/stdout.expected echo "08) $short_commit1 $d $GOT_AUTHOR_8 5" \ >> $testroot/stdout.expected echo "09) $short_commit1 $d $GOT_AUTHOR_8 6" \ >> $testroot/stdout.expected echo "10) $short_commit1 $d $GOT_AUTHOR_8 7" \ >> $testroot/stdout.expected echo "11) $short_commit3 $d $GOT_AUTHOR_8 8" \ >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_blame_commit_subsumed() { local testroot=`test_init blame_commit_subsumed` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi cat > $testroot/wt/alpha < /dev/null) local commit1=`git_show_head $testroot/repo` local short_commit1=`trim_obj_id 32 $commit1` local author_time1=`git_show_author_time $testroot/repo` local d1=`date -u -r $author_time1 +"%G-%m-%d"` cat > $testroot/wt/alpha < /dev/null) local commit2=`git_show_head $testroot/repo` local short_commit2=`trim_obj_id 32 $commit2` local author_time2=`git_show_author_time $testroot/repo` local d2=`date -u -r $author_time2 +"%G-%m-%d"` cat > $testroot/wt/alpha < /dev/null) local commit3=`git_show_head $testroot/repo` local short_commit3=`trim_obj_id 32 $commit3` local author_time3=`git_show_author_time $testroot/repo` local d3=`date -u -r $author_time3 +"%G-%m-%d"` cat > $testroot/wt/alpha < /dev/null) local commit4=`git_show_head $testroot/repo` local short_commit4=`trim_obj_id 32 $commit4` local author_time4=`git_show_author_time $testroot/repo` local d4=`date -u -r $author_time4 +"%G-%m-%d"` (cd $testroot/wt && got blame alpha > $testroot/stdout) echo -n "01) $short_commit3 $d3 $GOT_AUTHOR_8 " \ > $testroot/stdout.expected echo "SUBDIRS = ext modules pdns codedocs docs" \ >> $testroot/stdout.expected echo "02) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected echo -n "03) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected echo 'EXTRA_DIST =' >> $testroot/stdout.expected echo -n "04) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tINSTALL\n" >> $testroot/stdout.expected echo -n "05) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tNOTICE\n" >> $testroot/stdout.expected echo -n "06) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tREADME\n" >> $testroot/stdout.expected echo -n "07) $short_commit4 $d4 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tCOPYING\n" >> $testroot/stdout.expected echo -n "08) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tcodedocs/doxygen.conf\n" >> $testroot/stdout.expected echo -n "09) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tcontrib/powerdns.solaris.init.d\n" \ >> $testroot/stdout.expected echo -n "10) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tpdns/named.conf.parsertest\n" >> $testroot/stdout.expected echo -n "11) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tregression-tests/zones/unit.test\n" \ >> $testroot/stdout.expected echo -n "12) $short_commit4 $d4 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected printf "\tbuilder-support/gen-version\n" >> $testroot/stdout.expected echo "13) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected echo -n "14) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected echo "ACLOCAL_AMFLAGS = -I m4" \ >> $testroot/stdout.expected echo "15) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected echo -n "16) $short_commit1 $d1 $GOT_AUTHOR_8 " \ >> $testroot/stdout.expected echo "dvi: # do nothing to build dvi" \ >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_blame_blame_h() { local testroot=`test_init blame_blame_h` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi cat > $testroot/wt/got_blame.h < * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ const struct got_error *got_blame(const char *, struct got_object_id *, struct got_repository *, FILE *); EOF (cd $testroot/wt && got add got_blame.h > /dev/null) (cd $testroot/wt && got commit -m "change 1" > /dev/null) cat > $testroot/wt/blame-2.patch < /dev/null) (cd $testroot/wt && got commit -m "change 2" > /dev/null) cat > $testroot/wt/blame-3.patch < /dev/null) (cd $testroot/wt && got commit -m "change 3" > /dev/null) cat > $testroot/wt/blame-4.patch < /dev/null) (cd $testroot/wt && got commit -m "change 4" > /dev/null) cat > $testroot/wt/blame-5.patch < /dev/null) (cd $testroot/wt && got commit -m "change 5" > /dev/null) blame_cmp "$testroot" "got_blame.h" ret=$? test_done "$testroot" "$ret" } test_blame_added_on_branch() { local testroot=`test_init blame_added_on_branch` got branch -r $testroot/repo -c master newbranch ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi got checkout -b newbranch $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi echo 1 > $testroot/wt/new (cd $testroot/wt && got add new > /dev/null) (cd $testroot/wt && got commit -m "change 1" > /dev/null) local commit1=`git_show_branch_head $testroot/repo newbranch` echo 2 >> $testroot/wt/new (cd $testroot/wt && got commit -m "change 2" > /dev/null) local commit2=`git_show_branch_head $testroot/repo newbranch` echo 3 >> $testroot/wt/new (cd $testroot/wt && got commit -m "change 3" > /dev/null) local commit3=`git_show_branch_head $testroot/repo newbranch` local author_time=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame new > $testroot/stdout) local short_commit1=`trim_obj_id 32 $commit1` local short_commit2=`trim_obj_id 32 $commit2` local short_commit3=`trim_obj_id 32 $commit3` d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit1 $d $GOT_AUTHOR_8 1" > $testroot/stdout.expected echo "2) $short_commit2 $d $GOT_AUTHOR_8 2" >> $testroot/stdout.expected echo "3) $short_commit3 $d $GOT_AUTHOR_8 3" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout fi test_done "$testroot" "$ret" } test_blame_submodule() { local testroot=`test_init blame_submodule` local commit_id0=`git_show_head $testroot/repo` local author_time=`git_show_author_time $testroot/repo` make_single_file_repo $testroot/repo2 foo (cd $testroot/repo && git -c protocol.file.allow=always \ submodule -q add ../repo2) (cd $testroot/repo && git commit -q -m 'adding submodule') # Attempt a (nonsensical) blame of a submodule. got blame -r $testroot/repo repo2 \ > $testroot/stdout 2> $testroot/stderr ret=$? if [ $ret -eq 0 ]; then echo "blame command succeeded unexpectedly" >&2 test_done "$testroot" "1" return 1 fi local submodule_id=$(got tree -r $testroot/repo -i | \ grep 'repo2\$$' | cut -d ' ' -f1) echo "got: object $submodule_id not found" > $testroot/stderr.expected cmp -s $testroot/stderr.expected $testroot/stderr ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stderr.expected $testroot/stderr fi test_done "$testroot" "$ret" } test_blame_symlink() { local testroot=`test_init blame_symlink` local commit_id0=`git_show_head $testroot/repo` local short_commit0=`trim_obj_id 32 $commit_id0` (cd $testroot/repo && ln -s alpha alpha.link) (cd $testroot/repo && ln -s epsilon epsilon.link) (cd $testroot/repo && ln -s /etc/passwd passwd.link) (cd $testroot/repo && ln -s ../beta epsilon/beta.link) (cd $testroot/repo && ln -s nonexistent nonexistent.link) (cd $testroot/repo && git add .) git_commit $testroot/repo -m "add symlinks" local commit_id1=`git_show_head $testroot/repo` local short_commit1=`trim_obj_id 32 $commit_id1` local author_time=`git_show_author_time $testroot/repo` # got blame dereferences symlink to a regular file got blame -r $testroot/repo alpha.link > $testroot/stdout ret=$? if [ $ret -ne 0 ]; then echo "blame command failed unexpectedly" >&2 test_done "$testroot" "$ret" return 1 fi d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit0 $d $GOT_AUTHOR_8 alpha" \ > $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 -a "$xfail" = "" ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "1" return 1 fi # got blame dereferences symlink with relative path got blame -r $testroot/repo epsilon/beta.link > $testroot/stdout ret=$? if [ $ret -ne 0 ]; then echo "blame command failed unexpectedly" >&2 test_done "$testroot" "$ret" return 1 fi d=`date -u -r $author_time +"%G-%m-%d"` echo "1) $short_commit0 $d $GOT_AUTHOR_8 beta" \ > $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 -a "$xfail" = "" ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "1" return 1 fi got blame -r $testroot/repo epsilon.link > $testroot/stdout \ 2> $testroot/stderr ret=$? if [ $ret -eq 0 ]; then echo "blame command succeeded unexpectedly" >&2 test_done "$testroot" "1" return 1 fi # blame dereferences symlink to a directory echo "got: /epsilon: wrong type of object" > $testroot/stderr.expected cmp -s $testroot/stderr.expected $testroot/stderr ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stderr.expected $testroot/stderr test_done "$testroot" "1" return 1 fi # got blame fails if symlink target does not exist in repo got blame -r $testroot/repo passwd.link > $testroot/stdout \ 2> $testroot/stderr ret=$? if [ $ret -eq 0 ]; then echo "blame command succeeded unexpectedly" >&2 test_done "$testroot" "1" return 1 fi echo "got: /etc/passwd: no such entry found in tree" \ > $testroot/stderr.expected cmp -s $testroot/stderr.expected $testroot/stderr ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stderr.expected $testroot/stderr test_done "$testroot" "1" return 1 fi got blame -r $testroot/repo nonexistent.link > $testroot/stdout \ 2> $testroot/stderr ret=$? if [ $ret -eq 0 ]; then echo "blame command succeeded unexpectedly" >&2 test_done "$testroot" "1" return 1 fi echo "got: /nonexistent: no such entry found in tree" \ > $testroot/stderr.expected cmp -s $testroot/stderr.expected $testroot/stderr ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stderr.expected $testroot/stderr test_done "$testroot" "1" return 1 fi test_done "$testroot" "$ret" } test_blame_lines_shifted_skip() { local testroot=`test_init blame_lines_shifted_skip` got checkout $testroot/repo $testroot/wt > /dev/null ret=$? if [ $ret -ne 0 ]; then test_done "$testroot" "$ret" return 1 fi cat > $testroot/wt/alpha < /dev/null) local commit1=`git_show_head $testroot/repo` local short_commit1=`trim_obj_id 32 $commit1` local author_time1=`git_show_author_time $testroot/repo` cat > $testroot/wt/alpha < /dev/null) local commit2=`git_show_head $testroot/repo` local short_commit2=`trim_obj_id 32 $commit2` local author_time2=`git_show_author_time $testroot/repo` cat > $testroot/wt/alpha < /dev/null) local commit3=`git_show_head $testroot/repo` local short_commit3=`trim_obj_id 32 $commit3` local author_time3=`git_show_author_time $testroot/repo` cat > $testroot/wt/alpha < /dev/null) local commit4=`git_show_head $testroot/repo` local short_commit4=`trim_obj_id 32 $commit4` local author_time4=`git_show_author_time $testroot/repo` cat > $testroot/wt/alpha < /dev/null) local commit5=`git_show_head $testroot/repo` local short_commit5=`trim_obj_id 32 $commit5` local author_time5=`git_show_author_time $testroot/repo` (cd $testroot/wt && got blame alpha > $testroot/stdout) d1=`date -u -r $author_time1 +"%G-%m-%d"` d2=`date -u -r $author_time2 +"%G-%m-%d"` d4=`date -u -r $author_time4 +"%G-%m-%d"` d5=`date -u -r $author_time5 +"%G-%m-%d"` echo "1) $short_commit5 $d5 $GOT_AUTHOR_8 X" > $testroot/stdout.expected echo "2) $short_commit1 $d1 $GOT_AUTHOR_8 A" >> $testroot/stdout.expected echo "3) $short_commit1 $d1 $GOT_AUTHOR_8 B" >> $testroot/stdout.expected echo "4) $short_commit1 $d1 $GOT_AUTHOR_8 C" >> $testroot/stdout.expected echo "5) $short_commit2 $d2 $GOT_AUTHOR_8 P" >> $testroot/stdout.expected echo "6) $short_commit4 $d4 $GOT_AUTHOR_8 Y" >> $testroot/stdout.expected echo "7) $short_commit2 $d5 $GOT_AUTHOR_8 Q" >> $testroot/stdout.expected cmp -s $testroot/stdout.expected $testroot/stdout ret=$? if [ $ret -ne 0 ]; then diff -u $testroot/stdout.expected $testroot/stdout test_done "$testroot" "$ret" return 1 fi blame_cmp "$testroot" "alpha" ret=$? test_done "$testroot" "$ret" } test_parseargs "$@" run_test test_blame_basic run_test test_blame_tag run_test test_blame_file_single_line run_test test_blame_file_single_line_no_newline run_test test_blame_all_lines_replaced run_test test_blame_lines_shifted_up run_test test_blame_lines_shifted_down run_test test_blame_commit_subsumed run_test test_blame_blame_h run_test test_blame_added_on_branch run_test test_blame_submodule run_test test_blame_symlink run_test test_blame_lines_shifted_skip