diff options
author | Junio C Hamano <junkio@cox.net> | 2006-02-23 08:45:45 +0300 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-02-23 08:45:45 +0300 |
commit | b925410d10fce5e0d4182847f99e8c2df048bde1 (patch) | |
tree | 735fdc67bec7b266489f3a684397f9b9ce471bee | |
parent | b19696c2e7c3e753777189100b2ac09c9e04080b (diff) |
pack-objects: thin pack micro-optimization.
Since we sort objects by type, hash, preferredness and then
size, after we have a delta against preferred base, there is no
point trying a delta with non-preferred base. This seems to
save expensive calls to diff-delta and it also seems to save the
output space as well.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | pack-objects.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/pack-objects.c b/pack-objects.c index ceb107f63f..af3bdf5d35 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -447,7 +447,7 @@ static int add_object_entry(const unsigned char *sha1, const char *name, int exc struct packed_git *p; unsigned int found_offset = 0; struct packed_git *found_pack = NULL; - int ix; + int ix, status = 0; if (!exclude) { for (p = packed_git; p; p = p->next) { @@ -493,6 +493,7 @@ static int add_object_entry(const unsigned char *sha1, const char *name, int exc die("internal error in object hashing."); object_ix[-1 - ix] = idx + 1; } + status = 1; already_added: if (exclude) @@ -503,7 +504,7 @@ static int add_object_entry(const unsigned char *sha1, const char *name, int exc entry->in_pack_offset = found_offset; } } - return 1; + return status; } static void add_pbase_tree(struct tree_desc *tree) @@ -521,7 +522,10 @@ static void add_pbase_tree(struct tree_desc *tree) continue; if (sha1_object_info(sha1, type, &size)) continue; - add_object_entry(sha1, name, 1); + + if (!add_object_entry(sha1, name, 1)) + continue; + if (!strcmp(type, "tree")) { struct tree_desc sub; void *elem; @@ -543,8 +547,8 @@ static void add_preferred_base(unsigned char *sha1) tree.buf = elem; if (!tree.buf) return; - add_object_entry(sha1, "", 1); - add_pbase_tree(&tree); + if (add_object_entry(sha1, "", 1)) + add_pbase_tree(&tree); free(elem); } @@ -774,7 +778,7 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de * already have a delta based on preferred * one is pointless. */ - return 0; + return -1; } else if (!old_preferred) max_size = cur_entry->delta_size-1; |