890d7112210195fb43b4a726b3a760d86a2807a8
[bash-notes.git] / SOURCE / head.sh
1 #! /bin/bash
2
3 # bash-notes © 2023 by danix is licensed under CC BY-NC 4.0.
4 # To view a copy of this license, visit http://creativecommons.org/licenses/by-nc/4.0/
5
6 # to debug the script run it like:
7 # DEBUG=true notes.sh ...
8 # and check /tmp/debug_bash-notes.log
9 if [[ $DEBUG == true ]]; then
10 exec 5> /tmp/debug_bash-notes.log
11 BASH_XTRACEFD="5"
12 PS4='$LINENO: '
13 set -x
14 fi
15
16 PID=$$
17 BASENAME=$( basename "$0" )
18 NOW=$(date +%s)
19
20 VERSION="0.4git"
21 DBVERSION=${VERSION}_${NOW}
22
23 set_defaults() {
24 # Binaries to use
25 JQ=${JQ:-/usr/bin/jq}
26 EDITOR=${EDITOR:-/usr/bin/vim}
27 TERMINAL=${TERMINAL:-/usr/bin/alacritty}
28 # Git binary only used if $USEGIT is true - See below
29 GIT=${GIT:-/usr/bin/git}
30 # add options for your terminal. Remember to add the last option to execute
31 # your editor program, otherwise the script will fail.
32 # see example in the addnote function
33 TERM_OPTS="--class notes --title notes -e "
34 # Setting PAGER here overrides whatever is set in your default shell
35 # comment this option to use your default pager if set in your shell.
36 PAGER=${PAGER:-/usr/bin/more}
37
38 # set this to true to have output in plain text
39 # or use the -p option on the command line before every other option
40 PLAIN=false
41 # base directory for program files
42 BASEDIR=${BASEDIR:-~/.local/share/bash-notes}
43 # notes database in json format
44 DB=${BASEDIR}/db.json
45 # directory containing the actual notes
46 NOTESDIR=${BASEDIR}/notes
47
48 ### GIT SUPPORT
49
50 # If you want to store your notes in a git repository set this to true
51 USEGIT=true
52 # Address of your remote repository
53 GITREMOTE=${GITREMOTE:-""}
54 # How long should we wait (in seconds) between sync on the git remote. Default 3600 (1 hour)
55 GITSYNCDELAY=${GITSYNCDELAY:-3600}
56
57 } # end set_defaults, do not change this line.
58
59 set_defaults
60
61 # Do not edit below this point
62 RCFILE=${RCFILE:-~/.config/bash-notes.rc}
63 TMPDB=/tmp/db.json
64
65 if [ ! -x "$JQ" ]; then
66 echo "jq not found in your PATH"
67 echo "install jq to continue"
68 exit 1
69 fi
70
71 # IMPORT USER DEFINED OPTIONS IF ANY
72 if [[ -f $RCFILE ]]; then
73 # shellcheck disable=SC1090
74 source "$RCFILE"
75 fi
76
77 # We prevent the program from running more than one instance:
78 PIDFILE=/var/tmp/$(basename "$0" .sh).pid
79
80 # Make sure the PID file is removed when we kill the process
81 trap 'rm -f $PIDFILE; exit 1' TERM INT
82
83 if [[ -r $PIDFILE ]]; then
84 # PIDFILE exists, so I guess there's already an instance running
85 # let's kill it and run again
86 # shellcheck disable=SC2046,SC2086
87 kill -s 15 $(cat $PIDFILE) > /dev/null 2>&1
88 # should already be deleted by trap, but just to be sure
89 rm "$PIDFILE"
90 fi
91
92 # create PIDFILE
93 echo $PID > "$PIDFILE"
94
95 # Export config to file
96 export_config() {
97 if [ -r ${RCFILE} ]; then
98 echo "Backing up current '${RCFILE}'...."
99 mv -f ${RCFILE} ${RCFILE}.$(date +%Y%m%d_%H%M)
100 fi
101 echo "Writing '${RCFILE}'...."
102 sed -n '/^set_defaults() {/,/^} # end set_defaults, do not change this line./p' $0 \
103 | grep -v set_defaults \
104 | sed -e 's/^\([^=]*\)=\${\1:-\([^}]*\)}/\1=\2/' \
105 > ${RCFILE}
106 if [ -r ${RCFILE} ]; then
107 echo "Taking no further action."
108 exit 0
109 else
110 echo "Could not write '${RCFILE}'...!"
111 exit 1
112 fi
113 }
114
115 # we should expand on this function to add a sample note and explain a little bit
116 # how the program works.
117 firstrun() {
118 [ -f $RCFILE ] && RC=$RCFILE || RC="none"
119
120 clear
121 echo "${BASENAME} configuration:
122
123 base directory: ${BASEDIR}/
124 notes archive: ${NOTESDIR}/
125 notes database: ${DB}
126 rc file: $RC
127 text editor: ${EDITOR}
128 terminal: ${TERMINAL}
129 jq executable: ${JQ}
130 "
131
132 echo "Now I'll create the needed files and directories."
133 read -r -p "Do you wish to continue? (y/N) " ANSWER
134 case $ANSWER in
135 y|Y )
136 mkdir -p $NOTESDIR
137 cat << __EOL__ > ${DB}
138 {
139 "params": {
140 "version": "${VERSION}",
141 "dbversion": "${DBVERSION}"
142 },
143 "git": {
144 "lastpull": ""
145 },
146 "notes": []
147 }
148 __EOL__
149 echo; echo "All done, you can now write your first note."
150 ;;
151 * )
152 echo "No changes made. Exiting"
153 exit
154 ;;
155 esac
156 }
157
158 # check for notes dir existance and create it in case it doesn't exists
159 if [[ ! -d $NOTESDIR ]]; then
160 # we don't have a directory. FIRST RUN?
161 firstrun
162 fi