Merge branch 'es/worktree-forced-ops-fix'
authorJunio C Hamano <gitster@pobox.com>
Mon, 17 Sep 2018 20:53:59 +0000 (13:53 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 17 Sep 2018 20:53:59 +0000 (13:53 -0700)
Fix a bug in which the same path could be registered under multiple
worktree entries if the path was missing (for instance, was removed
manually). Also, as a convenience, expand the number of cases in
which --force is applicable.

* es/worktree-forced-ops-fix:
doc-diff: force worktree add
worktree: delete .git/worktrees if empty after 'remove'
worktree: teach 'remove' to override lock when --force given twice
worktree: teach 'move' to override lock when --force given twice
worktree: teach 'add' to respect --force for registered but missing path
worktree: disallow adding same path multiple times
worktree: prepare for more checks of whether path can become worktree
worktree: generalize delete_git_dir() to reduce code duplication
worktree: move delete_git_dir() earlier in file for upcoming new callers
worktree: don't die() in library function find_worktree()

1  2 
Documentation/doc-diff
diff --combined Documentation/doc-diff
index cece4fd537e6282c391ab6582bdd37f571ec4ee8,19d841ddeb31f2a8b1bc39e06f69f8e670add67c..dfd9418778a80a209e8ceb43aa94dbb4259f91db
@@@ -1,34 -1,21 +1,34 @@@
  #!/bin/sh
 +#
 +# Build two documentation trees and diff the resulting formatted output.
 +# Compared to a source diff, this can reveal mistakes in the formatting.
 +# For example:
 +#
 +#   ./doc-diff origin/master HEAD
 +#
 +# would show the differences introduced by a branch based on master.
  
  OPTIONS_SPEC="\
  doc-diff [options] <from> <to> [-- <diff-options>]
 +doc-diff (-c|--clean)
  --
  j=n   parallel argument to pass to make
  f     force rebuild; do not rely on cached results
 +c,clean       cleanup temporary working files
  "
  SUBDIRECTORY_OK=1
  . "$(git --exec-path)/git-sh-setup"
  
  parallel=
  force=
 +clean=
  while test $# -gt 0
  do
        case "$1" in
        -j)
                parallel=$2; shift ;;
 +      -c|--clean)
 +              clean=t ;;
        -f)
                force=t ;;
        --)
        shift
  done
  
 +cd_to_toplevel
 +tmp=Documentation/tmp-doc-diff
 +
 +if test -n "$clean"
 +then
 +      test $# -eq 0 || usage
 +      git worktree remove --force "$tmp/worktree" 2>/dev/null
 +      rm -rf "$tmp"
 +      exit 0
 +fi
 +
  if test -z "$parallel"
  then
        parallel=$(getconf _NPROCESSORS_ONLN 2>/dev/null)
@@@ -66,6 -42,9 +66,6 @@@ to=$1; shif
  from_oid=$(git rev-parse --verify "$from") || exit 1
  to_oid=$(git rev-parse --verify "$to") || exit 1
  
 -cd_to_toplevel
 -tmp=Documentation/tmp-doc-diff
 -
  if test -n "$force"
  then
        rm -rf "$tmp"
@@@ -75,7 -54,7 +75,7 @@@ f
  # results that don't differ between the two trees.
  if ! test -d "$tmp/worktree"
  then
-       git worktree add --detach "$tmp/worktree" "$from" &&
+       git worktree add -f --detach "$tmp/worktree" "$from" &&
        dots=$(echo "$tmp/worktree" | sed 's#[^/]*#..#g') &&
        ln -s "$dots/config.mak" "$tmp/worktree/config.mak"
  fi
@@@ -90,12 -69,12 +90,12 @@@ generate_render_makefile () 
                printf '%s: %s\n' "$dst" "$src"
                printf '\t@echo >&2 "  RENDER $(notdir $@)" && \\\n'
                printf '\tmkdir -p $(dir $@) && \\\n'
 -              printf '\tMANWIDTH=80 man -l $< >$@+ && \\\n'
 +              printf '\tMANWIDTH=80 man $< >$@+ && \\\n'
                printf '\tmv $@+ $@\n'
        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
        # 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 \
        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