rerere: migrate to parse-options API

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jonathan Nieder 2010-08-05 06:28:37 -05:00 committed by Junio C Hamano
parent f7314882c2
commit 672d1b789b
2 changed files with 118 additions and 23 deletions

View file

@ -1,13 +1,16 @@
#include "builtin.h" #include "builtin.h"
#include "cache.h" #include "cache.h"
#include "dir.h" #include "dir.h"
#include "parse-options.h"
#include "string-list.h" #include "string-list.h"
#include "rerere.h" #include "rerere.h"
#include "xdiff/xdiff.h" #include "xdiff/xdiff.h"
#include "xdiff-interface.h" #include "xdiff-interface.h"
static const char git_rerere_usage[] = static const char * const rerere_usage[] = {
"git rerere [clear | status | diff | gc]"; "git rerere [clear | status | diff | gc]",
NULL,
};
/* these values are days */ /* these values are days */
static int cutoff_noresolve = 15; static int cutoff_noresolve = 15;
@ -103,25 +106,26 @@ static int diff_two(const char *file1, const char *label1,
int cmd_rerere(int argc, const char **argv, const char *prefix) int cmd_rerere(int argc, const char **argv, const char *prefix)
{ {
struct string_list merge_rr = { NULL, 0, 0, 1 }; struct string_list merge_rr = { NULL, 0, 0, 1 };
int i, fd, flags = 0; int i, fd, autoupdate = -1, flags = 0;
if (2 < argc) { struct option options[] = {
if (!strcmp(argv[1], "-h")) OPT_SET_INT(0, "rerere-autoupdate", &autoupdate,
usage(git_rerere_usage); "register clean resolutions in index", 1),
if (!strcmp(argv[1], "--rerere-autoupdate")) OPT_END(),
flags = RERERE_AUTOUPDATE; };
else if (!strcmp(argv[1], "--no-rerere-autoupdate"))
flags = RERERE_NOAUTOUPDATE; argc = parse_options(argc, argv, prefix, options, rerere_usage, 0);
if (flags) {
argc--; if (autoupdate == 1)
argv++; flags = RERERE_AUTOUPDATE;
} if (autoupdate == 0)
} flags = RERERE_NOAUTOUPDATE;
if (argc < 2)
if (argc < 1)
return rerere(flags); return rerere(flags);
if (!strcmp(argv[1], "forget")) { if (!strcmp(argv[0], "forget")) {
const char **pathspec = get_pathspec(prefix, argv + 2); const char **pathspec = get_pathspec(prefix, argv + 1);
return rerere_forget(pathspec); return rerere_forget(pathspec);
} }
@ -129,26 +133,26 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
if (fd < 0) if (fd < 0)
return 0; return 0;
if (!strcmp(argv[1], "clear")) { if (!strcmp(argv[0], "clear")) {
for (i = 0; i < merge_rr.nr; i++) { for (i = 0; i < merge_rr.nr; i++) {
const char *name = (const char *)merge_rr.items[i].util; const char *name = (const char *)merge_rr.items[i].util;
if (!has_rerere_resolution(name)) if (!has_rerere_resolution(name))
unlink_rr_item(name); unlink_rr_item(name);
} }
unlink_or_warn(git_path("rr-cache/MERGE_RR")); unlink_or_warn(git_path("rr-cache/MERGE_RR"));
} else if (!strcmp(argv[1], "gc")) } else if (!strcmp(argv[0], "gc"))
garbage_collect(&merge_rr); garbage_collect(&merge_rr);
else if (!strcmp(argv[1], "status")) else if (!strcmp(argv[0], "status"))
for (i = 0; i < merge_rr.nr; i++) for (i = 0; i < merge_rr.nr; i++)
printf("%s\n", merge_rr.items[i].string); printf("%s\n", merge_rr.items[i].string);
else if (!strcmp(argv[1], "diff")) else if (!strcmp(argv[0], "diff"))
for (i = 0; i < merge_rr.nr; i++) { for (i = 0; i < merge_rr.nr; i++) {
const char *path = merge_rr.items[i].string; const char *path = merge_rr.items[i].string;
const char *name = (const char *)merge_rr.items[i].util; const char *name = (const char *)merge_rr.items[i].util;
diff_two(rerere_path(name, "preimage"), path, path, path); diff_two(rerere_path(name, "preimage"), path, path, path);
} }
else else
usage(git_rerere_usage); usage_with_options(rerere_usage, options);
string_list_clear(&merge_rr, 1); string_list_clear(&merge_rr, 1);
return 0; return 0;

View file

@ -292,4 +292,95 @@ test_expect_success 'merge --no-rerere-autoupdate' '
test_cmp expected actual test_cmp expected actual
' '
test_expect_success 'set up an unresolved merge' '
headblob=$(git rev-parse version2:file3) &&
mergeblob=$(git rev-parse fifth:file3) &&
cat >expected.unresolved <<-EOF &&
100644 $headblob 2 file3
100644 $mergeblob 3 file3
EOF
test_might_fail git config --unset rerere.autoupdate &&
git reset --hard &&
git checkout version2 &&
fifth=$(git rev-parse fifth) &&
echo "$fifth branch 'fifth' of ." |
git fmt-merge-msg >msg &&
ancestor=$(git merge-base version2 fifth) &&
test_must_fail git merge-recursive "$ancestor" -- HEAD fifth &&
git ls-files --stage >failedmerge &&
cp file3 file3.conflict &&
git ls-files -u >actual &&
test_cmp expected.unresolved actual
'
test_expect_success 'explicit rerere' '
test_might_fail git config --unset rerere.autoupdate &&
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
test_must_fail git update-index --refresh -q &&
git rerere &&
git ls-files -u >actual &&
test_cmp expected.unresolved actual
'
test_expect_success 'explicit rerere with autoupdate' '
git config rerere.autoupdate true &&
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
test_must_fail git update-index --refresh -q &&
git rerere &&
git update-index --refresh
'
test_expect_success 'explicit rerere --rerere-autoupdate overrides' '
git config rerere.autoupdate false &&
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
git rerere &&
git ls-files -u >actual1 &&
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
git rerere --rerere-autoupdate &&
git update-index --refresh &&
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
git rerere --rerere-autoupdate --no-rerere-autoupdate &&
git ls-files -u >actual2 &&
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
git rerere --rerere-autoupdate --no-rerere-autoupdate --rerere-autoupdate &&
git update-index --refresh &&
test_cmp expected.unresolved actual1 &&
test_cmp expected.unresolved actual2
'
test_expect_success 'rerere --no-no-rerere-autoupdate' '
git rm -fr --cached . &&
git update-index --index-info <failedmerge &&
cp file3.conflict file3 &&
test_must_fail git rerere --no-no-rerere-autoupdate 2>err &&
grep [Uu]sage err &&
test_must_fail git update-index --refresh
'
test_expect_success 'rerere -h' '
test_must_fail git rerere -h >help &&
grep [Uu]sage help
'
test_done test_done