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:
parent
f7314882c2
commit
672d1b789b
@ -1,13 +1,16 @@
|
||||
#include "builtin.h"
|
||||
#include "cache.h"
|
||||
#include "dir.h"
|
||||
#include "parse-options.h"
|
||||
#include "string-list.h"
|
||||
#include "rerere.h"
|
||||
#include "xdiff/xdiff.h"
|
||||
#include "xdiff-interface.h"
|
||||
|
||||
static const char git_rerere_usage[] =
|
||||
"git rerere [clear | status | diff | gc]";
|
||||
static const char * const rerere_usage[] = {
|
||||
"git rerere [clear | status | diff | gc]",
|
||||
NULL,
|
||||
};
|
||||
|
||||
/* these values are days */
|
||||
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)
|
||||
{
|
||||
struct string_list merge_rr = { NULL, 0, 0, 1 };
|
||||
int i, fd, flags = 0;
|
||||
int i, fd, autoupdate = -1, flags = 0;
|
||||
|
||||
if (2 < argc) {
|
||||
if (!strcmp(argv[1], "-h"))
|
||||
usage(git_rerere_usage);
|
||||
if (!strcmp(argv[1], "--rerere-autoupdate"))
|
||||
flags = RERERE_AUTOUPDATE;
|
||||
else if (!strcmp(argv[1], "--no-rerere-autoupdate"))
|
||||
flags = RERERE_NOAUTOUPDATE;
|
||||
if (flags) {
|
||||
argc--;
|
||||
argv++;
|
||||
}
|
||||
}
|
||||
if (argc < 2)
|
||||
struct option options[] = {
|
||||
OPT_SET_INT(0, "rerere-autoupdate", &autoupdate,
|
||||
"register clean resolutions in index", 1),
|
||||
OPT_END(),
|
||||
};
|
||||
|
||||
argc = parse_options(argc, argv, prefix, options, rerere_usage, 0);
|
||||
|
||||
if (autoupdate == 1)
|
||||
flags = RERERE_AUTOUPDATE;
|
||||
if (autoupdate == 0)
|
||||
flags = RERERE_NOAUTOUPDATE;
|
||||
|
||||
if (argc < 1)
|
||||
return rerere(flags);
|
||||
|
||||
if (!strcmp(argv[1], "forget")) {
|
||||
const char **pathspec = get_pathspec(prefix, argv + 2);
|
||||
if (!strcmp(argv[0], "forget")) {
|
||||
const char **pathspec = get_pathspec(prefix, argv + 1);
|
||||
return rerere_forget(pathspec);
|
||||
}
|
||||
|
||||
@ -129,26 +133,26 @@ int cmd_rerere(int argc, const char **argv, const char *prefix)
|
||||
if (fd < 0)
|
||||
return 0;
|
||||
|
||||
if (!strcmp(argv[1], "clear")) {
|
||||
if (!strcmp(argv[0], "clear")) {
|
||||
for (i = 0; i < merge_rr.nr; i++) {
|
||||
const char *name = (const char *)merge_rr.items[i].util;
|
||||
if (!has_rerere_resolution(name))
|
||||
unlink_rr_item(name);
|
||||
}
|
||||
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);
|
||||
else if (!strcmp(argv[1], "status"))
|
||||
else if (!strcmp(argv[0], "status"))
|
||||
for (i = 0; i < merge_rr.nr; i++)
|
||||
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++) {
|
||||
const char *path = merge_rr.items[i].string;
|
||||
const char *name = (const char *)merge_rr.items[i].util;
|
||||
diff_two(rerere_path(name, "preimage"), path, path, path);
|
||||
}
|
||||
else
|
||||
usage(git_rerere_usage);
|
||||
usage_with_options(rerere_usage, options);
|
||||
|
||||
string_list_clear(&merge_rr, 1);
|
||||
return 0;
|
||||
|
@ -292,4 +292,95 @@ test_expect_success 'merge --no-rerere-autoupdate' '
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user