diff --git a/hyde/ext/plugins/git.py b/hyde/ext/plugins/git.py new file mode 100644 index 0000000..996a865 --- /dev/null +++ b/hyde/ext/plugins/git.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- +""" +Contains classes and utilities to extract information from git repository +""" + +from hyde.plugin import Plugin + +import subprocess +import traceback +from dateutil.parser import parse + +class GitDatesPlugin(Plugin): + """ + Extract creation and last modification date from git and include + them in the meta data if they are set to "git". Creation date + is put in `created` and last modification date in `modified`. + """ + + def __init__(self, site): + super(GitDatesPlugin, self).__init__(site) + + def begin_site(self): + """ + Initialize plugin. Retrieve dates from git + """ + for node in self.site.content.walk(): + for resource in node.resources: + created = None + modified = None + try: + created = resource.meta.created + modified = resource.meta.modified + except AttributeError: + pass + # Everything is already overrided + if created != "git" and modified != "git": + continue + # Run git log --pretty=%ai + try: + commits = subprocess.check_output(["git", "log", "--pretty=%ai", + resource.path]).split("\n") + except subprocess.CalledProcessError: + self.logger.warning("Unable to get git history for [%s]" % resource) + continue + commits = commits[:-1] + if not commits: + self.logger.warning("No git history for [%s]" % resource) + continue + if created == "git": + created = parse(commits[-1].strip()) + resource.meta.created = created + if modified == "git": + modified = parse(commits[0].strip()) + resource.meta.modified = modified