Skip to content

Commit 672d1b7

Browse files
jrngitster
authored andcommitted
rerere: migrate to parse-options API
Signed-off-by: Jonathan Nieder <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f731488 commit 672d1b7

File tree

2 files changed

+119
-24
lines changed

2 files changed

+119
-24
lines changed

builtin/rerere.c

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
#include "builtin.h"
22
#include "cache.h"
33
#include "dir.h"
4+
#include "parse-options.h"
45
#include "string-list.h"
56
#include "rerere.h"
67
#include "xdiff/xdiff.h"
78
#include "xdiff-interface.h"
89

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+
};
1114

1215
/* these values are days */
1316
static int cutoff_noresolve = 15;
@@ -103,52 +106,53 @@ static int diff_two(const char *file1, const char *label1,
103106
int cmd_rerere(int argc, const char **argv, const char *prefix)
104107
{
105108
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)
121125
return rerere(flags);
122126

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);
125129
return rerere_forget(pathspec);
126130
}
127131

128132
fd = setup_rerere(&merge_rr, flags);
129133
if (fd < 0)
130134
return 0;
131135

132-
if (!strcmp(argv[1], "clear")) {
136+
if (!strcmp(argv[0], "clear")) {
133137
for (i = 0; i < merge_rr.nr; i++) {
134138
const char *name = (const char *)merge_rr.items[i].util;
135139
if (!has_rerere_resolution(name))
136140
unlink_rr_item(name);
137141
}
138142
unlink_or_warn(git_path("rr-cache/MERGE_RR"));
139-
} else if (!strcmp(argv[1], "gc"))
143+
} else if (!strcmp(argv[0], "gc"))
140144
garbage_collect(&merge_rr);
141-
else if (!strcmp(argv[1], "status"))
145+
else if (!strcmp(argv[0], "status"))
142146
for (i = 0; i < merge_rr.nr; i++)
143147
printf("%s\n", merge_rr.items[i].string);
144-
else if (!strcmp(argv[1], "diff"))
148+
else if (!strcmp(argv[0], "diff"))
145149
for (i = 0; i < merge_rr.nr; i++) {
146150
const char *path = merge_rr.items[i].string;
147151
const char *name = (const char *)merge_rr.items[i].util;
148152
diff_two(rerere_path(name, "preimage"), path, path, path);
149153
}
150154
else
151-
usage(git_rerere_usage);
155+
usage_with_options(rerere_usage, options);
152156

153157
string_list_clear(&merge_rr, 1);
154158
return 0;

t/t4200-rerere.sh

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,4 +292,95 @@ test_expect_success 'merge --no-rerere-autoupdate' '
292292
test_cmp expected actual
293293
'
294294

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+
295386
test_done

0 commit comments

Comments
 (0)