diff options
author | Junio C Hamano <junkio@cox.net> | 2006-04-16 22:03:01 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-04-16 22:03:01 -0700 |
commit | ca9de6cadfa55c9b00476112e2bb52fe20ab95e0 (patch) | |
tree | 671b1df986324e9b44e0197b9e67dd463e70d591 | |
parent | Geert's similarity (diff) | |
download | tgif-ca9de6cadfa55c9b00476112e2bb52fe20ab95e0.tar.xz |
Try using Geert similarity code in pack-objects.
It appears the fingerprinting itself is too expensive to be worth doing
for this purpose. A failed experiment.
Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | pack-objects.c | 10 |
2 files changed, 11 insertions, 1 deletions
@@ -204,7 +204,7 @@ DIFF_OBJS = \ diffcore-delta.o log-tree.o LIB_OBJS = \ - blob.o commit.o connect.o csum-file.o \ + blob.o commit.o connect.o csum-file.o gsimm.o rabinpoly.o \ date.o diff-delta.o entry.o exec_cmd.o ident.o index.o \ object.o pack-check.o patch-delta.o path.o pkt-line.o \ quote.o read-cache.o refs.o run-command.o \ diff --git a/pack-objects.c b/pack-objects.c index 09f4f2c944..18f8f82571 100644 --- a/pack-objects.c +++ b/pack-objects.c @@ -8,6 +8,8 @@ #include "pack.h" #include "csum-file.h" #include "tree-walk.h" +#include "rabinpoly.h" +#include "gsimm.h" #include <sys/time.h> #include <signal.h> @@ -993,6 +995,7 @@ static int type_size_sort(const struct object_entry *a, const struct object_entr struct unpacked { struct object_entry *entry; + unsigned char fingerprint[MD_LENGTH]; void *data; }; @@ -1041,6 +1044,9 @@ static int try_delta(struct unpacked *cur, struct unpacked *old, unsigned max_de if (old_entry->depth >= max_depth) return 0; + if (gb_simm_score(cur->fingerprint, old->fingerprint) < 0.4) + return 0; + /* * NOTE! * @@ -1077,6 +1083,7 @@ static void find_deltas(struct object_entry **list, int window, int depth) unsigned processed = 0; unsigned last_percent = 999; + rabin_reset (); memset(array, 0, array_size); i = nr_objects; idx = 0; @@ -1115,6 +1122,8 @@ static void find_deltas(struct object_entry **list, int window, int depth) if (size != entry->size) die("object %s inconsistent object length (%lu vs %lu)", sha1_to_hex(entry->sha1), size, entry->size); + gb_simm_process(n->data, size, n->fingerprint); + j = window; while (--j > 0) { unsigned int other_idx = idx + j; @@ -1124,6 +1133,7 @@ static void find_deltas(struct object_entry **list, int window, int depth) m = array + other_idx; if (!m->entry) break; + if (try_delta(n, m, depth) < 0) break; } |