Files
git/contrib/diff-highlight/t/t9400-diff-highlight.sh
Junio C Hamano 0728012c53 diff-highlight: allow testing with Git 3.0 breaking changes
The diff-highlight (in contrib/) comes with its own test script,
which relies on the initial branch name being 'master'.  This is not
just encoded in the test logic, but in the illustration in the file
that shows the topology of the history.

Force the initial branch name to 'master' to allow it pass.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-02-03 13:27:35 -08:00

344 lines
6.6 KiB
Bash
Executable File

#!/bin/sh
test_description='Test diff-highlight'
CURR_DIR=$(pwd)
TEST_OUTPUT_DIRECTORY=$(pwd)
TEST_DIRECTORY="$CURR_DIR"/../../../t
DIFF_HIGHLIGHT="$CURR_DIR"/../diff-highlight
CW="$(printf "\033[7m")" # white
CR="$(printf "\033[27m")" # reset
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. "$TEST_DIRECTORY"/test-lib.sh
if ! test_have_prereq PERL
then
skip_all='skipping diff-highlight tests; perl not available'
test_done
fi
# dh_test is a test helper function which takes 3 file names as parameters. The
# first 2 files are used to generate diff and commit output, which is then
# piped through diff-highlight. The 3rd file should contain the expected output
# of diff-highlight (minus the diff/commit header, ie. everything after and
# including the first @@ line).
dh_test () {
a="$1" b="$2" &&
cat >patch.exp &&
{
cat "$a" >file &&
git add file &&
git commit -m "Add a file" &&
cat "$b" >file &&
git diff file >diff.raw &&
git commit -a -m "Update a file" &&
git show >commit.raw
} >/dev/null &&
"$DIFF_HIGHLIGHT" <diff.raw | test_strip_patch_header >diff.act &&
"$DIFF_HIGHLIGHT" <commit.raw | test_strip_patch_header >commit.act &&
test_cmp patch.exp diff.act &&
test_cmp patch.exp commit.act
}
test_strip_patch_header () {
sed -n '/^@@/,$p' $*
}
# dh_test_setup_history generates a contrived graph such that we have at least
# 1 nesting (E) and 2 nestings (F).
#
# A---B master
# /
# D---E---F branch
#
# git log --all --graph
# * commit
# | B
# | * commit
# | | F
# * | commit
# | | A
# | * commit
# |/
# | E
# * commit
# D
#
dh_test_setup_history () {
echo file1 >file &&
git add file &&
test_tick &&
git commit -m "D" &&
git checkout -b branch &&
echo file2 >file &&
test_tick &&
git commit -a -m "E" &&
git checkout master &&
echo file2 >file &&
test_tick &&
git commit -a -m "A" &&
git checkout branch &&
echo file3 >file &&
test_tick &&
git commit -a -m "F" &&
git checkout master &&
echo file3 >file &&
test_tick &&
git commit -a -m "B"
}
left_trim () {
"$PERL_PATH" -pe 's/^\s+//'
}
trim_graph () {
# graphs start with * or |
# followed by a space or / or \
"$PERL_PATH" -pe 's@^((\*|\|)( |/|\\))+@@'
}
test_expect_success 'diff-highlight highlights the beginning of a line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
0bb
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-${CW}b${CR}bb
+${CW}0${CR}bb
ccc
EOF
'
test_expect_success 'diff-highlight highlights the end of a line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
bb0
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-bb${CW}b${CR}
+bb${CW}0${CR}
ccc
EOF
'
test_expect_success 'diff-highlight highlights the middle of a line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
b0b
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-b${CW}b${CR}b
+b${CW}0${CR}b
ccc
EOF
'
test_expect_success 'diff-highlight does not highlight whole line' '
cat >a <<-\EOF &&
aaa
bbb
ccc
EOF
cat >b <<-\EOF &&
aaa
000
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-bbb
+000
ccc
EOF
'
test_expect_failure 'diff-highlight highlights mismatched hunk size' '
cat >a <<-\EOF &&
aaa
bbb
EOF
cat >b <<-\EOF &&
aaa
b0b
ccc
EOF
dh_test a b <<-EOF
@@ -1,3 +1,3 @@
aaa
-b${CW}b${CR}b
+b${CW}0${CR}b
+ccc
EOF
'
# These two code points share the same leading byte in UTF-8 representation;
# a naive byte-wise diff would highlight only the second byte.
#
# - U+00f3 ("o" with acute)
o_accent=$(printf '\303\263')
# - U+00f8 ("o" with stroke)
o_stroke=$(printf '\303\270')
test_expect_success 'diff-highlight treats multibyte utf-8 as a unit' '
echo "unic${o_accent}de" >a &&
echo "unic${o_stroke}de" >b &&
dh_test a b <<-EOF
@@ -1 +1 @@
-unic${CW}${o_accent}${CR}de
+unic${CW}${o_stroke}${CR}de
EOF
'
# Unlike the UTF-8 above, these are combining code points which are meant
# to modify the character preceding them:
#
# - U+0301 (combining acute accent)
combine_accent=$(printf '\314\201')
# - U+0302 (combining circumflex)
combine_circum=$(printf '\314\202')
test_expect_failure 'diff-highlight treats combining code points as a unit' '
echo "unico${combine_accent}de" >a &&
echo "unico${combine_circum}de" >b &&
dh_test a b <<-EOF
@@ -1 +1 @@
-unic${CW}o${combine_accent}${CR}de
+unic${CW}o${combine_circum}${CR}de
EOF
'
test_expect_success 'diff-highlight works with the --graph option' '
dh_test_setup_history &&
# date-order so that the commits are interleaved for both
# trim graph elements so we can do a diff
# trim leading space because our trim_graph is not perfect
git log --branches -p --date-order |
"$DIFF_HIGHLIGHT" | left_trim >graph.exp &&
git log --branches -p --date-order --graph |
"$DIFF_HIGHLIGHT" | trim_graph | left_trim >graph.act &&
test_cmp graph.exp graph.act
'
# Just reuse the previous graph test, but with --color. Our trimming
# doesn't know about color, so just sanity check that something got
# highlighted.
test_expect_success 'diff-highlight works with color graph' '
git log --branches -p --date-order --graph --color |
"$DIFF_HIGHLIGHT" | trim_graph | left_trim >graph &&
grep "\[7m" graph
'
# Most combined diffs won't meet diff-highlight's line-number filter. So we
# create one here where one side drops a line and the other modifies it. That
# should result in a diff like:
#
# - modified content
# ++resolved content
#
# which naively looks like one side added "+resolved".
test_expect_success 'diff-highlight ignores combined diffs' '
echo "content" >file &&
git add file &&
git commit -m base &&
>file &&
git commit -am master &&
git checkout -b other HEAD^ &&
echo "modified content" >file &&
git commit -am other &&
test_must_fail git merge master &&
echo "resolved content" >file &&
git commit -am resolved &&
cat >expect <<-\EOF &&
--- a/file
+++ b/file
@@@ -1,1 -1,0 +1,1 @@@
- modified content
++resolved content
EOF
git show -c | "$DIFF_HIGHLIGHT" >actual.raw &&
sed -n "/^---/,\$p" <actual.raw >actual &&
test_cmp expect actual
'
test_expect_success 'diff-highlight handles --graph with leading dash' '
cat >file <<-\EOF &&
before
the old line
-leading dash
EOF
git add file &&
git commit -m before &&
sed s/old/new/ <file >file.tmp &&
mv file.tmp file &&
git add file &&
git commit -m after &&
cat >expect <<-EOF &&
--- a/file
+++ b/file
@@ -1,3 +1,3 @@
before
-the ${CW}old${CR} line
+the ${CW}new${CR} line
-leading dash
EOF
git log --graph -p -1 | "$DIFF_HIGHLIGHT" >actual.raw &&
trim_graph <actual.raw | sed -n "/^---/,\$p" >actual &&
test_cmp expect actual
'
test_done