xdiff: generate "anti-diffs" aka what is common to two files
authorLinus Torvalds <torvalds@osdl.org>
Thu, 29 Jun 2006 04:57:12 +0000 (21:57 -0700)
committerJunio C Hamano <junkio@cox.net>
Thu, 29 Jun 2006 05:24:32 +0000 (22:24 -0700)
This fairly trivial patch adds a new XDL_EMIT_xxx flag to tell libxdiff
that we don't want to generate the _diff_ between two files, we want to
see the lines that are _common_ to two files.

So when you set XDL_EMIT_COMMON, xdl_diff() will do everything exactly
like it used to do, but the output records it generates just contain the
lines that aren't part of the diff.

This is for doing things like generating the common base case for a file
that was added in both branches.

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
xdiff/xdiff.h
xdiff/xemit.c
index 2ce10b4c0d18aca467d3fb7a47badefa8c7c956f..c9f817818a781164b63c78be2af71a5d21e35d6f 100644 (file)
@@ -39,6 +39,7 @@ extern "C" {
 #define XDL_PATCH_IGNOREBSPACE (1 << 8)
 
 #define XDL_EMIT_FUNCNAMES (1 << 0)
+#define XDL_EMIT_COMMON (1 << 1)
 
 #define XDL_MMB_READONLY (1 << 0)
 
index ad5bfb191003f14cd71b2ec7f39fd72ac86eda9b..714c563547462d962b4a6b69b524092e1bc2a036 100644 (file)
@@ -100,6 +100,21 @@ static void xdl_find_func(xdfile_t *xf, long i, char *buf, long sz, long *ll) {
 }
 
 
+int xdl_emit_common(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
+                   xdemitconf_t const *xecfg) {
+       xdfile_t *xdf = &xe->xdf1;
+       const char *rchg = xdf->rchg;
+       long ix;
+
+       for (ix = 0; ix < xdf->nrec; ix++) {
+               if (rchg[ix])
+                       continue;
+               if (xdl_emit_record(xdf, ix, "", ecb))
+                       return -1;
+       }
+       return 0;
+}
+
 int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
                  xdemitconf_t const *xecfg) {
        long s1, s2, e1, e2, lctx;
@@ -107,6 +122,9 @@ int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
        char funcbuf[40];
        long funclen = 0;
 
+       if (xecfg->flags & XDL_EMIT_COMMON)
+               return xdl_emit_common(xe, xscr, ecb, xecfg);
+
        for (xch = xche = xscr; xch; xch = xche->next) {
                xche = xdl_get_hunk(xch, xecfg);