about summary refs log blame commit diff stats
path: root/bash/moon-maker/mm
blob: b7431c25f54353f6faf44659135b2de3e2e7dd89 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                  
                   
 


                              
                                           





                                          
                                                   





                      


                              
                                              





                                          
                                                      








                              
                                                          





                                          
                                                                  





                      




















                                               

















                                                                        
                                                                   





                                                                                      
                                                                           





                      

                                        
 

             
                                                                                     




                                                                                      
                                                                     










                                                                             


                                   
        
                                                       
      
        
                                       
                
                    

                                      


                                                                                     
                                                                                       
      
                                            
                              
        


                                       
                                         
                               

                                        
                               

                                         

                                              
        




                    





                                                                                



                  
#!/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 "$@"