From: Sergey Vlasov Date: Wed, 14 Sep 2005 12:42:55 GMT Subject: [PATCH 1/4] Do not try to process objects more than once during fetch 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. */