mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
Merge 0c482ffa1a into ed82f62a5a
This commit is contained in:
commit
7185aa8f4b
3 changed files with 46 additions and 9 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'])
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue