jw-pkg/scripts/pgit.sh
Jan Lindemann b7833c928a pgit.sh fix: --create-remote-user-repos parsed incorrectly
--create-remote-user-repos is not recognized because of is not
recognized because of a typo, fix that.

Signed-off-by: Jan Lindemann <jan@janware.com>
2025-11-18 21:12:54 +01:00

239 lines
4.8 KiB
Bash

#!/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-repos -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