Merge branch 'jc/revision-dash-count-parsing'
[git.git] / t / t4204-patch-id.sh
blobbaa9d3c82e8a54dc7501d90bc9da0527f2a72b2e
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 name="$1"
34 shift
35 git patch-id "$@" |
36 sed "s/ .*//" >patch-id_"$name" &&
37 test_line_count -gt 0 patch-id_"$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 cat >nonl <<\EOF
147 diff --git i/a w/a
148 index e69de29..2e65efe 100644
149 --- i/a
150 +++ w/a
151 @@ -0,0 +1 @@
153 \ No newline at end of file
154 diff --git i/b w/b
155 index e69de29..6178079 100644
156 --- i/b
157 +++ w/b
158 @@ -0,0 +1 @@
162 cat >withnl <<\EOF
163 diff --git i/a w/a
164 index e69de29..7898192 100644
165 --- i/a
166 +++ w/a
167 @@ -0,0 +1 @@
169 diff --git i/b w/b
170 index e69de29..6178079 100644
171 --- i/b
172 +++ w/b
173 @@ -0,0 +1 @@
177 test_expect_success 'patch-id handles no-nl-at-eof markers' '
178 cat nonl | calc_patch_id nonl &&
179 cat withnl | calc_patch_id withnl &&
180 test_cmp patch-id_nonl patch-id_withnl
182 test_done