зеркало из https://github.com/microsoft/git.git
Merge branch 'jk/renamelimit' (early part)
* 'jk/renamelimit' (early part): diff: make "too many files" rename warning optional bump rename limit defaults add merge.renamelimit config option
This commit is contained in:
Коммит
adf59ec127
|
@ -6,6 +6,11 @@ merge.log::
|
|||
Whether to include summaries of merged commits in newly created
|
||||
merge commit messages. False by default.
|
||||
|
||||
merge.renameLimit::
|
||||
The number of files to consider when performing rename detection
|
||||
during a merge; if not specified, defaults to the value of
|
||||
diff.renameLimit.
|
||||
|
||||
merge.tool::
|
||||
Controls which merge resolution program is used by
|
||||
linkgit:git-mergetool[1]. Valid built-in values are: "kdiff3",
|
||||
|
|
|
@ -92,7 +92,8 @@ static struct path_list current_directory_set = {NULL, 0, 0, 1};
|
|||
|
||||
static int call_depth = 0;
|
||||
static int verbosity = 2;
|
||||
static int rename_limit = -1;
|
||||
static int diff_rename_limit = -1;
|
||||
static int merge_rename_limit = -1;
|
||||
static int buffer_output = 1;
|
||||
static struct strbuf obuf = STRBUF_INIT;
|
||||
|
||||
|
@ -361,7 +362,10 @@ static struct path_list *get_renames(struct tree *tree,
|
|||
diff_setup(&opts);
|
||||
DIFF_OPT_SET(&opts, RECURSIVE);
|
||||
opts.detect_rename = DIFF_DETECT_RENAME;
|
||||
opts.rename_limit = rename_limit;
|
||||
opts.rename_limit = merge_rename_limit >= 0 ? merge_rename_limit :
|
||||
diff_rename_limit >= 0 ? diff_rename_limit :
|
||||
500;
|
||||
opts.warn_on_too_large_rename = 1;
|
||||
opts.output_format = DIFF_FORMAT_NO_OUTPUT;
|
||||
if (diff_setup_done(&opts) < 0)
|
||||
die("diff setup failed");
|
||||
|
@ -1343,7 +1347,11 @@ static int merge_config(const char *var, const char *value)
|
|||
return 0;
|
||||
}
|
||||
if (!strcasecmp(var, "diff.renamelimit")) {
|
||||
rename_limit = git_config_int(var, value);
|
||||
diff_rename_limit = git_config_int(var, value);
|
||||
return 0;
|
||||
}
|
||||
if (!strcasecmp(var, "merge.renamelimit")) {
|
||||
merge_rename_limit = git_config_int(var, value);
|
||||
return 0;
|
||||
}
|
||||
return git_default_config(var, value);
|
||||
|
|
2
diff.c
2
diff.c
|
@ -19,7 +19,7 @@
|
|||
#endif
|
||||
|
||||
static int diff_detect_rename_default;
|
||||
static int diff_rename_limit_default = 100;
|
||||
static int diff_rename_limit_default = 200;
|
||||
int diff_use_color_default = -1;
|
||||
static const char *external_diff_cmd_cfg;
|
||||
int diff_auto_refresh_index = 1;
|
||||
|
|
1
diff.h
1
diff.h
|
@ -83,6 +83,7 @@ struct diff_options {
|
|||
int pickaxe_opts;
|
||||
int rename_score;
|
||||
int rename_limit;
|
||||
int warn_on_too_large_rename;
|
||||
int dirstat_percent;
|
||||
int setup;
|
||||
int abbrev;
|
||||
|
|
|
@ -492,7 +492,8 @@ void diffcore_rename(struct diff_options *options)
|
|||
rename_limit = 32767;
|
||||
if ((num_create > rename_limit && num_src > rename_limit) ||
|
||||
(num_create * num_src > rename_limit * rename_limit)) {
|
||||
warning("too many files, skipping inexact rename detection");
|
||||
if (options->warn_on_too_large_rename)
|
||||
warning("too many files, skipping inexact rename detection");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,73 @@
|
|||
#!/bin/sh
|
||||
|
||||
test_description='merging with large rename matrix'
|
||||
. ./test-lib.sh
|
||||
|
||||
count() {
|
||||
i=1
|
||||
while test $i -le $1; do
|
||||
echo $i
|
||||
i=$(($i + 1))
|
||||
done
|
||||
}
|
||||
|
||||
test_expect_success 'setup (initial)' '
|
||||
touch file &&
|
||||
git add . &&
|
||||
git commit -m initial &&
|
||||
git tag initial
|
||||
'
|
||||
|
||||
make_text() {
|
||||
echo $1: $2
|
||||
for i in `count 20`; do
|
||||
echo $1: $i
|
||||
done
|
||||
echo $1: $3
|
||||
}
|
||||
|
||||
test_rename() {
|
||||
test_expect_success "rename ($1, $2)" '
|
||||
n='$1'
|
||||
expect='$2'
|
||||
git checkout -f master &&
|
||||
git branch -D test$n || true &&
|
||||
git reset --hard initial &&
|
||||
for i in $(count $n); do
|
||||
make_text $i initial initial >$i
|
||||
done &&
|
||||
git add . &&
|
||||
git commit -m add=$n &&
|
||||
for i in $(count $n); do
|
||||
make_text $i changed initial >$i
|
||||
done &&
|
||||
git commit -a -m change=$n &&
|
||||
git checkout -b test$n HEAD^ &&
|
||||
for i in $(count $n); do
|
||||
git rm $i
|
||||
make_text $i initial changed >$i.moved
|
||||
done &&
|
||||
git add . &&
|
||||
git commit -m change+rename=$n &&
|
||||
case "$expect" in
|
||||
ok) git merge master ;;
|
||||
*) test_must_fail git merge master ;;
|
||||
esac
|
||||
'
|
||||
}
|
||||
|
||||
test_rename 5 ok
|
||||
|
||||
test_expect_success 'set diff.renamelimit to 4' '
|
||||
git config diff.renamelimit 4
|
||||
'
|
||||
test_rename 4 ok
|
||||
test_rename 5 fail
|
||||
|
||||
test_expect_success 'set merge.renamelimit to 5' '
|
||||
git config merge.renamelimit 5
|
||||
'
|
||||
test_rename 5 ok
|
||||
test_rename 6 fail
|
||||
|
||||
test_done
|
|
@ -206,7 +206,7 @@ static void wt_status_print_updated(struct wt_status *s)
|
|||
rev.diffopt.format_callback = wt_status_print_updated_cb;
|
||||
rev.diffopt.format_callback_data = s;
|
||||
rev.diffopt.detect_rename = 1;
|
||||
rev.diffopt.rename_limit = 100;
|
||||
rev.diffopt.rename_limit = 200;
|
||||
rev.diffopt.break_opt = 0;
|
||||
run_diff_index(&rev, 1);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче