Skip to content

Commit ac076c2

Browse files
dschogitster
authored andcommitted
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 <[email protected]> Acked-by: Uwe Kleine-König <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 2b9232c commit ac076c2

File tree

1 file changed

+11
-10
lines changed

1 file changed

+11
-10
lines changed

builtin-name-rev.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,17 @@ static const char name_rev_usage[] =
1111

1212
typedef struct rev_name {
1313
const char *tip_name;
14-
int merge_traversals;
1514
int generation;
15+
int distance;
1616
} rev_name;
1717

1818
static long cutoff = LONG_MAX;
1919

20+
/* How many generations are maximally preferred over _one_ merge traversal? */
21+
#define MERGE_TRAVERSAL_WEIGHT 65535
22+
2023
static void name_rev(struct commit *commit,
21-
const char *tip_name, int merge_traversals, int generation,
24+
const char *tip_name, int generation, int distance,
2225
int deref)
2326
{
2427
struct rev_name *name = (struct rev_name *)commit->util;
@@ -45,13 +48,11 @@ static void name_rev(struct commit *commit,
4548
name = xmalloc(sizeof(rev_name));
4649
commit->util = name;
4750
goto copy_data;
48-
} else if (name->merge_traversals > merge_traversals ||
49-
(name->merge_traversals == merge_traversals &&
50-
name->generation > generation)) {
51+
} else if (name->distance > distance) {
5152
copy_data:
5253
name->tip_name = tip_name;
53-
name->merge_traversals = merge_traversals;
5454
name->generation = generation;
55+
name->distance = distance;
5556
} else
5657
return;
5758

@@ -74,11 +75,11 @@ static void name_rev(struct commit *commit,
7475
sprintf(new_name, "%.*s^%d", len, tip_name,
7576
parent_number);
7677

77-
name_rev(parents->item, new_name,
78-
merge_traversals + 1 , 0, 0);
78+
name_rev(parents->item, new_name, 0,
79+
distance + MERGE_TRAVERSAL_WEIGHT, 0);
7980
} else {
80-
name_rev(parents->item, tip_name, merge_traversals,
81-
generation + 1, 0);
81+
name_rev(parents->item, tip_name, generation + 1,
82+
distance + 1, 0);
8283
}
8384
}
8485
}

0 commit comments

Comments
 (0)