merge-recursive: clarify code in was_tracked()

It can be puzzling to see that was_tracked() asks to get an index entry
by name, but does not take a negative return value for an answer.

The reason we have to do this is that cache_name_pos() only looks for
entries in stage 0, even if nobody asked for any stage in particular.

Let's rewrite the logic a little bit, to handle the easy case early: if
cache_name_pos() returned a non-negative position, we know it is a match,
and we do not even have to compare the name again (cache_name_pos() did
that for us already). We can say right away: yes, this file was tracked.

Only if there was no exact match do we need to look harder for any
matching entry in stage 2.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Johannes Schindelin 2016-07-26 18:05:57 +02:00 коммит произвёл Junio C Hamano
Родитель 7e97e10033
Коммит f8d83fb66c
1 изменённых файлов: 14 добавлений и 16 удалений

Просмотреть файл

@ -667,23 +667,21 @@ static int was_tracked(const char *path)
{
int pos = cache_name_pos(path, strlen(path));
if (pos < 0)
pos = -1 - pos;
while (pos < active_nr &&
!strcmp(path, active_cache[pos]->name)) {
/*
* If stage #0, it is definitely tracked.
* If it has stage #2 then it was tracked
* before this merge started. All other
* cases the path was not tracked.
*/
switch (ce_stage(active_cache[pos])) {
case 0:
case 2:
if (0 <= pos)
/* we have been tracking this path */
return 1;
/*
* Look for an unmerged entry for the path,
* specifically stage #2, which would indicate
* that "our" side before the merge started
* had the path tracked (and resulted in a conflict).
*/
for (pos = -1 - pos;
pos < active_nr && !strcmp(path, active_cache[pos]->name);
pos++)
if (ce_stage(active_cache[pos]) == 2)
return 1;
}
pos++;
}
return 0;
}