summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>2007-08-27 11:37:33 (GMT)
committerJunio C Hamano <gitster@pobox.com>2007-08-28 05:36:43 (GMT)
commitac076c29ae8d57b72abe27f573061ea7b2eeed57 (patch)
tree4b3d9e4fa5dfd9f7e986e366a7fe0e70a5e886cb
parent2b9232cc23a86f650cc1b93a35cce6ad59a8d782 (diff)
downloadgit-ac076c29ae8d57b72abe27f573061ea7b2eeed57.zip
git-ac076c29ae8d57b72abe27f573061ea7b2eeed57.tar.gz
git-ac076c29ae8d57b72abe27f573061ea7b2eeed57.tar.bz2
name-rev: Fix non-shortest description
Uwe Kleine-König noticed that under certain circumstances, name-rev picked a non-optimal tag. Jeff King analyzed that name-rev only takes into account the number of merge traversals, and then the _last_ number in the description. As an easy way to fix it, use a weighting factor for merge traversals: A merge traversal is now made 65535 times more expensive than a first-parent traversal. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Acked-by: Uwe Kleine-König <ukleinek@informatik.uni-freiburg.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rw-r--r--builtin-name-rev.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/builtin-name-rev.c b/builtin-name-rev.c
index 61eba34..03083e9 100644
--- a/builtin-name-rev.c
+++ b/builtin-name-rev.c
@@ -11,14 +11,17 @@ static const char name_rev_usage[] =
typedef struct rev_name {
const char *tip_name;
- int merge_traversals;
int generation;
+ int distance;
} rev_name;
static long cutoff = LONG_MAX;
+/* How many generations are maximally preferred over _one_ merge traversal? */
+#define MERGE_TRAVERSAL_WEIGHT 65535
+
static void name_rev(struct commit *commit,
- const char *tip_name, int merge_traversals, int generation,
+ const char *tip_name, int generation, int distance,
int deref)
{
struct rev_name *name = (struct rev_name *)commit->util;
@@ -45,13 +48,11 @@ static void name_rev(struct commit *commit,
name = xmalloc(sizeof(rev_name));
commit->util = name;
goto copy_data;
- } else if (name->merge_traversals > merge_traversals ||
- (name->merge_traversals == merge_traversals &&
- name->generation > generation)) {
+ } else if (name->distance > distance) {
copy_data:
name->tip_name = tip_name;
- name->merge_traversals = merge_traversals;
name->generation = generation;
+ name->distance = distance;
} else
return;
@@ -74,11 +75,11 @@ copy_data:
sprintf(new_name, "%.*s^%d", len, tip_name,
parent_number);
- name_rev(parents->item, new_name,
- merge_traversals + 1 , 0, 0);
+ name_rev(parents->item, new_name, 0,
+ distance + MERGE_TRAVERSAL_WEIGHT, 0);
} else {
- name_rev(parents->item, tip_name, merge_traversals,
- generation + 1, 0);
+ name_rev(parents->item, tip_name, generation + 1,
+ distance + 1, 0);
}
}
}