Almost make it to a functional first implementation
This commit is contained in:
		
							
								
								
									
										19
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								README.md
									
									
									
									
									
								
							@@ -1,5 +1,11 @@
 | 
				
			|||||||
# proj
 | 
					# proj
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## TODO
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Actually spawn the shell
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Figure out why the pre-spawn hook is using the `project_dir` value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Usage
 | 
					## Usage
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Invoke the script and pass the name of the project as its only non-flag argument:
 | 
					Invoke the script and pass the name of the project as its only non-flag argument:
 | 
				
			||||||
@@ -16,7 +22,7 @@ When invoked as specified in usage (with any number of valid flags plus exactly
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
* Check for the existence of `project_dir`
 | 
					* Check for the existence of `project_dir`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * If `project_dir` is a directory or symbolic link, proceed
 | 
					  * If `project_dir` is a directory or symbolic link to one, proceed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * If `project_dir` is any other type of file, panic
 | 
					  * If `project_dir` is any other type of file, panic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -26,7 +32,7 @@ When invoked as specified in usage (with any number of valid flags plus exactly
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
* Check for the existence of `$arg1`
 | 
					* Check for the existence of `$arg1`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * If `$arg1` is a directory or symbolic link, proceed
 | 
					  * If `$arg1` is a directory or symbolic link to one, proceed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  * If `$arg1` is any other type of file, panic
 | 
					  * If `$arg1` is any other type of file, panic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,9 +42,7 @@ When invoked as specified in usage (with any number of valid flags plus exactly
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    * Create `$arg1` as a directory
 | 
					    * Create `$arg1` as a directory
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    * Initialize an empty git repository if configured to do so
 | 
					    * Execute the post-create hook if configured to do so
 | 
				
			||||||
 | 
					 | 
				
			||||||
    * Add and commit a `.gitignore` if configured to do so
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
* `cd` to `$arg1`
 | 
					* `cd` to `$arg1`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,9 +63,8 @@ flag|description|args
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
value|description|default
 | 
					value|description|default
 | 
				
			||||||
---|---|---
 | 
					---|---|---
 | 
				
			||||||
git\_auto\_init|If not set to `0`, automatically initialize a git repository on project creation|`0`
 | 
					 | 
				
			||||||
git\_auto\_init\_gitignore|A colon-separated ($PATH-style) list of items to include in the initial `.gitignore`|`*.swp`
 | 
					 | 
				
			||||||
hook\_pre\_create|Path to a script invoked (not sourced) before a project is created. Script will be executed relative to `project_dir`|Empty string
 | 
					hook\_pre\_create|Path to a script invoked (not sourced) before a project is created. Script will be executed relative to `project_dir`|Empty string
 | 
				
			||||||
 | 
					hook\_post\_create|Path to a script invoked (not sourced) after a project is created. Script will be executed relative to the project's root directory|Empty string
 | 
				
			||||||
hook\_pre\_spawn|Path to a script invoked (not sourced) before a shell is spawned in the project directory. Script will be executed relative to the project's root directory|Empty string
 | 
					hook\_pre\_spawn|Path to a script invoked (not sourced) before a shell is spawned in the project directory. Script will be executed relative to the project's root directory|Empty string
 | 
				
			||||||
hook\_env|Path to a script to *source in* after entering a project directory but before a shell is spawned. Script will be sourced relative to the project's root directory|`.projenv`
 | 
					hook\_env|Path to a script to *source in* after entering a project directory but before a shell is spawned. Script will be sourced relative to the project's root directory|`.projenv`
 | 
				
			||||||
project\_dir|Path to where projects should be stored.|`$HOME/Projects`
 | 
					project\_dir|Path to where projects should be stored.|`$HOME/Projects`
 | 
				
			||||||
@@ -73,3 +76,5 @@ code|description
 | 
				
			|||||||
0|Success
 | 
					0|Success
 | 
				
			||||||
2|Invalid flag or missing flag argument
 | 
					2|Invalid flag or missing flag argument
 | 
				
			||||||
50|Non-flag arguments have errors or are nonsensical
 | 
					50|Non-flag arguments have errors or are nonsensical
 | 
				
			||||||
 | 
					61|`project_dir` exists and is not a directory
 | 
				
			||||||
 | 
					62|`$arg1` exists and is not a directory
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										74
									
								
								proj
									
									
									
									
									
								
							
							
						
						
									
										74
									
								
								proj
									
									
									
									
									
								
							@@ -12,9 +12,8 @@ set -e
 | 
				
			|||||||
declare -r _name="$(basename -- "$0")"
 | 
					declare -r _name="$(basename -- "$0")"
 | 
				
			||||||
# Options
 | 
					# Options
 | 
				
			||||||
declare -a _config=(
 | 
					declare -a _config=(
 | 
				
			||||||
	[git_auto_init]="0"
 | 
					 | 
				
			||||||
	[git_auto_init_gitignore]="*.swp"
 | 
					 | 
				
			||||||
	[hook_pre_create]=""
 | 
						[hook_pre_create]=""
 | 
				
			||||||
 | 
						[hook_post_create]=""
 | 
				
			||||||
	[hook_pre_spawn]=""
 | 
						[hook_pre_spawn]=""
 | 
				
			||||||
	[hook_env]=".projenv"
 | 
						[hook_env]=".projenv"
 | 
				
			||||||
	[project_dir]="$HOME/Projects"
 | 
						[project_dir]="$HOME/Projects"
 | 
				
			||||||
@@ -94,9 +93,74 @@ Copyright (c) 2021 rehashedsalt@cock.li
 | 
				
			|||||||
Licensed under the MIT license
 | 
					Licensed under the MIT license
 | 
				
			||||||
EOF
 | 
					EOF
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					hook() {
 | 
				
			||||||
 | 
						# Execute a hook, if it exists
 | 
				
			||||||
 | 
						# If it fails for whatever reason, continue anyway silently
 | 
				
			||||||
 | 
						# $1 path to executable
 | 
				
			||||||
 | 
						# $2 name of hook
 | 
				
			||||||
 | 
						[ -z "$1" ] && return 1
 | 
				
			||||||
 | 
						[ -z "$2" ] && return 2
 | 
				
			||||||
 | 
						log "Attempting to execute hook \"$2\": $1"
 | 
				
			||||||
 | 
						if ! [ -e "$1" ]; then
 | 
				
			||||||
 | 
							warn "Hook \"$2\" does not exist: $1"
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						if ! [ -x "$1" ]; then
 | 
				
			||||||
 | 
							warn "Hook \"$2\" cannot be executed: $1"
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						if [ -d "$1" ]; then
 | 
				
			||||||
 | 
							warn "Hook \"$2\" is a directory: $1"
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
						"$1" || warn "Hook \"$2\" failed: $?"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
proj() {
 | 
					proj() {
 | 
				
			||||||
	# Do the do
 | 
						# Create/find a project directory and get in there
 | 
				
			||||||
 | 
						[ -z "$1" ] && return 1
 | 
				
			||||||
 | 
						# Get to project_dir
 | 
				
			||||||
 | 
						local projdir="${_config[project_dir]}"
 | 
				
			||||||
 | 
						log "Using project_dir: $projdir" 2
 | 
				
			||||||
 | 
						if ! [ -d "$projdir" ]; then
 | 
				
			||||||
 | 
							if [ -e "$projdir" ]; then
 | 
				
			||||||
 | 
								error "Project directory exists as another file type: $projdir" 61
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							mkdir -p "$projdir"
 | 
				
			||||||
 | 
							log "Created project directory: $projdir" 1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log "Entering directory: $projdir" 2
 | 
				
			||||||
 | 
						cd "$projdir"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Get to THE project directory
 | 
				
			||||||
 | 
						local dir="$1"
 | 
				
			||||||
 | 
						local dirnew
 | 
				
			||||||
 | 
						if ! [ -d "$1" ]; then
 | 
				
			||||||
 | 
							if [ -e "$1" ]; then
 | 
				
			||||||
 | 
								error "File is in the way of creating a directory: $dir" 62
 | 
				
			||||||
 | 
							fi
 | 
				
			||||||
 | 
							# Execute the pre-create hook
 | 
				
			||||||
 | 
							[ -n "${_config[hook_pre_create]}" ] && hook "${_config[hook_pre_create]}" "pre-create"
 | 
				
			||||||
 | 
							mkdir -p "$dir"
 | 
				
			||||||
 | 
							dirnew=1
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log "Entering directory: $dir" 2
 | 
				
			||||||
 | 
						cd "$dir"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Execute a post-create hook if necessary
 | 
				
			||||||
 | 
						if [ -n "$dirnew" ]; then
 | 
				
			||||||
 | 
							[ -n "${_config[hook_post_create]}" ] && hook "${_config[hook_post_create]}" "post-create"
 | 
				
			||||||
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Execute the pre-spawn hook if necesary
 | 
				
			||||||
 | 
						[ -n "${_config[hook_pre_spawn]}" ] && hook "${_config[hook_pre_spawn]}" "pre-spawn"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						# Get in there
 | 
				
			||||||
 | 
						(
 | 
				
			||||||
	:
 | 
						:
 | 
				
			||||||
 | 
						) || :
 | 
				
			||||||
 | 
						unset dirnew precreatehook postcreatehook
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main
 | 
					# Main
 | 
				
			||||||
@@ -135,7 +199,7 @@ main() {
 | 
				
			|||||||
	[ -n "$_opthelp" ] && printhelp && exit 0
 | 
						[ -n "$_opthelp" ] && printhelp && exit 0
 | 
				
			||||||
	# Parse out a config file if it exists
 | 
						# Parse out a config file if it exists
 | 
				
			||||||
	if [ -f "$_optconfigfile" ]; then
 | 
						if [ -f "$_optconfigfile" ]; then
 | 
				
			||||||
		log "Loading config file" 2
 | 
							log "Loading config file: $_optconfigfile" 2
 | 
				
			||||||
		while read line; do
 | 
							while read line; do
 | 
				
			||||||
			# If the line has an equals sign and isn't a comment
 | 
								# If the line has an equals sign and isn't a comment
 | 
				
			||||||
			if [ "$line" != "${line#*=}" ] && validateline "$line"; then
 | 
								if [ "$line" != "${line#*=}" ] && validateline "$line"; then
 | 
				
			||||||
@@ -161,7 +225,7 @@ main() {
 | 
				
			|||||||
	fi
 | 
						fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	# Do the do
 | 
						# Do the do
 | 
				
			||||||
	proj
 | 
						proj "${_args[0]}"
 | 
				
			||||||
	exit 0
 | 
						exit 0
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user