#!/bin/sh log() { echo $@ } err() { log $@ } fatal() { err $@ exit 1 } marker() { log "# ------------- [$cur/$n_projects] $@" } fat_marker() { log "# ==================================================== [$cur/$n_projects] $@" } config() { [ "$pdir" ] || { # guess pdir pdir=`pwd` while [ ! -r Makefile ] || ! grep -q some-random-string-to-id-this-makefile Makefile; do [ "$pdir" = / ] && fatal "didn't find \"proj\" in directory components" pdir=`dirname $pdir` done } [ "$pdirs" ] || { pdirs=`(cd $pdir; ls -d */.git 2>/dev/null | sed 's%/.git%%')` } n_projects=`echo $pdirs | wc -w` } run_git() { marker git "$@" # sadly, CentOS 7 has git 1.8.3.1, which doesn't support -C if [ "$1" = -C ]; then ( cd $2 shift 2 git "$@" ) return $? fi git "$@" } # ------------- commands run() {( local cmd=$1 local d shift config cd $pdir if [ "$PGIT_KEEP_GOING" != y ]; then set -e; fi for d in $pdirs; do cur=`expr $cur + 1` run_git -C $d $cmd "$@" done )} commit() {( local d do_cvs if [ "$1" = --cvs ]; then do_cvs=true shift fi config cd $pdir if [ "$PGIT_KEEP_GOING" != y ]; then set -e; fi for d in $pdirs; do cur=`expr $cur + 1` if run_git -C $d diff-index --quiet HEAD --; then log "Nothing to commit" continue fi run_git -C $d commit "$@" done )} clone() {( local p config cd $pdir local refspec=(${PGIT_CLONE_FROM_USER//:/ }) local fromuser=${refspec[0]} local fromref=${refspec[1]} local toref=${refspec[2]} local login=$JANWARE_USER local projects="$PGIT_CLONE_PROJECTS" local ignore="$PGIT_IGNORE" local thisdir="${0%/*}" local jw_projects="/usr/bin/python3 $thisdir/jw-projects.py" local create_remote_user_repos=false [ "$login" ] || login=`whoami` [ "$fromuser" ] || fromuser=`whoami` [ "$fromref" ] || fromref=master local git_srv_admin="$SSH $login@git.janware.com /opt/jw-build/bin/git-srv-admin.sh" local opts opts=$(getopt -o C --long create-remote-user-repo -n clone -- "$@") || fatal "Failed to parse options $@" eval set -- "$opts" while [ "$1" != -- ]; do case "$1" in -c | --create-remote-user-repos) create_remote_user_repos=true ;; *) fatal "Unknown option $1" ;; esac shift done if [ -z "$projects" ]; then projects=`$jw_projects list-repos --from-user $fromuser $remote_base` [ "$?" != 0 ] && exit 1 fi n_projects=`echo $projects | wc -w` if [ "$PGIT_KEEP_GOING" != y ]; then set -e; fi for p in $projects; do if echo $ignore | grep -q "\b$p\b"; then continue fi cur=`expr $cur + 1` local pullurl=$remote_base/$fromuser$remote_subpath/$p local pushurl=$remote_base/$login$remote_subpath/$p local curref="" fat_marker "Fetching project $p from user $fromuser" if [ "$fromuser" = "$login" ]; then if [ -d $p ]; then run_git -C $p pull --recurse-submodules=on-demand else run_git clone $remote_base/$fromuser$remote_subpath/$p fi else local remotename="jw-$fromuser" if [ -d $p ]; then run_git -C $p remote | grep -q "^$remotename$" || { run_git -C $p remote add $remotename $pullurl run_git -C $p remote set-url --push $remotename no_push } run_git -C $p fetch --prune --recurse-submodules=on-demand $remotename $fromref if [ "$toref" ]; then curref=`git -C $p branch --show-current` if [ "$curref" = "$toref" ]; then run_git -C $p pull --recurse-submodules=on-demand $remotename $fromref else run_git -C $p fetch --recurse-submodules=on-demand $remotename $fromref:$toref fi fi else # set -x run_git clone $remote_base/$fromuser$remote_subpath/$p run_git -C $p remote rename origin $remotename || fatal failed to rename remote in $p run_git -C $p remote set-url --push $remotename no_push if [ $create_remote_user_repos = true ]; then $git_srv_admin -u $login -j create-personal-project $p run_git -C $p remote add origin $pushurl run_git -C $p push --recurse-submodules=on-demand origin master $git_srv_admin -u $login -j update-descriptions $p run_git -C $p branch --set-upstream-to origin/master master fi fi fi run_git -C $p submodule update --init --recursive || fatal git submodule update failed in $p done )} diff() {( local d config cd $pdir for d in $pdirs; do cur=`expr $cur + 1` # marker $d run_git -C $d diff --src-prefix=$d/ --dst-prefix=$d/ "$@" done )} echo "running $0 $@ GIT_SSH=$GIT_SSH" >&2 SSH=ssh [ "$GIT_SSH" ] && SSH=$GIT_SSH remote_base="ssh://$login@git.janware.com/srv/git" while [ ${1:0:1} = - ]; do case $1 in '--remote-base') remote_base="$2" shift ;; esac shift done # Only janware.com ssh git supports subdirectories below users if [[ "$remote_base" =~ git.janware.com ]]; then remote_subpath="/proj" else remote_subpath="" fi cmd=$1 cur=0 shift case $cmd in clone|diff|commit) $cmd "$@" ;; *) run $cmd "$@" ;; esac