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:-""}
+# How long should we wait (in seconds) between sync on the git remote. Default 3600 (1 hour)
+GITSYNCDELAY=${GITSYNCDELAY:-3600}
+
} # end set_defaults, do not change this line.
set_defaults
echo $PID > "$PIDFILE"
# Export config to file
-function export_config() {
+export_config() {
if [ -r ${RCFILE} ]; then
echo "Backing up current '${RCFILE}'...."
mv -f ${RCFILE} ${RCFILE}.$(date +%Y%m%d_%H%M)
# we should expand on this function to add a sample note and explain a little bit
# how the program works.
-function firstrun() {
+firstrun() {
[ -f $RCFILE ] && RC=$RCFILE || RC="none"
clear
"version": "${VERSION}",
"dbversion": "${DBVERSION}"
},
+ "git": {
+ "lastpull": ""
+ },
"notes": []
}
__EOL__
firstrun
fi
# check if input is a number, returns false or the number itself
-function check_noteID() {
+check_noteID() {
IN=$1
case $IN in
''|*[!0-9]*)
esac
}
-function helptext() {
+helptext() {
echo "Usage:"
echo " $0 [PARAMS] [note ID]..."
echo ""
echo -e "if a non option is passed and is a valid note ID, the note will be displayed."
}
-function configtext() {
+configtext() {
cat << __NOWCONF__
${BASENAME} configuration is:
}
-function addnote() {
+# this function returns a random 2 words title
+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() {
+ NOWSYNC=$(date +%s)
+ # LASTSYNC is the last time we synced to the remote, or 0 if it's the first time.
+ LASTSYNC=$($JQ -r '.git["lastpull"] // 0' "$DB")
+ [ $PLAIN == false ] && echo "Syncing notes with git on remote \"$GITREMOTE\""
+ SYNCDIFF=$(( ${NOWSYNC} - ${LASTSYNC} ))
+ if (( $SYNCDIFF > $GITSYNCDELAY )); then
+ #more than our delay time has passed. We can sync again.
+ $JQ --arg n "$NOWSYNC" '.git["lastpull"] = $n' "$DB" > $TMPDB
+ mv $TMPDB $DB
+ cd $BASEDIR
+ $GIT pull
+ else
+ # Last synced less than $GITSYNCDELAY seconds ago. We shall wait
+ [ $PLAIN == false ] && echo "Last synced less than $GITSYNCDELAY seconds ago. We shall wait"
+ fi
+}
+
+# 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
+
+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)
# shellcheck disable=SC2086,SC2091
$(${TERMINAL} ${TERM_OPTS} ${EDITOR} ${NOTESDIR}/${NOW})
}
-function backup_data() {
+backup_data() {
BACKUPDIR="$1"
echo "backing up data in $BACKUPDIR"
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
fi
}
-function backup_restore() {
+backup_restore() {
BACKUPDIR="$1"
echo "restoring backup from $BACKUPDIR"
echo "This will overwrite all your notes and configurations with the backup."
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"
esac
}
-function editnote() {
+editnote() {
NOTE=$1
# shellcheck disable=SC2155
local OK=$(check_noteID "$NOTE")
exit 1
fi
}
-function listnotes() {
+listnotes() {
+ # attempt syncing before listing all notes
+ gitsync
# [ $PLAIN == true ] && echo "output is plain text" || echo "output is colored"
if [[ $(ls -A "$NOTESDIR") ]]; then
if [ $PLAIN == false ]; then
echo "no notes yet. You can add your first one with: ${BASENAME} -a \"your note title\""
fi
}
-function rmnote() {
+rmnote() {
# remove eventually existing temp DB file
if [[ -f $TMPDB ]]; then
rm $TMPDB
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
}
-function shownote() {
+shownote() {
NOTE=$1
# shellcheck disable=SC2155
fi
}
# shellcheck disable=SC2006
-GOPT=$(getopt -o hvplr::a::e::d::s:: --long help,version,list,plain,userconf,restore::,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
backup_restore $RDIR
exit
;;
+ --sync )
+ gitsync
+ exit
+ ;;
--userconf )
export_config
# shellcheck disable=SC2317