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