From: Jacob Keller <jacob.kel...@gmail.com>

v8 has changes suggested by Junio and Stefan Beller, as well as a few
modifications of my own, plus more tests.

Series interdiff of v7 and v8:
diff --git c/builtin/rev-list.c w/builtin/rev-list.c
index 1a75a83538f4..21cde8dd6b31 100644
--- c/builtin/rev-list.c
+++ w/builtin/rev-list.c
@@ -129,20 +129,20 @@ static void show_commit(struct commit *commit, void *data)
                        graph_show_commit_msg(revs->graph, stdout, &buf);
 
                        /*
-                               * Add a newline after the commit message.
-                               *
-                               * Usually, this newline produces a blank
-                               * padding line between entries, in which case
-                               * we need to add graph padding on this line.
-                               *
-                               * However, the commit message may not end in a
-                               * newline.  In this case the newline simply
-                               * ends the last line of the commit message,
-                               * and we don't need any graph output.  (This
-                               * always happens with CMIT_FMT_ONELINE, and it
-                               * happens with CMIT_FMT_USERFORMAT when the
-                               * format doesn't explicitly end in a newline.)
-                               */
+                       * Add a newline after the commit message.
+                       *
+                       * Usually, this newline produces a blank
+                       * padding line between entries, in which case
+                       * we need to add graph padding on this line.
+                       *
+                       * However, the commit message may not end in a
+                       * newline.  In this case the newline simply
+                       * ends the last line of the commit message,
+                       * and we don't need any graph output.  (This
+                       * always happens with CMIT_FMT_ONELINE, and it
+                       * happens with CMIT_FMT_USERFORMAT when the
+                       * format doesn't explicitly end in a newline.)
+                       */
                        if (buf.len && buf.buf[buf.len - 1] == '\n')
                                graph_show_padding(revs->graph);
                        putchar('\n');
diff --git c/cache.h w/cache.h
index f30a4417efdf..da9f0be67d7b 100644
--- c/cache.h
+++ w/cache.h
@@ -964,6 +964,8 @@ static inline void oidclr(struct object_id *oid)
 #define EMPTY_BLOB_SHA1_BIN \
        ((const unsigned char *) EMPTY_BLOB_SHA1_BIN_LITERAL)
 
+extern const struct object_id empty_tree_oid;
+
 static inline int is_empty_blob_sha1(const unsigned char *sha1)
 {
        return !hashcmp(sha1, EMPTY_BLOB_SHA1_BIN);
diff --git c/diff.c w/diff.c
index e119758aba82..b38d95eb249c 100644
--- c/diff.c
+++ w/diff.c
@@ -2318,7 +2318,7 @@ static void builtin_diff(const char *name_a,
                const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
                show_submodule_summary(o->file, one->path ? one->path : 
two->path,
                                line_prefix,
-                               one->oid.hash, two->oid.hash,
+                               &one->oid, &two->oid,
                                two->dirty_submodule,
                                meta, del, add, reset);
                return;
@@ -2329,7 +2329,7 @@ static void builtin_diff(const char *name_a,
                const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
                show_submodule_inline_diff(o->file, one->path ? one->path : 
two->path,
                                line_prefix,
-                               one->oid.hash, two->oid.hash,
+                               &one->oid, &two->oid,
                                two->dirty_submodule,
                                meta, del, add, reset, o);
                return;
diff --git c/graph.c w/graph.c
index b140c096b7f3..06f1139f2e20 100644
--- c/graph.c
+++ w/graph.c
@@ -1215,10 +1215,10 @@ void graph_show_commit(struct git_graph *graph)
        struct strbuf msgbuf = STRBUF_INIT;
        int shown_commit_line = 0;
 
-       if (!graph) {
-               graph_show_line_prefix(default_diffopt);
+       graph_show_line_prefix(default_diffopt);
+
+       if (!graph)
                return;
-       }
 
        /*
         * When showing a diff of a merge against each of its parents, we
@@ -1232,11 +1232,12 @@ void graph_show_commit(struct git_graph *graph)
 
        while (!shown_commit_line && !graph_is_commit_finished(graph)) {
                shown_commit_line = graph_next_line(graph, &msgbuf);
-               graph_show_line_prefix(&graph->revs->diffopt);
                fwrite(msgbuf.buf, sizeof(char), msgbuf.len,
                        graph->revs->diffopt.file);
-               if (!shown_commit_line)
+               if (!shown_commit_line) {
                        putc('\n', graph->revs->diffopt.file);
+                       graph_show_line_prefix(&graph->revs->diffopt);
+               }
                strbuf_setlen(&msgbuf, 0);
        }
 
@@ -1247,13 +1248,12 @@ void graph_show_oneline(struct git_graph *graph)
 {
        struct strbuf msgbuf = STRBUF_INIT;
 
-       if (!graph) {
-               graph_show_line_prefix(default_diffopt);
+       graph_show_line_prefix(default_diffopt);
+
+       if (!graph)
                return;
-       }
 
        graph_next_line(graph, &msgbuf);
-       graph_show_line_prefix(&graph->revs->diffopt);
        fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file);
        strbuf_release(&msgbuf);
 }
@@ -1262,13 +1262,12 @@ void graph_show_padding(struct git_graph *graph)
 {
        struct strbuf msgbuf = STRBUF_INIT;
 
-       if (!graph) {
-               graph_show_line_prefix(default_diffopt);
+       graph_show_line_prefix(default_diffopt);
+
+       if (!graph)
                return;
-       }
 
        graph_padding_line(graph, &msgbuf);
-       graph_show_line_prefix(&graph->revs->diffopt);
        fwrite(msgbuf.buf, sizeof(char), msgbuf.len, graph->revs->diffopt.file);
        strbuf_release(&msgbuf);
 }
@@ -1278,28 +1277,27 @@ int graph_show_remainder(struct git_graph *graph)
        struct strbuf msgbuf = STRBUF_INIT;
        int shown = 0;
 
-       if (!graph) {
-               graph_show_line_prefix(default_diffopt);
-               return 0;
-       }
+       graph_show_line_prefix(default_diffopt);
 
-       if (graph_is_commit_finished(graph)) {
-               graph_show_line_prefix(&graph->revs->diffopt);
+       if (!graph)
+               return 0;
+
+       if (graph_is_commit_finished(graph))
                return 0;
-       }
 
        for (;;) {
                graph_next_line(graph, &msgbuf);
-               graph_show_line_prefix(&graph->revs->diffopt);
                fwrite(msgbuf.buf, sizeof(char), msgbuf.len,
                        graph->revs->diffopt.file);
                strbuf_setlen(&msgbuf, 0);
                shown = 1;
 
-               if (!graph_is_commit_finished(graph))
+               if (!graph_is_commit_finished(graph)) {
                        putc('\n', graph->revs->diffopt.file);
-               else
+                       graph_show_line_prefix(&graph->revs->diffopt);
+               } else {
                        break;
+               }
        }
        strbuf_release(&msgbuf);
 
diff --git c/path.c w/path.c
index d1af029152a2..0cb30123e988 100644
--- c/path.c
+++ w/path.c
@@ -477,11 +477,16 @@ static void do_submodule_path(struct strbuf *buf, const 
char *path,
        strbuf_complete(buf, '/');
        strbuf_addstr(buf, ".git");
 
-       git_dir = resolve_gitdir(buf->buf);
-       if (git_dir && git_dir != buf->buf) {
+       git_dir = read_gitfile(buf->buf);
+       if (git_dir) {
                strbuf_reset(buf);
                strbuf_addstr(buf, git_dir);
        }
+       if (!is_git_directory(buf->buf)) {
+               strbuf_reset(buf);
+               strbuf_git_path(buf, "%s/%s", "modules", path);
+       }
+
        strbuf_addch(buf, '/');
        strbuf_addbuf(&git_submodule_dir, buf);
 
diff --git c/sha1_file.c w/sha1_file.c
index 1e23fc186a02..10883d56a600 100644
--- c/sha1_file.c
+++ w/sha1_file.c
@@ -38,6 +38,9 @@ static inline uintmax_t sz_fmt(size_t s) { return s; }
 
 const unsigned char null_sha1[20];
 const struct object_id null_oid;
+const struct object_id empty_tree_oid = {
+       .hash = EMPTY_TREE_SHA1_BIN_LITERAL
+};
 
 /*
  * This is meant to hold a *small* number of objects that you would
diff --git c/submodule.c w/submodule.c
index e5f1138f4362..cecd3cd98de4 100644
--- c/submodule.c
+++ w/submodule.c
@@ -333,7 +333,7 @@ static void print_submodule_summary(struct rev_info *rev, 
FILE *f,
  */
 static void show_submodule_header(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *reset,
                struct commit **left, struct commit **right)
@@ -350,30 +350,30 @@ static void show_submodule_header(FILE *f, const char 
*path,
                fprintf(f, "%sSubmodule %s contains modified content\n",
                        line_prefix, path);
 
-       if (is_null_sha1(one))
+       if (is_null_oid(one))
                message = "(new submodule)";
-       else if (is_null_sha1(two))
+       else if (is_null_oid(two))
                message = "(submodule deleted)";
 
        if (add_submodule_odb(path)) {
                if (!message)
-                       message = "(submodule not initialized)";
+                       message = "(not initialized)";
                goto output_header;
        }
 
        /*
         * Attempt to lookup the commit references, and determine if this is
-        * a fast forward or fast backwards update
+        * a fast forward or fast backwards update.
         */
-       *left = lookup_commit_reference(one);
-       *right = lookup_commit_reference(two);
+       *left = lookup_commit_reference(one->hash);
+       *right = lookup_commit_reference(two->hash);
 
        /*
         * Warn about missing commits in the submodule project, but only if
-        * they aren't null
+        * they aren't null.
         */
-       if ((!is_null_sha1(one) && !*left) ||
-            (!is_null_sha1(two) && !*right))
+       if ((!is_null_oid(one) && !*left) ||
+            (!is_null_oid(two) && !*right))
                message = "(commits not present)";
 
        merge_bases = get_merge_bases(*left, *right);
@@ -384,17 +384,17 @@ static void show_submodule_header(FILE *f, const char 
*path,
                        fast_backward = 1;
        }
 
-       if (!hashcmp(one, two)) {
+       if (!oidcmp(one, two)) {
                strbuf_release(&sb);
                return;
        }
 
 output_header:
        strbuf_addf(&sb, "%s%sSubmodule %s %s..", line_prefix, meta, path,
-                       find_unique_abbrev(one, DEFAULT_ABBREV));
+                       find_unique_abbrev(one->hash, DEFAULT_ABBREV));
        if (!fast_backward && !fast_forward)
                strbuf_addch(&sb, '.');
-       strbuf_addf(&sb, "%s", find_unique_abbrev(two, DEFAULT_ABBREV));
+       strbuf_addf(&sb, "%s", find_unique_abbrev(two->hash, DEFAULT_ABBREV));
        if (message)
                strbuf_addf(&sb, " %s%s\n", message, reset);
        else
@@ -406,7 +406,7 @@ static void show_submodule_header(FILE *f, const char *path,
 
 void show_submodule_summary(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset)
 {
@@ -417,33 +417,32 @@ void show_submodule_summary(FILE *f, const char *path,
                              meta, reset, &left, &right);
 
        /*
-        * if we don't have both a left and a right pointer, then we can't
-        * display a summary
+        * If we don't have both a left and a right pointer, there is no
+        * reason to try and display a summary. The header line should contain
+        * all the information the user needs.
         */
        if (!left || !right)
                return;
 
+       /* Treat revision walker failure the same as missing commits */
        if (prepare_submodule_summary(&rev, path, left, right)) {
                fprintf(f, "%s(revision walker failed)\n", line_prefix);
                return;
        }
 
        print_submodule_summary(&rev, f, line_prefix, del, add, reset);
-
-       if (left)
-               clear_commit_marks(left, ~0);
-       if (right)
-               clear_commit_marks(right, ~0);
+       clear_commit_marks(left, ~0);
+       clear_commit_marks(right, ~0);
 }
 
 void show_submodule_inline_diff(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset,
                const struct diff_options *o)
 {
-       const char *old = EMPTY_TREE_SHA1_BIN, *new = EMPTY_TREE_SHA1_BIN;
+       const struct object_id *old = &empty_tree_oid, *new = &empty_tree_oid;
        struct commit *left = NULL, *right = NULL;
        struct strbuf submodule_dir = STRBUF_INIT;
        struct child_process cp = CHILD_PROCESS_INIT;
@@ -452,8 +451,8 @@ void show_submodule_inline_diff(FILE *f, const char *path,
                              meta, reset, &left, &right);
 
        /* We need a valid left and right commit to display a difference */
-       if (!(left || is_null_sha1(one)) ||
-           !(right || is_null_sha1(two)))
+       if (!(left || is_null_oid(one)) ||
+           !(right || is_null_oid(two)))
                goto done;
 
        if (left)
@@ -481,14 +480,15 @@ void show_submodule_inline_diff(FILE *f, const char *path,
                argv_array_pushf(&cp.args, "--dst-prefix=%s%s/",
                                 o->b_prefix, path);
        }
-       argv_array_push(&cp.args, sha1_to_hex(old));
-       /* If the submodule has modified content, we will diff against the
+       argv_array_push(&cp.args, oid_to_hex(old));
+       /*
+        * If the submodule has modified content, we will diff against the
         * work tree, under the assumption that the user has asked for the
         * diff format and wishes to actually see all differences even if they
         * haven't yet been committed to the submodule yet.
         */
        if (!(dirty_submodule & DIRTY_SUBMODULE_MODIFIED))
-               argv_array_push(&cp.args, sha1_to_hex(new));
+               argv_array_push(&cp.args, oid_to_hex(new));
 
        if (run_command(&cp))
                fprintf(f, "(diff failed)\n");
diff --git c/submodule.h w/submodule.h
index e2ebc0756f6a..d9e197a948fd 100644
--- c/submodule.h
+++ w/submodule.h
@@ -43,12 +43,12 @@ const char *submodule_strategy_to_string(const struct 
submodule_update_strategy
 void handle_ignore_submodules_arg(struct diff_options *diffopt, const char *);
 void show_submodule_summary(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset);
 void show_submodule_inline_diff(FILE *f, const char *path,
                const char *line_prefix,
-               unsigned char one[20], unsigned char two[20],
+               struct object_id *one, struct object_id *two,
                unsigned dirty_submodule, const char *meta,
                const char *del, const char *add, const char *reset,
                const struct diff_options *opt);
diff --git c/t/t4059-diff-submodule-not-initialized.sh 
w/t/t4059-diff-submodule-not-initialized.sh
new file mode 100755
index 000000000000..cc787454033a
--- /dev/null
+++ w/t/t4059-diff-submodule-not-initialized.sh
@@ -0,0 +1,105 @@
+#!/bin/sh
+#
+# Copyright (c) 2016 Jacob Keller, based on t4041 by Jens Lehmann
+#
+
+test_description='Test for submodule diff on non-checked out submodule
+
+This test tries to verify that add_submodule_odb works when the submodule was
+initialized previously but the checkout has since been removed.
+'
+
+TEST_NO_CREATE_REPO=1
+. ./test-lib.sh
+
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
+# String "added" in German (translated with Google Translate), encoded in 
UTF-8,
+# used in sample commit log messages in add_file() function below.
+added=$(printf "hinzugef\303\274gt")
+add_file () {
+       (
+               cd "$1" &&
+               shift &&
+               for name
+               do
+                       echo "$name" >"$name" &&
+                       git add "$name" &&
+                       test_tick &&
+                       # "git commit -m" would break MinGW, as Windows refuse 
to pass
+                       # $test_encoding encoded parameter to git.
+                       echo "Add $name ($added $name)" | iconv -f utf-8 -t 
$test_encoding |
+                       git -c "i18n.commitEncoding=$test_encoding" commit -F -
+               done >/dev/null &&
+               git rev-parse --short --verify HEAD
+       )
+}
+commit_file () {
+       test_tick &&
+       git commit "$@" -m "Commit $*" >/dev/null
+}
+
+test_create_repo sm1 &&
+test_create_repo sm2 &&
+add_file sm1 foo >/dev/null &&
+add_file sm2 foo1 foo2 >/dev/null &&
+smhead1=$(cd sm2; git rev-parse --short --verify HEAD) &&
+cd sm1
+
+test_expect_success 'setup - submodule directory' '
+       git submodule add ../sm2 sm2 &&
+       commit_file sm2 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm2 0000000...$smhead1 (new submodule)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule directory removed' '
+       rm -rf sm2 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm2 0000000...$smhead1 (new submodule)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'setup - submodule multiple commits' '
+       git submodule update --checkout sm2 &&
+       smhead2=$(add_file sm2 foo3 foo4) &&
+       commit_file sm2 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm2 $smhead1..$smhead2:
+         > Add foo4 ($added foo4)
+         > Add foo3 ($added foo3)
+       EOF
+       test_cmp expected actual
+'
+
+test_expect_success 'submodule removed multiple commits' '
+       rm -rf sm2 &&
+       git diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm2 $smhead1..$smhead2:
+         > Add foo4 ($added foo4)
+         > Add foo3 ($added foo3)
+       EOF
+       test_cmp expected actual
+'
+
+cd ..
+
+test_expect_success 'submodule not initialized in new clone' '
+       git clone sm1 sm3 &&
+       git -C sm3 diff-tree -p --no-commit-id --submodule=log HEAD >actual &&
+       cat >expected <<-EOF &&
+       Submodule sm2 $smhead1...$smhead2 (not initialized)
+       EOF
+       test_cmp expected actual
+
+'
+
+test_done
diff --git c/t/t4059-diff-submodule-option-diff-format.sh 
w/t/t4060-diff-submodule-option-diff-format.sh
similarity index 95%
rename from t/t4059-diff-submodule-option-diff-format.sh
rename to t/t4060-diff-submodule-option-diff-format.sh
index 88484f1ba847..836caef5c8ba 100755
--- c/t/t4059-diff-submodule-option-diff-format.sh
+++ w/t/t4060-diff-submodule-option-diff-format.sh
@@ -50,7 +50,7 @@ test_expect_success 'added submodule' '
        git add sm1 &&
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 0000000...1beffeb (new submodule)
+       Submodule sm1 0000000...$head1 (new submodule)
        diff --git a/sm1/foo1 b/sm1/foo1
        new file mode 100644
        index 0000000..1715acd
@@ -70,13 +70,26 @@ test_expect_success 'added submodule' '
 '
 
 test_expect_success 'added submodule, set diff.submodule' '
-       git config diff.submodule log &&
+       test_config diff.submodule log &&
        git add sm1 &&
-       git diff --cached >actual &&
+       git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
        Submodule sm1 0000000...$head1 (new submodule)
+       diff --git a/sm1/foo1 b/sm1/foo1
+       new file mode 100644
+       index 0000000..1715acd
+       --- /dev/null
+       +++ b/sm1/foo1
+       @@ -0,0 +1 @@
+       +foo1
+       diff --git a/sm1/foo2 b/sm1/foo2
+       new file mode 100644
+       index 0000000..54b060e
+       --- /dev/null
+       +++ b/sm1/foo2
+       @@ -0,0 +1 @@
+       +foo2
        EOF
-       git config --unset diff.submodule &&
        test_cmp expected actual
 '
 
@@ -117,7 +130,7 @@ head2=$(add_file sm1 foo3)
 test_expect_success 'modified submodule(forward)' '
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 1beffeb..30b9670:
+       Submodule sm1 $head1..$head2:
        diff --git a/sm1/foo3 b/sm1/foo3
        new file mode 100644
        index 0000000..c1ec6c6
@@ -132,7 +145,7 @@ test_expect_success 'modified submodule(forward)' '
 test_expect_success 'modified submodule(forward)' '
        git diff --submodule=diff >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 1beffeb..30b9670:
+       Submodule sm1 $head1..$head2:
        diff --git a/sm1/foo3 b/sm1/foo3
        new file mode 100644
        index 0000000..c1ec6c6
@@ -178,7 +191,7 @@ head3=$(
 test_expect_success 'modified submodule(backward)' '
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 30b9670..dafb207 (rewind):
+       Submodule sm1 $head2..$head3 (rewind):
        diff --git a/sm1/foo2 b/sm1/foo2
        deleted file mode 100644
        index 54b060e..0000000
@@ -201,7 +214,7 @@ head4=$(add_file sm1 foo4 foo5)
 test_expect_success 'modified submodule(backward and forward)' '
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 30b9670...d176589:
+       Submodule sm1 $head2...$head4:
        diff --git a/sm1/foo2 b/sm1/foo2
        deleted file mode 100644
        index 54b060e..0000000
@@ -245,7 +258,7 @@ mv sm1-bak sm1
 test_expect_success 'typechanged submodule(submodule->blob), --cached' '
        git diff --submodule=diff --cached >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 d176589...0000000 (submodule deleted)
+       Submodule sm1 $head4...0000000 (submodule deleted)
        diff --git a/sm1/foo1 b/sm1/foo1
        deleted file mode 100644
        index 1715acd..0000000
@@ -288,7 +301,7 @@ test_expect_success 'typechanged 
submodule(submodule->blob)' '
        +++ /dev/null
        @@ -1 +0,0 @@
        -sm1
-       Submodule sm1 0000000...d176589 (new submodule)
+       Submodule sm1 0000000...$head4 (new submodule)
        diff --git a/sm1/foo1 b/sm1/foo1
        new file mode 100644
        index 0000000..1715acd
@@ -322,7 +335,7 @@ test_expect_success 'typechanged 
submodule(submodule->blob)' '
        Submodule sm1 $head4...0000000 (submodule deleted)
        diff --git a/sm1 b/sm1
        new file mode 100644
-       index 0000000..$head5
+       index 0000000..9da5fb8
        --- /dev/null
        +++ b/sm1
        @@ -0,0 +1 @@
@@ -338,7 +351,7 @@ fullhead6=$(cd sm1; git rev-parse --verify HEAD)
 test_expect_success 'nonexistent commit' '
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 d176589...17243c9 (commits not present)
+       Submodule sm1 $head4...$head6 (commits not present)
        EOF
        test_cmp expected actual
 '
@@ -354,7 +367,7 @@ test_expect_success 'typechanged 
submodule(blob->submodule)' '
        +++ /dev/null
        @@ -1 +0,0 @@
        -sm1
-       Submodule sm1 0000000...17243c9 (new submodule)
+       Submodule sm1 0000000...$head6 (new submodule)
        diff --git a/sm1/foo6 b/sm1/foo6
        new file mode 100644
        index 0000000..462398b
@@ -472,7 +485,7 @@ head8=$(cd sm1; git rev-parse --short --verify HEAD) &&
 test_expect_success 'submodule is modified' '
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 17243c9..cfce562:
+       Submodule sm1 17243c9..$head8:
        diff --git a/sm1/foo6 b/sm1/foo6
        index 462398b..3e75765 100644
        --- a/sm1/foo6
@@ -489,7 +502,7 @@ test_expect_success 'modified submodule contains untracked 
content' '
        git diff-index -p --submodule=diff HEAD >actual &&
        cat >expected <<-EOF &&
        Submodule sm1 contains untracked content
-       Submodule sm1 17243c9..cfce562:
+       Submodule sm1 17243c9..$head8:
        diff --git a/sm1/foo6 b/sm1/foo6
        index 462398b..3e75765 100644
        --- a/sm1/foo6
@@ -504,7 +517,7 @@ test_expect_success 'modified submodule contains untracked 
content' '
 test_expect_success 'modified submodule contains untracked content (untracked 
ignored)' '
        git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD 
>actual &&
        cat >expected <<-EOF &&
-       Submodule sm1 17243c9..cfce562:
+       Submodule sm1 17243c9..$head8:
        diff --git a/sm1/foo6 b/sm1/foo6
        index 462398b..3e75765 100644
        --- a/sm1/foo6

------>8

Jacob Keller (7):
  graph: add support for --line-prefix on all graph-aware output
  diff: prepare for additional submodule formats
  submodule: allow add_submodule_odb to work even if path is not checked
    out
  submodule: convert show_submodule_summary to use struct object_id *
  submodule: refactor show_submodule_summary with helper function
  cache: add empty_tree_oid object
  diff: teach diff to display submodule difference with an inline diff

Junio C Hamano (1):
  diff.c: remove output_prefix_length field

 Documentation/diff-config.txt                      |   9 +-
 Documentation/diff-options.txt                     |  20 +-
 builtin/rev-list.c                                 |  70 +-
 cache.h                                            |   2 +
 diff.c                                             |  64 +-
 diff.h                                             |  11 +-
 graph.c                                            | 100 ++-
 graph.h                                            |  22 +-
 log-tree.c                                         |   5 +-
 path.c                                             |   5 +
 sha1_file.c                                        |   3 +
 submodule.c                                        | 178 ++++-
 submodule.h                                        |   8 +-
 t/t4013-diff-various.sh                            |   6 +
 ...diff.diff_--line-prefix=abc_master_master^_side |  29 +
 t/t4013/diff.diff_--line-prefix_--cached_--_file0  |  15 +
 t/t4059-diff-submodule-not-initialized.sh          | 105 +++
 t/t4060-diff-submodule-option-diff-format.sh       | 746 +++++++++++++++++++++
 t/t4202-log.sh                                     | 323 +++++++++
 19 files changed, 1569 insertions(+), 152 deletions(-)
 create mode 100644 t/t4013/diff.diff_--line-prefix=abc_master_master^_side
 create mode 100644 t/t4013/diff.diff_--line-prefix_--cached_--_file0
 create mode 100755 t/t4059-diff-submodule-not-initialized.sh
 create mode 100755 t/t4060-diff-submodule-option-diff-format.sh

-- 
2.10.0.rc0.217.g609f9e8.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to