This commit is contained in:
Jörn S 2013-06-12 16:21:12 -07:00
commit 7185aa8f4b
3 changed files with 46 additions and 9 deletions

View file

@ -279,14 +279,17 @@ be specified either via the ``tags`` metadata, as is standard in Pelican, or
via the ``keywords`` metadata, as is standard in HTML. The two can be used via the ``keywords`` metadata, as is standard in HTML. The two can be used
interchangeably. interchangeably.
Note that, aside from the title, none of this article metadata is mandatory: Note that, aside from the title, none of this article metadata is mandatory: if
if the date is not specified and ``DEFAULT_DATE`` is set to ``fs``, Pelican the date is not specified and ``DEFAULT_DATE`` is set to ``fs``, Pelican will
will rely on the file's "mtime" timestamp, and the category can be determined rely on the file's "mtime" timestamp. If you keep your content in a git
by the directory in which the file resides. For example, a file located at repository, you can set ``DEFAULT_DATE`` to ``git-last-modified`` or
``python/foobar/myfoobar.rst`` will have a category of ``foobar``. If you would ``git-creation`` to let Pelican use git information (either the time of the last
like to organize your files in other ways where the name of the subfolder would commit when the file was modified, or the time of the commit when the file was
not be a good category name, you can set the setting ``USE_FOLDER_AS_CATEGORY`` created). The category can be determined by the directory in which the file
to ``False``. resides. For example, a file located at ``python/foobar/myfoobar.rst`` will have
a category of ``foobar``. If you would like to organize your files in other ways
where the name of the subfolder would not be a good category name, you can set
the setting ``USE_FOLDER_AS_CATEGORY`` to ``False``.
If you do not explicitly specify summary metadata for a given post, the If you do not explicitly specify summary metadata for a given post, the
``SUMMARY_MAX_LENGTH`` setting can be used to specify how many words from the ``SUMMARY_MAX_LENGTH`` setting can be used to specify how many words from the

View file

@ -23,7 +23,9 @@ from pelican.contents import (
Article, Page, Category, Static, is_valid_content Article, Page, Category, Static, is_valid_content
) )
from pelican.readers import read_file from pelican.readers import read_file
from pelican.utils import copy, process_translations, mkdir_p, DateFormatter from pelican.utils import (
copy, process_translations, mkdir_p, DateFormatter, git_mtime
)
from pelican import signals from pelican import signals
import pelican.utils import pelican.utils
@ -407,6 +409,10 @@ class ArticlesGenerator(Generator):
if self.settings['DEFAULT_DATE'] == 'fs': if self.settings['DEFAULT_DATE'] == 'fs':
metadata['date'] = datetime.datetime.fromtimestamp( metadata['date'] = datetime.datetime.fromtimestamp(
os.stat(f).st_ctime) os.stat(f).st_ctime)
elif self.settings['DEFAULT_DATE'] == 'git-last-modified':
metadata['date'] = git_mtime(f, True)
elif self.settings['DEFAULT_DATE'] == 'git-creation':
metadata['date'] = git_mtime(f, False)
else: else:
metadata['date'] = datetime.datetime( metadata['date'] = datetime.datetime(
*self.settings['DEFAULT_DATE']) *self.settings['DEFAULT_DATE'])

View file

@ -11,6 +11,7 @@ import logging
import errno import errno
import locale import locale
import fnmatch import fnmatch
import subprocess
from collections import Hashable from collections import Hashable
from functools import partial from functools import partial
@ -549,3 +550,30 @@ def split_all(path):
break break
path = head path = head
return components return components
def git_mtime(filename, use_last_modification=True, git_binary="git"):
"""Determines the git modification time of a file and returns it as a
datetime.datetime object.
If use_last_modification is True, then the date and time of the last
modification will be returned. Otherwise the date and time of the first
commit containing the file will be returned.
The optional argument 'git_binary' can be used to specify the git binary to
use.
"""
call = [git_binary, "log", "--pretty=format:%at ", filename]
repository= os.path.dirname(filename)
try:
output = subprocess.check_output(call, cwd=repository).decode('utf-8').splitlines()
except Exception as e:
print("ERROR: Could not get git time information for {0}: {1}".format(filename, str(e)))
return None
dates = [ datetime.fromtimestamp(int(x)) for x in output ]
sorted_dates = sorted(dates)
return sorted_dates[-1] if use_last_modification else sorted_dates[0]