Code

Merge branch 'jc/maint-1.6.0-split-diff-metainfo' into jc/maint-split-diff-metainfo
authorJunio C Hamano <gitster@pobox.com>
Tue, 27 Jan 2009 09:08:02 +0000 (01:08 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 27 Jan 2009 09:08:02 +0000 (01:08 -0800)
This is an evil merge, as a test added since 1.6.0 expects an incorrect
behaviour the merged commit fixes.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
1  2 
diff.c
t/t4030-diff-textconv.sh

diff --cc diff.c
index 5b85b4077a1d3e333d6af86127bf9473b295c837,6fea3c03476ac1817453a61fad0cda93a954df9a..416c5aa722afc8d10e4bc910e7b297b3eb0a2760
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -1999,6 -2073,91 +1999,68 @@@ static void run_external_diff(const cha
        }
  }
  
 -static const char *external_diff_attr(const char *name)
 -{
 -      struct git_attr_check attr_diff_check;
 -
 -      if (!name)
 -              return NULL;
 -
 -      setup_diff_attr_check(&attr_diff_check);
 -      if (!git_checkattr(name, 1, &attr_diff_check)) {
 -              const char *value = attr_diff_check.value;
 -              if (!ATTR_TRUE(value) &&
 -                  !ATTR_FALSE(value) &&
 -                  !ATTR_UNSET(value)) {
 -                      struct ll_diff_driver *drv;
 -
 -                      for (drv = user_diff; drv; drv = drv->next)
 -                              if (!strcmp(drv->name, value))
 -                                      return drv->cmd;
 -              }
 -      }
 -      return NULL;
 -}
 -
+ static int similarity_index(struct diff_filepair *p)
+ {
+       return p->score * 100 / MAX_SCORE;
+ }
+ static void fill_metainfo(struct strbuf *msg,
+                         const char *name,
+                         const char *other,
+                         struct diff_filespec *one,
+                         struct diff_filespec *two,
+                         struct diff_options *o,
+                         struct diff_filepair *p)
+ {
+       strbuf_init(msg, PATH_MAX * 2 + 300);
+       switch (p->status) {
+       case DIFF_STATUS_COPIED:
+               strbuf_addf(msg, "similarity index %d%%", similarity_index(p));
+               strbuf_addstr(msg, "\ncopy from ");
+               quote_c_style(name, msg, NULL, 0);
+               strbuf_addstr(msg, "\ncopy to ");
+               quote_c_style(other, msg, NULL, 0);
+               strbuf_addch(msg, '\n');
+               break;
+       case DIFF_STATUS_RENAMED:
+               strbuf_addf(msg, "similarity index %d%%", similarity_index(p));
+               strbuf_addstr(msg, "\nrename from ");
+               quote_c_style(name, msg, NULL, 0);
+               strbuf_addstr(msg, "\nrename to ");
+               quote_c_style(other, msg, NULL, 0);
+               strbuf_addch(msg, '\n');
+               break;
+       case DIFF_STATUS_MODIFIED:
+               if (p->score) {
+                       strbuf_addf(msg, "dissimilarity index %d%%\n",
+                                   similarity_index(p));
+                       break;
+               }
+               /* fallthru */
+       default:
+               /* nothing */
+               ;
+       }
+       if (one && two && hashcmp(one->sha1, two->sha1)) {
+               int abbrev = DIFF_OPT_TST(o, FULL_INDEX) ? 40 : DEFAULT_ABBREV;
+               if (DIFF_OPT_TST(o, BINARY)) {
+                       mmfile_t mf;
+                       if ((!fill_mmfile(&mf, one) && diff_filespec_is_binary(one)) ||
+                           (!fill_mmfile(&mf, two) && diff_filespec_is_binary(two)))
+                               abbrev = 40;
+               }
+               strbuf_addf(msg, "index %.*s..%.*s",
+                           abbrev, sha1_to_hex(one->sha1),
+                           abbrev, sha1_to_hex(two->sha1));
+               if (one->mode == two->mode)
+                       strbuf_addf(msg, " %06o", one->mode);
+               strbuf_addch(msg, '\n');
+       }
+       if (msg->len)
+               strbuf_setlen(msg, msg->len - 1);
+ }
  static void run_diff_cmd(const char *pgm,
                         const char *name,
                         const char *other,
index 2f27a0ba9ec002b1a6e4d3bd0ed1dc7484d4d14e,0000000000000000000000000000000000000000..a3f0897a52ce2147388baeac6fc64d3b8501b516
mode 100755,000000..100755
--- /dev/null
@@@ -1,126 -1,0 +1,126 @@@
- index ad8b3d2..67be421
 +#!/bin/sh
 +
 +test_description='diff.*.textconv tests'
 +. ./test-lib.sh
 +
 +find_diff() {
 +      sed '1,/^index /d' | sed '/^-- $/,$d'
 +}
 +
 +cat >expect.binary <<'EOF'
 +Binary files a/file and b/file differ
 +EOF
 +
 +cat >expect.text <<'EOF'
 +--- a/file
 ++++ b/file
 +@@ -1 +1,2 @@
 + 0
 ++1
 +EOF
 +
 +cat >hexdump <<'EOF'
 +#!/bin/sh
 +perl -e '$/ = undef; $_ = <>; s/./ord($&)/ge; print $_' < "$1"
 +EOF
 +chmod +x hexdump
 +
 +test_expect_success 'setup binary file with history' '
 +      printf "\\0\\n" >file &&
 +      git add file &&
 +      git commit -m one &&
 +      printf "\\01\\n" >>file &&
 +      git add file &&
 +      git commit -m two
 +'
 +
 +test_expect_success 'file is considered binary by porcelain' '
 +      git diff HEAD^ HEAD >diff &&
 +      find_diff <diff >actual &&
 +      test_cmp expect.binary actual
 +'
 +
 +test_expect_success 'file is considered binary by plumbing' '
 +      git diff-tree -p HEAD^ HEAD >diff &&
 +      find_diff <diff >actual &&
 +      test_cmp expect.binary actual
 +'
 +
 +test_expect_success 'setup textconv filters' '
 +      echo file diff=foo >.gitattributes &&
 +      git config diff.foo.textconv "$PWD"/hexdump &&
 +      git config diff.fail.textconv false
 +'
 +
 +test_expect_success 'diff produces text' '
 +      git diff HEAD^ HEAD >diff &&
 +      find_diff <diff >actual &&
 +      test_cmp expect.text actual
 +'
 +
 +test_expect_success 'diff-tree produces binary' '
 +      git diff-tree -p HEAD^ HEAD >diff &&
 +      find_diff <diff >actual &&
 +      test_cmp expect.binary actual
 +'
 +
 +test_expect_success 'log produces text' '
 +      git log -1 -p >log &&
 +      find_diff <log >actual &&
 +      test_cmp expect.text actual
 +'
 +
 +test_expect_success 'format-patch produces binary' '
 +      git format-patch --no-binary --stdout HEAD^ >patch &&
 +      find_diff <patch >actual &&
 +      test_cmp expect.binary actual
 +'
 +
 +test_expect_success 'status -v produces text' '
 +      git reset --soft HEAD^ &&
 +      git status -v >diff &&
 +      find_diff <diff >actual &&
 +      test_cmp expect.text actual &&
 +      git reset --soft HEAD@{1}
 +'
 +
 +cat >expect.stat <<'EOF'
 + file |  Bin 2 -> 4 bytes
 + 1 files changed, 0 insertions(+), 0 deletions(-)
 +EOF
 +test_expect_success 'diffstat does not run textconv' '
 +      echo file diff=fail >.gitattributes &&
 +      git diff --stat HEAD^ HEAD >actual &&
 +      test_cmp expect.stat actual
 +'
 +# restore working setup
 +echo file diff=foo >.gitattributes
 +
 +cat >expect.typechange <<'EOF'
 +--- a/file
 ++++ /dev/null
 +@@ -1,2 +0,0 @@
 +-0
 +-1
 +diff --git a/file b/file
 +new file mode 120000
++index 0000000..67be421
 +--- /dev/null
 ++++ b/file
 +@@ -0,0 +1 @@
 ++frotz
 +\ No newline at end of file
 +EOF
 +# make a symlink the hard way that works on symlink-challenged file systems
 +test_expect_success 'textconv does not act on symlinks' '
 +      printf frotz > file &&
 +      git add file &&
 +      git ls-files -s | sed -e s/100644/120000/ |
 +              git update-index --index-info &&
 +      git commit -m typechange &&
 +      git show >diff &&
 +      find_diff <diff >actual &&
 +      test_cmp expect.typechange actual
 +'
 +
 +test_done