Skip to content

Instantly share code, notes, and snippets.

@luke-biel
Last active August 27, 2021 09:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save luke-biel/c90b70b340aea45123df2b8335c429bf to your computer and use it in GitHub Desktop.
Save luke-biel/c90b70b340aea45123df2b8335c429bf to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
###
# Save this as ~/.cds/cds.sh
# chmod +x ~/.cds/cds.sh
# ~/.cds/cds.sh setup
##
fail() {
echo "[$(date)] ERROR: $1"
}
info() {
echo "[$(date)] INFO: $1"
}
CACHE_FOLDER="${HOME}/.cds"
CACHE_FILE="${CACHE_FOLDER}/cache.cds"
COMMAND="${1:---help}"
LINK="${2}"
__cds_print_usage()
{
echo "Usage: cds COMMAND"
echo ""
echo "cds --help - prints this dialog"
echo "cds --setup - creates cache directory"
echo "cds --link LINK_NAME - creates new link to current directory with name LINK_NAME"
echo "cds --rm LINK_NAME - removes given link"
echo "cds --lookup LINK_NAME - prints details about given link"
echo "cds --list - prints all registered links"
echo "cds LINK_NAME - moves current context to directory at LINK_NAME"
}
__cds_setup()
{
TARGET="${1:-$HOME/.bashrc}"
mkdir -p "${CACHE_FOLDER}"
rm -f "${CACHE_FILE}"
touch "${CACHE_FILE}"
if ! grep "alias cds='source ${CACHE_FOLDER}/cds.sh'" "${TARGET}" > /dev/null; then
echo "
###
# cds.sh command line utility
###
alias cds='source $CACHE_FOLDER/cds.sh'" >> "${TARGET}"
info 'cds set up successfully'
fi
}
__cds_add_link()
{
link_name="${1}"
folder="${2:-$(pwd)}"
if [[ -z "${link_name+empty}" ]]; then
fail 'must supply link name'
fi
if [[ "${link_name}" == *'\|'* ]]; then
fail 'link name cannot contain special characters'
fi
if ! grep -e "${link_name}|" "${CACHE_FILE}" > /dev/null; then
echo "${link_name}|${folder}" >> "${CACHE_FILE}"
info "link created '$link_name' -> '$folder'!"
else
fail "'${link_name}' already exists"
fi
}
__cds_lookup()
{
link_name="${1}"
result=`grep -e "^${link_name}|" "${CACHE_FILE}"`
if [ $? -eq 0 ]; then
info "found $(echo ${result} | awk -F'|' '{ print $2 }')"
else
fail "'${link_name}' doesn't exist"
fi
}
__cds_rm_link()
{
link_name="${1}"
if [[ -z "${link_name+empty}" ]]; then
fail 'must supply link name'
fi
result=`grep -e "^${link_name}|" "${CACHE_FILE}"`
if [ $? -eq 0 ]; then
sed -i.bak "/^${link_name}\|.*\$/d" "${CACHE_FILE}"
else
fail "'${link_name}' doesn't exist"
fi
}
__cds_goto()
{
link_name="${1}"
result=`grep -e "^${link_name}|" "${CACHE_FILE}"`
if [ $? -eq 0 ]; then
warp=`echo ${result} | awk -F'|' '{ print $2 }'`
cd "${warp}"
else
fail "'${link_name}' doesn't exist!"
fi
}
__cds_list()
{
echo -e "name | path\n----- | -----" | cat - "${CACHE_FILE}" | column -t -s'|'
}
if [[ -z "${COMMAND+empty}" ]] || [[ "$COMMAND" == "--help" ]]; then
__cds_print_usage
elif [ "$COMMAND" = "--setup" ]; then
__cds_setup $LINK
elif [ "$COMMAND" = "--link" ]; then
__cds_add_link $LINK
elif [ "$COMMAND" = "--lookup" ]; then
__cds_lookup $LINK
elif [ "$COMMAND" = "--rm" ]; then
__cds_rm_link $LINK
elif [ "$COMMAND" = "--list" ]; then
__cds_list
else
__cds_goto $COMMAND
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment