rpatch 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Rpatch::PatchHunk do
7
+
8
+ it "Question mark expression in pattern" do
9
+ before = <<-EOF
10
+ original text
11
+ end of text
12
+ EOF
13
+
14
+ diff = <<-EOF
15
+ ? original text
16
+ + foobar
17
+ EOF
18
+
19
+ after = <<-EOF
20
+ original text
21
+ foobar
22
+ end of text
23
+ EOF
24
+
25
+ hunk = Rpatch::PatchHunk.new('@@ description')
26
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
27
+
28
+ hunk.match_after_patch(before.split($/)).should eq nil
29
+ hunk.match_before_patch(before.split($/)).should eq [0, 1]
30
+ result = hunk.patch(before.split($/))
31
+ (result * "\n" + "\n").should eq after
32
+ end
33
+
34
+ it "Question mark expression in pattern (2)" do
35
+ before = <<-EOF
36
+ original text
37
+ end of text
38
+ EOF
39
+
40
+ diff = <<-EOF
41
+ ? original text
42
+ ?+ # comment for foobar
43
+ + foobar
44
+ EOF
45
+
46
+ after = <<-EOF
47
+ original text
48
+ # comment for foobar
49
+ foobar
50
+ end of text
51
+ EOF
52
+
53
+ hunk = Rpatch::PatchHunk.new('@@ description')
54
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
55
+
56
+ hunk.match_after_patch(before.split($/)).should eq nil
57
+ hunk.match_before_patch(before.split($/)).should eq [0, 1]
58
+ result = hunk.patch(before.split($/))
59
+ (result * "\n" + "\n").should eq after
60
+ end
61
+
62
+ it "Question mark expression in pattern (3)" do
63
+ before = <<-EOF
64
+ changed original contents
65
+ foobar
66
+ end of text
67
+ EOF
68
+
69
+ diff = <<-EOF
70
+ ? original text
71
+ ?+ # comment for foobar
72
+ + foobar
73
+ EOF
74
+
75
+ after = <<-EOF
76
+ changed original contents
77
+ foobar
78
+ end of text
79
+ EOF
80
+
81
+ hunk = Rpatch::PatchHunk.new('@@ patch with qmark')
82
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
83
+
84
+ hunk.match_after_patch(before.split($/)).should eq [1, 1]
85
+ hunk.match_before_patch(before.split($/)).should eq nil
86
+ expect {
87
+ hunk.patch(before.split($/))
88
+ }.to raise_exception Rpatch::AlreadyPatchedError, /Hunk # \(patch with qmark\) is already patched\./
89
+ end
90
+
91
+ it "Question mark expression in pattern (4)" do
92
+ before = <<-EOF
93
+ Copyright 2013, jiangxin
94
+ foo
95
+ baz
96
+
97
+ bar
98
+ bye.
99
+ EOF
100
+
101
+ diff = <<-EOF
102
+ ?/ [cC]opyright [0-9]{4}
103
+ ? Hello, world
104
+ ?+
105
+ + baz
106
+ EOF
107
+
108
+ after = before.dup
109
+
110
+ hunk = Rpatch::PatchHunk.new('@@ patch with qmark')
111
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
112
+
113
+ hunk.match_after_patch(before.split($/)).should eq [2, 1]
114
+ hunk.match_before_patch(before.split($/)).should eq nil
115
+ expect {
116
+ hunk.patch(before.split($/))
117
+ }.to raise_exception Rpatch::AlreadyPatchedError, /Hunk # \(patch with qmark\) is already patched\./
118
+ end
119
+
120
+ it "Question mark expression in pattern (5)" do
121
+ before = <<-EOF
122
+ Copyright 2013, jiangxin
123
+ Hello, world
124
+ foo
125
+ baz
126
+
127
+ bar
128
+ bye.
129
+ EOF
130
+
131
+ diff = <<-EOF
132
+ ?/ [cC]opyright [0-9]{4}
133
+ ? Hello, world
134
+ ?+
135
+ + baz
136
+ EOF
137
+
138
+ after = before.dup
139
+
140
+ hunk = Rpatch::PatchHunk.new('@@ patch with qmark')
141
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
142
+
143
+ hunk.match_after_patch(before.split($/)).should eq [3, 1]
144
+ hunk.match_before_patch(before.split($/)).should eq [0, 2]
145
+ hunk.patterns_before_patch.size.should eq 2
146
+ hunk.patterns_after_patch.size.should eq 1
147
+ expect {
148
+ hunk.patch(before.split($/))
149
+ }.to raise_exception Rpatch::AlreadyPatchedError, /Hunk # \(patch with qmark\) is already patched\./
150
+ end
151
+
152
+ end
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+
4
+ require 'spec_helper'
5
+
6
+ describe Rpatch::PatchHunk do
7
+
8
+ it "Regexp in pattern" do
9
+ before = <<-EOF
10
+ HeLLo
11
+ world
12
+ EOF
13
+
14
+ diff = <<-EOF
15
+ / [hH][eE][lL]{2}[oO]
16
+ +foo
17
+ +bar
18
+ EOF
19
+
20
+ after = <<-EOF
21
+ HeLLo
22
+ foo
23
+ bar
24
+ world
25
+ EOF
26
+
27
+ hunk = Rpatch::PatchHunk.new('@@ description')
28
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
29
+
30
+ hunk.match_after_patch(before.split($/)).should eq nil
31
+ hunk.match_before_patch(before.split($/)).should eq [0, 1]
32
+ result = hunk.patch(before.split($/))
33
+ (result * "\n" + "\n").should eq after
34
+ end
35
+
36
+ it "Regexp in pattern (2)" do
37
+ before = <<-EOF
38
+ Copyright 2013
39
+ HeLLo
40
+ world
41
+ --
42
+ jiangxin
43
+ EOF
44
+
45
+ diff = <<-EOF
46
+ / [hH][eE][lL]{2}[oO]
47
+ +foo
48
+ +bar
49
+ /-wo*
50
+ +baz
51
+ EOF
52
+
53
+ after = <<-EOF
54
+ Copyright 2013
55
+ HeLLo
56
+ foo
57
+ bar
58
+ baz
59
+ --
60
+ jiangxin
61
+ EOF
62
+
63
+ hunk = Rpatch::PatchHunk.new('@@ description')
64
+ diff.split($/).each {|line| hunk.feed_line line.chomp}
65
+
66
+ hunk.match_after_patch(before.split($/)).should eq nil
67
+ hunk.match_before_patch(before.split($/)).should eq [1, 2]
68
+ result = hunk.patch(before.split($/))
69
+ (result * "\n" + "\n").should eq after
70
+ end
71
+
72
+ end
@@ -10,8 +10,8 @@ test_description='patch file test'
10
10
  ############################################################
11
11
 
12
12
  cat > diff <<EOF
13
- diff -u a/foo b/foo
14
- --- a/foo 2013-11-04 16:01:56.000000000 +0800
13
+ diff -u /dev/null b/foo
14
+ --- /dev/null 2013-11-04 16:01:56.000000000 +0800
15
15
  +++ b/foo 2013-11-04 16:01:59.000000000 +0800
16
16
  @@ add two lines
17
17
  +bar
@@ -34,15 +34,15 @@ test_expect_success 'patch newfile' '
34
34
 
35
35
  cat > expect_errlog <<EOF
36
36
  Patched "actual".
37
- actual: Hunk 1 (add two lines) is already patched.
37
+ INFO: actual: Hunk 1 (add two lines) is already patched.
38
38
  actual: nothing changed
39
39
  EOF
40
40
 
41
41
  test_expect_success 'patch newfile (2nd)' '
42
42
  rm actual &&
43
43
  touch actual &&
44
- rpatch actual < diff 2> actual_errlog &&
45
- rpatch actual < diff 2>>actual_errlog &&
44
+ rpatch -vv actual < diff 2> actual_errlog &&
45
+ rpatch -vv actual < diff 2>>actual_errlog &&
46
46
  test_cmp expect actual &&
47
47
  test_cmp expect_errlog actual_errlog
48
48
  '
@@ -55,7 +55,6 @@ baz
55
55
  EOF
56
56
 
57
57
  cat > diff <<EOF
58
- diff -u a/foo b/foo
59
58
  --- a/foo 2013-11-04 16:01:56.000000000 +0800
60
59
  +++ b/foo 2013-11-04 16:01:59.000000000 +0800
61
60
  @@ insert heading
@@ -85,14 +84,14 @@ test_expect_success 'patch add/remote contents' '
85
84
  ############################################################
86
85
 
87
86
  cat > expect_errlog <<EOF
88
- actual: Hunk 1 (insert heading) is already patched.
89
- actual: Hunk 2 (add/remove) is already patched.
90
- actual: Hunk 3 (insert footer) is already patched.
87
+ INFO: actual: Hunk 1 (insert heading) is already patched.
88
+ INFO: actual: Hunk 2 (add/remove) is already patched.
89
+ INFO: actual: Hunk 3 (insert footer) is already patched.
91
90
  actual: nothing changed
92
91
  EOF
93
92
 
94
93
  test_expect_success 'patch add/remote contents (2nd)' '
95
- rpatch actual < diff 2>actual_errlog &&
94
+ rpatch -vv actual < diff 2>actual_errlog &&
96
95
  test_cmp expect actual &&
97
96
  test_cmp expect_errlog actual_errlog
98
97
  '
@@ -115,7 +114,7 @@ Remove "actual".
115
114
  EOF
116
115
 
117
116
  test_expect_success 'patch to rm file' '
118
- rpatch -p1 actual < diff 2> actual_errlog &&
117
+ rpatch -vv -p1 actual < diff 2> actual_errlog &&
119
118
  test ! -f actual &&
120
119
  test_cmp expect_errlog actual_errlog
121
120
  '
@@ -123,13 +122,13 @@ test_expect_success 'patch to rm file' '
123
122
  ############################################################
124
123
 
125
124
  cat > expect_errlog <<EOF
126
- actual: Hunk 1 (delete all) is already patched.
125
+ INFO: actual: Hunk 1 (delete all) is already patched.
127
126
  actual: nothing changed
128
127
  EOF
129
128
 
130
129
  test_expect_success 'patch to rm file (2nd)' '
131
130
  touch actual &&
132
- rpatch -p1 actual < diff 2> actual_errlog &&
131
+ rpatch -vv -p1 actual < diff 2> actual_errlog &&
133
132
  test -z "$(cat actual)" &&
134
133
  test_cmp expect_errlog actual_errlog
135
134
  '
@@ -147,11 +146,11 @@ diff -u a/foo b/foo
147
146
  --- a/foo 2013-11-04 16:01:56.000000000 +0800
148
147
  +++ b/foo 2013-11-04 16:01:59.000000000 +0800
149
148
  @@ remove bAr
150
- RE: ^[\\s]+(foo|FOO)\$
151
- RE:-[bB][aA][rR]
149
+ / ^[\\s]+(foo|FOO)\$
150
+ /-[bB][aA][rR]
152
151
  +bar
153
152
  @@ mixed
154
- RE: baz
153
+ / baz
155
154
  +end of text
156
155
  EOF
157
156
 
@@ -168,7 +167,7 @@ EOF
168
167
 
169
168
  test_expect_success 'use regexp in patch' '
170
169
  cp orig actual &&
171
- rpatch actual < diff 2> actual_errlog &&
170
+ rpatch -vv actual < diff 2> actual_errlog &&
172
171
  test_cmp expect actual &&
173
172
  test_cmp expect_errlog actual_errlog
174
173
  '
@@ -176,13 +175,13 @@ test_expect_success 'use regexp in patch' '
176
175
  ############################################################
177
176
 
178
177
  cat > expect_errlog <<EOF
179
- actual: Hunk 1 (remove bAr) is already patched.
180
- actual: Hunk 2 (mixed) is already patched.
178
+ INFO: actual: Hunk 1 (remove bAr) is already patched.
179
+ INFO: actual: Hunk 2 (mixed) is already patched.
181
180
  actual: nothing changed
182
181
  EOF
183
182
 
184
183
  test_expect_success 'use regexp in patch (2nd)' '
185
- rpatch actual < diff 2> actual_errlog &&
184
+ rpatch -vv actual < diff 2> actual_errlog &&
186
185
  test_cmp expect actual &&
187
186
  test_cmp expect_errlog actual_errlog
188
187
  '
@@ -200,14 +199,14 @@ trash text
200
199
  EOF
201
200
 
202
201
  cat > expect_errlog <<EOF
203
- Error: Line 6 of patch "<IO>" is invalid.
204
- => "trash text"
202
+ ERROR: Line 6 of patch "<IO>" is invalid.
203
+ => "trash text"
205
204
  EOF
206
205
 
207
206
  test_expect_success 'patch load fail: bad syntax' '
208
207
  rm actual &&
209
208
  touch actual &&
210
- test_must_fail rpatch actual < diff 2> actual_errlog &&
209
+ test_must_fail rpatch -vv actual < diff 2> actual_errlog &&
211
210
  test_cmp expect_errlog actual_errlog
212
211
  '
213
212
 
@@ -233,7 +232,7 @@ EOF
233
232
 
234
233
  test_expect_success 'patch apply fail' '
235
234
  cp orig actual &&
236
- test_must_fail rpatch actual < diff 2> actual_errlog &&
235
+ test_must_fail rpatch -vv actual < diff 2> actual_errlog &&
237
236
  test_cmp expect_errlog actual_errlog
238
237
  '
239
238
 
@@ -262,14 +261,14 @@ EOF
262
261
 
263
262
  cat > expect_errlog <<EOF
264
263
  ERROR: actual: Hunk 2 (add footer) FAILED to apply. Match failed.
265
- Warning: saved orignal file as "actual.orig".
264
+ WARNING: saved orignal file as "actual.orig".
266
265
  Patched "actual".
267
266
  EOF
268
267
 
269
268
  test_expect_success 'partial patch success' '
270
269
  cp orig actual &&
271
270
  test ! -f actual.orig &&
272
- test_must_fail rpatch actual < diff 2> actual_errlog &&
271
+ test_must_fail rpatch -vv actual < diff 2> actual_errlog &&
273
272
  test -f actual.orig &&
274
273
  test_cmp actual.orig orig &&
275
274
  test_cmp actual expect &&
@@ -279,13 +278,13 @@ test_expect_success 'partial patch success' '
279
278
  ############################################################
280
279
 
281
280
  cat > expect_errlog <<EOF
282
- actual: Hunk 1 (add header) is already patched.
281
+ INFO: actual: Hunk 1 (add header) is already patched.
283
282
  ERROR: actual: Hunk 2 (add footer) FAILED to apply. Match failed.
284
283
  actual: nothing changed
285
284
  EOF
286
285
 
287
286
  test_expect_success 'partial patch success (2nd)' '
288
- test_must_fail rpatch actual < diff 2> actual_errlog &&
287
+ test_must_fail rpatch -vv actual < diff 2> actual_errlog &&
289
288
  test -f actual.orig &&
290
289
  test_cmp actual.orig orig &&
291
290
  test_cmp actual expect &&
@@ -0,0 +1,336 @@
1
+ #!/bin/sh
2
+ #
3
+ # Copyright (c) 2013 Jiang Xin
4
+ #
5
+
6
+ test_description='patch file test'
7
+
8
+ . ./test-lib.sh
9
+
10
+ ############################################################
11
+
12
+ cat > diff <<EOF
13
+ diff -u a/foo b/foo
14
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
15
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
16
+ @@ add two lines
17
+ <
18
+ +bar
19
+ +baz
20
+ EOF
21
+
22
+ cat > actual <<EOF
23
+ hello
24
+ world
25
+ EOF
26
+
27
+
28
+ cat > expect <<EOF
29
+ bar
30
+ baz
31
+ hello
32
+ world
33
+ EOF
34
+
35
+ cat > expect_errlog <<EOF
36
+ Patched "actual".
37
+ EOF
38
+
39
+ test_expect_success 'patch from beginning' '
40
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
41
+ test_cmp expect actual &&
42
+ test_cmp expect_errlog actual_errlog
43
+ '
44
+
45
+ ############################################################
46
+
47
+ cat > diff <<EOF
48
+ diff -u a/foo b/foo
49
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
50
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
51
+ @@ add two lines
52
+ >
53
+ +bar
54
+ +baz
55
+ EOF
56
+
57
+ cat > actual <<EOF
58
+ hello
59
+ world
60
+ EOF
61
+
62
+
63
+ cat > expect <<EOF
64
+ hello
65
+ world
66
+ bar
67
+ baz
68
+ EOF
69
+
70
+ cat > expect_errlog <<EOF
71
+ Patched "actual".
72
+ EOF
73
+
74
+ test_expect_success 'patch from tail' '
75
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
76
+ test_cmp expect actual &&
77
+ test_cmp expect_errlog actual_errlog
78
+ '
79
+
80
+ ############################################################
81
+
82
+ cat > diff <<EOF
83
+ diff -u a/foo b/foo
84
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
85
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
86
+ @@ add two lines
87
+ <
88
+ hello, world
89
+ +bar
90
+ +baz
91
+ EOF
92
+
93
+ cat > actual <<EOF
94
+ hello, world
95
+ hello, world
96
+ EOF
97
+
98
+
99
+ cat > expect <<EOF
100
+ hello, world
101
+ bar
102
+ baz
103
+ hello, world
104
+ EOF
105
+
106
+ cat > expect_errlog <<EOF
107
+ Patched "actual".
108
+ EOF
109
+
110
+ test_expect_success 'patch from beginning (2)' '
111
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
112
+ test_cmp expect actual &&
113
+ test_cmp expect_errlog actual_errlog
114
+ '
115
+
116
+ ############################################################
117
+
118
+ cat > diff <<EOF
119
+ diff -u a/foo b/foo
120
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
121
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
122
+ @@ add two lines
123
+ >
124
+ hello, world
125
+ +bar
126
+ +baz
127
+ EOF
128
+
129
+ cat > actual <<EOF
130
+ hello, world
131
+ hello, world
132
+ EOF
133
+
134
+
135
+ cat > expect <<EOF
136
+ hello, world
137
+ hello, world
138
+ bar
139
+ baz
140
+ EOF
141
+
142
+ cat > expect_errlog <<EOF
143
+ Patched "actual".
144
+ EOF
145
+
146
+ test_expect_success 'patch from tail (2)' '
147
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
148
+ test_cmp expect actual &&
149
+ test_cmp expect_errlog actual_errlog
150
+ '
151
+
152
+ ############################################################
153
+
154
+ cat > actual <<EOF
155
+ Copyright 2013, jiangxin
156
+ Hello, world
157
+ bye.
158
+ EOF
159
+
160
+ cat > diff <<EOF
161
+ diff -u a/foo b/foo
162
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
163
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
164
+ @@ add two lines
165
+ / [cC]opyright [0-9]{4}
166
+ /-[Hh]ello
167
+ +foo
168
+ +bar
169
+ EOF
170
+
171
+ cat > expect <<EOF
172
+ Copyright 2013, jiangxin
173
+ foo
174
+ bar
175
+ bye.
176
+ EOF
177
+
178
+ cat > expect_errlog <<EOF
179
+ Patched "actual".
180
+ EOF
181
+
182
+ test_expect_success 'Start regex pattern with /' '
183
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
184
+ test_cmp expect actual &&
185
+ test_cmp expect_errlog actual_errlog
186
+ '
187
+
188
+ ############################################################
189
+
190
+ cat > actual <<EOF
191
+ Copyright 2013, jiangxin
192
+ Hello, world
193
+ bye.
194
+ EOF
195
+
196
+ cat > diff <<EOF
197
+ diff -u a/foo b/foo
198
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
199
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
200
+ @@ foo
201
+ ?/ [cC]opyright [0-9]{4}
202
+ ? Hello, world
203
+ ?+
204
+ + foo
205
+ @@ bar
206
+ ?/ [cC]opyright [0-9]{4}
207
+ ? Hello, world
208
+ ?+
209
+ + bar
210
+ @@ baz
211
+ ?/ [cC]opyright [0-9]{4}
212
+ ? Hello, world
213
+ ?+
214
+ + baz
215
+ EOF
216
+
217
+ cat > expect <<EOF
218
+ Copyright 2013, jiangxin
219
+ Hello, world
220
+
221
+ baz
222
+
223
+ bar
224
+
225
+ foo
226
+ bye.
227
+ EOF
228
+
229
+ cat > expect_errlog <<EOF
230
+ Patched "actual".
231
+ EOF
232
+
233
+ test_expect_success 'Question mark patterns test (1)' '
234
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
235
+ test_cmp expect actual &&
236
+ test_cmp expect_errlog actual_errlog
237
+ '
238
+
239
+ ############################################################
240
+
241
+ cat > actual <<EOF
242
+ Copyright 2013, jiangxin
243
+ foo
244
+ baz
245
+
246
+ bar
247
+ bye.
248
+ EOF
249
+
250
+ cat > diff <<EOF
251
+ diff -u a/foo b/foo
252
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
253
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
254
+ @@ foo
255
+ ?/ [cC]opyright [0-9]{4}
256
+ ? Hello, world
257
+ ?+
258
+ + foo
259
+ @@ bar
260
+ ?/ [cC]opyright [0-9]{4}
261
+ ? Hello, world
262
+ ?+
263
+ + bar
264
+ @@ baz
265
+ ?/ [cC]opyright [0-9]{4}
266
+ ? Hello, world
267
+ ?+
268
+ + baz
269
+ EOF
270
+
271
+ cp actual expect
272
+
273
+ cat > expect_errlog <<EOF
274
+ INFO: actual: Hunk 1 (foo) is already patched.
275
+ INFO: actual: Hunk 2 (bar) is already patched.
276
+ INFO: actual: Hunk 3 (baz) is already patched.
277
+ actual: nothing changed
278
+ EOF
279
+
280
+ test_expect_success 'Question mark patterns test (2)' '
281
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
282
+ test_cmp expect actual &&
283
+ test_cmp expect_errlog actual_errlog
284
+ '
285
+
286
+ ############################################################
287
+
288
+ cat > actual <<EOF
289
+ Copyright 2013, jiangxin
290
+ Hello, world
291
+ foo
292
+ baz
293
+
294
+ bar
295
+ bye.
296
+ EOF
297
+
298
+ cat > diff <<EOF
299
+ diff -u a/foo b/foo
300
+ --- a/foo 2013-11-04 16:01:56.000000000 +0800
301
+ +++ b/foo 2013-11-04 16:01:59.000000000 +0800
302
+ @@ foo
303
+ ?/ [cC]opyright [0-9]{4}
304
+ ? Hello, world
305
+ ?+
306
+ + foo
307
+ @@ bar
308
+ ?/ [cC]opyright [0-9]{4}
309
+ ? Hello, world
310
+ ?+
311
+ + bar
312
+ @@ baz
313
+ ?/ [cC]opyright [0-9]{4}
314
+ ? Hello, world
315
+ ?+
316
+ + baz
317
+ EOF
318
+
319
+ cp actual expect
320
+
321
+ cat > expect_errlog <<EOF
322
+ INFO: actual: Hunk 1 (foo) is already patched.
323
+ INFO: actual: Hunk 2 (bar) is already patched.
324
+ INFO: actual: Hunk 3 (baz) is already patched.
325
+ actual: nothing changed
326
+ EOF
327
+
328
+ test_expect_success 'Question mark patterns test (3)' '
329
+ rpatch -p1 -vv actual < diff 2>actual_errlog &&
330
+ test_cmp expect actual &&
331
+ test_cmp expect_errlog actual_errlog
332
+ '
333
+
334
+ ############################################################
335
+
336
+ test_done