Git fork
1#!/bin/sh
2
3test_description='test textconv caching'
4
5. ./test-lib.sh
6
7cat >helper <<'EOF'
8#!/bin/sh
9sed 's/^/converted: /' "$@" >helper.out
10cat helper.out
11EOF
12chmod +x helper
13
14test_expect_success 'setup' '
15 echo foo content 1 >foo.bin &&
16 echo bar content 1 >bar.bin &&
17 git add . &&
18 git commit -m one &&
19 foo1=$(git rev-parse --short HEAD:foo.bin) &&
20 bar1=$(git rev-parse --short HEAD:bar.bin) &&
21 echo foo content 2 >foo.bin &&
22 echo bar content 2 >bar.bin &&
23 git commit -a -m two &&
24 foo2=$(git rev-parse --short HEAD:foo.bin) &&
25 bar2=$(git rev-parse --short HEAD:bar.bin) &&
26 echo "*.bin diff=magic" >.gitattributes &&
27 git config diff.magic.textconv ./helper &&
28 git config diff.magic.cachetextconv true
29'
30
31cat >expect <<EOF
32diff --git a/bar.bin b/bar.bin
33index $bar1..$bar2 100644
34--- a/bar.bin
35+++ b/bar.bin
36@@ -1 +1 @@
37-converted: bar content 1
38+converted: bar content 2
39diff --git a/foo.bin b/foo.bin
40index $foo1..$foo2 100644
41--- a/foo.bin
42+++ b/foo.bin
43@@ -1 +1 @@
44-converted: foo content 1
45+converted: foo content 2
46EOF
47
48test_expect_success 'first textconv works' '
49 git diff HEAD^ HEAD >actual &&
50 test_cmp expect actual
51'
52
53test_expect_success 'cached textconv produces same output' '
54 git diff HEAD^ HEAD >actual &&
55 test_cmp expect actual
56'
57
58test_expect_success 'cached textconv does not run helper' '
59 rm -f helper.out &&
60 git diff HEAD^ HEAD >actual &&
61 test_cmp expect actual &&
62 ! test -r helper.out
63'
64
65cat >expect <<EOF
66diff --git a/bar.bin b/bar.bin
67index $bar1..$bar2 100644
68--- a/bar.bin
69+++ b/bar.bin
70@@ -1,2 +1,2 @@
71 converted: other
72-converted: bar content 1
73+converted: bar content 2
74diff --git a/foo.bin b/foo.bin
75index $foo1..$foo2 100644
76--- a/foo.bin
77+++ b/foo.bin
78@@ -1,2 +1,2 @@
79 converted: other
80-converted: foo content 1
81+converted: foo content 2
82EOF
83test_expect_success 'changing textconv invalidates cache' '
84 echo other >other &&
85 git config diff.magic.textconv "./helper other" &&
86 git diff HEAD^ HEAD >actual &&
87 test_cmp expect actual
88'
89
90cat >expect <<EOF
91diff --git a/bar.bin b/bar.bin
92index $bar1..$bar2 100644
93--- a/bar.bin
94+++ b/bar.bin
95@@ -1,2 +1,2 @@
96 converted: other
97-converted: bar content 1
98+converted: bar content 2
99diff --git a/foo.bin b/foo.bin
100index $foo1..$foo2 100644
101--- a/foo.bin
102+++ b/foo.bin
103@@ -1 +1 @@
104-converted: foo content 1
105+converted: foo content 2
106EOF
107test_expect_success 'switching diff driver produces correct results' '
108 git config diff.moremagic.textconv ./helper &&
109 echo foo.bin diff=moremagic >>.gitattributes &&
110 git diff HEAD^ HEAD >actual &&
111 test_cmp expect actual
112'
113
114# The point here is to test that we can log the notes cache and still use it to
115# produce a diff later (older versions of git would segfault on this). It's
116# much more likely to come up in the real world with "log --all -p", but using
117# --no-walk lets us reliably reproduce the order of traversal.
118test_expect_success 'log notes cache and still use cache for -p' '
119 git log --no-walk -p refs/notes/textconv/magic HEAD
120'
121
122test_expect_success 'caching is silently ignored outside repo' '
123 test_oid_cache <<-\EOM &&
124 oid1 sha1:5626abf
125 oid1 sha256:a4ed1f3
126 oid2 sha1:f719efd
127 oid2 sha256:aa9e7dc
128 EOM
129 oid1=$(test_oid --hash=builtin oid1) &&
130 oid2=$(test_oid --hash=builtin oid2) &&
131 mkdir -p non-repo &&
132 echo one >non-repo/one &&
133 echo two >non-repo/two &&
134 echo "* diff=test" >attr &&
135 test_expect_code 1 \
136 nongit git -c core.attributesFile="$PWD/attr" \
137 -c diff.test.textconv="tr a-z A-Z <" \
138 -c diff.test.cachetextconv=true \
139 diff --no-index one two >actual &&
140 cat >expect <<-EOF &&
141 diff --git a/one b/two
142 index $oid1..$oid2 100644
143 --- a/one
144 +++ b/two
145 @@ -1 +1 @@
146 -ONE
147 +TWO
148 EOF
149 test_cmp expect actual
150'
151
152test_done