@matheusbsbs / matheus-bagliano / commits / 672d1b789b
Fork 0

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