summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2010-12-07 10:39:33 +0000
committerLars Wirzenius <liw@liw.fi>2010-12-07 10:39:33 +0000
commit1cb275ff732729fc65f6da77a6772506f71a6f2e (patch)
tree772f940ffed5241b39492cb79d1f6f1daa72df76
parent792946d92e579ff73f585b997ff5686c822859a7 (diff)
parent726cb96b71b38d052eedf99b40f0aa1d48b5ba65 (diff)
downloadliw-automation-1cb275ff732729fc65f6da77a6772506f71a6f2e.tar.gz
Merge new journal-note.
-rwxr-xr-xscripts/journal-note200
1 files changed, 159 insertions, 41 deletions
diff --git a/scripts/journal-note b/scripts/journal-note
index f91a07b..ed87a79 100755
--- a/scripts/journal-note
+++ b/scripts/journal-note
@@ -1,46 +1,164 @@
-#!/bin/sh
+#!/usr/bin/python
+# Copyright 2010 Lars Wirzenius
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
-set -e
-if [ "$#" != 1 ]
-then
- echo "Usage: $0 title"
- exit 1
-fi
+import optparse
+import os
+import re
+import subprocess
+import sys
+import tempfile
+import time
+import traceback
-title="$1"
-temp="$(mktemp --tmpdir=$HOME/Journal)"
-cat << eof > "$temp"
-[[!meta title="$title"]]
+template = '''\
+[[!meta title="%(title)s"]]
[[!tag ]]
-[[!meta date="$(date +%Y-%m-%dT%H:%M)"]]
-
-eof
-
-checksum="$(mktemp)"
-md5sum "$temp" > "$checksum"
-vi "$temp"
-if md5sum --status -c "$checksum"
-then
- echo "No change to note, aborting."
- rm "$temp" "$checksum"
- exit 1
-fi
-
-cat << eof >> "$temp"
-
-[[!meta done="$(date +%Y-%m-%dT%H:%M)"]]
-eof
-
-cd "$HOME/Journal/src"
-filename="notes/$(date +%Y-%m-%d-%H:%M.mdwn)"
-if [ -e "$filename" ]
-then
- filename="notes/$(date +%Y-%m-%d-%H:%M:%S.mdwn)"
-fi
-cp "$temp" "$filename"
-bzr add "$filename"
-bzr commit -m "New note" "$filename"
-ikiwiki --setup ../ikiwiki.setup --refresh
-rm "$temp" "$checksum"
+[[!meta date="%(date)s"]]
+
+'''
+
+
+class AppException(Exception):
+
+ pass
+
+
+class App(object):
+
+ def __init__(self):
+ pass
+
+ def parse_args(self):
+ p = optparse.OptionParser()
+
+ p.add_option('--base', default=os.path.expanduser('~/Journal'))
+
+ return p.parse_args()
+
+ def main(self):
+ commands = {
+ 'new': self.new_entry,
+ 'list': self.list_entries,
+ 'edit': self.edit_entry,
+ 'remove': self.remove_entry,
+ 'finish': self.finish_entry,
+ }
+
+ opts, args = self.parse_args()
+ if args and args[0] in commands:
+ commands[args[0]](args[1:], opts)
+ else:
+ raise AppException('Usage: journal-note [options] cmd args...')
+
+ def drafts(self, opts):
+ return os.path.join(opts.base, 'drafts')
+
+ def draftname(self, opts, draft_id):
+ return os.path.join(opts.base, 'drafts', '%s.mdwn' % draft_id)
+
+ def gedit_file(self, pathname):
+ subprocess.check_call(['gedit', '--new-window', pathname])
+
+ def new_entry(self, args, opts):
+ if not args:
+ raise AppException('Usage: journal-note new TITLE')
+
+ for i in range(1000):
+ name = self.draftname(opts, i)
+ if not os.path.exists(name):
+ break
+ else:
+ raise AppException('ERROR: too many existing drafts')
+
+ values = {
+ 'title': args[0],
+ 'date': time.strftime('%Y-%m-%d %H:%M')
+ }
+ f = open(name, 'w')
+ f.write(template % values)
+ f.close()
+ self.gedit_file(name)
+
+ def list_entries(self, args, opts):
+ drafts = self.drafts(opts)
+ for name in os.listdir(drafts):
+ if name.endswith('.mdwn'):
+ f = open(os.path.join(drafts, name))
+ for line in f:
+ m = re.match('\[\[!meta title="(?P<title>.*)("\]\])$',
+ line)
+ if m:
+ title = m.group('title')
+ break
+ else:
+ title = 'unknown title'
+ f.close()
+ print name[:-len('.mdwn')], title
+
+ def edit_entry(self, args, opts):
+ if not args:
+ raise AppException('Usage: journal-note edit ID')
+ pathname = self.draftname(opts, args[0])
+ if not os.path.exists(pathname):
+ raise AppException('draft %s does not exist' % args[0])
+ self.gedit_file(pathname)
+
+ def remove_entry(self, args, opts):
+ if not args:
+ raise AppException('Usage: journal-note remove ID')
+ pathname = self.draftname(opts, args[0])
+ os.remove(pathname)
+
+ def finish_entry(self, args, opts):
+ if not args:
+ raise AppException('Usage: journal-note finish ID')
+ draft = self.draftname(opts, args[0])
+ if not os.path.exists(draft):
+ raise AppException('draft %s does not exist' % args[0])
+ basename = time.strftime('%Y-%m-%d-%H:%M.mdwn')
+ i = 0
+ while True:
+ finished = os.path.join(opts.base, 'src', 'notes', basename)
+ if not os.path.exists(finished):
+ break
+ i += 1
+ basename = '%s-%d.mdwn' % (time.strftime('%Y-%m-%d-%H:%M:%S-'), i)
+ os.rename(draft, finished)
+
+ src = os.path.join(opts.base, 'src')
+ subprocess.check_call(['bzr', 'add', finished], cwd=src)
+ subprocess.check_call(['bzr', 'commit', '-m', 'new note'], cwd=src)
+ subprocess.check_call(['ikiwiki', '--setup', '../ikiwiki.setup',
+ '--refresh'],
+ cwd=src)
+
+
+if __name__ == '__main__':
+ try:
+ App().main()
+ except KeyboardInterrupt:
+ sys.exit(1)
+ except AppException, e:
+ sys.stderr.write('%s\n' % str(e))
+ sys.exit(1)
+ except SystemExit, e:
+ sys.exit(e.code)
+ except BaseException, e:
+ sys.stderr.write(traceback.format_exc(e))
+ sys.exit(1)
+