microblog automation via git and jekyll and shell scripts
A longer post explaining my setup, in case somebody else finds it useful.
So how do I do it:
first, I have a bare git repository on my webserver that acts as the master repository in to which all clients, that can post entrys push to. This repository I have called
microblog.git
for obvious reasons. Also on the server, there exists a clone of this bare repository that contains a working copy created via
git clone microblog.git
In order to make sure that this clone is always up-to-date, I have a post-receive-hook set in the config of the bare repository that looks like this:
#!/bin/bash
cd ~/microblog
GIT_DIR=.git git pull origin master
so whenever I push to the bare repository from some other client (like e.g. on my laptop), the working copy on the server immediately does a pull.
Inside the repository lives a jekyll instance using the Hydejack theme. One relevant line in the ‘_config.yml’ file is
destination: /the/microblog/directory/in/the/webserver/
but also
defaults:
-
scope:
path: "_posts"
values:
layout: post
title: ""
In this way, a new post can be created with minimal yaml frontmatter, i.e. only the ‘date:’ line is needed. Using the ‘title: “”’ trick creates microblog-like entries.
Now the workflow would be something like (on my laptop)
$ cd ~/microblog/_posts
$ vim 1971-01-01-01.md # here we need the date and a running numer
$ # now I edit the file, the yaml frontmatter needs
$ # date: 1971-01-01 00:00
$ # in between two sets of three dashes (---)
$ git add 1971-01-01-01.md
$ git commit -a -m 01
$ git push
On the server, in the checked out working copy directory, I have the following command running:
$ bundle exec jekyll build --watch
which means that as soon as a new entry appears (via the post-receive hook above), the jekyll site rebuilds itself. BUT this is still a pain in the ass, to be honest. I mean one would want to enter one command, type the actual content of the post, cause it to save and that’s it. So for that purpose I wrote myself a dumb bash script with the following content (has to be called inside ~/microblog/_posts)
#!/bin/bash
#
# make a new entry for the microblog
# set up my variables
today=$(date +%F);
now=$(date +%F\ %H:%M);
iterator=1;
filename=$today-$(printf "%02d" $iterator).md;
# make sure we have the hottest newest latest
git pull;
# determine the first available file for today
while [ -f $filename ]
do iterator=$(($iterator+1));
filename=$today-$(printf "%02d" $iterator).md;
done
# create the file
touch $filename;
# pre-populate the file
echo '---' >> $filename;
echo -n 'date: ' >> $filename;
echo $now >> $filename;
echo '---' >> $filename;
echo >> $filename;
# start editing
vim +star +4 $filename;
# and upload
git add $filename;
git commit -a -m $iterator;
git push;
echo;
echo all done with $filename;
echo;
And that’s how I do it. It is entirely possible that I forgot to mention some important detail in this description and it is also entirely possible that what I’m doing is overly complicated and/or completely wrongheaded. Also, I still need a nicer workflow for posting from my phone that basically replicates the above. That’s still a todo …