1#!/bin/sh
2
3test_description='git patch-id'
4
5. ./test-lib.sh
6
7test_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
26test_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.
32calc_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
40get_top_diff () {
41 git log -p -1 "$@" -O bar-then-foo --
42}
43
44get_patch_id () {
45 get_top_diff "$1" | calc_patch_id "$@"
46}
47
48test_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
54test_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
60test_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
69test_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
76cmp_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
86test_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
101test_patch_id () {
102 test_patch_id_file_order "$@"
103}
104
105# small tests with detailed diagnostic for basic options.
106test_expect_success 'file order is irrelevant with --stable' '
107 test_patch_id_file_order irrelevant --stable --stable
108'
109
110test_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.
115test_expect_success 'default is unstable' '
116 test_patch_id relevant default
117'
118
119test_expect_success 'patchid.stable = true is stable' '
120 test_config patchid.stable true &&
121 test_patch_id irrelevant patchid.stable=true
122'
123
124test_expect_success 'patchid.stable = false is unstable' '
125 test_config patchid.stable false &&
126 test_patch_id relevant patchid.stable=false
127'
128
129test_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
134test_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
139test_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
146test_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
160cat >nonl <<\EOF
161diff --git i/a w/a
162index e69de29..2e65efe 100644
163--- i/a
164+++ w/a
165@@ -0,0 +1 @@
166+a
167\ No newline at end of file
168diff --git i/b w/b
169index e69de29..6178079 100644
170--- i/b
171+++ w/b
172@@ -0,0 +1 @@
173+b
174EOF
175
176cat >withnl <<\EOF
177diff --git i/a w/a
178index e69de29..7898192 100644
179--- i/a
180+++ w/a
181@@ -0,0 +1 @@
182+a
183diff --git i/b w/b
184index e69de29..6178079 100644
185--- i/b
186+++ w/b
187@@ -0,0 +1 @@
188+b
189EOF
190
191test_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'
196test_done