BASENAME=$( basename "$0" )
NOW=$(date +%s)
-VERSION="0.3"
+VERSION="0.4git"
DBVERSION=${VERSION}_${NOW}
set_defaults() {
JQ=${JQ:-/usr/bin/jq}
EDITOR=${EDITOR:-/usr/bin/vim}
TERMINAL=${TERMINAL:-/usr/bin/alacritty}
+# Git binary only used if $USEGIT is true - See below
+GIT=${GIT:-/usr/bin/git}
# add options for your terminal. Remember to add the last option to execute
# your editor program, otherwise the script will fail.
# see example in the addnote function
# directory containing the actual notes
NOTESDIR=${BASEDIR}/notes
+### GIT SUPPORT
+
+# If you want to store your notes in a git repository set this to true
+USEGIT=true
+# Address of your remote repository
+GITREMOTE=${GITREMOTE:-""}
+
} # end set_defaults, do not change this line.
set_defaults
"version": "${VERSION}",
"dbversion": "${DBVERSION}"
},
+ "git": {
+ "lastpull": ""
+ },
"notes": []
}
__EOL__
function helptext() {
echo "Usage:"
- echo " $0 [PARAMS] ..."
- echo ""
- cat << __NOWCONF__
-${BASENAME} configuration is:
-
-base directory: ${BASEDIR}/
-notes archive: ${NOTESDIR}/
-notes database: ${DB}
-rc file: $RCFILE
-debug file: /tmp/debug_bash-note.log
-
-text editor: ${EDITOR}
-terminal: ${TERMINAL}
-jq executable: ${JQ}
-PAGER: ${PAGER}
-__NOWCONF__
-
+ echo " $0 [PARAMS] [note ID]..."
echo ""
echo "${BASENAME} parameters are:"
echo -e " -h | --help\t\t\t: This help text"
echo -e "\t\t\t\t (without this option the output is formatted)"
echo -e "\t\t\t\t (this option must precede all others)"
echo -e " -l | --list\t\t\t: List existing notes"
- echo -e " -a | --add [\"<title>\"]\t: Add new note"
- echo -e " -e | --edit [<note>]\t\t: Edit note"
- echo -e " -d | --delete [<note> | all] : Delete single note or all notes at once"
- echo -e " -s | --show [<note>]\t\t: Display note using your favourite PAGER"
+ echo -e " -a | --add=[\"<title>\"]\t: Add new note"
+ echo -e " -e | --edit=[<note>]\t\t: Edit note"
+ echo -e " -d | --delete=[<note> | all] : Delete single note or all notes at once"
+ echo -e " -s | --show=[<note>]\t\t: Display note using your favourite PAGER"
+ echo -e " -r | --restore=[<dir>]\t: Restore a previous backup from dir"
echo -e " -v | --version\t\t: Print version"
echo -e " --userconf\t\t\t: Export User config file"
echo -e " --backup [<dest>]\t\t: Backup your data in your destination folder"
echo ""
+ echo -e "if a non option is passed and is a valid note ID, the note will be displayed."
+}
+
+function configtext() {
+ cat << __NOWCONF__
+${BASENAME} configuration is:
+
+base directory: ${BASEDIR}/
+notes archive: ${NOTESDIR}/
+notes database: ${DB}
+rc file: $RCFILE
+debug file: /tmp/debug_bash-note.log
+
+text editor: ${EDITOR}
+terminal: ${TERMINAL}
+jq executable: ${JQ}
+PAGER: ${PAGER}
+__NOWCONF__
+
+}
+
+# this function returns a random 2 words title
+function random_title() {
+ # Constants
+ X=0
+ DICT=/usr/share/dict/words
+ OUTPUT=""
+
+ # total number of non-random words available
+ COUNT=$(cat $DICT | wc -l)
+
+ # while loop to generate random words
+ while [ "$X" -lt 2 ]
+ do
+ RAND=$(od -N3 -An -i /dev/urandom | awk -v f=0 -v r="$COUNT" '{printf "%i\n", f + r * $1 / 16777216}')
+ OUTPUT+="$(sed `echo $RAND`"q;d" $DICT)"
+ (("X = X + 1"))
+ [[ $X -eq 1 ]] && OUTPUT+=" "
+ done
+
+ echo $OUTPUT
+}
+
+# returns true if the argument provided directory is a git repository
+is_git_repo() {
+ DIR=$1
+ if [[ -d $DIR ]]; then
+ cd $DIR
+ if git rev-parse 2>/dev/null; then
+ true
+ else
+ false
+ fi
+ fi
+}
+
+# sync local repository to remote
+gitsync() {
+ echo "Syncing notes with git on remote \"$GITREMOTE\""
+ cd $BASEDIR
+ $GIT pull
}
+# check for USEGIT and subsequent variables
+if [[ $USEGIT && -n $GITREMOTE ]]; then
+ # GIT is a go.
+ if ! is_git_repo $BASEDIR; then
+ # initializing git repository
+ cd $BASEDIR
+ $GIT init
+ echo "adding all files to git"
+ $GIT add .
+ $GIT commit -m "$(basename $0) - initial commit"
+ $GIT remote add origin $GITREMOTE
+ $GIT push -u origin master
+ fi
+elif [[ $USEGIT && -z $GITREMOTE ]]; then
+ echo "GITREMOTE variable not set. reverting USEGIT to false"
+ USEGIT=false
+fi
+
function addnote() {
# remove eventually existing temp DB file
if [[ -f $TMPDB ]]; then
rm $TMPDB
fi
- NOTETITLE="$1"
+ RTITLE=$(random_title)
+ [[ -z "$1" ]] && NOTETITLE="$RTITLE" || NOTETITLE="$1"
echo "adding new note - \"$NOTETITLE\""
# shellcheck disable=SC2086
LASTID=$($JQ '.notes[-1].id // 0 | tonumber' $DB)
fi
# ok, we have a backup directory
if [ -r $RCFILE ]; then
- BCKUP_COMM=$(rsync -avz --progress ${RCFILE} ${BASEDIR}/* ${BACKUPDIR})
+ BCKUP_COMM=$(rsync -avz --progress ${RCFILE}* ${BASEDIR}/ ${BACKUPDIR})
else
- BCKUP_COMM=$(rsync -avz --progress ${BASEDIR}/* ${BACKUPDIR})
+ BCKUP_COMM=$(rsync -avz --progress ${BASEDIR}/ ${BACKUPDIR})
fi
# run the command
if [ "$BCKUP_COMM" ]; then
- echo -e "BASE directory:\t\t$BASEDIR"
+ echo -e "All files backed up."
echo -e "BACKUP directory:\t$BACKUPDIR"
+ tree $BACKUPDIR | $PAGER
echo; echo "BACKUP COMPLETED"
fi
}
+function backup_restore() {
+ BACKUPDIR="$1"
+ echo "restoring backup from $BACKUPDIR"
+ echo "This will overwrite all your notes and configurations with the backup."
+ read -r -p "Do you want to continue? (y/N) " ANSWER
+ case $ANSWER in
+ y|Y )
+ # restoring rc file
+ BACKUPRC=$(basename $RCFILE)
+ if [ -r ${BACKUPDIR}/${BACKUPRC} ]; then
+ if [ -r ${RCFILE} ]; then
+ echo "Backing up current '${RCFILE}'...."
+ mv -f ${RCFILE} ${RCFILE}.$(date +%Y%m%d_%H%M)
+ fi
+ cp --verbose ${BACKUPDIR}/${BACKUPRC} $RCFILE
+ fi
+ # restoring notes directory
+ if [ -d $BACKUPDIR/notes ]; then
+ if [ $(/bin/ls -A $NOTESDIR) ]; then
+ rm --verbose $NOTESDIR/*
+ fi
+ cp -r --verbose $BACKUPDIR/notes $BASEDIR
+ fi
+ # restoring database
+ BACKUPDB=$(basename $DB)
+ if [ -f ${BACKUPDIR}/${BACKUPDB} ]; then
+ if [ -r ${DB} ]; then
+ echo "Backing up current '${DB}'...."
+ mv -f ${DB} ${DB}.$(date +%Y%m%d_%H%M)
+ fi
+ cp --verbose ${BACKUPDIR}/${BACKUPDB} $DB
+ fi
+ # restoring git repo subdirectory
+ if [ -d $BACKUPDIR/.git ]; then
+ if [ /bin/ls -A ${BASEDIR}/.git ]; then
+ rm -rf ${BASEDIR}/.git
+ fi
+ cp -r --verbose ${BACKUPDIR}/.git ${BASEDIR}/
+ fi
+ ;;
+ * )
+ echo "No changes made. Exiting"
+ exit
+ ;;
+ esac
+}
+
function editnote() {
NOTE=$1
# shellcheck disable=SC2155
if [ ! "$OK" ]; then
echo "invalid note \"$NOTE\""
echo "Use the note ID that you can fetch after listing your notes"
+ sleep 1
exit 1
fi
mv $TMPDB $DB
rm $NOTESDIR/$FILE
echo "Deleted note $TITLE"
+ sleep 1
+ exit
else
echo "note not found"
+ sleep 1
exit 1
fi
fi
fi
}
# shellcheck disable=SC2006
-GOPT=$(getopt -o hvpla::e::d::s:: --long help,version,list,plain,userconf,backup::,add::,edit::,delete::,show:: -n 'bash-notes' -- "$@")
+GOPT=$(getopt -o hvplr::a::e::d::s:: --long help,version,list,plain,userconf,sync,restore::,backup::,add::,edit::,delete::,show:: -n 'bash-notes' -- "$@")
# shellcheck disable=SC2181
if [ $? != 0 ] ; then helptext >&2 ; exit 1 ; fi
shownote "$NOTE"
exit
;;
+ -r | --restore )
+ case "$2" in
+ '' )
+ read -r -p "Backup Dir: " RDIR
+ ;;
+ * )
+ RDIR=$2
+ ;;
+ esac
+ shift 2
+ backup_restore $RDIR
+ exit
+ ;;
+ --sync )
+ gitsync
+ exit
+ ;;
--userconf )
export_config
# shellcheck disable=SC2317
;;
esac
done
+
+for arg; do
+ if [ $(check_noteID $arg) ]; then
+ shownote $arg
+ else
+ helptext
+ exit
+ fi
+done