|
@@ -0,0 +1,81 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+"""
|
|
|
+This plugin is mostly a copy of the filetime_from_git plugin
|
|
|
+by Zhang Cheng <StephenPCG@gmail.com> and others.
|
|
|
+
|
|
|
+Copyright (c) David Douard <david.douard@sdfa3.org>
|
|
|
+
|
|
|
+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)
|