Skip to content

Commit 74e8911

Browse files
peffgitster
authored andcommitted
t4063: add tests of direct blob diffs
The git-diff command can directly compare two blobs (or a blob and a file), but we don't test this at all. Let's add some basic tests that reveal a few problems. There are basically four interesting inputs: 1. sha1 against sha1 (where diff has no information beyond the contents) 2. tree:path against tree:path (where it can get information via get_sha1_with_context) 3. Same as (2), but using the ".." range syntax 4. tree:path against a filename And beyond generating a sane diff, we care about a few little bits: which paths they show in the diff header, and whether they correctly pick up a mode change. They should all be able to show a mode except for (1), though note that case (3) is currently broken. For the headers, we would ideally show the path within the tree if we have it, making: git diff a:path b:path look the same as: git diff a b -- path We can't always do that (e.g., in the direct sha1/sha1 diff, we have no path to show), in which case we should fall back to the name that resolved to the blob (which is nonsense from the repository's perspective, but is the best we can do). Aside from the fallback case in (1), none of the cases get this right. Cases (2) and (3) always show the full tree:path, even though we should be able to know just the "path" portion. Case (4) picks up the filename path, but assigns it to _both_ sides of the diff. So this works for: git diff tree:path path but not for: git diff tree:other_path path The appropriate tests are marked to expect failure. Signed-off-by: Jeff King <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent dc944b6 commit 74e8911

File tree

1 file changed

+91
-0
lines changed

1 file changed

+91
-0
lines changed

t/t4063-diff-blobs.sh

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
#!/bin/sh
2+
3+
test_description='test direct comparison of blobs via git-diff'
4+
. ./test-lib.sh
5+
6+
run_diff () {
7+
# use full-index to make it easy to match the index line
8+
git diff --full-index "$@" >diff
9+
}
10+
11+
check_index () {
12+
grep "^index $1\\.\\.$2" diff
13+
}
14+
15+
check_mode () {
16+
grep "^old mode $1" diff &&
17+
grep "^new mode $2" diff
18+
}
19+
20+
check_paths () {
21+
grep "^diff --git a/$1 b/$2" diff
22+
}
23+
24+
test_expect_success 'create some blobs' '
25+
echo one >one &&
26+
echo two >two &&
27+
chmod +x two &&
28+
git add . &&
29+
30+
# cover systems where modes are ignored
31+
git update-index --chmod=+x two &&
32+
33+
git commit -m base &&
34+
35+
sha1_one=$(git rev-parse HEAD:one) &&
36+
sha1_two=$(git rev-parse HEAD:two)
37+
'
38+
39+
test_expect_success 'diff by sha1' '
40+
run_diff $sha1_one $sha1_two
41+
'
42+
test_expect_success 'index of sha1 diff' '
43+
check_index $sha1_one $sha1_two
44+
'
45+
test_expect_success 'sha1 diff uses arguments as paths' '
46+
check_paths $sha1_one $sha1_two
47+
'
48+
test_expect_success 'sha1 diff has no mode change' '
49+
! grep mode diff
50+
'
51+
52+
test_expect_success 'diff by tree:path (run)' '
53+
run_diff HEAD:one HEAD:two
54+
'
55+
test_expect_success 'index of tree:path diff' '
56+
check_index $sha1_one $sha1_two
57+
'
58+
test_expect_failure 'tree:path diff uses filenames as paths' '
59+
check_paths one two
60+
'
61+
test_expect_success 'tree:path diff shows mode change' '
62+
check_mode 100644 100755
63+
'
64+
65+
test_expect_success 'diff by ranged tree:path' '
66+
run_diff HEAD:one..HEAD:two
67+
'
68+
test_expect_success 'index of ranged tree:path diff' '
69+
check_index $sha1_one $sha1_two
70+
'
71+
test_expect_failure 'ranged tree:path diff uses filenames as paths' '
72+
check_paths one two
73+
'
74+
test_expect_failure 'ranged tree:path diff shows mode change' '
75+
check_mode 100644 100755
76+
'
77+
78+
test_expect_success 'diff blob against file' '
79+
run_diff HEAD:one two
80+
'
81+
test_expect_success 'index of blob-file diff' '
82+
check_index $sha1_one $sha1_two
83+
'
84+
test_expect_failure 'blob-file diff uses filename as paths' '
85+
check_paths one two
86+
'
87+
test_expect_success FILEMODE 'blob-file diff shows mode change' '
88+
check_mode 100644 100755
89+
'
90+
91+
test_done

0 commit comments

Comments
 (0)