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 <ava...@gmail.com>
---
 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 0000000000..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=*)
+               INSTALL_SYMLINKS="${1#--flag-install-symlinks=}"
+               ;;
+       --flag-no-install-hardlinks=*)
+               NO_INSTALL_HARDLINKS="${1#--flag-no-install-hardlinks=}"
+               ;;
+       --flag-no-cross-directory-hardlinks=*)
+               
NO_CROSS_DIRECTORY_HARDLINKS="${1#--flag-no-cross-directory-hardlinks=}"
+               ;;
+       --list-bindir-standalone=*)
+               list_bindir_standalone="${1#--list-bindir-standalone=}"
+               ;;
+       --list-bindir-git-dashed=*)
+               list_bindir_git_dashed="${1#--list-bindir-git-dashed=}"
+               ;;
+       --list-execdir-git-dashed=*)
+               list_execdir_git_dashed="${1#--list-execdir-git-dashed=}"
+               ;;
+       --list-execdir-curl-aliases=*)
+               list_execdir_curl_aliases="${1#--list-execdir-curl-aliases=}"
+               ;;
+
+       *)
+               echo "Unknown option $1"
+               exit 1
+               ;;
+       esac
+       shift
+done &&
+{ test "$bindir/" = "$execdir/" ||
+  for p in $list_bindir_standalone; do
+       $RM "$execdir/$p" &&
+       test -n "$INSTALL_SYMLINKS" &&
+       ln -s "$destdir_from_execdir/$bindir_relative/$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 $list_bindir_git_dashed; 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 $list_execdir_git_dashed; do
+       $RM "$execdir/$p" &&
+       test -n "$INSTALL_SYMLINKS" &&
+       ln -s "$destdir_from_execdir/$bindir_relative/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 &&
+for p in $list_execdir_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
-- 
2.19.1.930.g4563a0d9d0

Reply via email to