[PATCH v2 04/17] merge-recursive: clarify code in was_tracked()
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Jul 5, 2016, 11:23 UTC
- Message-ID
- <69fc0a26854c89f35c1fb0e61d15f1fce82bef1c.1467717730.git.johannes.schindelin@gmx.de>
- In-Reply-To
- <cover.1467717729.git.johannes.schindelin@gmx.de>
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> --- merge-recursive.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-)
diff --git a/merge-recursive.c b/merge-recursive.c index e51f8fc..66ce27c 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -658,23 +658,22 @@ 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 (pos >= 0) + return pos < active_nr; + /* + * cache_name_pos() looks for stage == 0, even if we did not ask for + * it. Let's look for stage == 2 now. + */ + for (pos = -1 - pos; pos < active_nr && + !strcmp(path, active_cache[pos]->name); pos++) /* * 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 (ce_stage(active_cache[pos]) == 2) return 1; - } - pos++; - } return 0; }
-- 2.9.0.280.g32e2a70