12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- # -*- 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)
|