diff mbox series

[2/7] help -a: do not list commands that are excluded from the build

Message ID 7dc5293e9e0f8997674b1273393f22954e72c4cd.1555070430.git.gitgitgadget@gmail.com (mailing list archive)
State New, archived
Headers show
Series Assorted Documentation-related fixes | expand

Commit Message

Philip Peterson via GitGitGadget April 12, 2019, noon UTC
From: Johannes Schindelin <johannes.schindelin@gmx.de>

When built with NO_CURL or with NO_UNIX_SOCKETS, some commands are
skipped from the build. It does not make sense to list them in the
output of `git help -a`, so let's just not.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---
 Makefile            | 14 ++++++++++++--
 generate-cmdlist.sh | 10 +++++++++-
 2 files changed, 21 insertions(+), 3 deletions(-)

Comments

Junio C Hamano April 15, 2019, 7:08 a.m. UTC | #1
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
writes:

> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>
> When built with NO_CURL or with NO_UNIX_SOCKETS, some commands are
> skipped from the build. It does not make sense to list them in the
> output of `git help -a`, so let's just not.

The objective makes sense quite a lot.

>  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)) \

Each whitespace separated token on $(EXCLUDED_PROGRAMS) is the name
of a program to be excluded and we know there is no funny characters
in it, hence quoing in "^$1 " (without protecting us against
funnies) is sufficient.

> +		command-list.txt >$@+ && mv $@+ $@
>  
>  SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
>  	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
> diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
> index 709d67405b..7867b99d19 100755
> --- a/generate-cmdlist.sh
> +++ b/generate-cmdlist.sh
> @@ -6,7 +6,7 @@ die () {
>  }
>  
>  command_list () {
> -	grep -v '^#' "$1"
> +	eval grep -ve '^#' $exclude_programs "$1"

The original protects against $IFS in the filename given as $1, but
with the eval that is no longer true.  We have been feeding the
constant "command-list.txt" to the program since its inception, and
I do not expect it to change, so this regression in defensiveness
does not matter in practice.  Also because # is prefixed with ^, the
unintended loss of quotes around it when the eval makes the shell
re-parse the generated command line would not make the remainder
into a comment.

But it does look brittle, and smells like a trap for less
experienced shell programmers to blindly copy & paste & tweak
without understanding what is going on, leading to bugs.

	eval "grep -v -e '^#' $exclude_programs" <"$1"

or something like that, perhaps?

> @@ -93,6 +93,14 @@ EOF
>  EOF
>  }
>  
> +exclude_programs=
> +while test "a$1" = "a--exclude-program"

s/a/z/g; if you want to pretend to be old-fashioned, but s/a//g;
should be sufficient in the modern world.

> +do
> +	shift
> +	exclude_programs="$exclude_programs -e \"^$1 \""
> +	shift
> +done

As I said, this part looks good enough given the things we feed as
parameters to --exclude-program option.

Thanks.
Johannes Schindelin April 18, 2019, 12:06 p.m. UTC | #2
Hi Junio,

On Mon, 15 Apr 2019, Junio C Hamano wrote:

> "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
> writes:
>
> >  SCRIPT_DEFINES = $(SHELL_PATH_SQ):$(DIFF_SQ):$(GIT_VERSION):\
> >  	$(localedir_SQ):$(NO_CURL):$(USE_GETTEXT_SCHEME):$(SANE_TOOL_PATH_SQ):\
> > diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
> > index 709d67405b..7867b99d19 100755
> > --- a/generate-cmdlist.sh
> > +++ b/generate-cmdlist.sh
> > @@ -6,7 +6,7 @@ die () {
> >  }
> >
> >  command_list () {
> > -	grep -v '^#' "$1"
> > +	eval grep -ve '^#' $exclude_programs "$1"
>
> The original protects against $IFS in the filename given as $1, but
> with the eval that is no longer true.  We have been feeding the
> constant "command-list.txt" to the program since its inception, and
> I do not expect it to change, so this regression in defensiveness
> does not matter in practice.  Also because # is prefixed with ^, the
> unintended loss of quotes around it when the eval makes the shell
> re-parse the generated command line would not make the remainder
> into a comment.
>
> But it does look brittle, and smells like a trap for less
> experienced shell programmers to blindly copy & paste & tweak
> without understanding what is going on, leading to bugs.
>
> 	eval "grep -v -e '^#' $exclude_programs" <"$1"
>
> or something like that, perhaps?

Yes! Thank you.

> > @@ -93,6 +93,14 @@ EOF
> >  EOF
> >  }
> >
> > +exclude_programs=
> > +while test "a$1" = "a--exclude-program"
>
> s/a/z/g; if you want to pretend to be old-fashioned, but s/a//g;
> should be sufficient in the modern world.

Don't you know, I always used "a" without realizing. You can see my
misdeed even in git-rebase--preserve-merges.sh. I won't fix it there,
though, as I hope that it'll be gone soon enough.

Will be fixed in the next iteration I send.

Thanks,
Dscho
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 26f8ed2228..8f3c477ab3 100644
--- a/Makefile
+++ b/Makefile
@@ -611,6 +611,7 @@  FUZZ_PROGRAMS =
 LIB_OBJS =
 PROGRAM_OBJS =
 PROGRAMS =
+EXCLUDED_PROGRAMS =
 SCRIPT_PERL =
 SCRIPT_PYTHON =
 SCRIPT_SH =
@@ -1323,6 +1324,7 @@  ifdef NO_CURL
 	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.
@@ -1347,7 +1349,11 @@  endif
 	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"
@@ -1593,7 +1599,9 @@  ifdef NO_INET_PTON
 	LIB_OBJS += compat/inet_pton.o
 	BASIC_CFLAGS += -DNO_INET_PTON
 endif
-ifndef NO_UNIX_SOCKETS
+ifdef NO_UNIX_SOCKETS
+	EXCLUDED_PROGRAMS += git-credential-cache git-credential-cache--daemon
+else
 	LIB_OBJS += unix-socket.o
 	PROGRAM_OBJS += credential-cache.o
 	PROGRAM_OBJS += credential-cache--daemon.o
@@ -2112,7 +2120,9 @@  $(BUILT_INS): git$X
 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):\
diff --git a/generate-cmdlist.sh b/generate-cmdlist.sh
index 709d67405b..7867b99d19 100755
--- a/generate-cmdlist.sh
+++ b/generate-cmdlist.sh
@@ -6,7 +6,7 @@  die () {
 }
 
 command_list () {
-	grep -v '^#' "$1"
+	eval grep -ve '^#' $exclude_programs "$1"
 }
 
 get_categories () {
@@ -93,6 +93,14 @@  EOF
 EOF
 }
 
+exclude_programs=
+while test "a$1" = "a--exclude-program"
+do
+	shift
+	exclude_programs="$exclude_programs -e \"^$1 \""
+	shift
+done
+
 echo "/* Automatically generated by generate-cmdlist.sh */
 struct cmdname_help {
 	const char *name;