@@ -44,19 +44,28 @@ static struct rev_name *get_commit_rev_name(const struct commit *commit)
44
44
return is_valid_rev_name (name ) ? name : NULL ;
45
45
}
46
46
47
+ static int effective_distance (int distance , int generation )
48
+ {
49
+ return distance + (generation > 0 ? MERGE_TRAVERSAL_WEIGHT : 0 );
50
+ }
51
+
47
52
static int is_better_name (struct rev_name * name ,
48
53
timestamp_t taggerdate ,
54
+ int generation ,
49
55
int distance ,
50
56
int from_tag )
51
57
{
58
+ int name_distance = effective_distance (name -> distance , name -> generation );
59
+ int new_distance = effective_distance (distance , generation );
60
+
52
61
/*
53
62
* When comparing names based on tags, prefer names
54
63
* based on the older tag, even if it is farther away.
55
64
*/
56
65
if (from_tag && name -> from_tag )
57
66
return (name -> taggerdate > taggerdate ||
58
67
(name -> taggerdate == taggerdate &&
59
- name -> distance > distance ));
68
+ name_distance > new_distance ));
60
69
61
70
/*
62
71
* We know that at least one of them is a non-tag at this point.
@@ -69,8 +78,8 @@ static int is_better_name(struct rev_name *name,
69
78
* We are now looking at two non-tags. Tiebreak to favor
70
79
* shorter hops.
71
80
*/
72
- if (name -> distance != distance )
73
- return name -> distance > distance ;
81
+ if (name_distance != new_distance )
82
+ return name_distance > new_distance ;
74
83
75
84
/* ... or tiebreak to favor older date */
76
85
if (name -> taggerdate != taggerdate )
@@ -88,7 +97,7 @@ static struct rev_name *create_or_update_name(struct commit *commit,
88
97
struct rev_name * name = commit_rev_name_at (& rev_names , commit );
89
98
90
99
if (is_valid_rev_name (name )) {
91
- if (!is_better_name (name , taggerdate , distance , from_tag ))
100
+ if (!is_better_name (name , taggerdate , generation , distance , from_tag ))
92
101
return NULL ;
93
102
94
103
/*
0 commit comments