summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-04-28 02:31:46 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-04-28 02:31:46 (GMT)
commit9a8b6a0a9d4de3d9c1005b872b9b57a213d3e9f8 (patch)
tree6e34f845941322b6fade53d1f121db31bd5c929e
parentbd346f105dc6f343eb577e4b25dbc1fa098cff33 (diff)
downloadgit-9a8b6a0a9d4de3d9c1005b872b9b57a213d3e9f8.zip
git-9a8b6a0a9d4de3d9c1005b872b9b57a213d3e9f8.tar.gz
git-9a8b6a0a9d4de3d9c1005b872b9b57a213d3e9f8.tar.bz2
pack-objects: update size heuristucs.
We used to omit delta base candidates that is much bigger than the target, but delta size does not grow when we delete more, so that was not a very good heuristics. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--pack-objects.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/pack-objects.c b/pack-objects.c
index c0acc46..6604338 100644
--- a/pack-objects.c
+++ b/pack-objects.c
@@ -1032,12 +1032,6 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
max_depth -= cur_entry->delta_limit;
}
- size = cur_entry->size;
- oldsize = old_entry->size;
- sizediff = oldsize > size ? oldsize - size : size - oldsize;
-
- if (size < 50)
- return -1;
if (old_entry->depth >= max_depth)
return 0;
@@ -1048,9 +1042,12 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de
* more space-efficient (deletes don't have to say _what_ they
* delete).
*/
+ size = cur_entry->size;
max_size = size / 2 - 20;
if (cur_entry->delta)
max_size = cur_entry->delta_size-1;
+ oldsize = old_entry->size;
+ sizediff = oldsize < size ? size - oldsize : 0;
if (sizediff >= max_size)
return 0;
delta_buf = diff_delta(old->data, oldsize,
@@ -1109,6 +1106,9 @@ static void find_deltas(struct object_entry **list, int window, int depth)
*/
continue;
+ if (entry->size < 50)
+ continue;
+
free(n->data);
n->entry = entry;
n->data = read_sha1_file(entry->sha1, type, &size);