blob: c581bde3ee3d05891a87e54e2253050765d44ab0 (
plain)
- #!/bin/sh
- set -eu
- PRG=$(basename "$0")
- showhelp() {
- cat <<EOF
- Usage: $PRG PROJECT [GIT_REPO [SSH_CONN [GIT_REMOTE]]]
- Initialize remote git, push local git, and set as default remote.
- PROJECT basename or relative path for remote git project
- GIT_REPO hostname for public git access, or absolute basepath
- default: "source." + current domainname
- SSH_CONN hostname for ssh, optionally with user + "@" prepended
- default: GIT_REPO unless it starts with "/"
- GIT_REMOTE name for local repository set
- default: "origin"
- Full remote path becomes SSH_USER@SSH_HOST:BASEPATH/PROJECT.git
- where BASEPATH is resolved as "/srv/git/" + GIT_REPO
- or simply GIT_REPO when it begins with "/".
- When local repository set is "origin" it is marked as default remote.
- Examples:
- $PRG myproject
- $PRG some/subproject git.example.org me@shell.example.org
- $PRG some/subproject /private/path/on/ssh/host me.example.org backup
- $PRG some/subproject /private/path/on/local/host
- EOF
- }
- exit1() {
- echo >&2 "${1:+ERROR: }${1:-Internal error!}"
- exit 1
- }
- # parse cmdline options
- TEMP="`getopt -s sh -o h -l help -n "$PRG" -- "$@"`" || exit1
- eval set -- "$TEMP"
- while true; do
- case "$1" in
- -h|--help) showhelp; exit;;
- --) shift; break;;
- *) exit1;;
- esac
- done
- PROJECT=${1-$(showhelp; exit1 "project name missing")}
- GIT_REPO=${2:-source.$(dnsdomainname --domain)}
- case "$GIT_REPO" in
- /*)
- BASEPATH=$GIT_REPO
- ;;
- *)
- GIT_HOST=$GIT_REPO
- BASEPATH=/srv/git/"$GIT_REPO"
- ;;
- esac
- SSH_CONN=${3:-$GIT_HOST}
- GIT_REMOTE=${4:-origin}
- [ origin != "$GIT_REMOTE" ] || ORIGIN_IS_DEFAULT=yes
- # TODO: handle /~ BASEPATH specially and stop blindly ignore any error
- [ -z "$SSH_CONN" ] || ssh "$SSH_CONN" git init --bare --shared "$BASEPATH"/"$PROJECT".git || true
- git remote add "$GIT_REMOTE" "$SSH_CONN":"$BASEPATH"/"$PROJECT".git
- git push ${ORIGIN_IS_DEFAULT:+--set-upstream} "$GIT_REMOTE" master
|