rerere: migrate to parse-options API
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Jonathan Nieder committed
Aug 5, 2010 at 06:28 UTC
672d1b789bc041be6aa18dcce066e6b556d6b787
2 files changed
+119
-24
builtin/rerere.c
+28
-24
@@ -1,13 +1,16 @@
1
#include "builtin.h"
2
#include "cache.h"
3
#include "dir.h"
4
+#include "parse-options.h"
5
#include "string-list.h"
6
#include "rerere.h"
7
#include "xdiff/xdiff.h"
8
#include "xdiff-interface.h"
9
9
-static const char git_rerere_usage[] =
10
-"git rerere [clear | status | diff | gc]";
10
+static const char * const rerere_usage[] = {
11
+ "git rerere [clear | status | diff | gc]",
12
+ NULL,
13
+};
14
15
/* these values are days */
16
static int cutoff_noresolve = 15;
@@ -103,25 +106,26 @@ static int diff_two(const char *file1, const char *label1,
106
int cmd_rerere(int argc, const char **argv, const char *prefix)
107
{
108
struct string_list merge_rr = { NULL, 0, 0, 1 };
106
- int i, fd, flags = 0;
107
-
108
- if (2 < argc) {
109
- if (!strcmp(argv[1], "-h"))
110
- usage(git_rerere_usage);
111
- if (!strcmp(argv[1], "--rerere-autoupdate"))
112
- flags = RERERE_AUTOUPDATE;
113
- else if (!strcmp(argv[1], "--no-rerere-autoupdate"))
114
- flags = RERERE_NOAUTOUPDATE;
115
- if (flags) {
116
- argc--;
117
- argv++;
118
- }
119
- }
120
- if (argc < 2)
109
+ int i, fd, autoupdate = -1, flags = 0;
110
+
111
+ struct option options[] = {
112
+ OPT_SET_INT(0, "rerere-autoupdate", &autoupdate,
113
+ "register clean resolutions in index", 1),
114
+ OPT_END(),
115
+ };
116
+
117
+ argc = parse_options(argc, argv, prefix, options, rerere_usage, 0);
118
+
119
+ if (autoupdate == 1)
120
+ flags = RERERE_AUTOUPDATE;
121
+ if (autoupdate == 0)
122
+ flags = RERERE_NOAUTOUPDATE;
123
+
124
+ if (argc < 1)
125
return rerere(flags);
126
123
- if (!strcmp(argv[1], "forget")) {
124
- const char **pathspec = get_pathspec(prefix, argv + 2);
127
+ if (!strcmp(argv[0], "forget")) {
128
+ const char **pathspec = get_pathspec(prefix, argv + 1);
129
return rerere_forget(pathspec);
130
}
131
@@ -129,26 +133,26 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
133
if (fd < 0)
134
return 0;
135
132
- if (!strcmp(argv[1], "clear")) {
136
+ if (!strcmp(argv[0], "clear")) {
137
for (i = 0; i < merge_rr.nr; i++) {
138
const char *name = (const char *)merge_rr.items[i].util;
139
if (!has_rerere_resolution(name))
140
unlink_rr_item(name);
141
}
142
unlink_or_warn(git_path("rr-cache/MERGE_RR"));
139
- } else if (!strcmp(argv[1], "gc"))
143
+ } else if (!strcmp(argv[0], "gc"))
144
garbage_collect(&merge_rr);
141
- else if (!strcmp(argv[1], "status"))
145
+ else if (!strcmp(argv[0], "status"))
146
for (i = 0; i < merge_rr.nr; i++)
147
printf("%s\n", merge_rr.items[i].string);
144
- else if (!strcmp(argv[1], "diff"))
148
+ else if (!strcmp(argv[0], "diff"))
149
for (i = 0; i < merge_rr.nr; i++) {
150
const char *path = merge_rr.items[i].string;
151
const char *name = (const char *)merge_rr.items[i].util;
152
diff_two(rerere_path(name, "preimage"), path, path, path);
153
}
154
else
151
- usage(git_rerere_usage);
155
+ usage_with_options(rerere_usage, options);
156
157
string_list_clear(&merge_rr, 1);
158
return 0;
t/t4200-rerere.sh
+91
@@ -292,4 +292,95 @@ test_expect_success 'merge --no-rerere-autoupdate' '
292
test_cmp expected actual
293
'
294
295
+test_expect_success 'set up an unresolved merge' '
296
+ headblob=$(git rev-parse version2:file3) &&
297
+ mergeblob=$(git rev-parse fifth:file3) &&
298
+ cat >expected.unresolved <<-EOF &&
299
+ 100644 $headblob 2 file3
300
+ 100644 $mergeblob 3 file3
301
+ EOF
302
+
303
+ test_might_fail git config --unset rerere.autoupdate &&
304
+ git reset --hard &&
305
+ git checkout version2 &&
306
+ fifth=$(git rev-parse fifth) &&
307
+ echo "$fifth branch 'fifth' of ." |
308
+ git fmt-merge-msg >msg &&
309
+ ancestor=$(git merge-base version2 fifth) &&
310
+ test_must_fail git merge-recursive "$ancestor" -- HEAD fifth &&
311
+
312
+ git ls-files --stage >failedmerge &&
313
+ cp file3 file3.conflict &&
314
+
315
+ git ls-files -u >actual &&
316
+ test_cmp expected.unresolved actual
317
+'
318
+
319
+test_expect_success 'explicit rerere' '
320
+ test_might_fail git config --unset rerere.autoupdate &&
321
+ git rm -fr --cached . &&
322
+ git update-index --index-info <failedmerge &&
323
+ cp file3.conflict file3 &&
324
+ test_must_fail git update-index --refresh -q &&
325
+
326
+ git rerere &&
327
+ git ls-files -u >actual &&
328
+ test_cmp expected.unresolved actual
329
+'
330
+
331
+test_expect_success 'explicit rerere with autoupdate' '
332
+ git config rerere.autoupdate true &&
333
+ git rm -fr --cached . &&
334
+ git update-index --index-info <failedmerge &&
335
+ cp file3.conflict file3 &&
336
+ test_must_fail git update-index --refresh -q &&
337
+
338
+ git rerere &&
339
+ git update-index --refresh
340
+'
341
+
342
+test_expect_success 'explicit rerere --rerere-autoupdate overrides' '
343
+ git config rerere.autoupdate false &&
344
+ git rm -fr --cached . &&
345
+ git update-index --index-info <failedmerge &&
346
+ cp file3.conflict file3 &&
347
+ git rerere &&
348
+ git ls-files -u >actual1 &&
349
+
350
+ git rm -fr --cached . &&
351
+ git update-index --index-info <failedmerge &&
352
+ cp file3.conflict file3 &&
353
+ git rerere --rerere-autoupdate &&
354
+ git update-index --refresh &&
355
+
356
+ git rm -fr --cached . &&
357
+ git update-index --index-info <failedmerge &&
358
+ cp file3.conflict file3 &&
359
+ git rerere --rerere-autoupdate --no-rerere-autoupdate &&
360
+ git ls-files -u >actual2 &&
361
+
362
+ git rm -fr --cached . &&
363
+ git update-index --index-info <failedmerge &&
364
+ cp file3.conflict file3 &&
365
+ git rerere --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate &&
366
+ git update-index --refresh &&
367
+
368
+ test_cmp expected.unresolved actual1 &&
369
+ test_cmp expected.unresolved actual2
370
+'
371
+
372
+test_expect_success 'rerere --no-no-rerere-autoupdate' '
373
+ git rm -fr --cached . &&
374
+ git update-index --index-info <failedmerge &&
375
+ cp file3.conflict file3 &&
376
+ test_must_fail git rerere --no-no-rerere-autoupdate 2>err &&
377
+ grep [Uu]sage err &&
378
+ test_must_fail git update-index --refresh
379
+'
380
+
381
+test_expect_success 'rerere -h' '
382
+ test_must_fail git rerere -h >help &&
383
+ grep [Uu]sage help
384
+'
385
+
386
test_done