# -*- coding: utf-8 -*- """ This plugin is mostly a copy of the filetime_from_git plugin by Zhang Cheng and others. Copyright (c) David Douard Compute Date and Modified metadata from Mercurial revisions. """ import os from pelican import signals, contents from pelican.utils import strftime, set_date_tzinfo from datetime import datetime import hglib def datetime_from_timestamp(timestamp, content): """ Helper function to add timezone information to datetime, so that datetime is comparable to other datetime objects in recent versions that now also have timezone information. """ return set_date_tzinfo( datetime.fromtimestamp(timestamp), tz_name=content.settings.get('TIMEZONE', None)) def filetime_from_hg(content): if isinstance(content, contents.Static): return if 'date' in content.metadata: # if user did explicitely set a date, do not overwrite it return repo = hglib.open('.') tz_name = content.settings.get('TIMEZONE', None) hgtime = content.metadata.get('hgtime', 'yes').lower() if hgtime in ('no', 'off', 'false', '0'): return # 1. file is not managed by hg # date: fs time # 2. file is staged, but has no commits # date: fs time # 3. file is managed, and clean # date: first commit time, update: last commit time or None # 4. file is managed, but dirty # date: first commit time, update: fs time path = content.source_path root = repo.root() filelog = repo.log(revrange='.:0', files=[path,], follow=content.settings.get('HG_FILETIME_FOLLOW', False)) if filelog: # has commited content.date = set_date_tzinfo(filelog[-1][6], tz_name) if path in [os.path.join(root, mfile) for flag, mfile in repo.status(modified=True)]: # file is modified in the wd content.modified = datetime_from_timestamp( os.stat(path).st_ctime, content) else: # file is not changed if len(filelog) > 1: content.modified = set_date_tzinfo(filelog[0][6], tz_name) else: # file is not managed by hg content.date = datetime_from_timestamp(os.stat(path).st_ctime, content) if not hasattr(content, 'modified'): content.modified = content.date content.locale_date = strftime(content.date, content.date_format) content.locale_modified = strftime(content.modified, content.date_format) # ensure the metadata directory is synchronized. Might be used by # some other plugin (eg. series) content.metadata['modified'] = content.modified content.metadata['date'] = content.date def register(): signals.content_object_init.connect(filetime_from_hg)