from os import path from django import template from django.conf import settings register = template.Library() @register.tag(name="git_head_revision") def do_git_head_revision(parser, token): return GitHeadRevisionTag() class GitHeadRevisionTag(template.Node): head = None @staticmethod def _get_head(): git_dir = path.normpath(path.join(settings.MEDIA_ROOT, '..', '.git')) # Read the HEAD ref fhead = open(path.join(git_dir, 'HEAD'), 'r') ref_name = fhead.readline().split(" ")[1].strip() fhead.close() # Read the commit id fref = open(path.join(git_dir, ref_name), 'r') ref = fref.readline().strip() fref.close() return unicode(ref) @staticmethod def get_head_cached(): if not GitHeadRevisionTag.head: GitHeadRevisionTag.head = GitHeadRevisionTag._get_head() return GitHeadRevisionTag.head def render(self, context): return GitHeadRevisionTag.get_head_cached() @register.tag(name="media") def do_media(parser, token): try: tag_name, path = token.split_contents() except ValueError: raise template.TemplateSyntaxError, "%r tag must one argument" % token.contents.split()[0] return MediaTag(path) class MediaTag(template.Node): def __init__(self, path): self.path = path def render(self, context): head = GitHeadRevisionTag.get_head_cached() fullpath = settings.MEDIA_URL + self.path + '?' + head return fullpath