#!/usr/bin/env bash set -o errexit set -o nounset set -o pipefail if [[ "${TRACE-0}" == "1" ]]; then set -o xtrace fi EDITOR="subl -n -b" add-moons () { if [[ -d ".moons" ]]; then touch ".moons/$1" echo -e "a new moon is orbiting $2" else path=$(pwd) while [ -n "$path" ]; do path=${path%/*} if [ -d "$path/.moons" ]; then touch "$path/.moons/$1" echo -e "a new moon is orbiting $2" return fi done fi } delete-moon-by-moon-id () { if [[ -d ".moons" ]]; then rm .moons/*"$1"* echo -e "the moon $1 has been removed" else path=$(pwd) while [ -n "$path" ]; do path=${path%/*} if [ -d "$path/.moons" ]; then rm "$path/.moons/"*"$1"* echo -e "the moon $1 has been removed" return fi done fi } delete-moons-by-planet () { if [[ -d ".moons" ]]; then rm .moons/"$1"* echo -e "all moons orbiting $1 have been deleted." else path=$(pwd) while [ -n "$path" ]; do path=${path%/*} if [ -d "$path/.moons" ]; then rm "$path/.moons/$1"* echo -e "all moons orbiting $1 have been deleted." return fi done fi } open-moons () { if [[ -d ".moons" ]]; then for file in .moons/$1; do echo -e "$file" $EDITOR "$file" done else path=$(pwd) while [ -n "$path" ]; do path=${path%/*} if [ -d "$path/.moons" ]; then for file in $path/.moons/$1; do echo -e "$file" $EDITOR "$file" done return fi done fi } list-moons-by-planet () { if [[ -d ".moons" ]]; then ls -a .moons/"$1"* else path=$(pwd) while [ -n "$path" ]; do path=${path%/*} if [ -d "$path/.moons" ]; then ls -a "$path/.moons/$1"* return fi done fi } rename-planet-and-orbiting-moons () { if [[ -d ".moons" ]]; then for file in .moons/"$1"* ; do mv "$file" "${file//$1/$2}" ; done echo -e "planets and moons have been renamed from $1 to $2" else path=$(pwd) while [ -n "$path" ]; do path=${path%/*} if [ -d "$path/.moons" ]; then for file in "$path/.moons/$1"* ; do mv "$file" "${file//$1/$2}" ; done echo -e "planets and moons have been renamed from $1 to $2" return fi done fi } PRE_SHORT_RAND=$(openssl rand -base64 6) SHORT_RAND=${PRE_SHORT_RAND//\//_} help_text() { echo ' A planet file is the one you care about -- probably an file in an actual project. Moon files orbit planets, they are disposable scratch spaces connected to planets. usage: ./mm -i(nit)....initialize a directory to store moon files -o(pen)....open a planet file and all of its moon files -l(ist)....list all moons for a given planet file -a(dd).....create a new moon file for a given planet file -d(elete)..remove a moon file by its id -c(lear)...remove all moon files for a given planet file -u(pdate)..rename a planet file and all of its moon files ' } if [[ "${1-}" =~ ^-*h(elp)?$ ]]; then help_text "$@" exit elif [[ "${1-}" =~ ^-*i(nit)?$ ]]; then if [[ ! -d ".moons" ]]; then mkdir ".moons" echo -e "moons initialized" else echo -e "there's already a moon directory here" fi exit elif [[ "${1-}" =~ ^-*o(pen)?$ ]]; then $EDITOR "$2" open-moons "$2*" exit elif [[ "${1-}" =~ ^-*a(dd)?$ ]]; then if [ $# -ge 3 ]; then FILE_TYPE="$3" # optionally pass a file type you'd like to append to the moon else FILE_TYPE="txt" # if you don't provide a file type assume .txt for the new moon fi NEW_MOON="$2"."$SHORT_RAND"."$FILE_TYPE" add-moons "$NEW_MOON" "$2" exit elif [[ "${1-}" =~ ^-*l(ist)?$ ]]; then list-moons-by-planet "$2" exit elif [[ "${1-}" =~ ^-*d(elete)?$ ]]; then delete-moon-by-moon-id "$2" exit elif [[ "${1-}" =~ ^-*c(lear)?$ ]]; then delete-moons-by-planet "$2" exit elif [[ "${1-}" =~ ^-*u(pdate)?$ ]]; then mv "$2" "$3" rename-planet-and-orbiting-moons "$2" "$3" exit fi cd "$(dirname "$0")" main() { echo -e ' Moon Maker ⋆。°✩ ☾ mm is a small program that lets you add orbiting moons to existing planets.' help_text "$@" } main "$@"