diff --git a/make/projects-dir.mk b/make/projects-dir.mk index 08647bd9..dd80bcf3 100644 --- a/make/projects-dir.mk +++ b/make/projects-dir.mk @@ -116,14 +116,17 @@ endif PROJECTS_PY = $(TIME) python3 $(JWB_SCRIPT_DIR)/jw-projects.py --prefix $(shell pwd) $(PROJECTS_PY_EXTRA_OPTS) PROJECTS_PY_BUILD = $(PROJECTS_PY) build $(PROJECTS_PY_EXTRA_BUILD_OPTS) -PGIT_SH = /bin/bash $(JWB_SCRIPT_DIR)/pgit.sh -PGIT_SH_CLONE = $(PGIT_SH) clone -export PGIT_CLONE_FROM_USER = $(CLONE_FROM_USER) +PGIT_SH := /bin/bash $(JWB_SCRIPT_DIR)/pgit.sh +PGIT_SH_CLONE := $(PGIT_SH) clone +PGIT_SH_CLONE_DEFAULT := $(PGIT_SH_CLONE) +ifneq ($(CLONE_FROM_USER),) + PGIT_SH_CLONE_DEFAULT += --refspec $(CLONE_FROM_USER) +endif ifneq ($(OFFLINE_PROJECTS),) export PGIT_IGNORE = $(OFFLINE_PROJECTS) endif ifneq ($(JANWARE_USER),) - #PGIT_SH_CLONE += --create-remote-user-repos + #PGIT_SH_CLONE_DEFAULT += --create-remote-user-repos endif ifneq ($(origin PROJECTS_DIR_REMOTE_BASE),undefined) PGIT_SH += --remote-base $(PROJECTS_DIR_REMOTE_BASE) @@ -309,20 +312,20 @@ git-status: git-pull: $(SSH_WRAPPER_SH) - $(PGIT_SH_CLONE) + $(PGIT_SH_CLONE_DEFAULT) git-pull-mini: $(SSH_WRAPPER_SH) - PGIT_CLONE_PROJECTS="$(patsubst %/.git,%,$(wildcard $(addsuffix /.git,$(shell make -s build-order))))" $(PGIT_SH_CLONE) + PGIT_CLONE_PROJECTS="$(patsubst %/.git,%,$(wildcard $(addsuffix /.git,$(shell make -s build-order))))" $(PGIT_SH_CLONE_DEFAULT) git-pull-all: $(SSH_WRAPPER_SH) $(PGIT_SH) pull --all git-clone: $(SSH_WRAPPER_SH) - $(PGIT_SH_CLONE) + $(PGIT_SH_CLONE_DEFAULT) touch clone.done git-clone-%: $(SSH_WRAPPER_SH) - PGIT_CLONE_FROM_USER=$* $(PGIT_SH_CLONE) + $(PGIT_SH_CLONE_DEFAULT) git-show-non-master-branches: @$(PGIT_SH) branch 2>&1 | \ @@ -343,7 +346,7 @@ git-update-project-descriptions: $(SSH_WRAPPER_SH) $(GIT_SRV_ADMIN_SH) -j update-descriptions all git-pull-%: $(SSH_WRAPPER_SH) - PGIT_CLONE_FROM_USER=$* $(PGIT_SH_CLONE) + $(PGIT_SH_CLONE) --refspec "$*:master:master" git-commit: $(PGIT_SH) commit @@ -363,5 +366,5 @@ pull.done: $(filter-out $(UNAVAILABLE_TARGETS), clone.done) touch $@ clone.done: $(filter-out $(UNAVAILABLE_TARGETS),$(SSH_WRAPPER_SH)) - $(PGIT_SH_CLONE) + $(PGIT_SH_CLONE_DEFAULT) touch $@ diff --git a/scripts/pgit.sh b/scripts/pgit.sh index e54e7188..e1b14625 100644 --- a/scripts/pgit.sh +++ b/scripts/pgit.sh @@ -103,30 +103,28 @@ 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 long_opts="create-remote-user-repos" + local refspec=() + long_opts="$long_opts,refspec:" local opts - opts=$(getopt -o C --long create-remote-user-repos -n clone -- "$@") || fatal "Failed to parse options $@" + opts=$(getopt -o C --long "$long_opts" -n clone -- "$@") || fatal "Failed to parse options $@" eval set -- "$opts" while [ "$1" != -- ]; do case "$1" in - -c | --create-remote-user-repos) + -C | --create-remote-user-repos) create_remote_user_repos=true ;; + --refspec) + refspec=(${2//:/ }) + shift + ;; *) fatal "Unknown option $1" ;; @@ -135,10 +133,20 @@ clone() shift done + local fromuser="${refspec[0]}" + local fromref="${refspec[1]}" + local toref="${refspec[2]}" + local whoami="$(id -un)" + [ "$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" + 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