[PATCH 1/4] Do not try to process objects more than once during fetch
- From
Sergey Vlasov <vsu@altlinux.ru>
- Date
- Sep 14, 2005, 12:42 UTC
- Message-ID
- <20050914124255.GD24405@master.mivlgu.local>
- In-Reply-To
- <20050914124206.GC24405@master.mivlgu.local>
fetch.c:process() is often called more than once for the same object; e.g., for unpacked git repository with 7313 objects there are 320997 calls to process() for objects which were already seen (and 7528 of those calls are for tree objects, which is a real problem because of recursive processing).
---
fetch.c | 8 ++++++++ 1 files changed, 8 insertions(+), 0 deletions(-)
f8285569e916a21c28379b55415165a89794272a
diff --git a/fetch.c b/fetch.c --- a/fetch.c +++ b/fetch.c @@ -7,6 +7,8 @@ #include "blob.h" #include "refs.h" +#define SEEN (1u << 0) + const char *write_ref = NULL; const unsigned char *current_ref = NULL; @@ -126,6 +128,12 @@ static int process_object(struct object static int process(unsigned char *sha1, const char *type) { struct object *obj = lookup_object_type(sha1, type); + + /* Do not try to process objects more than once */ + if (obj->flags & SEEN) + return 0; + obj->flags |= SEEN; + if (has_sha1_file(sha1)) { parse_object(sha1); /* We already have it, so we should scan it now. */