Merge branch 'dl/format-patch-cover-from-desc'
[git.git] / t / t4204-patch-id.sh
blob0288c17ec60b803d2815fb1b704c35f74e4a7753
1 #!/bin/sh
3 test_description='git patch-id'
5 . ./test-lib.sh
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
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
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"
40 get_top_diff () {
41 git log -p -1 "$@" -O bar-then-foo --
44 get_patch_id () {
45 get_top_diff "$1" | calc_patch_id "$@"
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
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
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)
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
76 cmp_patch_id () {
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"
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"
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 "$@"
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
110 test_expect_success 'file order is relevant with --unstable' '
111 test_patch_id_file_order relevant --unstable --unstable
114 #Now test various option combinations.
115 test_expect_success 'default is unstable' '
116 test_patch_id relevant default
119 test_expect_success 'patchid.stable = true is stable' '
120 test_config patchid.stable true &&
121 test_patch_id irrelevant patchid.stable=true
124 test_expect_success 'patchid.stable = false is unstable' '
125 test_config patchid.stable false &&
126 test_patch_id relevant patchid.stable=false
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
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
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
146 test_expect_success 'patch-id respects config from subdir' '
147 test_config patchid.stable true &&
148 mkdir subdir &&
150 # copy these because test_patch_id() looks for them in
151 # the current directory
152 cp bar-then-foo foo-then-bar subdir &&
155 cd subdir &&
156 test_patch_id irrelevant patchid.stable=true
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 @@
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 @@
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 @@
183 diff --git i/b w/b
184 index e69de29..6178079 100644
185 --- i/b
186 +++ w/b
187 @@ -0,0 +1 @@
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
196 test_done