mirror of https://github.com/nirenjan/dotfiles.git
				
				
				
			Add deploy script to install files from Git repos
Deploy files are bash scripts with a couple of extra commands - namely the repo, target and file commands. This allows a user to specify a deployment file with a source repository, destination folder and specific Git version to extract.master
							parent
							
								
									952067e854
								
							
						
					
					
						commit
						5ab3d000a3
					
				
							
								
								
									
										1
									
								
								install
								
								
								
								
							
							
						
						
									
										1
									
								
								install
								
								
								
								
							|  | @ -221,6 +221,7 @@ mkfolder ~/bin | ||||||
| 
 | 
 | ||||||
| # Install scripts | # Install scripts | ||||||
| lnfile scripts/beep ~/bin/ | lnfile scripts/beep ~/bin/ | ||||||
|  | lnfile scripts/deploy ~/bin/ | ||||||
| lnfile scripts/mlog ~/bin/ | lnfile scripts/mlog ~/bin/ | ||||||
| lnfile scripts/stardate ~/bin/ | lnfile scripts/stardate ~/bin/ | ||||||
| lnfile scripts/settitle ~/bin/ | lnfile scripts/settitle ~/bin/ | ||||||
|  |  | ||||||
|  | @ -0,0 +1,191 @@ | ||||||
|  | #!/bin/bash | ||||||
|  | # Script to copy files from a Git repository to a destination | ||||||
|  | # Reads deployment instructions from a file and acts accordingly | ||||||
|  | # | ||||||
|  | # File Format | ||||||
|  | # =========== | ||||||
|  | # | ||||||
|  | # Comments begin with a # character and terminate at the end of the line. | ||||||
|  | # | ||||||
|  | # The keyword 'repo' specifies the path to the repository. The repository must | ||||||
|  | # be accessible locally without having to resort to ssh, https or git protocols. | ||||||
|  | # Usage: repo <path to repo> | ||||||
|  | # | ||||||
|  | # The keyword 'target' specifies the location to which to deploy. If omitted, it | ||||||
|  | # defaults to the current folder. Folders can be specified relative to the | ||||||
|  | # current folder, relative to the home directory, or relative to the root, using | ||||||
|  | # ./ or ../, ~/ and / as prefixes respectively. The parameter must be a valid | ||||||
|  | # directory. | ||||||
|  | # Usage: target <path to install to> | ||||||
|  | # | ||||||
|  | # The keyword 'file' specifies the file location relative to the root of the | ||||||
|  | # Git repository, along with the version to install and an optional rename | ||||||
|  | # argument which allows you to rename the destination file. If the version is | ||||||
|  | # omitted, it defaults to HEAD. If the rename-to parameter is omitted, the | ||||||
|  | # filename is the same as the name within the repository. | ||||||
|  | # Usage: file <path to file within repo> [version [rename-to]] | ||||||
|  | 
 | ||||||
|  | # Default environment variables used | ||||||
|  | DEPLOY_GIT='' | ||||||
|  | DEPLOY_TGT=$(pwd) | ||||||
|  | DEPLOY_SRC='' | ||||||
|  | DEPLOY_LST='' | ||||||
|  | DEPLOY_DEBUG=false | ||||||
|  | 
 | ||||||
|  | # Usage function will display the usage | ||||||
|  | usage() | ||||||
|  | { | ||||||
|  |     local deploy=$(basename $0) | ||||||
|  |     echo "Usage: $deploy <deploy-file1> <deploy-file2> ..." | ||||||
|  |     exit 0 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Die function will print the error message to stderr and abort the script | ||||||
|  | die() | ||||||
|  | { | ||||||
|  |     local exit_code=$1 | ||||||
|  |     local deploy=$(basename $0) | ||||||
|  |     shift | ||||||
|  | 
 | ||||||
|  |     for msg in "$@" | ||||||
|  |     do | ||||||
|  |         echo -e "$deploy: $msg" >&2 | ||||||
|  |     done | ||||||
|  | 
 | ||||||
|  |     if [[ $exit_code != 128 && $exit_code != 0 ]] | ||||||
|  |     then | ||||||
|  |         echo -e "\tError in file $DEPLOY_SRC line ${BASH_LINENO[1]}" >&2 | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     exit $exit_code | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Debug function will display all data, but only if debugs are enabled | ||||||
|  | debug() | ||||||
|  | { | ||||||
|  |     $DEPLOY_DEBUG && echo "$@" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Repo function checks if it is a valid Git repo and sets the DEPLOY_GIT | ||||||
|  | repo() | ||||||
|  | { | ||||||
|  |     if [[ $# != 1 ]] | ||||||
|  |     then | ||||||
|  |         die 4 "Invalid usage of repo command" "Usage: repo <path to Git repo>" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ -d "$1" ]] | ||||||
|  |     then | ||||||
|  |         cd "$1" | ||||||
|  |         local gtl=$(git rev-parse --show-toplevel 2>/dev/null) | ||||||
|  | 
 | ||||||
|  |         if [[ -z $gtl ]] | ||||||
|  |         then | ||||||
|  |             die 3 "Path $1 is not a valid Git repository!" | ||||||
|  |         else | ||||||
|  |             debug "Using repository $gtl" | ||||||
|  |             DEPLOY_GIT="$gtl" | ||||||
|  |         fi | ||||||
|  |     else | ||||||
|  |         die 1 "Path $1 does not exist!" | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Target function checks if it is a valid directory and sets the DEPLOY_TGT | ||||||
|  | target() | ||||||
|  | { | ||||||
|  |     if [[ $# != 1 ]] | ||||||
|  |     then | ||||||
|  |         die 4 "Invalid usage of target command" "Usage: target <path>" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ -d "$1" ]] | ||||||
|  |     then | ||||||
|  |         debug "Target folder $1" | ||||||
|  |         DEPLOY_TGT="$1" | ||||||
|  |     else | ||||||
|  |         die 1 "Path $1 does not exist!" | ||||||
|  |     fi | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # File command selects a file to deploy | ||||||
|  | file() | ||||||
|  | { | ||||||
|  |     if [[ $# == 0 || $# > 3 ]] | ||||||
|  |     then | ||||||
|  |         die 4 "Invalid usage of file command" \ | ||||||
|  |               "Usage: file <path from root of repo> [<version> [<rename-to>] ]" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ -z $DEPLOY_GIT ]] | ||||||
|  |     then | ||||||
|  |         die 2 "Must specify repo before file!" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     if [[ -z $DEPLOY_TGT ]] | ||||||
|  |     then | ||||||
|  |         die 2 "Must specify target before file!" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     local file=$1 | ||||||
|  |     local ver=$2 | ||||||
|  |     local rename=$3 | ||||||
|  | 
 | ||||||
|  |     debug "file $@" | ||||||
|  | 
 | ||||||
|  |     # Sanity check on ver | ||||||
|  |     [[ -z $ver ]] && ver=HEAD | ||||||
|  | 
 | ||||||
|  |     # Sanity check on rename | ||||||
|  |     [[ -z $rename ]] && rename=$(basename $file) | ||||||
|  | 
 | ||||||
|  |     cd $DEPLOY_GIT | ||||||
|  | 
 | ||||||
|  |     # Check to make sure that version is a sane version | ||||||
|  |     git rev-parse $ver &>/dev/null | ||||||
|  | 
 | ||||||
|  |     if [[ $? != 0 ]] | ||||||
|  |     then | ||||||
|  |         die 3 "Version $ver does not exist in the repository $DEPLOY_GIT" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  |     local vercheck=$(git rev-parse $ver 2>/dev/null) | ||||||
|  |     debug "Using version $vercheck" | ||||||
|  | 
 | ||||||
|  |     # Check to make sure that the file is valid in the specified version | ||||||
|  |     git show $vercheck:$file &>/dev/null | ||||||
|  | 
 | ||||||
|  |     if [[ $? != 0 ]] | ||||||
|  |     then | ||||||
|  |         die 3 "File $file does not exist in version $ver of the repo $DEPLOY_GIT" | ||||||
|  |     else | ||||||
|  |         debug "Using file $file" | ||||||
|  |         local cmd="cd $DEPLOY_GIT; git show $vercheck:$file > $DEPLOY_TGT/$rename;" | ||||||
|  |         DEPLOY_LST="$DEPLOY_LST $cmd" | ||||||
|  |     fi | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if [[ $# == 0 ]] | ||||||
|  | then | ||||||
|  |     usage | ||||||
|  | else | ||||||
|  |     for i in "$@" | ||||||
|  |     do | ||||||
|  |         if [[ -f $i && -r $i ]] | ||||||
|  |         then | ||||||
|  |             DEPLOY_SRC=$i | ||||||
|  |             source $i | ||||||
|  |         else | ||||||
|  |             die 128 "Deploy file $i does not exist or is not readable!" | ||||||
|  |         fi | ||||||
|  |     done | ||||||
|  | fi | ||||||
|  | 
 | ||||||
|  | if [[ ! -z $DEPLOY_LST ]] | ||||||
|  | then | ||||||
|  |     eval $DEPLOY_LST | ||||||
|  | else | ||||||
|  |     die 0 "No files to deploy!" | ||||||
|  | fi | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue