Adds projects script untouched. This needs work to even document what it needs cleaned up.

This commit is contained in:
Tom Hicks
2024-09-20 17:09:17 -07:00
parent d88a11a844
commit 6c37e8c633

163
.rc.d/projects.sh Executable file
View File

@@ -0,0 +1,163 @@
# use command
export PROJECTS_ROOT=~/Projects
DEFAULT_IDE="code ."
# TODO: This needs tons of cleanup and needs to support at least 1 level of nested directories in the $PROJECTS_ROOT directory.
use () {
# TODO: Add autocomplete support for this in at least zsh and bash. So it will pull from whatever "projects()" returns to use for the project name.
# TODO: Consider replacing/augmenting .shrc with some sort of .project file. Mostly to override project type detection.
local PROJECT_NAME=$1
if [ -z "$PROJECTS_ROOT" ]; then
echo "PROJECTS_ROOT not set."
elif [ -z "$PROJECT_NAME" ]; then
echo "PROJECT_NAME not specified."
elif [ ! -d "$PROJECTS_ROOT/$PROJECT_NAME" ]; then
echo "Project ${PROJECT_NAME} does not exist in ${PROJECTS_ROOT}."
else
cd "$PROJECTS_ROOT/$PROJECT_NAME"
# Add local node modules to path
if [ -d "$PWD/node_modules/.bin" ]; then
export PATH="$PWD/node_modules/.bin:$PATH"
fi
# Switch to the project's version of node
if [ -f .nvmrc ]; then
nvm use 2>/dev/null || nvm install
fi
# Run the project specific commands
# TODO: add a general version of this like .shrc and one for the other shell style. csh maybe.
# TODO: Maybe separate these. BASH_VERSION and ZSH_VERSION should never be srt at the same time, but we may want .bashrc and .shrc to both be executed if present and running under bash.
if [ -f .bashrc -a -n "$BASH_VERSION" ]; then
source .bashrc
elif [ -f .zshrc -a -n "$ZSH_VERSION" ]; then
source .zshrc
elif [ -f .shrc ]; then
source .shrc
fi
local XCODE_WORKSPACES="$(compgen -G "*.xcworkspace")"
local XCODE_PROJECTS="$(compgen -G "*.xcodeproj")"
# TODO: Add a --no-ide switch to not open an ide when using a project.
# TODO: Add a variable that can be set in the project .zshrc or .bashrc file to not detect and run an editor. i.e. .zshrc runs qb64 and then sets some variable to 1 to disable these checks to launch a different editor.
if [ -d .vscode ]; then
# VS Code settings found
code . >/dev/null 2>&1 &
elif [ -n "$XCODE_WORKSPACES" ]; then
# XCode workspace found
while IFS= read -r line; do
open "$line" >/dev/null 2>&1 &
done <<< "$XCODE_WORKSPACES"
elif [ -n "$XCODE_PROJECTS" ]; then
# XCode project found
while IFS= read -r line; do
open "$line" >/dev/null 2>&1 &
done <<< "$XCODE_PROJECTS"
elif [ -f .idea/misc.xml ]; then
# IntelliJ project found
# Is misc.xml the right file to check for? Maybe just the .idea directory existing and being a directory.
# So still use the project type from misc.xml to decide which intellij ide to load, but stop checking for other IDEs if .idea exists.
# IntelliJ projects
local INTELLIJ_PROJECT_TYPE=$(xpath -q -e 'string(/project/component[@name="ProjectType"]/option[@name="id"]/@value)' .idea/misc.xml)
if [ "Android" = "$INTELLIJ_PROJECT_TYPE" ]; then
# Android Studio project found
# TODO: Make this work for linux is it studio.sh? What is it under WSL or git bash?
open -a /Applications/Android\ Studio.app . >/dev/null 2>&1 &
else
# By default IntelliJ projects don't have a project type so all others should open with IntelliJ
echo $INTELLIJ_PROJECT_TYPE
if [ -d /Applications/IntelliJ.app ]; then
open /Applications/IntelliJ.app . >/dev/null 2>&1 &
elif [ command -v idea64 ]; then
idea64 . >/dev/null 2>&1 &
else
# We can't find IntelliJ so just launch the default IDE
eval $DEFAULT_IDE >/dev/null 2>&1 &
fi
fi
else
# TODO: Detect qb64 apps. Workaround is to open the main .bas file in qb64 from .shrc.
# TODO: Detect vb6 apps.
# TODO: Detect vc6/vc++6 apps.
# TODO: Detect other visual studio solution/project files.
# TODO: Maybe detect MSBuild projects and try to open visual studio/visual studio mac.
# TODO: Detect other editors config/project files.
# TODO: Detect plain java apps.
# Unrecognized project type
echo "This is not a recognized project type."
eval $DEFAULT_IDE
fi
fi
}
projects () {
find "$PROJECTS_ROOT" -mindepth 1 -maxdepth 1 -type d -exec basename {} \; | sort
}
new_project() {
PROJECT_DIR=$PROJECTS_ROOT/$1
mkdir -p "$PROJECT_DIR"
touch "$PROJECT_DIR/.project.sh"
touch "$PROJECT_DIR/README.md"
echo ".vscode/" >> "$PROJECT_DIR/.gitignore"
echo "bazel-bazel-test" >> "$PROJECT_DIR/.gitignore"
echo "bazel-bin" >> "$PROJECT_DIR/.gitignore"
echo "bazel-out" >> "$PROJECT_DIR/.gitignore"
echo "bazel-testlogs" >> "$PROJECT_DIR/.gitignore"
echo "build/" >> "$PROJECT_DIR/.gitignore"
echo "tmp/" >> "$PROJECT_DIR/.gitignore"
touch "$PROJECT_DIR/.gitattributes"
if [ ! -d "$PROJECT_DIR/.git" ]; then
git init "$PROJECT_DIR"
fi
cd "$PROJECT_DIR"
git add --all .
git commit -m "Initial commit."
}
clone() {
if [ -z "$1" -o "$1" = " " -o -z "$2" -o "$2" = " " ]; then
echo "Clones the repo into \$PROJECTS_ROOT/<projectName>"
echo "usage: clone <repositoryUrl> <projectName>"
return
fi
# TODO: Also check if $PROJECTS_ROOT/$2 already exists.
git clone "$1" "$PROJECTS_ROOT/$2" && use "$2"
}
if [ -n "$ZSH_VERSION" ]; then
autoload -U compinit
compinit -i
function _list_folders() {
local dir=$PROJECTS_ROOT
local IFS=$'\n'
local files=( $(projects) )
local completions=()
for file in "${files[@]}"; do
completions+=( $file )
done
compadd -d -U -- ${completions[@]}
}
zle -N _list_folders
compdef _list_folders use
elif [ -n "$BASH_VERSION" ]; then
_use() {
local cur="${COMP_WORDS[COMP_CWORD]}"
local prev="${COMP_WORDS[COMP_CWORD-1]}"
if [[ $prev == "use" ]]; then
COMPREPLY=( $(compgen -W "$PROJECTS_ROOT" -- $cur) )
fi
}
complete -o default -F _use use
fi