git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [WIP/PATCH] merge-recursive: option to specify rename threshold
@ 2010-09-22  6:03 Kevin Ballard
  2010-09-23  0:32 ` [PATCH] " Kevin Ballard
  0 siblings, 1 reply; 18+ messages in thread
From: Kevin Ballard @ 2010-09-22  6:03 UTC (permalink / raw)
  To: git; +Cc: Kevin Ballard, Junio C Hamano

The recursive merge strategy turns on rename detection but leaves the
rename score at the default. Add a strategy option to allow the user
to specify a rename score to use.
---
The only thing I'm concerned about in this patch is the duplicated
parse_num() function. I'm inclined to take that function in diff.c,
rename it to something like parse_rename_score(), and declare it
in diff.h.

 merge-recursive.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 merge-recursive.h |    1 +
 2 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/merge-recursive.c b/merge-recursive.c
index bf611ae..f8ff30e 100644
--- a/merge-recursive.c
+++ b/merge-recursive.c
@@ -334,6 +334,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)
@@ -1552,6 +1553,43 @@ void init_merge_options(struct merge_options *o)
 	o->current_directory_set.strdup_strings = 1;
 }
 
+// XXX: copied from diff.c
+static int parse_num(const char **cp_p)
+{
+	unsigned long num, scale;
+	int ch, dot;
+	const char *cp = *cp_p;
+
+	num = 0;
+	scale = 1;
+	dot = 0;
+	for (;;) {
+		ch = *cp;
+		if ( !dot && ch == '.' ) {
+			scale = 1;
+			dot = 1;
+		} else if ( ch == '%' ) {
+			scale = dot ? scale*100 : 100;
+			cp++;	/* % is always at the end */
+			break;
+		} else if ( ch >= '0' && ch <= '9' ) {
+			if ( scale < 100000 ) {
+				scale *= 10;
+				num = (num*10) + (ch-'0');
+			}
+		} else {
+			break;
+		}
+		cp++;
+	}
+	*cp_p = cp;
+
+	/* user says num divided by scale and we say internally that
+	 * is MAX_SCORE * num / scale.
+	 */
+	return (int)((num >= scale) ? MAX_SCORE : (MAX_SCORE * num / scale));
+}
+
 int parse_merge_opt(struct merge_options *o, const char *s)
 {
 	if (!s || !*s)
@@ -1576,6 +1614,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-score=")) {
+		const char *score = s + strlen("rename-score=");
+		if ((o->rename_score = parse_num(&score)) == -1 || *score != 0)
+			return -1;
+	}
 	else
 		return -1;
 	return 0;
diff --git a/merge-recursive.h b/merge-recursive.h
index 2eb5d1a..c8135b0 100644
--- a/merge-recursive.h
+++ b/merge-recursive.h
@@ -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;
-- 
1.7.3.237.ge0a7

^ permalink raw reply related	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2010-09-28 22:23 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-09-22  6:03 [WIP/PATCH] merge-recursive: option to specify rename threshold Kevin Ballard
2010-09-23  0:32 ` [PATCH] " Kevin Ballard
2010-09-23  0:38   ` Kevin Ballard
2010-09-23  0:45     ` Kevin Ballard
2010-09-27  4:11       ` Junio C Hamano
2010-09-27  5:04         ` Kevin Ballard
2010-09-27  5:24           ` Junio C Hamano
2010-09-27  5:34             ` Kevin Ballard
2010-09-27  6:04               ` Junio C Hamano
2010-09-27 22:01             ` Kevin Ballard
2010-09-27 23:53               ` Jonathan Nieder
2010-09-28  0:01                 ` Kevin Ballard
2010-09-28  0:08                   ` Jonathan Nieder
2010-09-28  0:14                     ` Kevin Ballard
2010-09-28  0:24                       ` Jonathan Nieder
2010-09-27 23:58               ` [PATCHv2 1/2] " Kevin Ballard
2010-09-27 23:58               ` [PATCHv2 2/2] diff: add synonyms for -M, -C, -B Kevin Ballard
2010-09-28 21:15                 ` Thell Fowler

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).