Merge branch 'bc/hash-algo'
[git] / t / t4204-patch-id.sh
1 #!/bin/sh
2
3 test_description='git patch-id'
4
5 . ./test-lib.sh
6
7 test_expect_success 'setup' '
8         as="a a a a a a a a" && # eight a
9         test_write_lines $as >foo &&
10         test_write_lines $as >bar &&
11         git add foo bar &&
12         git commit -a -m initial &&
13         test_write_lines $as b >foo &&
14         test_write_lines $as b >bar &&
15         git commit -a -m first &&
16         git checkout -b same master &&
17         git commit --amend -m same-msg &&
18         git checkout -b notsame master &&
19         echo c >foo &&
20         echo c >bar &&
21         git commit --amend -a -m notsame-msg &&
22         test_write_lines bar foo >bar-then-foo &&
23         test_write_lines foo bar >foo-then-bar
24 '
25
26 test_expect_success 'patch-id output is well-formed' '
27         git log -p -1 | git patch-id >output &&
28         grep "^[a-f0-9]\{40\} $(git rev-parse HEAD)$" output
29 '
30
31 #calculate patch id. Make sure output is not empty.
32 calc_patch_id () {
33         patch_name="$1"
34         shift
35         git patch-id "$@" |
36         sed "s/ .*//" >patch-id_"$patch_name" &&
37         test_line_count -gt 0 patch-id_"$patch_name"
38 }
39
40 get_top_diff () {
41         git log -p -1 "$@" -O bar-then-foo --
42 }
43
44 get_patch_id () {
45         get_top_diff "$1" | calc_patch_id "$@"
46 }
47
48 test_expect_success 'patch-id detects equality' '
49         get_patch_id master &&
50         get_patch_id same &&
51         test_cmp patch-id_master patch-id_same
52 '
53
54 test_expect_success 'patch-id detects inequality' '
55         get_patch_id master &&
56         get_patch_id notsame &&
57         ! test_cmp patch-id_master patch-id_notsame
58 '
59
60 test_expect_success 'patch-id supports git-format-patch output' '
61         get_patch_id master &&
62         git checkout same &&
63         git format-patch -1 --stdout | calc_patch_id same &&
64         test_cmp patch-id_master patch-id_same &&
65         set $(git format-patch -1 --stdout | git patch-id) &&
66         test "$2" = $(git rev-parse HEAD)
67 '
68
69 test_expect_success 'whitespace is irrelevant in footer' '
70         get_patch_id master &&
71         git checkout same &&
72         git format-patch -1 --stdout | sed "s/ \$//" | calc_patch_id same &&
73         test_cmp patch-id_master patch-id_same
74 '
75
76 cmp_patch_id () {
77         if
78                 test "$1" = "relevant"
79         then
80                 ! test_cmp patch-id_"$2" patch-id_"$3"
81         else
82                 test_cmp patch-id_"$2" patch-id_"$3"
83         fi
84 }
85
86 test_patch_id_file_order () {
87         relevant="$1"
88         shift
89         name="order-${1}-$relevant"
90         shift
91         get_top_diff "master" | calc_patch_id "$name" "$@" &&
92         git checkout same &&
93         git format-patch -1 --stdout -O foo-then-bar |
94                 calc_patch_id "ordered-$name" "$@" &&
95         cmp_patch_id $relevant "$name" "ordered-$name"
96
97 }
98
99 # combined test for options: add more tests here to make them
100 # run with all options
101 test_patch_id () {
102         test_patch_id_file_order "$@"
103 }
104
105 # small tests with detailed diagnostic for basic options.
106 test_expect_success 'file order is irrelevant with --stable' '
107         test_patch_id_file_order irrelevant --stable --stable
108 '
109
110 test_expect_success 'file order is relevant with --unstable' '
111         test_patch_id_file_order relevant --unstable --unstable
112 '
113
114 #Now test various option combinations.
115 test_expect_success 'default is unstable' '
116         test_patch_id relevant default
117 '
118
119 test_expect_success 'patchid.stable = true is stable' '
120         test_config patchid.stable true &&
121         test_patch_id irrelevant patchid.stable=true
122 '
123
124 test_expect_success 'patchid.stable = false is unstable' '
125         test_config patchid.stable false &&
126         test_patch_id relevant patchid.stable=false
127 '
128
129 test_expect_success '--unstable overrides patchid.stable = true' '
130         test_config patchid.stable true &&
131         test_patch_id relevant patchid.stable=true--unstable --unstable
132 '
133
134 test_expect_success '--stable overrides patchid.stable = false' '
135         test_config patchid.stable false &&
136         test_patch_id irrelevant patchid.stable=false--stable --stable
137 '
138
139 test_expect_success 'patch-id supports git-format-patch MIME output' '
140         get_patch_id master &&
141         git checkout same &&
142         git format-patch -1 --attach --stdout | calc_patch_id same &&
143         test_cmp patch-id_master patch-id_same
144 '
145
146 test_expect_success 'patch-id respects config from subdir' '
147         test_config patchid.stable true &&
148         mkdir subdir &&
149
150         # copy these because test_patch_id() looks for them in
151         # the current directory
152         cp bar-then-foo foo-then-bar subdir &&
153
154         (
155                 cd subdir &&
156                 test_patch_id irrelevant patchid.stable=true
157         )
158 '
159
160 cat >nonl <<\EOF
161 diff --git i/a w/a
162 index e69de29..2e65efe 100644
163 --- i/a
164 +++ w/a
165 @@ -0,0 +1 @@
166 +a
167 \ No newline at end of file
168 diff --git i/b w/b
169 index e69de29..6178079 100644
170 --- i/b
171 +++ w/b
172 @@ -0,0 +1 @@
173 +b
174 EOF
175
176 cat >withnl <<\EOF
177 diff --git i/a w/a
178 index e69de29..7898192 100644
179 --- i/a
180 +++ w/a
181 @@ -0,0 +1 @@
182 +a
183 diff --git i/b w/b
184 index e69de29..6178079 100644
185 --- i/b
186 +++ w/b
187 @@ -0,0 +1 @@
188 +b
189 EOF
190
191 test_expect_success 'patch-id handles no-nl-at-eof markers' '
192         cat nonl | calc_patch_id nonl &&
193         cat withnl | calc_patch_id withnl &&
194         test_cmp patch-id_nonl patch-id_withnl
195 '
196 test_done