diff options
Diffstat (limited to 'git-getall')
-rwxr-xr-x | git-getall | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/git-getall b/git-getall new file mode 100755 index 0000000..8e55a74 --- /dev/null +++ b/git-getall @@ -0,0 +1,105 @@ +#!/bin/sh +# +# Retrieve public web-interface for git repositories, +# then ensure that the same repository tree exists and +# is up to date in the current directory. +# Currently ONLY CGIT is supported for web scrapping. + +# user and repository informations +http_url="" +git_remote="" +git_user="git" +git_dir="." +git_branches="trunk master main" +# regexp patterns +pattern_before="<a class='button' href='" +pattern_after="'>" + +log() { + echo "[#] $@" +} + +usage() { + [[ ! -z ${1} ]] && log "${1}" + cat <<-EOF + usage: git-dlall [-ud] [-p git_repositories] -l http_url -r git_remote + EOF +} + +_git_setup() { + valid_branch="" + for branch in ${git_branches}; do + if git branch | grep "${branch}" >/dev/null; then + valid_branch="${branch}" + break + fi + done + # only continue if a valid principal branch is found + [ -z "${valid_branch}" ] && return 1 + + git pull origin "${valid_branch}" >/dev/null + git branch --set-upstream-to="origin/${valid_branch}" "${valid_branch}" >/dev/null +} + +main() { + # retrieve command line arguments + while getopts "d:l:r:u:" arg; do + case "${arg}" in + l) + http_url=${OPTARG} + ;; + d) + git_dir=${OPTARG} + ;; + u) + git_user=${OPTARG} + ;; + p) + git_repositories=${OPTARG} + ;; + r) + git_remote=${OPTARG} + ;; + *) + usage + exit 1 + ;; + esac + done + + # ensure required variables are not empty + if [ -z "${git_remote}" ] || [ -z "${http_url}" ]; then + usage "missing remote informations" + exit 1 + fi + + # ensure git root directory exists + if [ ! -d "${git_dir}" ]; then + mkdir "${git_dir}" + [ "${?}" -ne 0 ] && usage && exit 1 + fi + + # retrieve available repositories + http_content=$(curl --silent --insecure "${http_url}") + repo_list=$(echo "${http_content}" | grep -o "$pattern_before.*$pattern_after" | cut -d "'" -f 4) + + # sanitize repositories + for repository in ${repo_list}; do + repository="${repository#/}" + repositories="${repositories} ${repository%/}" + done + + # sync repository + for repository in ${repositories}; do + repository_fullpath="${git_dir}/${repository}" + if [ -d "${repository_fullpath}" ]; then + log "repository : ${repository}. check" + else + log "repository : ${repository}. clone" + git clone "${git_user}@${git_remote}:${repository}" "${repository_fullpath}" + fi + (cd "${repository_fullpath}" ; _git_setup) + done +} + +main $@ |