Browse Source

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
maint
Junio C Hamano 17 years ago
parent
commit
adf59ec127
  1. 5
      Documentation/merge-config.txt
  2. 14
      builtin-merge-recursive.c
  3. 2
      diff.c
  4. 1
      diff.h
  5. 3
      diffcore-rename.c
  6. 73
      t/t6032-merge-large-rename.sh
  7. 2
      wt-status.c

5
Documentation/merge-config.txt

@ -6,6 +6,11 @@ merge.log:: @@ -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",

14
builtin-merge-recursive.c

@ -92,7 +92,8 @@ static struct path_list current_directory_set = {NULL, 0, 0, 1}; @@ -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, @@ -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) @@ -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

@ -19,7 +19,7 @@ @@ -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

@ -83,6 +83,7 @@ struct diff_options { @@ -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;

3
diffcore-rename.c

@ -492,7 +492,8 @@ void diffcore_rename(struct diff_options *options) @@ -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;
}


73
t/t6032-merge-large-rename.sh

@ -0,0 +1,73 @@ @@ -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

2
wt-status.c

@ -206,7 +206,7 @@ static void wt_status_print_updated(struct wt_status *s) @@ -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);
}

Loading…
Cancel
Save