From: Bruno Haible Date: Sat, 6 Sep 2025 14:43:04 +0000 (+0200) Subject: gitsub.sh: Support URL redirections also for subcheckouts. X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e287b2aaf1f24ccaddbb814212816da7d876b6ea;p=thirdparty%2Fgnulib.git gitsub.sh: Support URL redirections also for subcheckouts. * top/gitsub.sh (func_expand): New function. (func_pull): Invoke it, and show a message about redirection. --- diff --git a/ChangeLog b/ChangeLog index 7e019dfb78..423cdd5be9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2025-09-06 Bruno Haible + + gitsub.sh: Support URL redirections also for subcheckouts. + * top/gitsub.sh (func_expand): New function. + (func_pull): Invoke it, and show a message about redirection. + 2025-09-05 Collin Funk quotearg: Remove an unused variable. diff --git a/top/gitsub.sh b/top/gitsub.sh index 37592904d9..6612d06bde 100755 --- a/top/gitsub.sh +++ b/top/gitsub.sh @@ -229,6 +229,57 @@ else submodule_names= fi +# func_expand URL +# Expands a repository URL, taking into account the git configuration. +# Output: +# - url expanded repository URL +# Test cases: +# After +# git config --global url.git://git.savannah.gnu.org/.insteadof git://git.git.savannah.gnu.org/ +# git config --global url.https://git.savannah.gnu.org/git/.insteadof https://https.git.savannah.gnu.org/git/ +# git config --global url.git://git.savannah.gnu.org/gnulib.git.insteadof https://github.com/coreutils/gnulib.git +# git config --global url.https://git.savannah.gnu.org/git/gnulib.git.insteadof https://github.com/coreutils/gnulib.git +# func_expand git://git.savannah.gnu.org/grep.git => url = git://git.git.savannah.gnu.org/grep.git +# func_expand git://git.savannah.gnu.org/gnulib.git => url = https://github.com/coreutils/gnulib.git +func_expand () +{ + url="$1" + # Iterate through all the elements of the configuration of the form + # url..insteadof = + # Note: $ git config get --url="$url" url.insteadof + # and $ git config --get-urlmatch url.insteadof "$url" + # are not useful here, because they return without + # returning . + longest_base= + longest_len=0 + for lhs in `git config --get-regexp --name-only '^url\..*\.insteadof$'`; do + base=`echo "$lhs" | sed -e 's/^url\.//' -e 's/\.insteadof$//'` + len=`printf '%s' "$base" | wc -c` + if test $len -gt $longest_len; then + case "$url" in + "$base"* ) longest_base="$base"; longest_len="$len" ;; + esac + fi + done + # Iterate through all the elements of the configuration of the form + # url..insteadof = + # this time with the right-hand sides. + if test $longest_len != 0; then + startpos=`expr $longest_len + 1` + urltail=`echo "$url" | cut -b "$startpos"-` + rewritten=` + git config --get-regexp '^url\..*\.insteadof$' \ + | while read lhs rhs; do + if test "$lhs" = url."$longest_base".insteadof; then + echo "$rhs$urltail" + fi + done` + if test -n "$rewritten"; then + url="$rewritten" + fi + fi +} + # func_validate SUBDIR # Verifies that the state on the file system is in sync with the declarations # in the configuration file. @@ -354,6 +405,13 @@ func_pull () fi else # The subdir does not yet exist. Create a plain checkout. + orig_url="$url" + func_expand "$url" + if test "$url" = "$orig_url"; then + func_note "Accessing $url" + else + func_note "Redirecting $orig_url => $url" + fi trap func_cleanup_current_git_clone HUP INT PIPE TERM git clone $2 "$url" "$path" || func_cleanup_current_git_clone trap - HUP INT PIPE TERM