doc-diff: always use oids inside worktree
authorJeff King <peff@peff.net>
Thu, 30 Aug 2018 08:12:03 +0000 (04:12 -0400)
committerJunio C Hamano <gitster@pobox.com>
Thu, 30 Aug 2018 17:09:05 +0000 (10:09 -0700)
The doc-diff script immediately resolves its two endpoints
to actual object ids, so that we can reuse cached results
even if they appear under a different name. But we still use
the original name the user fed us when running "git
checkout" in our temporary worktree. This can lead to
confusing results:

- the namespace inside the worktree is different than the
one outside. In particular, "./doc-diff origin HEAD"
will resolve HEAD inside the worktree, whose detached
HEAD will be pointing at origin! As a result, such a
diff would always be empty.

- worse, we will store this result under the oid we got by
resolving HEAD in the main worktree, thus polluting our
cache

- we didn't pass --detach, which meant that using a branch
name would cause us to actually check out that branch,
making it unavailable to other worktrees.

We can solve this by feeding the already-resolved object id
to git-checkout. That naturally forces a detached HEAD, but
just to make clear our expectation, let's explicitly pass
--detach.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/doc-diff
index 6e285e648cc15905bc2b3336b3a351dc076e2dca..c430fe7c99f20299d3ef0e317d2ea73b5501f4e2 100755 (executable)
@@ -82,7 +82,7 @@ generate_render_makefile () {
        done
 }
 
-# render_tree <dirname> <committish>
+# render_tree <committish_oid>
 render_tree () {
        # Skip install-man entirely if we already have an installed directory.
        # We can't rely on make here, since "install-man" unconditionally
@@ -92,7 +92,7 @@ render_tree () {
        # through.
        if ! test -d "$tmp/installed/$1"
        then
-               git -C "$tmp/worktree" checkout "$2" &&
+               git -C "$tmp/worktree" checkout --detach "$1" &&
                make -j$parallel -C "$tmp/worktree" \
                        GIT_VERSION=omitted \
                        SOURCE_DATE_EPOCH=0 \
@@ -112,6 +112,6 @@ render_tree () {
        fi
 }
 
-render_tree $from_oid "$from" &&
-render_tree $to_oid "$to" &&
+render_tree $from_oid &&
+render_tree $to_oid &&
 git -C $tmp/rendered diff --no-index "$@" $from_oid $to_oid