| 1 | #!/bin/bash |
| 2 | # Desc: Initializes a git repository |
| 3 | |
| 4 | #==BEGIN Define script parameters== |
| 5 | #===BEGIN Declare local script functions=== |
| 6 | yell() { echo "$0: $*" >&2; } #o Yell, Die, Try Three-Fingered Claw technique |
| 7 | die() { yell "$*"; exit 111; } #o Ref/Attrib: https://stackoverflow.com/a/25515370 |
| 8 | try() { "$@" || die "cannot $*"; } #o |
| 9 | checkURL() { |
| 10 | # Desc: Checks if string is a valid URL. |
| 11 | # Warning: Does not correctly handle multi-byte characters. |
| 12 | # Version: 0.0.2 |
| 13 | # Input: arg1: string |
| 14 | # Output: return code 0: string is a valid URL |
| 15 | # return code 1: string is NOT a valid URL |
| 16 | # Depends: Bash 5.0.3 |
| 17 | # Ref/Attrib: https://stackoverflow.com/a/3184819 |
| 18 | regex='(https?|ftp|file|ssh|git)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]' |
| 19 | arg1="$1"; |
| 20 | if [[ $arg1 =~ $regex ]]; then |
| 21 | return 0; |
| 22 | else |
| 23 | return 1; |
| 24 | fi; |
| 25 | } # Check if arg1 is valid URL |
| 26 | initGitRepo() { |
| 27 | # Desc: Creates, adds remotes to, and pulls to git repository |
| 28 | # Note: Does nothing if repoDir is already initialized git repo. |
| 29 | # Usage: createGitRepo arg1 arg2 arg3 arg4 |
| 30 | # Input: arg1: repoURL |
| 31 | # arg2: repoDir |
| 32 | # arg3: remoteName |
| 33 | # arg4: branchName |
| 34 | # Version: 0.0.9 |
| 35 | # Depends: checkURL() 0.0.2, yell(), Bash 5.0.3 |
| 36 | # Ref/Attrib: [1]: Test for space-less alphanuemric string. https://unix.stackexchange.com/a/416120 |
| 37 | # [2]: Test for argument count. https://stackoverflow.com/q/18568706 |
| 38 | # [3]: Test if dir is (in) git repository. https://stackoverflow.com/a/39518382 |
| 39 | # Note: Pulls use '--ff-only' option which requires an upstream branch be set. |
| 40 | # This can be done by using: |
| 41 | # $ git branch --set-upstream-to origin/master master |
| 42 | # |
| 43 | #==BEGIN Validate input arguments== |
| 44 | arg1="$1"; |
| 45 | arg2="$2"; |
| 46 | arg3="$3"; |
| 47 | arg4="$4"; |
| 48 | # Validate repoURL |
| 49 | if checkURL "$arg1"; then repoURL="$arg1"; |
| 50 | else yell "ERROR:Not a valid URL:$arg1"; return 1; fi; |
| 51 | |
| 52 | # Passthrough repoDir (it may not exist yet) |
| 53 | repoDir="$arg2"; |
| 54 | |
| 55 | # Validate remoteName |
| 56 | if [[ "$arg3" =~ ^[[:alnum:]]+$ ]]; then remoteName="$arg3"; |
| 57 | else yell "ERROR:Not a valid remote name:$arg3"; return 1; fi; # See [1]. |
| 58 | |
| 59 | # Validate branchName |
| 60 | if [[ "$arg4" =~ ^[[:alnum:]]+$ ]]; then branchName="$arg4"; |
| 61 | else yell "ERROR:Not a valid remote branch name:$arg4"; return 1; fi; # See [1]. |
| 62 | |
| 63 | # Check argument count |
| 64 | if [[ $# -gt 4 ]]; then yell "ERROR:Too many arguments."; return 1; fi; # See [2]. |
| 65 | #==END Validate input arguments== |
| 66 | #==BEGIN create and populate git repository== |
| 67 | if [[ ! -d "$repoDir" ]]; then mkdir "$repoDir"; fi; |
| 68 | pushd "$repoDir" || return 1; |
| 69 | if ! git -C "$(pwd)" rev-parse 1>/dev/null 2>&1; then |
| 70 | yell "STATUS:Initializing as git repo:$repoDir"; |
| 71 | git init; # Init repo if not already a git repo. See [3] |
| 72 | else |
| 73 | yell "STATUS:Already a git repository:$repoDir"; |
| 74 | git status; git remote -v; |
| 75 | fi; |
| 76 | yell "STATUS:Adding $repoURL as remote $remoteName"; |
| 77 | git remote add "$remoteName" "$repoURL"; |
| 78 | git branch --set-upstream-to "$remoteName"/"$branchName" "$branchName"; |
| 79 | yell "STATUS:Pulling branch $branchName from remote $remoteName"; |
| 80 | git pull --ff-only "$remoteName" "$branchName"; |
| 81 | git fetch "$remoteName"; |
| 82 | unset repoURL repoDir remoteName branchName; |
| 83 | popd || exit 1; |
| 84 | #==END create and populate git repository== |
| 85 | yell "================================"; |
| 86 | } # Init Git Repository |
| 87 | #===END Declare local script functions=== |
| 88 | #==END Define script parameters== |
| 89 | |
| 90 | #==BEGIN sample code |
| 91 | tmpDir=/tmp/"$(date +%Y%m%dT%H%M%S%z)"; |
| 92 | mkdir -p "$tmpDir"; |
| 93 | pushd "$tmpDir" || exit 1; |
| 94 | |
| 95 | repoURL="https://zdv2.bktei.com/gitweb/baltakatei-exdev.git"; |
| 96 | repoDir="BK-2020-03..bkexdev"; |
| 97 | remoteName="zdv2"; |
| 98 | branchName="master"; |
| 99 | initGitRepo "$repoURL" "$repoDir" "$remoteName" "$branchName"; |
| 100 | unset repoURL repoDir remoteName branchName; |
| 101 | |
| 102 | yell "STATUS:Done."; |
| 103 | #==END sample code |
| 104 | |
| 105 | # Author: Steven Baltaktei Sandoval |
| 106 | # License: GPLv3+ |