Merge branch 'js/misc-doc-fixes'
authorJunio C Hamano <gitster@pobox.com>
Wed, 8 May 2019 15:37:27 +0000 (00:37 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 8 May 2019 15:37:27 +0000 (00:37 +0900)
"make check-docs", "git help -a", etc. did not account for cases
where a particular build may deliberately omit some subcommands,
which has been corrected.

* js/misc-doc-fixes:
Turn `git serve` into a test helper
test-tool: handle the `-C <directory>` option just like `git`
check-docs: do not bother checking for legacy scripts' documentation
docs: exclude documentation for commands that have been excluded
check-docs: allow command-list.txt to contain excluded commands
help -a: do not list commands that are excluded from the build
Makefile: drop the NO_INSTALL variable
remote-testgit: move it into the support directory for t5801

1  2 
.gitignore
Documentation/.gitignore
Documentation/Makefile
Makefile
builtin.h
git.c
t/helper/test-tool.c
t/helper/test-tool.h
t/t5702-protocol-v2.sh
t/t5703-upload-pack-ref-in-want.sh
diff --combined .gitignore
index 44c74402c8c6dedfa24a9f5da6c596c7153b9d25,de8fc2f5b1a6434526c5af831e994aff33320971..2374f77a1aae580ed4f71d14e1383bd2dabebd27
@@@ -82,7 -82,7 +82,7 @@@
  /git-init-db
  /git-interpret-trailers
  /git-instaweb
 -/git-legacy-rebase
 +/git-legacy-stash
  /git-log
  /git-ls-files
  /git-ls-remote
  /git-remote-ftps
  /git-remote-fd
  /git-remote-ext
- /git-remote-testgit
  /git-remote-testpy
  /git-remote-testsvn
  /git-repack
diff --combined Documentation/.gitignore
index bf2bf271b5678895e94810dcbdca12b0dfb7de91,ea27148c598f925600f00f1af79f58fc9034f1a4..9022d4835545cbf40c9537efa8ca9a7678e42673
@@@ -13,4 -13,4 +13,5 @@@ mergetools-*.tx
  manpage-base-url.xsl
  SubmittingPatches.txt
  tmp-doc-diff/
 +GIT-ASCIIDOCFLAGS
+ /GIT-EXCLUDED-PROGRAMS
diff --combined Documentation/Makefile
index 6d738f831ebaf316ac79b6a3eb9c544cd18ea7c5,e22ea2f57c6543c8857a8c2dacd89914c6420219..dbf5a0f2762fba5c7d0fcf5f7ec322c413f2b779
@@@ -7,7 -7,10 +7,10 @@@ ARTICLES 
  SP_ARTICLES =
  OBSOLETE_HTML =
  
+ -include GIT-EXCLUDED-PROGRAMS
  MAN1_TXT += $(filter-out \
+               $(patsubst %,%.txt,$(EXCLUDED_PROGRAMS)) \
                $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
                $(wildcard git-*.txt))
  MAN1_TXT += git.txt
@@@ -331,15 -334,6 +334,15 @@@ mergetools-list.made: ../git-mergetool-
                show_tool_names can_merge "* " || :' >mergetools-merge.txt && \
        date >$@
  
 +TRACK_ASCIIDOCFLAGS = $(subst ','\'',$(ASCIIDOC_COMMON):$(ASCIIDOC_HTML):$(ASCIIDOC_DOCBOOK))
 +
 +GIT-ASCIIDOCFLAGS: FORCE
 +      @FLAGS='$(TRACK_ASCIIDOCFLAGS)'; \
 +          if test x"$$FLAGS" != x"`cat GIT-ASCIIDOCFLAGS 2>/dev/null`" ; then \
 +              echo >&2 "    * new asciidoc flags"; \
 +              echo "$$FLAGS" >GIT-ASCIIDOCFLAGS; \
 +            fi
 +
  clean:
        $(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7
        $(RM) *.texi *.texi+ *.texi++ git.info gitman.info
        $(RM) SubmittingPatches.txt
        $(RM) $(cmds_txt) $(mergetools_txt) *.made
        $(RM) manpage-base-url.xsl
 +      $(RM) GIT-ASCIIDOCFLAGS
  
 -$(MAN_HTML): %.html : %.txt asciidoc.conf
 +$(MAN_HTML): %.html : %.txt asciidoc.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
        $(TXT_TO_HTML) -d manpage -o $@+ $< && \
        mv $@+ $@
  
 -$(OBSOLETE_HTML): %.html : %.txto asciidoc.conf
 +$(OBSOLETE_HTML): %.html : %.txto asciidoc.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
        $(TXT_TO_HTML) -o $@+ $< && \
        mv $@+ $@
  manpage-base-url.xsl: manpage-base-url.xsl.in
        $(QUIET_GEN)sed "s|@@MAN_BASE_URL@@|$(MAN_BASE_URL)|" $< > $@
  
 -%.1 %.5 %.7 : %.xml manpage-base-url.xsl
 +%.1 %.5 %.7 : %.xml manpage-base-url.xsl $(wildcard manpage*.xsl)
        $(QUIET_XMLTO)$(RM) $@ && \
        $(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
  
 -%.xml : %.txt asciidoc.conf
 +%.xml : %.txt asciidoc.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
        $(TXT_TO_XML) -d manpage -o $@+ $< && \
        mv $@+ $@
  
 -user-manual.xml: user-manual.txt user-manual.conf
 +user-manual.xml: user-manual.txt user-manual.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
        $(TXT_TO_XML) -d book -o $@+ $< && \
        mv $@+ $@
@@@ -383,8 -376,7 +386,8 @@@ technical/api-index.txt: technical/api-
        $(QUIET_GEN)cd technical && '$(SHELL_PATH_SQ)' ./api-index.sh
  
  technical/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
 -$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt asciidoc.conf
 +$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt \
 +      asciidoc.conf GIT-ASCIIDOCFLAGS
        $(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
  
  SubmittingPatches.txt: SubmittingPatches
@@@ -441,7 -433,7 +444,7 @@@ $(patsubst %,%.html,$(ARTICLES)) : %.ht
  WEBDOC_DEST = /pub/software/scm/git/docs
  
  howto/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
 -$(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt
 +$(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt GIT-ASCIIDOCFLAGS
        $(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
        sed -e '1,/^$$/d' $< | \
        $(TXT_TO_HTML) - >$@+ && \
diff --combined Makefile
index 9f1b6e8926682c82530baa597794544b89d88c3a,9ce62fa2958b9fe3aefcf739d1b1ab56d0a9d3d8..5143cab9bdb2b303386074877838da3741ecc76d
+++ b/Makefile
@@@ -479,11 -479,7 +479,11 @@@ all:
  #
  # Define DEVELOPER to enable more compiler warnings. Compiler version
  # and family are auto detected, but could be overridden by defining
 -# COMPILER_FEATURES (see config.mak.dev)
 +# COMPILER_FEATURES (see config.mak.dev). You can still set
 +# CFLAGS="..." in combination with DEVELOPER enables, whether that's
 +# for tweaking something unrelated (e.g. optimization level), or for
 +# selectively overriding something DEVELOPER or one of the DEVOPTS
 +# (see just below) brings in.
  #
  # When DEVELOPER is set, DEVOPTS can be used to control compiler
  # options.  This variable contains keywords separated by
@@@ -510,8 -506,17 +510,8 @@@ GIT-VERSION-FILE: FORC
        @$(SHELL_PATH) ./GIT-VERSION-GEN
  -include GIT-VERSION-FILE
  
 -# CFLAGS and LDFLAGS are for the users to override from the command line.
 -
 -CFLAGS = -g -O2 -Wall
 -LDFLAGS =
 -ALL_CFLAGS = $(CPPFLAGS) $(CFLAGS)
 -ALL_LDFLAGS = $(LDFLAGS)
 -STRIP ?= strip
 -
 -# Create as necessary, replace existing, make ranlib unneeded.
 -ARFLAGS = rcs
 -
 +# Set our default configuration.
 +#
  # Among the variables below, these:
  #   gitexecdir
  #   template_dir
@@@ -556,7 -561,6 +556,7 @@@ perllibdir_relative = $(patsubst $(pref
  
  export prefix bindir sharedir sysconfdir gitwebdir perllibdir localedir
  
 +# Set our default programs
  CC = cc
  AR = ar
  RM = rm -f
@@@ -569,14 -573,29 +569,14 @@@ TCLTK_PATH = wis
  XGETTEXT = xgettext
  MSGFMT = msgfmt
  CURL_CONFIG = curl-config
 -PTHREAD_LIBS = -lpthread
 -PTHREAD_CFLAGS =
  GCOV = gcov
 +STRIP = strip
  SPATCH = spatch
  
  export TCL_PATH TCLTK_PATH
  
 -# user customisation variable for 'sparse' target
 -SPARSE_FLAGS ?=
 -# internal/platform customisation variable for 'sparse'
 -SP_EXTRA_FLAGS =
 -
 -SPATCH_FLAGS = --all-includes --patch .
 -
 -
 -
 -### --- END CONFIGURATION SECTION ---
 -
 -# Those must not be GNU-specific; they are shared with perl/ which may
 -# be built by a different compiler. (Note that this is an artifact now
 -# but it still might be nice to keep that distinction.)
 -BASIC_CFLAGS = -I.
 -BASIC_LDFLAGS =
 +# Set our default LIBS variables
 +PTHREAD_LIBS = -lpthread
  
  # Guard against environment variables
  BUILTIN_OBJS =
@@@ -592,6 -611,7 +592,7 @@@ FUZZ_PROGRAMS 
  LIB_OBJS =
  PROGRAM_OBJS =
  PROGRAMS =
+ EXCLUDED_PROGRAMS =
  SCRIPT_PERL =
  SCRIPT_PYTHON =
  SCRIPT_SH =
@@@ -613,9 -633,9 +614,8 @@@ SCRIPT_SH += git-merge-one-file.s
  SCRIPT_SH += git-merge-resolve.sh
  SCRIPT_SH += git-mergetool.sh
  SCRIPT_SH += git-quiltimport.sh
 -SCRIPT_SH += git-legacy-rebase.sh
 +SCRIPT_SH += git-legacy-stash.sh
- SCRIPT_SH += git-remote-testgit.sh
  SCRIPT_SH += git-request-pull.sh
 -SCRIPT_SH += git-stash.sh
  SCRIPT_SH += git-submodule.sh
  SCRIPT_SH += git-web--browse.sh
  
@@@ -637,17 -657,11 +637,11 @@@ SCRIPT_PERL += git-svn.per
  
  SCRIPT_PYTHON += git-p4.py
  
- NO_INSTALL += git-remote-testgit
  # Generated files for scripts
  SCRIPT_SH_GEN = $(patsubst %.sh,%,$(SCRIPT_SH))
  SCRIPT_PERL_GEN = $(patsubst %.perl,%,$(SCRIPT_PERL))
  SCRIPT_PYTHON_GEN = $(patsubst %.py,%,$(SCRIPT_PYTHON))
  
- SCRIPT_SH_INS = $(filter-out $(NO_INSTALL),$(SCRIPT_SH_GEN))
- SCRIPT_PERL_INS = $(filter-out $(NO_INSTALL),$(SCRIPT_PERL_GEN))
- SCRIPT_PYTHON_INS = $(filter-out $(NO_INSTALL),$(SCRIPT_PYTHON_GEN))
  # Individual rules to allow e.g.
  # "make -C ../.. SCRIPT_PERL=contrib/foo/bar.perl build-perl-script"
  # from subdirectories like contrib/*/
@@@ -657,11 -671,11 +651,11 @@@ build-sh-script: $(SCRIPT_SH_GEN
  build-python-script: $(SCRIPT_PYTHON_GEN)
  
  .PHONY: install-perl-script install-sh-script install-python-script
- install-sh-script: $(SCRIPT_SH_INS)
+ install-sh-script: $(SCRIPT_SH_GEN)
        $(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
- install-perl-script: $(SCRIPT_PERL_INS)
+ install-perl-script: $(SCRIPT_PERL_GEN)
        $(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
- install-python-script: $(SCRIPT_PYTHON_INS)
+ install-python-script: $(SCRIPT_PYTHON_GEN)
        $(INSTALL) $^ '$(DESTDIR_SQ)$(gitexec_instdir_SQ)'
  
  .PHONY: clean-perl-script clean-sh-script clean-python-script
@@@ -672,9 -686,9 +666,9 @@@ clean-perl-script
  clean-python-script:
        $(RM) $(SCRIPT_PYTHON_GEN)
  
- SCRIPTS = $(SCRIPT_SH_INS) \
-         $(SCRIPT_PERL_INS) \
-         $(SCRIPT_PYTHON_INS) \
+ SCRIPTS = $(SCRIPT_SH_GEN) \
+         $(SCRIPT_PERL_GEN) \
+         $(SCRIPT_PYTHON_GEN) \
          git-instaweb
  
  ETAGS_TARGET = TAGS
@@@ -744,6 -758,7 +738,7 @@@ TEST_BUILTINS_OBJS += test-repository.
  TEST_BUILTINS_OBJS += test-revision-walking.o
  TEST_BUILTINS_OBJS += test-run-command.o
  TEST_BUILTINS_OBJS += test-scrap-cache-tree.o
+ TEST_BUILTINS_OBJS += test-serve-v2.o
  TEST_BUILTINS_OBJS += test-sha1.o
  TEST_BUILTINS_OBJS += test-sha1-array.o
  TEST_BUILTINS_OBJS += test-sha256.o
@@@ -753,7 -768,6 +748,7 @@@ TEST_BUILTINS_OBJS += test-string-list.
  TEST_BUILTINS_OBJS += test-submodule-config.o
  TEST_BUILTINS_OBJS += test-submodule-nested-repo-config.o
  TEST_BUILTINS_OBJS += test-subprocess.o
 +TEST_BUILTINS_OBJS += test-trace2.o
  TEST_BUILTINS_OBJS += test-urlmatch-normalization.o
  TEST_BUILTINS_OBJS += test-xml-encode.o
  TEST_BUILTINS_OBJS += test-wildmatch.o
@@@ -822,8 -836,7 +817,8 @@@ VCSSVN_LIB = vcs-svn/lib.
  
  GENERATED_H += command-list.h
  
 -LIB_H = $(shell $(FIND) . \
 +LIB_H := $(shell git ls-files '*.h' ':!t/' ':!Documentation/' 2>/dev/null || \
 +      $(FIND) . \
        -name .git -prune -o \
        -name t -prune -o \
        -name Documentation -prune -o \
@@@ -999,16 -1012,6 +994,16 @@@ LIB_OBJS += tempfile.
  LIB_OBJS += thread-utils.o
  LIB_OBJS += tmp-objdir.o
  LIB_OBJS += trace.o
 +LIB_OBJS += trace2.o
 +LIB_OBJS += trace2/tr2_cfg.o
 +LIB_OBJS += trace2/tr2_cmd_name.o
 +LIB_OBJS += trace2/tr2_dst.o
 +LIB_OBJS += trace2/tr2_sid.o
 +LIB_OBJS += trace2/tr2_tbuf.o
 +LIB_OBJS += trace2/tr2_tgt_event.o
 +LIB_OBJS += trace2/tr2_tgt_normal.o
 +LIB_OBJS += trace2/tr2_tgt_perf.o
 +LIB_OBJS += trace2/tr2_tls.o
  LIB_OBJS += trailer.o
  LIB_OBJS += transport.o
  LIB_OBJS += transport-helper.o
@@@ -1125,12 -1128,10 +1120,11 @@@ BUILTIN_OBJS += builtin/rev-parse.
  BUILTIN_OBJS += builtin/revert.o
  BUILTIN_OBJS += builtin/rm.o
  BUILTIN_OBJS += builtin/send-pack.o
- BUILTIN_OBJS += builtin/serve.o
  BUILTIN_OBJS += builtin/shortlog.o
  BUILTIN_OBJS += builtin/show-branch.o
  BUILTIN_OBJS += builtin/show-index.o
  BUILTIN_OBJS += builtin/show-ref.o
 +BUILTIN_OBJS += builtin/stash.o
  BUILTIN_OBJS += builtin/stripspace.o
  BUILTIN_OBJS += builtin/submodule--helper.o
  BUILTIN_OBJS += builtin/symbolic-ref.o
@@@ -1158,25 -1159,6 +1152,25 @@@ ifeq ($(wildcard sha1collisiondetection
  DC_SHA1_SUBMODULE = auto
  endif
  
 +# Set CFLAGS, LDFLAGS and other *FLAGS variables. These might be
 +# tweaked by config.* below as well as the command-line, both of
 +# which'll override these defaults.
 +CFLAGS = -g -O2 -Wall
 +LDFLAGS =
 +BASIC_CFLAGS = -I.
 +BASIC_LDFLAGS =
 +
 +# library flags
 +ARFLAGS = rcs
 +PTHREAD_CFLAGS =
 +
 +# For the 'sparse' target
 +SPARSE_FLAGS ?=
 +SP_EXTRA_FLAGS =
 +
 +# For the 'coccicheck' target
 +SPATCH_FLAGS = --all-includes --patch .
 +
  include config.mak.uname
  -include config.mak.autogen
  -include config.mak
@@@ -1185,9 -1167,6 +1179,9 @@@ ifdef DEVELOPE
  include config.mak.dev
  endif
  
 +ALL_CFLAGS = $(DEVELOPER_CFLAGS) $(CPPFLAGS) $(CFLAGS)
 +ALL_LDFLAGS = $(LDFLAGS)
 +
  comma := ,
  empty :=
  space := $(empty) $(empty)
@@@ -1198,7 -1177,6 +1192,7 @@@ BASIC_CFLAGS += -fsanitize=$(SANITIZE) 
  BASIC_CFLAGS += -fno-omit-frame-pointer
  ifneq ($(filter undefined,$(SANITIZERS)),)
  BASIC_CFLAGS += -DNO_UNALIGNED_LOADS
 +BASIC_CFLAGS += -DSHA1DC_FORCE_ALIGNED_ACCESS
  endif
  ifneq ($(filter leak,$(SANITIZERS)),)
  BASIC_CFLAGS += -DSUPPRESS_ANNOTATED_LEAKS
@@@ -1342,6 -1320,7 +1336,7 @@@ ifdef NO_CUR
        REMOTE_CURL_PRIMARY =
        REMOTE_CURL_ALIASES =
        REMOTE_CURL_NAMES =
+       EXCLUDED_PROGRAMS += git-http-fetch git-http-push
  else
        ifdef CURLDIR
                # Try "-Wl,-rpath=$(CURLDIR)/$(lib)" in such a case.
@@@ -1366,7 -1345,11 +1361,11 @@@ endi
        ifeq "$(curl_check)" "070908"
                ifndef NO_EXPAT
                        PROGRAM_OBJS += http-push.o
+               else
+                       EXCLUDED_PROGRAMS += git-http-push
                endif
+       else
+               EXCLUDED_PROGRAMS += git-http-push
        endif
        curl_check := $(shell (echo 072200; $(CURL_CONFIG) --vernum | sed -e '/^70[BC]/s/^/0/') 2>/dev/null | sort -r | sed -ne 2p)
        ifeq "$(curl_check)" "072200"
@@@ -1613,7 -1596,7 +1612,8 @@@ ifdef NO_INET_PTO
        BASIC_CFLAGS += -DNO_INET_PTON
  endif
  ifdef NO_UNIX_SOCKETS
 +      BASIC_CFLAGS += -DNO_UNIX_SOCKETS
+       EXCLUDED_PROGRAMS += git-credential-cache git-credential-cache--daemon
  else
        LIB_OBJS += unix-socket.o
        PROGRAM_OBJS += credential-cache.o
@@@ -2133,7 -2116,9 +2133,9 @@@ $(BUILT_INS): git$
  command-list.h: generate-cmdlist.sh command-list.txt
  
  command-list.h: $(wildcard Documentation/git*.txt) Documentation/*config.txt Documentation/config/*.txt
-       $(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh command-list.txt >$@+ && mv $@+ $@
+       $(QUIET_GEN)$(SHELL_PATH) ./generate-cmdlist.sh \
+               $(patsubst %,--exclude-program %,$(EXCLUDED_PROGRAMS)) \
+               command-list.txt >$@+ && mv $@+ $@
  
  SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
        $(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
@@@ -2381,7 -2366,7 +2383,7 @@@ els
  # should _not_ be included here, since they are necessary even when
  # building an object for the first time.
  
 -$(OBJECTS): $(LIB_H)
 +$(OBJECTS): $(LIB_H) $(GENERATED_H)
  endif
  
  exec-cmd.sp exec-cmd.s exec-cmd.o: GIT-PREFIX
@@@ -2466,6 -2451,14 +2468,14 @@@ $(VCSSVN_LIB): $(VCSSVN_OBJS
  
  export DEFAULT_EDITOR DEFAULT_PAGER
  
+ Documentation/GIT-EXCLUDED-PROGRAMS: FORCE
+       @EXCLUDED='EXCLUDED_PROGRAMS := $(EXCLUDED_PROGRAMS)'; \
+           if test x"$$EXCLUDED" != \
+               x"`cat Documentation/GIT-EXCLUDED-PROGRAMS 2>/dev/null`" ; then \
+               echo >&2 "    * new documentation flags"; \
+               echo "$$EXCLUDED" >Documentation/GIT-EXCLUDED-PROGRAMS; \
+             fi
  .PHONY: doc man man-perl html info pdf
  doc: man-perl
        $(MAKE) -C Documentation all
@@@ -2704,7 -2697,6 +2714,6 @@@ endi
  test_bindir_programs := $(patsubst %,bin-wrappers/%,$(BINDIR_PROGRAMS_NEED_X) $(BINDIR_PROGRAMS_NO_X) $(TEST_PROGRAMS_NEED_X))
  
  all:: $(TEST_PROGRAMS) $(test_bindir_programs)
- all:: $(NO_INSTALL)
  
  bin-wrappers/%: wrap-for-bin.sh
        @mkdir -p bin-wrappers
@@@ -2754,10 -2746,7 +2763,10 @@@ $(SP_OBJ): %.sp: %.c GIT-CFLAGS FORC
  sparse: $(SP_OBJ)
  
  GEN_HDRS := command-list.h unicode-width.h
 -EXCEPT_HDRS := $(GEN_HDRS) compat% xdiff%
 +EXCEPT_HDRS := $(GEN_HDRS) compat/% xdiff/%
 +ifndef GCRYPT_SHA256
 +      EXCEPT_HDRS += sha256/gcrypt.h
 +endif
  CHK_HDRS = $(filter-out $(EXCEPT_HDRS),$(patsubst ./%,%,$(LIB_H)))
  HCO = $(patsubst %.h,%.hco,$(CHK_HDRS))
  
@@@ -2991,7 -2980,7 +3000,7 @@@ rpm:
  
  artifacts-tar:: $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) $(OTHER_PROGRAMS) \
                GIT-BUILD-OPTIONS $(TEST_PROGRAMS) $(test_bindir_programs) \
-               $(NO_INSTALL) $(MOFILES)
+               $(MOFILES)
        $(QUIET_SUBDIR0)templates $(QUIET_SUBDIR1) \
                SHELL_PATH='$(SHELL_PATH_SQ)' PERL_PATH='$(PERL_PATH_SQ)'
        test -n "$(ARTIFACTS_DIRECTORY)"
@@@ -3040,7 -3029,7 +3049,7 @@@ clean: profile-clean coverage-clean coc
        $(RM) $(OBJECTS)
        $(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
        $(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
-       $(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
+       $(RM) $(TEST_PROGRAMS)
        $(RM) $(FUZZ_PROGRAMS)
        $(RM) -r bin-wrappers $(dep_dirs)
        $(RM) -r po/build/
        $(RM) $(GIT_TARNAME).tar.gz git-core_$(GIT_VERSION)-*.tar.gz
        $(RM) $(htmldocs).tar.gz $(manpages).tar.gz
        $(MAKE) -C Documentation/ clean
+       $(RM) Documentation/GIT-EXCLUDED-PROGRAMS
  ifndef NO_PERL
        $(MAKE) -C gitweb clean
        $(RM) -r perl/build/
@@@ -3084,7 -3074,7 +3094,7 @@@ check-docs:
                git-merge-octopus | git-merge-ours | git-merge-recursive | \
                git-merge-resolve | git-merge-subtree | \
                git-fsck-objects | git-init-db | \
-               git-remote-* | git-stage | \
+               git-remote-* | git-stage | git-legacy-* | \
                git-?*--?* ) continue ;; \
                esac ; \
                test -f "Documentation/$$v.txt" || \
                    -e 's/\.txt//'; \
        ) | while read how cmd; \
        do \
-               case " $(patsubst %$X,%,$(ALL_COMMANDS)) " in \
+               case " $(patsubst %$X,%,$(ALL_COMMANDS) $(EXCLUDED_PROGRAMS)) " in \
                *" $$cmd "*)    ;; \
                *) echo "removed but $$how: $$cmd" ;; \
                esac; \
diff --combined builtin.h
index b78ab6e30b26f6a079c2f747c3787ead04b57962,c48636e2448d8b7f6da3ae171766682dba0f4f1a..ac552ff0d2ce1cfb2d0036cc599d54311ebd3fb7
+++ b/builtin.h
@@@ -219,13 -219,11 +219,12 @@@ extern int cmd_rev_parse(int argc, cons
  extern int cmd_revert(int argc, const char **argv, const char *prefix);
  extern int cmd_rm(int argc, const char **argv, const char *prefix);
  extern int cmd_send_pack(int argc, const char **argv, const char *prefix);
- extern int cmd_serve(int argc, const char **argv, const char *prefix);
  extern int cmd_shortlog(int argc, const char **argv, const char *prefix);
  extern int cmd_show(int argc, const char **argv, const char *prefix);
  extern int cmd_show_branch(int argc, const char **argv, const char *prefix);
  extern int cmd_show_index(int argc, const char **argv, const char *prefix);
  extern int cmd_status(int argc, const char **argv, const char *prefix);
 +extern int cmd_stash(int argc, const char **argv, const char *prefix);
  extern int cmd_stripspace(int argc, const char **argv, const char *prefix);
  extern int cmd_submodule__helper(int argc, const char **argv, const char *prefix);
  extern int cmd_symbolic_ref(int argc, const char **argv, const char *prefix);
diff --combined git.c
index 50da125c60a317d820cec18767ef1fc88efd56bf,c58b067771cfd92593e4812ee373fd0e201b72a0..1bf9c94550d9c232de2f89ef0f2b5a661e43cd79
--- 1/git.c
--- 2/git.c
+++ b/git.c
@@@ -62,13 -62,6 +62,13 @@@ static int list_cmds(const char *spec
  {
        struct string_list list = STRING_LIST_INIT_DUP;
        int i;
 +      int nongit;
 +
 +      /*
 +      * Set up the repository so we can pick up any repo-level config (like
 +      * completion.commands).
 +      */
 +      setup_git_directory_gently(&nongit);
  
        while (*spec) {
                const char *sep = strchrnul(spec, ',');
@@@ -154,20 -147,16 +154,20 @@@ static int handle_options(const char **
                                git_set_exec_path(cmd + 1);
                        else {
                                puts(git_exec_path());
 +                              trace2_cmd_name("_query_");
                                exit(0);
                        }
                } else if (!strcmp(cmd, "--html-path")) {
                        puts(system_path(GIT_HTML_PATH));
 +                      trace2_cmd_name("_query_");
                        exit(0);
                } else if (!strcmp(cmd, "--man-path")) {
                        puts(system_path(GIT_MAN_PATH));
 +                      trace2_cmd_name("_query_");
                        exit(0);
                } else if (!strcmp(cmd, "--info-path")) {
                        puts(system_path(GIT_INFO_PATH));
 +                      trace2_cmd_name("_query_");
                        exit(0);
                } else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) {
                        use_pager = 1;
                        (*argv)++;
                        (*argc)--;
                } else if (skip_prefix(cmd, "--list-cmds=", &cmd)) {
 +                      trace2_cmd_name("_query_");
                        if (!strcmp(cmd, "parseopt")) {
                                struct string_list list = STRING_LIST_INIT_DUP;
                                int i;
@@@ -344,14 -332,9 +344,14 @@@ static int handle_alias(int *argcp, con
                        commit_pager_choice();
  
                        child.use_shell = 1;
 +                      child.trace2_child_class = "shell_alias";
                        argv_array_push(&child.args, alias_string + 1);
                        argv_array_pushv(&child.args, (*argv) + 1);
  
 +                      trace2_cmd_alias(alias_command, child.args.argv);
 +                      trace2_cmd_list_config();
 +                      trace2_cmd_name("_run_shell_alias_");
 +
                        ret = run_command(&child);
                        if (ret >= 0)   /* normal exit */
                                exit(ret);
                /* insert after command name */
                memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp);
  
 +              trace2_cmd_alias(alias_command, new_argv);
 +              trace2_cmd_list_config();
 +
                *argv = new_argv;
                *argcp += count - 1;
  
@@@ -437,8 -417,6 +437,8 @@@ static int run_builtin(struct cmd_struc
                setup_work_tree();
  
        trace_argv_printf(argv, "trace: built-in: git");
 +      trace2_cmd_name(p->cmd);
 +      trace2_cmd_list_config();
  
        validate_cache_entries(the_repository->index);
        status = p->fn(argc, argv, prefix);
@@@ -498,7 -476,7 +498,7 @@@ static struct cmd_struct commands[] = 
        { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE | NO_PARSEOPT },
        { "diff-index", cmd_diff_index, RUN_SETUP | NO_PARSEOPT },
        { "diff-tree", cmd_diff_tree, RUN_SETUP | NO_PARSEOPT },
 -      { "difftool", cmd_difftool, RUN_SETUP | NEED_WORK_TREE },
 +      { "difftool", cmd_difftool, RUN_SETUP_GENTLY },
        { "fast-export", cmd_fast_export, RUN_SETUP },
        { "fetch", cmd_fetch, RUN_SETUP },
        { "fetch-pack", cmd_fetch_pack, RUN_SETUP | NO_PARSEOPT },
        { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE },
        { "rm", cmd_rm, RUN_SETUP },
        { "send-pack", cmd_send_pack, RUN_SETUP },
-       { "serve", cmd_serve, RUN_SETUP },
        { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER },
        { "show", cmd_show, RUN_SETUP },
        { "show-branch", cmd_show_branch, RUN_SETUP },
        { "show-index", cmd_show_index },
        { "show-ref", cmd_show_ref, RUN_SETUP },
        { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE },
 +      /*
 +       * NEEDSWORK: Until the builtin stash is thoroughly robust and no
 +       * longer needs redirection to the stash shell script this is kept as
 +       * is, then should be changed to RUN_SETUP | NEED_WORK_TREE
 +       */
 +      { "stash", cmd_stash },
        { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE },
        { "stripspace", cmd_stripspace },
        { "submodule--helper", cmd_submodule__helper, RUN_SETUP | SUPPORT_SUPER_PREFIX | NO_PARSEOPT },
@@@ -694,14 -665,7 +693,14 @@@ static void execv_dashed_external(cons
        cmd.clean_on_exit = 1;
        cmd.wait_after_clean = 1;
        cmd.silent_exec_failure = 1;
 +      cmd.trace2_child_class = "dashed";
 +
 +      trace2_cmd_name("_run_dashed_");
  
 +      /*
 +       * The code in run_command() logs trace2 child_start/child_exit
 +       * events, so we do not need to report exec/exec_result events here.
 +       */
        trace_argv_printf(cmd.args.argv, "trace: exec:");
  
        /*
         * the program.
         */
        status = run_command(&cmd);
 +
 +      /*
 +       * If the child process ran and we are now going to exit, emit a
 +       * generic string as our trace2 command verb to indicate that we
 +       * launched a dashed command.
 +       */
        if (status >= 0)
                exit(status);
        else if (errno != ENOENT)
@@@ -742,43 -700,6 +741,43 @@@ static int run_argv(int *argcp, const c
                if (!done_alias)
                        handle_builtin(*argcp, *argv);
  
 +#if 0 // TODO In GFW, need to amend a7924b655e940b06cb547c235d6bed9767929673 to include trace2_ and _tr2 lines.
 +              else if (get_builtin(**argv)) {
 +                      struct argv_array args = ARGV_ARRAY_INIT;
 +                      int i;
 +
 +                      /*
 +                       * The current process is committed to launching a
 +                       * child process to run the command named in (**argv)
 +                       * and exiting.  Log a generic string as the trace2
 +                       * command verb to indicate this.  Note that the child
 +                       * process will log the actual verb when it runs.
 +                       */
 +                      trace2_cmd_name("_run_git_alias_");
 +
 +                      if (get_super_prefix())
 +                              die("%s doesn't support --super-prefix", **argv);
 +
 +                      commit_pager_choice();
 +
 +                      argv_array_push(&args, "git");
 +                      for (i = 0; i < *argcp; i++)
 +                              argv_array_push(&args, (*argv)[i]);
 +
 +                      trace_argv_printf(args.argv, "trace: exec:");
 +
 +                      /*
 +                       * if we fail because the command is not found, it is
 +                       * OK to return. Otherwise, we just pass along the status code.
 +                       */
 +                      i = run_command_v_opt_tr2(args.argv, RUN_SILENT_EXEC_FAILURE |
 +                                                RUN_CLEAN_ON_EXIT, "git_alias");
 +                      if (i >= 0 || errno != ENOENT)
 +                              exit(i);
 +                      die("could not execute builtin %s", **argv);
 +              }
 +#endif // a7924b655e940b06cb547c235d6bed9767929673
 +
                /* .. then try the external ones */
                execv_dashed_external(*argv);
  
diff --combined t/helper/test-tool.c
index 53c06932c45c17bcb2981c9b1cc081df8135dded,4bf3666b43d318820d847e9969d00105f41c5972..087a8c0cc9da64d7bc276c3870b2d0faba4c2627
@@@ -1,6 -1,11 +1,12 @@@
  #include "git-compat-util.h"
  #include "test-tool.h"
 +#include "trace2.h"
+ #include "parse-options.h"
+ static const char * const test_tool_usage[] = {
+       "test-tool [-C <directory>] <command [<arguments>...]]",
+       NULL
+ };
  
  struct test_cmd {
        const char *name;
@@@ -43,6 -48,7 +49,7 @@@ static struct test_cmd cmds[] = 
        { "revision-walking", cmd__revision_walking },
        { "run-command", cmd__run_command },
        { "scrap-cache-tree", cmd__scrap_cache_tree },
+       { "serve-v2", cmd__serve_v2 },
        { "sha1", cmd__sha1 },
        { "sha1-array", cmd__sha1_array },
        { "sha256", cmd__sha256 },
@@@ -52,7 -58,6 +59,7 @@@
        { "submodule-config", cmd__submodule_config },
        { "submodule-nested-repo-config", cmd__submodule_nested_repo_config },
        { "subprocess", cmd__subprocess },
 +      { "trace2", cmd__trace2 },
        { "urlmatch-normalization", cmd__urlmatch_normalization },
        { "xml-encode", cmd__xml_encode },
        { "wildmatch", cmd__wildmatch },
@@@ -75,17 -80,28 +82,30 @@@ static NORETURN void die_usage(void
  int cmd_main(int argc, const char **argv)
  {
        int i;
+       const char *working_directory = NULL;
+       struct option options[] = {
+               OPT_STRING('C', NULL, &working_directory, "directory",
+                          "change the working directory"),
+               OPT_END()
+       };
  
        BUG_exit_code = 99;
+       argc = parse_options(argc, argv, NULL, options, test_tool_usage,
+                            PARSE_OPT_STOP_AT_NON_OPTION |
+                            PARSE_OPT_KEEP_ARGV0);
        if (argc < 2)
                die_usage();
  
+       if (working_directory && chdir(working_directory) < 0)
+               die("Could not cd to '%s'", working_directory);
        for (i = 0; i < ARRAY_SIZE(cmds); i++) {
                if (!strcmp(cmds[i].name, argv[1])) {
                        argv++;
                        argc--;
 +                      trace2_cmd_name(cmds[i].name);
 +                      trace2_cmd_list_config();
                        return cmds[i].fn(argc, argv);
                }
        }
diff --combined t/helper/test-tool.h
index ffab4d19d701e79cac1283a749e03ae8cf437e2e,bc72370916e44e79eeae81d79bf16c036b77a763..7e703f3038ae433c7d8b4ef5af51d9781d6bfffb
@@@ -39,6 -39,7 +39,7 @@@ int cmd__repository(int argc, const cha
  int cmd__revision_walking(int argc, const char **argv);
  int cmd__run_command(int argc, const char **argv);
  int cmd__scrap_cache_tree(int argc, const char **argv);
+ int cmd__serve_v2(int argc, const char **argv);
  int cmd__sha1(int argc, const char **argv);
  int cmd__sha1_array(int argc, const char **argv);
  int cmd__sha256(int argc, const char **argv);
@@@ -48,7 -49,6 +49,7 @@@ int cmd__string_list(int argc, const ch
  int cmd__submodule_config(int argc, const char **argv);
  int cmd__submodule_nested_repo_config(int argc, const char **argv);
  int cmd__subprocess(int argc, const char **argv);
 +int cmd__trace2(int argc, const char **argv);
  int cmd__urlmatch_normalization(int argc, const char **argv);
  int cmd__xml_encode(int argc, const char **argv);
  int cmd__wildmatch(int argc, const char **argv);
diff --combined t/t5702-protocol-v2.sh
index dbb4cf8881490282a9f55f596a97b908db73df69,8691bfc52dafa545f5987b0d240ad965064f00cc..5b33f625dddeccce7ecd68b45f115a46f7fbe93a
@@@ -182,13 -182,6 +182,13 @@@ test_expect_success 'server-options ar
        grep "server-option=world" log
  '
  
 +test_expect_success 'warn if using server-option with ls-remote with legacy protocol' '
 +      test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -c protocol.version=0 \
 +              ls-remote -o hello -o world "file://$(pwd)/file_parent" master 2>err &&
 +
 +      test_i18ngrep "see protocol.version in" err &&
 +      test_i18ngrep "server options require protocol version 2 or later" err
 +'
  
  test_expect_success 'clone with file:// using protocol v2' '
        test_when_finished "rm -f log" &&
@@@ -258,40 -251,6 +258,40 @@@ test_expect_success 'server-options ar
        grep "server-option=world" log
  '
  
 +test_expect_success 'warn if using server-option with fetch with legacy protocol' '
 +      test_when_finished "rm -rf temp_child" &&
 +
 +      git init temp_child &&
 +
 +      test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -C temp_child -c protocol.version=0 \
 +              fetch -o hello -o world "file://$(pwd)/file_parent" master 2>err &&
 +
 +      test_i18ngrep "see protocol.version in" err &&
 +      test_i18ngrep "server options require protocol version 2 or later" err
 +'
 +
 +test_expect_success 'server-options are sent when cloning' '
 +      test_when_finished "rm -rf log myclone" &&
 +
 +      GIT_TRACE_PACKET="$(pwd)/log" git -c protocol.version=2 \
 +              clone --server-option=hello --server-option=world \
 +              "file://$(pwd)/file_parent" myclone &&
 +
 +      grep "server-option=hello" log &&
 +      grep "server-option=world" log
 +'
 +
 +test_expect_success 'warn if using server-option with clone with legacy protocol' '
 +      test_when_finished "rm -rf myclone" &&
 +
 +      test_must_fail env GIT_TEST_PROTOCOL_VERSION=0 git -c protocol.version=0 \
 +              clone --server-option=hello --server-option=world \
 +              "file://$(pwd)/file_parent" myclone 2>err &&
 +
 +      test_i18ngrep "see protocol.version in" err &&
 +      test_i18ngrep "server options require protocol version 2 or later" err
 +'
 +
  test_expect_success 'upload-pack respects config using protocol v2' '
        git init server &&
        write_script server/.git/hook <<-\EOF &&
@@@ -400,12 -359,13 +400,13 @@@ test_expect_success 'even with handcraf
        0000
        EOF
  
-       test_must_fail git -C server serve --stateless-rpc <in >/dev/null 2>err &&
+       test_must_fail test-tool -C server serve-v2 --stateless-rpc \
+               <in >/dev/null 2>err &&
        grep "unexpected line: .filter blob:none." err &&
  
        # Exercise to ensure that if advertised, filter works
        git -C server config uploadpack.allowfilter 1 &&
-       git -C server serve --stateless-rpc <in >/dev/null
+       test-tool -C server serve-v2 --stateless-rpc <in >/dev/null
  '
  
  test_expect_success 'default refspec is used to filter ref when fetchcing' '
@@@ -583,38 -543,7 +584,38 @@@ test_expect_success 'clone with http:/
        # Client requested to use protocol v2
        grep "Git-Protocol: version=2" log &&
        # Server responded using protocol v2
 -      grep "git< version 2" log
 +      grep "git< version 2" log &&
 +      # Verify that the chunked encoding sending codepath is NOT exercised
 +      ! grep "Send header: Transfer-Encoding: chunked" log
 +'
 +
 +test_expect_success 'clone big repository with http:// using protocol v2' '
 +      test_when_finished "rm -f log" &&
 +
 +      git init "$HTTPD_DOCUMENT_ROOT_PATH/big" &&
 +      # Ensure that the list of wants is greater than http.postbuffer below
 +      for i in $(test_seq 1 1500)
 +      do
 +              # do not use here-doc, because it requires a process
 +              # per loop iteration
 +              echo "commit refs/heads/too-many-refs-$i" &&
 +              echo "committer git <git@example.com> $i +0000" &&
 +              echo "data 0" &&
 +              echo "M 644 inline bla.txt" &&
 +              echo "data 4" &&
 +              echo "bla"
 +      done | git -C "$HTTPD_DOCUMENT_ROOT_PATH/big" fast-import &&
 +
 +      GIT_TRACE_PACKET="$(pwd)/log" GIT_TRACE_CURL="$(pwd)/log" git \
 +              -c protocol.version=2 -c http.postbuffer=65536 \
 +              clone "$HTTPD_URL/smart/big" big_child &&
 +
 +      # Client requested to use protocol v2
 +      grep "Git-Protocol: version=2" log &&
 +      # Server responded using protocol v2
 +      grep "git< version 2" log &&
 +      # Verify that the chunked encoding sending codepath is exercised
 +      grep "Send header: Transfer-Encoding: chunked" log
  '
  
  test_expect_success 'fetch with http:// using protocol v2' '
@@@ -728,4 -657,6 +729,4 @@@ test_expect_success 'when server does n
        test_i18ngrep "expected no other sections to be sent after no .ready." err
  '
  
 -stop_httpd
 -
  test_done
index b6a995e8579c91874d2850ca579f87bf93f40561,dd1cbd0dd67e307d497c3b6d3695ecb9b0a4c5a8..0951d1bbdc26d998cdca7ed491eca557d53b2ddf
@@@ -48,15 -48,15 +48,15 @@@ test_expect_success 'setup repository' 
  '
  
  test_expect_success 'config controls ref-in-want advertisement' '
-       git serve --advertise-capabilities >out &&
+       test-tool serve-v2 --advertise-capabilities >out &&
        ! grep -a ref-in-want out &&
  
        git config uploadpack.allowRefInWant false &&
-       git serve --advertise-capabilities >out &&
+       test-tool serve-v2 --advertise-capabilities >out &&
        ! grep -a ref-in-want out &&
  
        git config uploadpack.allowRefInWant true &&
-       git serve --advertise-capabilities >out &&
+       test-tool serve-v2 --advertise-capabilities >out &&
        grep -a ref-in-want out
  '
  
@@@ -70,7 -70,7 +70,7 @@@ test_expect_success 'invalid want-ref l
        0000
        EOF
  
-       test_must_fail git serve --stateless-rpc 2>out <in &&
+       test_must_fail test-tool serve-v2 --stateless-rpc 2>out <in &&
        grep "unknown ref" out
  '
  
@@@ -90,7 -90,7 +90,7 @@@ test_expect_success 'basic want-ref' 
        0000
        EOF
  
-       git serve --stateless-rpc >out <in &&
+       test-tool serve-v2 --stateless-rpc >out <in &&
        check_output
  '
  
@@@ -112,7 -112,7 +112,7 @@@ test_expect_success 'multiple want-ref 
        0000
        EOF
  
-       git serve --stateless-rpc >out <in &&
+       test-tool serve-v2 --stateless-rpc >out <in &&
        check_output
  '
  
@@@ -133,7 -133,7 +133,7 @@@ test_expect_success 'mix want and want-
        0000
        EOF
  
-       git serve --stateless-rpc >out <in &&
+       test-tool serve-v2 --stateless-rpc >out <in &&
        check_output
  '
  
@@@ -153,7 -153,7 +153,7 @@@ test_expect_success 'want-ref with ref 
        0000
        EOF
  
-       git serve --stateless-rpc >out <in &&
+       test-tool serve-v2 --stateless-rpc >out <in &&
        check_output
  '
  
@@@ -257,6 -257,8 +257,6 @@@ test_expect_success 'server loses a re
        test_i18ngrep "fatal: remote error: unknown ref refs/heads/raster" err
  '
  
 -stop_httpd
 -
  REPO="$(pwd)/repo"
  LOCAL_PRISTINE="$(pwd)/local_pristine"