|
|
notes - notes - a console notes manager using git |
|
|
 |
Log |
|
|
 |
Files |
|
|
 |
Refs |
|
|
 |
Tags |
|
|
 |
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" |
|