Re: [RFC/PATCH 1/5] Makefile: move long inline shell loops in "install" into helper
On Mon, Nov 12 2018, Johannes Schindelin wrote: > Hi Ævar, > > On Mon, 12 Nov 2018, Ævar Arnfjörð Bjarmason wrote: > >> On Mon, Nov 12 2018, Johannes Schindelin wrote: >> >> > On Fri, 2 Nov 2018, Ævar Arnfjörð Bjarmason wrote: >> > >> >> Move a 37 line for-loop mess out of "install" and into a helper >> >> script. This started out fairly innocent but over the years has grown >> >> into a hard-to-maintain monster, and my recent ad874608d8 ("Makefile: >> >> optionally symlink libexec/git-core binaries to bin/git", 2018-03-13) >> >> certainly didn't help. >> >> >> >> The shell code is ported pretty much as-is (with getopts added), it'll >> >> be fixed & prettified in subsequent commits. >> >> >> >> Signed-off-by: Ævar Arnfjörð Bjarmason >> >> --- >> >> Makefile | 52 >> >> install_programs | 89 >> >> 2 files changed, 103 insertions(+), 38 deletions(-) >> >> create mode 100755 install_programs >> >> >> >> diff --git a/Makefile b/Makefile >> >> index bbfbb4292d..aa6ca1fa68 100644 >> >> --- a/Makefile >> >> +++ b/Makefile >> >> @@ -2808,44 +2808,20 @@ endif >> >> bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \ >> >> execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \ >> >> destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e >> >> 's|[^/][^/]*|..|g') && \ >> >> - { test "$$bindir/" = "$$execdir/" || \ >> >> - for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); >> >> do \ >> >> - $(RM) "$$execdir/$$p" && \ >> >> - test -n "$(INSTALL_SYMLINKS)" && \ >> >> - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" >> >> "$$execdir/$$p" || \ >> >> - { test -z >> >> "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ >> >> - ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ >> >> - cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \ >> >> - done; \ >> >> - } && \ >> >> - for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ >> >> - $(RM) "$$bindir/$$p" && \ >> >> - test -n "$(INSTALL_SYMLINKS)" && \ >> >> - ln -s "git$X" "$$bindir/$$p" || \ >> >> - { test -z "$(NO_INSTALL_HARDLINKS)" && \ >> >> - ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ >> >> - ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ >> >> - cp "$$bindir/git$X" "$$bindir/$$p" || exit; } \ >> >> - done && \ >> >> - for p in $(BUILT_INS); do \ >> >> - $(RM) "$$execdir/$$p" && \ >> >> - test -n "$(INSTALL_SYMLINKS)" && \ >> >> - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" >> >> "$$execdir/$$p" || \ >> >> - { test -z "$(NO_INSTALL_HARDLINKS)" && \ >> >> - ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ >> >> - ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ >> >> - cp "$$execdir/git$X" "$$execdir/$$p" || exit; } \ >> >> - done && \ >> >> - remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ >> >> - for p in $$remote_curl_aliases; do \ >> >> - $(RM) "$$execdir/$$p" && \ >> >> - test -n "$(INSTALL_SYMLINKS)" && \ >> >> - ln -s "git-remote-http$X" "$$execdir/$$p" || \ >> >> - { test -z "$(NO_INSTALL_HARDLINKS)" && \ >> >> - ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null >> >> || \ >> >> - ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ >> >> - cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ >> >> - done && \ >> > >> > This indeed looks like a mess... >> > >> >> + ./install_programs \ >> >> + --X="$$X" \ >> >> + --RM="$(RM)" \ >> >> + --bindir="$$bindir" \ >> >> + --bindir-relative="$(bindir_relative_SQ)" \ >> >> + --execdir="$$execdir" \ >> >> + --destdir-from-execdir="$$destdir_from_execdir_SQ" \ >> >> + --flag-install-symlinks="$(INSTALL_SYMLINKS)" \ >> >> + --flag-no-install-hardlinks="$(NO_INSTALL_HARDLINKS)" \ >> >> + >> >> --flag-no-cross-directory-hardlinks="$(NO_CROSS_DIRECTORY_HARDLINKS)" \ >> >> + --list-bindir-standalone="git$X $(filter >> >> $(install_bindir_programs),$(ALL_PROGRAMS))" \ >> >> + --list-bindir-git-dashed="$(filter >> >> $(install_bindir_programs),$(BUILT_INS))" \ >> >> + --list-execdir-git-dashed="$(BUILT_INS)" \ >> >> + --list-execdir-curl-aliases="$(REMOTE_CURL_ALIASES)" && \ >> >> ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" >> >> >> >> .PHONY: install-gitweb install-doc install-man install-man-perl >> >> install-html install-info install-pdf >> >> diff --git a/install_programs b/install_programs >> >> new file mode 100755 >> >> index 00..e287108112 >> >> --- /dev/null >> >> +++ b/install_programs >> >> @@ -0,0 +1,89 @@ >> >> +#!/bin/sh >> >> + >> >> +while test $# != 0 >> >> +do >> >> + case "$1" in >> >> + --X=*) >> >> +
Re: [RFC/PATCH 1/5] Makefile: move long inline shell loops in "install" into helper
Hi Ævar, On Mon, 12 Nov 2018, Ævar Arnfjörð Bjarmason wrote: > On Mon, Nov 12 2018, Johannes Schindelin wrote: > > > On Fri, 2 Nov 2018, Ævar Arnfjörð Bjarmason wrote: > > > >> Move a 37 line for-loop mess out of "install" and into a helper > >> script. This started out fairly innocent but over the years has grown > >> into a hard-to-maintain monster, and my recent ad874608d8 ("Makefile: > >> optionally symlink libexec/git-core binaries to bin/git", 2018-03-13) > >> certainly didn't help. > >> > >> The shell code is ported pretty much as-is (with getopts added), it'll > >> be fixed & prettified in subsequent commits. > >> > >> Signed-off-by: Ævar Arnfjörð Bjarmason > >> --- > >> Makefile | 52 > >> install_programs | 89 > >> 2 files changed, 103 insertions(+), 38 deletions(-) > >> create mode 100755 install_programs > >> > >> diff --git a/Makefile b/Makefile > >> index bbfbb4292d..aa6ca1fa68 100644 > >> --- a/Makefile > >> +++ b/Makefile > >> @@ -2808,44 +2808,20 @@ endif > >>bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \ > >>execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \ > >>destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e > >> 's|[^/][^/]*|..|g') && \ > >> - { test "$$bindir/" = "$$execdir/" || \ > >> -for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); > >> do \ > >> - $(RM) "$$execdir/$$p" && \ > >> - test -n "$(INSTALL_SYMLINKS)" && \ > >> - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" > >> "$$execdir/$$p" || \ > >> - { test -z > >> "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ > >> -ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ > >> -cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \ > >> -done; \ > >> - } && \ > >> - for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ > >> - $(RM) "$$bindir/$$p" && \ > >> - test -n "$(INSTALL_SYMLINKS)" && \ > >> - ln -s "git$X" "$$bindir/$$p" || \ > >> - { test -z "$(NO_INSTALL_HARDLINKS)" && \ > >> -ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ > >> -ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ > >> -cp "$$bindir/git$X" "$$bindir/$$p" || exit; } \ > >> - done && \ > >> - for p in $(BUILT_INS); do \ > >> - $(RM) "$$execdir/$$p" && \ > >> - test -n "$(INSTALL_SYMLINKS)" && \ > >> - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" > >> "$$execdir/$$p" || \ > >> - { test -z "$(NO_INSTALL_HARDLINKS)" && \ > >> -ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ > >> -ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ > >> -cp "$$execdir/git$X" "$$execdir/$$p" || exit; } \ > >> - done && \ > >> - remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ > >> - for p in $$remote_curl_aliases; do \ > >> - $(RM) "$$execdir/$$p" && \ > >> - test -n "$(INSTALL_SYMLINKS)" && \ > >> - ln -s "git-remote-http$X" "$$execdir/$$p" || \ > >> - { test -z "$(NO_INSTALL_HARDLINKS)" && \ > >> -ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null > >> || \ > >> -ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ > >> -cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ > >> - done && \ > > > > This indeed looks like a mess... > > > >> + ./install_programs \ > >> + --X="$$X" \ > >> + --RM="$(RM)" \ > >> + --bindir="$$bindir" \ > >> + --bindir-relative="$(bindir_relative_SQ)" \ > >> + --execdir="$$execdir" \ > >> + --destdir-from-execdir="$$destdir_from_execdir_SQ" \ > >> + --flag-install-symlinks="$(INSTALL_SYMLINKS)" \ > >> + --flag-no-install-hardlinks="$(NO_INSTALL_HARDLINKS)" \ > >> + > >> --flag-no-cross-directory-hardlinks="$(NO_CROSS_DIRECTORY_HARDLINKS)" \ > >> + --list-bindir-standalone="git$X $(filter > >> $(install_bindir_programs),$(ALL_PROGRAMS))" \ > >> + --list-bindir-git-dashed="$(filter > >> $(install_bindir_programs),$(BUILT_INS))" \ > >> + --list-execdir-git-dashed="$(BUILT_INS)" \ > >> + --list-execdir-curl-aliases="$(REMOTE_CURL_ALIASES)" && \ > >>./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" > >> > >> .PHONY: install-gitweb install-doc install-man install-man-perl > >> install-html install-info install-pdf > >> diff --git a/install_programs b/install_programs > >> new file mode 100755 > >> index 00..e287108112 > >> --- /dev/null > >> +++ b/install_programs > >> @@ -0,0 +1,89 @@ > >> +#!/bin/sh > >> + > >> +while test $# != 0 > >> +do > >> + case "$1" in > >> + --X=*) > >> + X="${1#--X=}" > >> + ;; > >> + --RM=*) > >> + RM="${1#--RM=}" > >> + ;;
Re: [RFC/PATCH 1/5] Makefile: move long inline shell loops in "install" into helper
On Mon, Nov 12 2018, Johannes Schindelin wrote: > Hi, > > On Fri, 2 Nov 2018, Ævar Arnfjörð Bjarmason wrote: > >> Move a 37 line for-loop mess out of "install" and into a helper >> script. This started out fairly innocent but over the years has grown >> into a hard-to-maintain monster, and my recent ad874608d8 ("Makefile: >> optionally symlink libexec/git-core binaries to bin/git", 2018-03-13) >> certainly didn't help. >> >> The shell code is ported pretty much as-is (with getopts added), it'll >> be fixed & prettified in subsequent commits. >> >> Signed-off-by: Ævar Arnfjörð Bjarmason >> --- >> Makefile | 52 >> install_programs | 89 >> 2 files changed, 103 insertions(+), 38 deletions(-) >> create mode 100755 install_programs >> >> diff --git a/Makefile b/Makefile >> index bbfbb4292d..aa6ca1fa68 100644 >> --- a/Makefile >> +++ b/Makefile >> @@ -2808,44 +2808,20 @@ endif >> bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \ >> execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \ >> destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e >> 's|[^/][^/]*|..|g') && \ >> -{ test "$$bindir/" = "$$execdir/" || \ >> - for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); >> do \ >> -$(RM) "$$execdir/$$p" && \ >> -test -n "$(INSTALL_SYMLINKS)" && \ >> -ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" >> "$$execdir/$$p" || \ >> -{ test -z >> "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ >> - ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ >> - cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \ >> - done; \ >> -} && \ >> -for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ >> -$(RM) "$$bindir/$$p" && \ >> -test -n "$(INSTALL_SYMLINKS)" && \ >> -ln -s "git$X" "$$bindir/$$p" || \ >> -{ test -z "$(NO_INSTALL_HARDLINKS)" && \ >> - ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ >> - ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ >> - cp "$$bindir/git$X" "$$bindir/$$p" || exit; } \ >> -done && \ >> -for p in $(BUILT_INS); do \ >> -$(RM) "$$execdir/$$p" && \ >> -test -n "$(INSTALL_SYMLINKS)" && \ >> -ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" >> "$$execdir/$$p" || \ >> -{ test -z "$(NO_INSTALL_HARDLINKS)" && \ >> - ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ >> - ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ >> - cp "$$execdir/git$X" "$$execdir/$$p" || exit; } \ >> -done && \ >> -remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ >> -for p in $$remote_curl_aliases; do \ >> -$(RM) "$$execdir/$$p" && \ >> -test -n "$(INSTALL_SYMLINKS)" && \ >> -ln -s "git-remote-http$X" "$$execdir/$$p" || \ >> -{ test -z "$(NO_INSTALL_HARDLINKS)" && \ >> - ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null >> || \ >> - ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ >> - cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ >> -done && \ > > This indeed looks like a mess... > >> +./install_programs \ >> +--X="$$X" \ >> +--RM="$(RM)" \ >> +--bindir="$$bindir" \ >> +--bindir-relative="$(bindir_relative_SQ)" \ >> +--execdir="$$execdir" \ >> +--destdir-from-execdir="$$destdir_from_execdir_SQ" \ >> +--flag-install-symlinks="$(INSTALL_SYMLINKS)" \ >> +--flag-no-install-hardlinks="$(NO_INSTALL_HARDLINKS)" \ >> + >> --flag-no-cross-directory-hardlinks="$(NO_CROSS_DIRECTORY_HARDLINKS)" \ >> +--list-bindir-standalone="git$X $(filter >> $(install_bindir_programs),$(ALL_PROGRAMS))" \ >> +--list-bindir-git-dashed="$(filter >> $(install_bindir_programs),$(BUILT_INS))" \ >> +--list-execdir-git-dashed="$(BUILT_INS)" \ >> +--list-execdir-curl-aliases="$(REMOTE_CURL_ALIASES)" && \ >> ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" >> >> .PHONY: install-gitweb install-doc install-man install-man-perl >> install-html install-info install-pdf >> diff --git a/install_programs b/install_programs >> new file mode 100755 >> index 00..e287108112 >> --- /dev/null >> +++ b/install_programs >> @@ -0,0 +1,89 @@ >> +#!/bin/sh >> + >> +while test $# != 0 >> +do >> +case "$1" in >> +--X=*) >> +X="${1#--X=}" >> +;; >> +--RM=*) >> +RM="${1#--RM=}" >> +;; >> +--bindir=*) >> +bindir="${1#--bindir=}" >> +;; >> +--bindir-relative=*) >> +
Re: [RFC/PATCH 1/5] Makefile: move long inline shell loops in "install" into helper
Hi, On Fri, 2 Nov 2018, Ævar Arnfjörð Bjarmason wrote: > Move a 37 line for-loop mess out of "install" and into a helper > script. This started out fairly innocent but over the years has grown > into a hard-to-maintain monster, and my recent ad874608d8 ("Makefile: > optionally symlink libexec/git-core binaries to bin/git", 2018-03-13) > certainly didn't help. > > The shell code is ported pretty much as-is (with getopts added), it'll > be fixed & prettified in subsequent commits. > > Signed-off-by: Ævar Arnfjörð Bjarmason > --- > Makefile | 52 > install_programs | 89 > 2 files changed, 103 insertions(+), 38 deletions(-) > create mode 100755 install_programs > > diff --git a/Makefile b/Makefile > index bbfbb4292d..aa6ca1fa68 100644 > --- a/Makefile > +++ b/Makefile > @@ -2808,44 +2808,20 @@ endif > bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \ > execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \ > destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e > 's|[^/][^/]*|..|g') && \ > - { test "$$bindir/" = "$$execdir/" || \ > - for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); > do \ > - $(RM) "$$execdir/$$p" && \ > - test -n "$(INSTALL_SYMLINKS)" && \ > - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" > "$$execdir/$$p" || \ > - { test -z > "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ > - ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ > - cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \ > - done; \ > - } && \ > - for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ > - $(RM) "$$bindir/$$p" && \ > - test -n "$(INSTALL_SYMLINKS)" && \ > - ln -s "git$X" "$$bindir/$$p" || \ > - { test -z "$(NO_INSTALL_HARDLINKS)" && \ > - ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ > - ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ > - cp "$$bindir/git$X" "$$bindir/$$p" || exit; } \ > - done && \ > - for p in $(BUILT_INS); do \ > - $(RM) "$$execdir/$$p" && \ > - test -n "$(INSTALL_SYMLINKS)" && \ > - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" > "$$execdir/$$p" || \ > - { test -z "$(NO_INSTALL_HARDLINKS)" && \ > - ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ > - ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ > - cp "$$execdir/git$X" "$$execdir/$$p" || exit; } \ > - done && \ > - remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ > - for p in $$remote_curl_aliases; do \ > - $(RM) "$$execdir/$$p" && \ > - test -n "$(INSTALL_SYMLINKS)" && \ > - ln -s "git-remote-http$X" "$$execdir/$$p" || \ > - { test -z "$(NO_INSTALL_HARDLINKS)" && \ > - ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null > || \ > - ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ > - cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ > - done && \ This indeed looks like a mess... > + ./install_programs \ > + --X="$$X" \ > + --RM="$(RM)" \ > + --bindir="$$bindir" \ > + --bindir-relative="$(bindir_relative_SQ)" \ > + --execdir="$$execdir" \ > + --destdir-from-execdir="$$destdir_from_execdir_SQ" \ > + --flag-install-symlinks="$(INSTALL_SYMLINKS)" \ > + --flag-no-install-hardlinks="$(NO_INSTALL_HARDLINKS)" \ > + > --flag-no-cross-directory-hardlinks="$(NO_CROSS_DIRECTORY_HARDLINKS)" \ > + --list-bindir-standalone="git$X $(filter > $(install_bindir_programs),$(ALL_PROGRAMS))" \ > + --list-bindir-git-dashed="$(filter > $(install_bindir_programs),$(BUILT_INS))" \ > + --list-execdir-git-dashed="$(BUILT_INS)" \ > + --list-execdir-curl-aliases="$(REMOTE_CURL_ALIASES)" && \ > ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" > > .PHONY: install-gitweb install-doc install-man install-man-perl install-html > install-info install-pdf > diff --git a/install_programs b/install_programs > new file mode 100755 > index 00..e287108112 > --- /dev/null > +++ b/install_programs > @@ -0,0 +1,89 @@ > +#!/bin/sh > + > +while test $# != 0 > +do > + case "$1" in > + --X=*) > + X="${1#--X=}" > + ;; > + --RM=*) > + RM="${1#--RM=}" > + ;; > + --bindir=*) > + bindir="${1#--bindir=}" > + ;; > + --bindir-relative=*) > + bindir_relative="${1#--bindir-relative=}" > + ;; > + --execdir=*) > + execdir="${1#--execdir=}" > +
Re: [RFC/PATCH 1/5] Makefile: move long inline shell loops in "install" into helper
'sb/filenames-with-dashes'On Fri, Nov 2, 2018 at 6:38 PM Ævar Arnfjörð Bjarmason wrote: > Move a 37 line for-loop mess out of "install" and into a helper > script. This started out fairly innocent but over the years has grown > into a hard-to-maintain monster, and my recent ad874608d8 ("Makefile: > optionally symlink libexec/git-core binaries to bin/git", 2018-03-13) > certainly didn't help. > > The shell code is ported pretty much as-is (with getopts added), it'll > be fixed & prettified in subsequent commits. > > Signed-off-by: Ævar Arnfjörð Bjarmason > --- > install_programs | 89 Pure nitpick: Earlier this year, Stefan made an effort[1] to eradicate filenames with underscores and replace them with hyphenated filenames. Perhaps name this "install-programs", instead. [1]: sb/filenames-with-dashes > diff --git a/install_programs b/install_programs > @@ -0,0 +1,89 @@ > +while test $# != 0 > +do > + case "$1" in > + --X=*) > + X="${1#--X=}" > + ;; > + --RM=*) > + RM="${1#--RM=}" > + ;; > + --bindir=*) > + bindir="${1#--bindir=}" > + ;; Is the intention that the user might have X, RM, 'bindir', etc. already in the environment, and the switches in this script merely override those values? Or is the intention that X, RM, 'bindir, etc. should all start out unset? If the latter, perhaps start the script with an initialization block which clears all these variables first: X= RM= bindir= ...
[RFC/PATCH 1/5] Makefile: move long inline shell loops in "install" into helper
Move a 37 line for-loop mess out of "install" and into a helper script. This started out fairly innocent but over the years has grown into a hard-to-maintain monster, and my recent ad874608d8 ("Makefile: optionally symlink libexec/git-core binaries to bin/git", 2018-03-13) certainly didn't help. The shell code is ported pretty much as-is (with getopts added), it'll be fixed & prettified in subsequent commits. Signed-off-by: Ævar Arnfjörð Bjarmason --- Makefile | 52 install_programs | 89 2 files changed, 103 insertions(+), 38 deletions(-) create mode 100755 install_programs diff --git a/Makefile b/Makefile index bbfbb4292d..aa6ca1fa68 100644 --- a/Makefile +++ b/Makefile @@ -2808,44 +2808,20 @@ endif bindir=$$(cd '$(DESTDIR_SQ)$(bindir_SQ)' && pwd) && \ execdir=$$(cd '$(DESTDIR_SQ)$(gitexec_instdir_SQ)' && pwd) && \ destdir_from_execdir_SQ=$$(echo '$(gitexecdir_relative_SQ)' | sed -e 's|[^/][^/]*|..|g') && \ - { test "$$bindir/" = "$$execdir/" || \ - for p in git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS)); do \ - $(RM) "$$execdir/$$p" && \ - test -n "$(INSTALL_SYMLINKS)" && \ - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/$$p" "$$execdir/$$p" || \ - { test -z "$(NO_INSTALL_HARDLINKS)$(NO_CROSS_DIRECTORY_HARDLINKS)" && \ - ln "$$bindir/$$p" "$$execdir/$$p" 2>/dev/null || \ - cp "$$bindir/$$p" "$$execdir/$$p" || exit; } \ - done; \ - } && \ - for p in $(filter $(install_bindir_programs),$(BUILT_INS)); do \ - $(RM) "$$bindir/$$p" && \ - test -n "$(INSTALL_SYMLINKS)" && \ - ln -s "git$X" "$$bindir/$$p" || \ - { test -z "$(NO_INSTALL_HARDLINKS)" && \ - ln "$$bindir/git$X" "$$bindir/$$p" 2>/dev/null || \ - ln -s "git$X" "$$bindir/$$p" 2>/dev/null || \ - cp "$$bindir/git$X" "$$bindir/$$p" || exit; } \ - done && \ - for p in $(BUILT_INS); do \ - $(RM) "$$execdir/$$p" && \ - test -n "$(INSTALL_SYMLINKS)" && \ - ln -s "$$destdir_from_execdir_SQ/$(bindir_relative_SQ)/git$X" "$$execdir/$$p" || \ - { test -z "$(NO_INSTALL_HARDLINKS)" && \ - ln "$$execdir/git$X" "$$execdir/$$p" 2>/dev/null || \ - ln -s "git$X" "$$execdir/$$p" 2>/dev/null || \ - cp "$$execdir/git$X" "$$execdir/$$p" || exit; } \ - done && \ - remote_curl_aliases="$(REMOTE_CURL_ALIASES)" && \ - for p in $$remote_curl_aliases; do \ - $(RM) "$$execdir/$$p" && \ - test -n "$(INSTALL_SYMLINKS)" && \ - ln -s "git-remote-http$X" "$$execdir/$$p" || \ - { test -z "$(NO_INSTALL_HARDLINKS)" && \ - ln "$$execdir/git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ - ln -s "git-remote-http$X" "$$execdir/$$p" 2>/dev/null || \ - cp "$$execdir/git-remote-http$X" "$$execdir/$$p" || exit; } \ - done && \ + ./install_programs \ + --X="$$X" \ + --RM="$(RM)" \ + --bindir="$$bindir" \ + --bindir-relative="$(bindir_relative_SQ)" \ + --execdir="$$execdir" \ + --destdir-from-execdir="$$destdir_from_execdir_SQ" \ + --flag-install-symlinks="$(INSTALL_SYMLINKS)" \ + --flag-no-install-hardlinks="$(NO_INSTALL_HARDLINKS)" \ + --flag-no-cross-directory-hardlinks="$(NO_CROSS_DIRECTORY_HARDLINKS)" \ + --list-bindir-standalone="git$X $(filter $(install_bindir_programs),$(ALL_PROGRAMS))" \ + --list-bindir-git-dashed="$(filter $(install_bindir_programs),$(BUILT_INS))" \ + --list-execdir-git-dashed="$(BUILT_INS)" \ + --list-execdir-curl-aliases="$(REMOTE_CURL_ALIASES)" && \ ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X" .PHONY: install-gitweb install-doc install-man install-man-perl install-html install-info install-pdf diff --git a/install_programs b/install_programs new file mode 100755 index 00..e287108112 --- /dev/null +++ b/install_programs @@ -0,0 +1,89 @@ +#!/bin/sh + +while test $# != 0 +do + case "$1" in + --X=*) + X="${1#--X=}" + ;; + --RM=*) + RM="${1#--RM=}" + ;; + --bindir=*) + bindir="${1#--bindir=}" + ;; + --bindir-relative=*) + bindir_relative="${1#--bindir-relative=}" + ;; + --execdir=*) + execdir="${1#--execdir=}" + ;; + --destdir-from-execdir=*) + destdir_from_execdir="${1#--destdir-from-execdir=}" + ;; + --flag-install-symlinks=*) +