#!/bin/bash # Desc: Initializes a git repository #==BEGIN Define script parameters== #===BEGIN Declare local script functions=== yell() { echo "$0: $*" >&2; } #o Yell, Die, Try Three-Fingered Claw technique die() { yell "$*"; exit 111; } #o Ref/Attrib: https://stackoverflow.com/a/25515370 try() { "$@" || die "cannot $*"; } #o checkURL() { # Desc: Checks if string is a valid URL. # Warning: Does not correctly handle multi-byte characters. # Version: 0.0.2 # Input: arg1: string # Output: return code 0: string is a valid URL # return code 1: string is NOT a valid URL # Depends: Bash 5.0.3 # Ref/Attrib: https://stackoverflow.com/a/3184819 regex='(https?|ftp|file|ssh|git)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]' arg1="$1"; if [[ $arg1 =~ $regex ]]; then return 0; else return 1; fi; } # Check if arg1 is valid URL initGitRepo() { # Desc: Creates, adds remotes to, and pulls to git repository # Note: Does nothing if repoDir is already initialized git repo. # Usage: createGitRepo arg1 arg2 arg3 arg4 # Input: arg1: repoURL # arg2: repoDir # arg3: remoteName # arg4: branchName # Version: 0.0.9 # Depends: checkURL() 0.0.2, yell(), Bash 5.0.3 # Ref/Attrib: [1]: Test for space-less alphanuemric string. https://unix.stackexchange.com/a/416120 # [2]: Test for argument count. https://stackoverflow.com/q/18568706 # [3]: Test if dir is (in) git repository. https://stackoverflow.com/a/39518382 # Note: Pulls use '--ff-only' option which requires an upstream branch be set. # This can be done by using: # $ git branch --set-upstream-to origin/master master # #==BEGIN Validate input arguments== arg1="$1"; arg2="$2"; arg3="$3"; arg4="$4"; # Validate repoURL if checkURL "$arg1"; then repoURL="$arg1"; else yell "ERROR:Not a valid URL:$arg1"; return 1; fi; # Passthrough repoDir (it may not exist yet) repoDir="$arg2"; # Validate remoteName if [[ "$arg3" =~ ^[[:alnum:]]+$ ]]; then remoteName="$arg3"; else yell "ERROR:Not a valid remote name:$arg3"; return 1; fi; # See [1]. # Validate branchName if [[ "$arg4" =~ ^[[:alnum:]]+$ ]]; then branchName="$arg4"; else yell "ERROR:Not a valid remote branch name:$arg4"; return 1; fi; # See [1]. # Check argument count if [[ $# -gt 4 ]]; then yell "ERROR:Too many arguments."; return 1; fi; # See [2]. #==END Validate input arguments== #==BEGIN create and populate git repository== if [[ ! -d "$repoDir" ]]; then mkdir "$repoDir"; fi; pushd "$repoDir" || return 1; if ! git -C "$(pwd)" rev-parse 1>/dev/null 2>&1; then yell "STATUS:Initializing as git repo:$repoDir"; git init; # Init repo if not already a git repo. See [3] else yell "STATUS:Already a git repository:$repoDir"; git status; git remote -v; fi; yell "STATUS:Adding $repoURL as remote $remoteName"; git remote add "$remoteName" "$repoURL"; git branch --set-upstream-to "$remoteName"/"$branchName" "$branchName"; yell "STATUS:Pulling branch $branchName from remote $remoteName"; git pull --ff-only "$remoteName" "$branchName"; git fetch "$remoteName"; unset repoURL repoDir remoteName branchName; popd || exit 1; #==END create and populate git repository== yell "================================"; } # Init Git Repository #===END Declare local script functions=== #==END Define script parameters== #==BEGIN sample code tmpDir=/tmp/"$(date +%Y%m%dT%H%M%S%z)"; mkdir -p "$tmpDir"; pushd "$tmpDir" || exit 1; repoURL="https://zdv2.bktei.com/gitweb/baltakatei-exdev.git"; repoDir="BK-2020-03..bkexdev"; remoteName="zdv2"; branchName="master"; initGitRepo "$repoURL" "$repoDir" "$remoteName" "$branchName"; unset repoURL repoDir remoteName branchName; yell "STATUS:Done."; #==END sample code # Author: Steven Baltaktei Sandoval # License: GPLv3+