#!/bin/bash set -euo pipefail # this script allows the creation of projects over ssh on git server # public repos will get a public.conf containing the remote # private repos will just exist on the server # # USAGE: # ssh git@ new-project [--public] [--description ] # # EXAMPLES: # ssh git@treybastian.com new-project myrepo # ssh git@treybastian.com new-project myrepo --public # ssh git@treybastian.com new-project myrepo --public --description "my cool repo" REMOTE_BASE_URL="git@treybastian.com:repos" usage() { echo "Usage: new-project [--public] [--description ]" echo "" echo "Examples:" echo " new-project myrepo" echo " new-project myrepo --public" echo " new-project myrepo --public --description \"my cool repo\"" exit 1 } if [ "$#" -lt 1 ]; then echo "Error: expected at least 1 argument, got $#" usage fi PROJECT_NAME="$1" PUBLIC=false DESCRIPTION="" shift while [ "$#" -gt 0 ]; do case "$1" in --public) PUBLIC=true shift ;; --description) [ "$#" -ge 2 ] || { echo "Error: --description requires a value"; usage; } DESCRIPTION="$2" shift 2 ;; *) echo "Error: unknown flag '$1'" usage ;; esac done if [[ "$PROJECT_NAME" != *.git ]]; then PROJECT_NAME="${PROJECT_NAME}.git" fi if [ -d "$PROJECT_NAME" ]; then echo "Error: '$PROJECT_NAME' already exists" exit 1 fi git --bare init "${PROJECT_NAME}" if [ -n "$DESCRIPTION" ]; then echo "$DESCRIPTION" > "${PROJECT_NAME}/description" fi if [ "$PUBLIC" = true ]; then echo "${REMOTE_BASE_URL}/${PROJECT_NAME}" > "${PROJECT_NAME}/public.conf" REMOTE_ARGS=("repos/${PROJECT_NAME}") if [ -n "$DESCRIPTION" ]; then REMOTE_ARGS+=(--description "$(printf '%q' "$DESCRIPTION")") fi ssh git@treybastian.com new-repo "${REMOTE_ARGS[@]}" echo "public repo: ${REMOTE_BASE_URL}/${PROJECT_NAME}" fi echo "git url: ${USER}@${HOSTNAME}:${PROJECT_NAME}" # vim: filetype=bash