Update timestamp in Hugo post

Posted on in #hugo

This site is built entirely with Hugo. Hugo itself has a lot of useful commands bundled, but there’s one case which is missing for me: update timestamp of some particular post without editing it manually.

My usecase for this is that when I generate new post, I might be writing in more than 1 day because of different reasons. But when I finish the post and want to publish it, I want post to have the date when it was finished. In that case I need to open the post, go to preamble and change the date manually.

Since, I’m quite lazy, I decided to automate this thing and created small Python script that work similar to touch command in *nix systems. This script goes through file and tries to find date field in preamble. If it was found, it just updates the field with current date. Very handy!

Here’s the script:

#!/usr/bin/env python3

import sys
from datetime import datetime

if len(sys.argv) < 2:
    print('Please provide filename')
    sys.exit(1)

with open(sys.argv[1], 'r') as f:
    lines = f.readlines()

found = False
outlines = []

now_date = ''

for line in lines:
    if not found and line.startswith('date'):
        now_date = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
        line = 'date: ' + now_date + '\n'
        found = True

    outlines.append(line)

if not found:
    print('Date was not found in file!')
    sys.exit(1)

with open(sys.argv[1], 'w') as f:
    f.writelines(outlines)

print('Date updated to ' + now_date)

It’s really simple and works only with YAML preamble, but it do the job for me. I placed it into /usr/local/bin and now, when I need to update date to current in any of my blog posts, I just simply invoke it like

hugo-touch ./content/glob/update-timestamp-hugo-post.md

Unfortunately, I haven’t found the way to extend Hugo itself with additional command, like it’s possible to do with Git. If you know how to do this, please drop me a message in Twitter.