From 9605ad02c9dcb7cd50e064f654149071784e1e5a Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 28 May 2018 16:32:37 +0300 Subject: Add mirroring to remote repository --- server/mrrepo | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 3 deletions(-) diff --git a/server/mrrepo b/server/mrrepo index 5e7d0fb..aae1e54 100755 --- a/server/mrrepo +++ b/server/mrrepo @@ -6,7 +6,23 @@ # # Will first download (via http or https if -s specified) the manifest file # from git.example.org which should list all publicly available repositories. -# It will then mirror each repository in /var/scm using the git protocol. +# It will then mirror each remote repository in /var/scm locally, using the +# git protocol. +# +# Afterwards it may mirror it further to a remote repository that can be +# specified in the manifest file. If mirroring via https, then you also most +# likely need to provide credentials for the remote https URLs in the +# mrrepo-config file. This file should be placed next to and will be sourced +# by the mrrepo script (remember to adjust its permissions). +# +# The manifest file line format (lines starting with # are ignored): +# +# [ ] +# +# To specify another credential for a URL add the following line to +# mrrepo-config: +# +# credentials['']=':' # # -v # Run verbose. @@ -68,6 +84,19 @@ if [ ! -d "$path" ]; then error "$path is not a directory" fi +declare -A credentials +config="$(realpath "${BASH_SOURCE[0]}")-config" + +if [ -f "$config" ]; then + source "$config" + + for p in "${!credentials[@]}"; do + if [ "${p:0:8}" != "https://" ]; then + error "https protocol is expected for '$p' in '$config'" + fi + done +fi + cd "$path" curl_ops=() @@ -93,10 +122,44 @@ function fetch () # [] fetch "$prot://$host/manifest" -z manifest -o manifest +function field () # [] +{ + local r + r="$(echo "$1 " | cut -d ' ' -f "$2")" + + if [ "$3" -a -z "$r" ]; then + error "field <$3> (#$2) missing in '$1'" + fi + echo "$r" +} + +# Collect new repositories (in the new array) and while at it fix up remote +# URLs with credentials (in the remotes map). +# new=() -while read r || [ -n "$r" ]; do +declare -A remotes + +while read l || [ -n "$l" ]; do + r=$(field "$l" 1 'path') + u=$(field "$l" 2) + new+=("$r") -done