summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: aeecd23)
raw | patch | inline | side by side (parent: aeecd23)
author | Junio C Hamano <junkio@cox.net> | |
Wed, 1 Mar 2006 00:01:36 +0000 (16:01 -0800) | ||
committer | Junio C Hamano <junkio@cox.net> | |
Wed, 1 Mar 2006 04:20:04 +0000 (20:20 -0800) |
This is to rework diffcore break/rename/copy detection code
so that it does not affected when deltifier code gets improved.
Signed-off-by: Junio C Hamano <junkio@cox.net>
so that it does not affected when deltifier code gets improved.
Signed-off-by: Junio C Hamano <junkio@cox.net>
Makefile | patch | blob | history | |
diffcore-break.c | patch | blob | history | |
diffcore-delta.c | [new file with mode: 0644] | patch | blob |
diffcore-rename.c | patch | blob | history | |
diffcore.h | patch | blob | history |
diff --git a/Makefile b/Makefile
index 19578fc93a60cc41c31883ceac37a0f1ec4202d7..a5eb0c4beb9b7d65e321fde5634904d42331dbd0 100644 (file)
--- a/Makefile
+++ b/Makefile
DIFF_OBJS = \
diff.o diffcore-break.o diffcore-order.o diffcore-pathspec.o \
- diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o
+ diffcore-pickaxe.o diffcore-rename.o tree-diff.o combine-diff.o \
+ diffcore-delta.o
LIB_OBJS = \
blob.o commit.o connect.o count-delta.o csum-file.o \
diff --git a/diffcore-break.c b/diffcore-break.c
index 95b5eb492e3aa1a282347b875df04da31f276399..0fc2b860bef30ee5a37b90df835e66f0dc74ab70 100644 (file)
--- a/diffcore-break.c
+++ b/diffcore-break.c
#include "cache.h"
#include "diff.h"
#include "diffcore.h"
-#include "delta.h"
-#include "count-delta.h"
static int should_break(struct diff_filespec *src,
struct diff_filespec *dst,
* The value we return is 1 if we want the pair to be broken,
* or 0 if we do not.
*/
- void *delta;
unsigned long delta_size, base_size, src_copied, literal_added;
int to_break = 0;
if (base_size < MINIMUM_BREAK_SIZE)
return 0; /* we do not break too small filepair */
- delta = diff_delta(src->data, src->size,
- dst->data, dst->size,
- &delta_size, 0);
- if (!delta)
- return 0; /* error but caught downstream */
-
- /* Estimate the edit size by interpreting delta. */
- if (count_delta(delta, delta_size,
- &src_copied, &literal_added)) {
- free(delta);
- return 0; /* we cannot tell */
- }
- free(delta);
+ if (diffcore_count_changes(src->data, src->size,
+ dst->data, dst->size,
+ 0,
+ &src_copied, &literal_added))
+ return 0;
/* Compute merge-score, which is "how much is removed
* from the source material". The clean-up stage will
diff --git a/diffcore-delta.c b/diffcore-delta.c
--- /dev/null
+++ b/diffcore-delta.c
@@ -0,0 +1,43 @@
+#include "cache.h"
+#include "diff.h"
+#include "diffcore.h"
+#include "delta.h"
+#include "count-delta.h"
+
+static int diffcore_count_changes_1(void *src, unsigned long src_size,
+ void *dst, unsigned long dst_size,
+ unsigned long delta_limit,
+ unsigned long *src_copied,
+ unsigned long *literal_added)
+{
+ void *delta;
+ unsigned long delta_size;
+
+ delta = diff_delta(src, src_size,
+ dst, dst_size,
+ &delta_size, delta_limit);
+ if (!delta)
+ /* If delta_limit is exceeded, we have too much differences */
+ return -1;
+
+ /* Estimate the edit size by interpreting delta. */
+ if (count_delta(delta, delta_size, src_copied, literal_added)) {
+ free(delta);
+ return -1;
+ }
+ free(delta);
+ return 0;
+}
+
+int diffcore_count_changes(void *src, unsigned long src_size,
+ void *dst, unsigned long dst_size,
+ unsigned long delta_limit,
+ unsigned long *src_copied,
+ unsigned long *literal_added)
+{
+ return diffcore_count_changes_1(src, src_size,
+ dst, dst_size,
+ delta_limit,
+ src_copied,
+ literal_added);
+}
diff --git a/diffcore-rename.c b/diffcore-rename.c
index ffd126af0d2cd3539e0f186e83c7671132758e6b..55cf1c37f344628eb06c40393295f288fb186a50 100644 (file)
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
#include "cache.h"
#include "diff.h"
#include "diffcore.h"
-#include "delta.h"
-#include "count-delta.h"
/* Table of rename/copy destinations */
* match than anything else; the destination does not even
* call into this function in that case.
*/
- void *delta;
unsigned long delta_size, base_size, src_copied, literal_added;
unsigned long delta_limit;
int score;
if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0))
return 0; /* error but caught downstream */
- delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE;
- delta = diff_delta(src->data, src->size,
- dst->data, dst->size,
- &delta_size, delta_limit);
- if (!delta)
- /* If delta_limit is exceeded, we have too much differences */
- return 0;
-
- /* A delta that has a lot of literal additions would have
- * big delta_size no matter what else it does.
- */
- if (base_size * (MAX_SCORE-minimum_score) < delta_size * MAX_SCORE) {
- free(delta);
- return 0;
- }
- /* Estimate the edit size by interpreting delta. */
- if (count_delta(delta, delta_size, &src_copied, &literal_added)) {
- free(delta);
+ delta_limit = base_size * (MAX_SCORE-minimum_score) / MAX_SCORE;
+ if (diffcore_count_changes(src->data, src->size,
+ dst->data, dst->size,
+ delta_limit,
+ &src_copied, &literal_added))
return 0;
- }
- free(delta);
/* Extent of damage */
if (src->size + literal_added < src_copied)
diff --git a/diffcore.h b/diffcore.h
index 12cd816591aa112b5fe6a773cb5ba2acbf9cf96e..dba4f17658e6b3b7e1853ca024f8cfe9eae9c92e 100644 (file)
--- a/diffcore.h
+++ b/diffcore.h
#define diff_debug_queue(a,b) do {} while(0)
#endif
+extern int diffcore_count_changes(void *src, unsigned long src_size,
+ void *dst, unsigned long dst_size,
+ unsigned long delta_limit,
+ unsigned long *src_copied,
+ unsigned long *literal_added);
+
#endif