Skip to content

Commit

Permalink
merge-recursive: option to specify rename threshold
Browse files Browse the repository at this point in the history
The recursive merge strategy turns on rename detection but leaves the
rename threshold at the default. Add a strategy option to allow the user
to specify a rename threshold to use.

Signed-off-by: Kevin Ballard <kevin@sb.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Kevin Ballard authored and Junio C Hamano committed Sep 29, 2010
1 parent 4e5dd04 commit 10ae752
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 3 deletions.
4 changes: 4 additions & 0 deletions Documentation/merge-strategies.txt
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,10 @@ no-renormalize;;
Disables the `renormalize` option. This overrides the
`merge.renormalize` configuration variable.

rename-threshold=<n>;;
Controls the similarity threshold used for rename detection.
See also linkgit:git-diff[1] `-M`.

subtree[=path];;
This option is a more advanced form of 'subtree' strategy, where
the strategy makes a guess on how two trees must be shifted to
Expand Down
6 changes: 3 additions & 3 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -3219,7 +3219,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
return 1;
}

static int parse_num(const char **cp_p)
int parse_rename_score(const char **cp_p)
{
unsigned long num, scale;
int ch, dot;
Expand Down Expand Up @@ -3265,7 +3265,7 @@ static int diff_scoreopt_parse(const char *opt)
if (cmd != 'M' && cmd != 'C' && cmd != 'B')
return -1; /* that is not a -M, -C nor -B option */

opt1 = parse_num(&opt);
opt1 = parse_rename_score(&opt);
if (cmd != 'B')
opt2 = 0;
else {
Expand All @@ -3275,7 +3275,7 @@ static int diff_scoreopt_parse(const char *opt)
return -1; /* we expect -B80/99 or -B80 */
else {
opt++;
opt2 = parse_num(&opt);
opt2 = parse_rename_score(&opt);
}
}
if (*opt != 0)
Expand Down
2 changes: 2 additions & 0 deletions diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -301,4 +301,6 @@ extern size_t fill_textconv(struct userdiff_driver *driver,

extern struct userdiff_driver *get_textconv(struct diff_filespec *one);

extern int parse_rename_score(const char **cp_p);

#endif /* DIFF_H */
6 changes: 6 additions & 0 deletions merge-recursive.c
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ static struct string_list *get_renames(struct merge_options *o,
opts.rename_limit = o->merge_rename_limit >= 0 ? o->merge_rename_limit :
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)
Expand Down Expand Up @@ -1525,6 +1526,11 @@ int parse_merge_opt(struct merge_options *o, const char *s)
o->renormalize = 1;
else if (!strcmp(s, "no-renormalize"))
o->renormalize = 0;
else if (!prefixcmp(s, "rename-threshold=")) {
const char *score = s + strlen("rename-threshold=");
if ((o->rename_score = parse_rename_score(&score)) == -1 || *score != 0)
return -1;
}
else
return -1;
return 0;
Expand Down
1 change: 1 addition & 0 deletions merge-recursive.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ struct merge_options {
int verbosity;
int diff_rename_limit;
int merge_rename_limit;
int rename_score;
int call_depth;
struct strbuf obuf;
struct string_list current_file_set;
Expand Down

0 comments on commit 10ae752

Please sign in to comment.