Skip to content

Commit

Permalink
merge: improve inexact rename limit warning
Browse files Browse the repository at this point in the history
The warning is generated deep in the diffcore code, which
means that it will come first, followed possibly by a spew
of conflicts, making it hard to see.

Instead, let's have diffcore pass back the information about
how big the rename limit would needed to have been, and then
the caller can provide a more appropriate message (and at a
more appropriate time).

No refactoring of other non-merge callers is necessary,
because nobody else was even using the warn_on_rename_limit
feature.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Jeff King authored and Junio C Hamano committed Feb 21, 2011
1 parent 7ed863a commit bf0ab10
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 4 deletions.
2 changes: 1 addition & 1 deletion diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ struct diff_options {
int pickaxe_opts;
int rename_score;
int rename_limit;
int warn_on_too_large_rename;
int needed_rename_limit;
int dirstat_percent;
int setup;
int abbrev;
Expand Down
5 changes: 3 additions & 2 deletions diffcore-rename.c
Original file line number Diff line number Diff line change
Expand Up @@ -493,12 +493,13 @@ void diffcore_rename(struct diff_options *options)
* but handles the potential overflow case specially (and we
* assume at least 32-bit integers)
*/
options->needed_rename_limit = 0;
if (rename_limit <= 0 || rename_limit > 32767)
rename_limit = 32767;
if ((num_create > rename_limit && num_src > rename_limit) ||
(num_create * num_src > rename_limit * rename_limit)) {
if (options->warn_on_too_large_rename)
warning("too many files (created: %d deleted: %d), skipping inexact rename detection", num_create, num_src);
options->needed_rename_limit =
num_src > num_create ? num_src : num_create;
goto cleanup;
}

Expand Down
10 changes: 9 additions & 1 deletion merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
#include "dir.h"
#include "submodule.h"

static const char rename_limit_advice[] =
"inexact rename detection was skipped because there were too many\n"
" files. You may want to set your merge.renamelimit variable to at least\n"
" %d and retry this merge.";

static struct tree *shift_tree_object(struct tree *one, struct tree *two,
const char *subtree_shift)
{
Expand Down Expand Up @@ -436,12 +441,13 @@ static struct string_list *get_renames(struct merge_options *o,
o->diff_rename_limit >= 0 ? o->diff_rename_limit :
500;
opts.rename_score = o->rename_score;
opts.warn_on_too_large_rename = 1;
opts.output_format = DIFF_FORMAT_NO_OUTPUT;
if (diff_setup_done(&opts) < 0)
die("diff setup failed");
diff_tree_sha1(o_tree->object.sha1, tree->object.sha1, "", &opts);
diffcore_std(&opts);
if (opts.needed_rename_limit > o->needed_rename_limit)
o->needed_rename_limit = opts.needed_rename_limit;
for (i = 0; i < diff_queued_diff.nr; ++i) {
struct string_list_item *item;
struct rename *re;
Expand Down Expand Up @@ -1666,6 +1672,8 @@ int merge_recursive(struct merge_options *o,
commit_list_insert(h2, &(*result)->parents->next);
}
flush_output(o);
if (o->needed_rename_limit)
warning(rename_limit_advice, o->needed_rename_limit);
return clean;
}

Expand Down
1 change: 1 addition & 0 deletions merge-recursive.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ struct merge_options {
int diff_rename_limit;
int merge_rename_limit;
int rename_score;
int needed_rename_limit;
int call_depth;
struct strbuf obuf;
struct string_list current_file_set;
Expand Down

0 comments on commit bf0ab10

Please sign in to comment.