notes - notes - a console notes manager using git DIR Log DIR Files DIR Refs DIR Tags DIR LICENSE --- notes (3372B) --- 1 #!/bin/sh 2 3 : ${REPO:=~/notes} 4 5 # search for a suitable editor 6 [ -z "$EDITOR" ] && \ 7 for e in nvim vim emacs vi ed; do 8 if command -v $e >/dev/null 2>&1; then 9 EDITOR=$e 10 break 11 fi 12 done 13 14 if [ -z "$EDITOR" ]; then 15 printf 'Could not elect an editor. ED is the standard text editor!\n' 16 EDITOR=ed 17 exit 1 18 fi 19 20 usage() { 21 name=$(basename $0) 22 printf '%s\n' \ 23 "$name [ls] | init | last | [history|cat|rm] PATH" \ 24 "$name [ls]" \ 25 ': show hierarchy tree' \ 26 "$name init" \ 27 ': initialize the git repository' \ 28 "$name last [limit]" \ 29 ': show files ordered by edition time' \ 30 "$name history PATH" \ 31 ': uses tig to display file history' \ 32 "$name cat PATH" \ 33 ': output content of the file' \ 34 "$name rm PATH" \ 35 ': delete file' \ 36 "$name [edit] PATH" \ 37 ": start \$EDITOR ($EDITOR) on file and auto commit" 38 exit 0 39 } 40 41 # display a file tree of notes taken 42 display() { 43 if type colortree >/dev/null 2>&1 44 then 45 colortree -C --prune --noreport "$REPO" 46 exit 0 47 else 48 cd "$REPO" 49 find . -name '.git' -prune -o -type f -print 50 exit 0 51 fi 52 } 53 54 # edit a file given as parameter 55 edit() { 56 cd "$REPO" 57 if [ ! -d "$1" ] 58 then 59 mkdir -p "$(dirname "$1")" 60 "$EDITOR" "$1" 61 if [ -f "$1" ] 62 then 63 git add "$1" 64 git commit -m "editing by $USER" "$1" 65 fi 66 exit 0 67 else 68 printf 'Aborting: "%s" is a directory.\n' "$1" 69 exit 1 70 fi 71 } 72 73 # show file history using tig program 74 histo() { 75 cd "$REPO" 76 if [ -f "$1" ] 77 then 78 if type tig >/dev/null 2>&1 79 then 80 tig "$1" 81 exit 0 82 else 83 printf 'Aborting: tig software is needed for history\n' 84 exit 6 85 fi 86 else 87 printf 'Aborting: "%s" file does not exist.\n' "$1" 88 exit 5 89 fi 90 } 91 92 # output the content of a file 93 show_file() { 94 cd "$REPO" 95 cat "$1" 96 exit 0 97 } 98 99 # delete a file and commit in git 100 delete() { 101 cd "$REPO" 102 if [ -f "$1" ]; 103 then 104 git rm "$1" 105 git commit -m "deleted by $USER" "$1" 106 exit 0 107 else 108 printf 'Aborting: "%s" is a directory.\n' "$1" 109 exit 1 110 fi 111 } 112 113 # display the list of edited files ordered by time 114 last() { 115 116 cd "$REPO" 117 118 if [ -n "$1" ]; then 119 limit="$1" 120 else 121 limit=10 122 fi 123 124 git log --date=relative --name-only | \ 125 awk ' 126 /^commit / { 127 date="no" 128 next 129 } 130 131 /^Date/ { 132 date=substr($0,index($0,$2)) 133 getline 134 for(s="x";s!="";) { 135 getline 136 s=$0 137 } 138 next 139 } 140 141 { 142 if(date!="no" && 143 substr($0,0,1)!=" " && 144 length($0)>1) 145 { 146 seen[$0]++ 147 if(seen[$0]==1) { 148 print date" "$0 149 } 150 } 151 }' | head -n "$limit" 152 exit 0 153 } 154 155 # raw list of files for completion 156 _completion_list() { 157 if [ -d "$REPO" ] 158 then 159 cd "$REPO" 160 find ./${1} -name '.git' -prune -o -type f -print | sed 's,^\./,,' 161 exit 0 162 else 163 printf 'Aborting: "%s" does not exist.\n' "$REPO" 164 exit 4 165 fi 166 } 167 168 # create a git repository 169 initialization() { 170 cd "$REPO" 171 if [ -d .git ] 172 then 173 echo "Git already initialized" 174 exit 3 175 else 176 git init 177 exit 0 178 fi 179 } 180 181 if ! mkdir -p "$REPO" 182 then 183 printf 'Aborting: cannot create "%s".\n' "$REPO" 184 exit 2 185 fi 186 187 case "$1" in 188 '') display ;; 189 help) usage;; 190 ls) display ;; 191 init) initialization ;; 192 last) last "$2" ;; 193 e*) [ -n "$2" ] && edit "$2" ;; 194 hi*) [ -n "$2" ] && histo "$2" ;; 195 r*) [ -n "$2" ] && delete "$2" ;; 196 c*) [ -n "$2" ] && show_file "$2" ;; 197 _files) _completion_list "$2" ;; 198 esac 199 200 # if parameter doesn't match a command, it may be a file 201 edit "$1"