summaryrefslogtreecommitdiff
path: root/rerere.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2015-06-30 23:10:10 (GMT)
committerJunio C Hamano <gitster@pobox.com>2015-07-24 22:09:32 (GMT)
commit74444d4ec4c23d254040de7b2637660b7f141110 (patch)
tree266d4272fe9db86be33d88b347415ea5faad0504 /rerere.c
parent67711cdc399203ec1d70cde2c3cd71e37e43da70 (diff)
downloadgit-74444d4ec4c23d254040de7b2637660b7f141110.zip
git-74444d4ec4c23d254040de7b2637660b7f141110.tar.gz
git-74444d4ec4c23d254040de7b2637660b7f141110.tar.bz2
rerere: stop looping unnecessarily
handle_cache() loops 3 times starting from an index entry that is unmerged, while ignoring an entry for a path that is different from what we are looking for. As the index is sorted, once we see a different path, we know we saw all stages for the path we are interested in. Just loop while we see the same path and then break, instead of continuing for 3 times. Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'rerere.c')
-rw-r--r--rerere.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/rerere.c b/rerere.c
index 2bce1c8..e1d527c 100644
--- a/rerere.c
+++ b/rerere.c
@@ -329,24 +329,21 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu
return -1;
pos = -pos - 1;
- for (i = 0; i < 3; i++) {
+ while (pos < active_nr) {
enum object_type type;
unsigned long size;
- int j;
- if (active_nr <= pos)
- break;
ce = active_cache[pos++];
if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
- continue;
- j = ce_stage(ce) - 1;
- mmfile[j].ptr = read_sha1_file(ce->sha1, &type, &size);
- mmfile[j].size = size;
+ break;
+ i = ce_stage(ce) - 1;
+ mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
+ mmfile[i].size = size;
}
- for (i = 0; i < 3; i++) {
+ for (i = 0; i < 3; i++)
if (!mmfile[i].ptr && !mmfile[i].size)
mmfile[i].ptr = xstrdup("");
- }
+
/*
* NEEDSWORK: handle conflicts from merges with
* merge.renormalize set, too