| @@ -11,24 +11,15 @@ import os.path | |||
| import subprocess | |||
| # | |||
| # Git Dates | |||
| # | |||
| class GitDatesPlugin(Plugin): | |||
| class VCSDatesPlugin(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`. | |||
| Base class for getting resource timestamps from VCS. | |||
| """ | |||
| def __init__(self, site): | |||
| super(GitDatesPlugin, self).__init__(site) | |||
| def __init__(self, site, vcs_name='vcs'): | |||
| super(VCSDatesPlugin, self).__init__(site) | |||
| self.vcs_name = vcs_name | |||
| def begin_site(self): | |||
| """ | |||
| Initialize plugin. Retrieve dates from git | |||
| """ | |||
| for node in self.site.content.walk(): | |||
| for resource in node.resources: | |||
| created = None | |||
| @@ -38,80 +29,95 @@ class GitDatesPlugin(Plugin): | |||
| modified = resource.meta.modified | |||
| except AttributeError: | |||
| pass | |||
| # Everything is already overrided | |||
| if created != "git" and modified != "git": | |||
| if created != self.vcs_name and modified != self.vcs_name: | |||
| continue | |||
| # Run git log --pretty=%ai | |||
| try: | |||
| commits = subprocess.Popen(["git", "log", "--pretty=%ai", resource.path], stdout=subprocess.PIPE).communicate() | |||
| commits = commits[0].split("\n") | |||
| if not commits: | |||
| self.logger.warning("No git history for [%s]" % resource) | |||
| except subprocess.CalledProcessError: | |||
| self.logger.warning("Unable to get git history for [%s]" % resource) | |||
| commits = None | |||
| date_created, date_modified = self.get_dates(resource) | |||
| if created == "git": | |||
| if commits: | |||
| created = parse(commits[-1].strip()) | |||
| else: | |||
| created = datetime.utcfromtimestamp(os.path.getctime(resource.path)) | |||
| created = date_created or \ | |||
| datetime.utcfromtimestamp( | |||
| os.path.getctime(resource.path)) | |||
| created = created.replace(tzinfo=None) | |||
| resource.meta.created = created | |||
| if modified == "git": | |||
| if commits: | |||
| modified = parse(commits[0].strip()) | |||
| else: | |||
| modified = datetime.utcfromtimestamp(os.path.getmtime(resource.path)) | |||
| modified = date_modified or resource.source.last_modified | |||
| modified = modified.replace(tzinfo=None) | |||
| resource.meta.modified = modified | |||
| def get_dates(self): | |||
| """ | |||
| Extract creation and last modification date from the vcs and include | |||
| them in the meta data if they are set to "<vcs_name>". Creation date | |||
| is put in `created` and last modification date in `modified`. | |||
| """ | |||
| return None, None | |||
| # | |||
| # Mercurial Dates | |||
| # Git Dates | |||
| # | |||
| class GitDatesPlugin(VCSDatesPlugin): | |||
| def __init__(self, site): | |||
| super(GitDatesPlugin, self).__init__(site, 'git') | |||
| class MercurialDatesPlugin(Plugin): | |||
| """ | |||
| Extract creation and last modification date from mercurial and | |||
| include them in the meta data if they are set to "hg". Creation | |||
| date is put in `created` and last modification date in `modified`. | |||
| """ | |||
| def get_dates(self, resource): | |||
| """ | |||
| Retrieve dates from git | |||
| """ | |||
| # Run git log --pretty=%ai | |||
| try: | |||
| commits = subprocess.check_output([ | |||
| "git", | |||
| "log", | |||
| "--pretty=%ai", | |||
| resource.path | |||
| ]).split("\n") | |||
| commits = commits[:-1] | |||
| except subprocess.CalledProcessError: | |||
| self.logger.warning("Unable to get git history for [%s]" % resource) | |||
| commits = None | |||
| if commits: | |||
| created = parse(commits[-1].strip()) | |||
| modified = parse(commits[0].strip()) | |||
| else: | |||
| self.logger.warning("No git history for [%s]" % resource) | |||
| created, modified = None, None | |||
| self.logger.info("Git dates: %s", (resource, created, modified)) | |||
| return created, modified | |||
| # | |||
| # Mercurial Dates | |||
| # | |||
| class MercurialDatesPlugin(VCSDatesPlugin): | |||
| def __init__(self, site): | |||
| super(MercurialDatesPlugin, self).__init__(site) | |||
| super(MercurialDatesPlugin, self).__init__(site, 'hg') | |||
| def begin_site(self): | |||
| def get_dates(self, resource): | |||
| """ | |||
| Initialize plugin. Retrieve dates from mercurial | |||
| Retrieve dates from mercurial | |||
| """ | |||
| 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 != "hg" and modified != "hg": | |||
| continue | |||
| # Run hg log --template={date|isodatesec} | |||
| try: | |||
| commits = subprocess.check_output(["hg", "log", "--template={date|isodatesec}\n", | |||
| resource.path]).split('\n') | |||
| except subprocess.CalledProcessError: | |||
| self.logger.warning("Unable to get mercurial history for [%s]" % resource) | |||
| continue | |||
| commits = commits[:-1] | |||
| if not commits: | |||
| self.logger.warning("No mercurial history for [%s]" % resource) | |||
| continue | |||
| if created == "hg": | |||
| created = parse(commits[-1].strip()) | |||
| resource.meta.created = created | |||
| if modified == "hg": | |||
| modified = parse(commits[0].strip()) | |||
| resource.meta.modified = modified | |||
| # Run hg log --template={date|isodatesec} | |||
| try: | |||
| commits = subprocess.check_output([ | |||
| "hg", "log", "--template={date|isodatesec}\n", | |||
| resource.path]).split('\n') | |||
| commits = commits[:-1] | |||
| except subprocess.CalledProcessError: | |||
| self.logger.warning("Unable to get mercurial history for [%s]" | |||
| % resource) | |||
| commits = None | |||
| if not commits: | |||
| self.logger.warning("No mercurial history for [%s]" % resource) | |||
| return None, None | |||
| created = parse(commits[-1].strip()) | |||
| modified = parse(commits[0].strip()) | |||
| return created, modified | |||