109 lines
3.3 KiB
Python
109 lines
3.3 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
import base64
|
||
|
import hashlib
|
||
|
import os
|
||
|
import logging
|
||
|
from pelican.utils import strftime
|
||
|
from .utils import string_to_bool
|
||
|
from .utils import datetime_from_timestamp
|
||
|
from .registration import content_git_object_init
|
||
|
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
@content_git_object_init.connect
|
||
|
def filetime_from_git(content, git_content):
|
||
|
'''
|
||
|
Update modification and creation times from git
|
||
|
'''
|
||
|
if not content.settings['GIT_FILETIME_FROM_GIT']:
|
||
|
# Disabled for everything
|
||
|
return
|
||
|
|
||
|
if not string_to_bool(content.metadata.get('gittime', 'yes')):
|
||
|
# Disable for this content
|
||
|
return
|
||
|
|
||
|
path = content.source_path
|
||
|
fs_creation_time = datetime_from_timestamp(os.stat(path).st_ctime, content)
|
||
|
fs_modified_time = datetime_from_timestamp(os.stat(path).st_mtime, content)
|
||
|
|
||
|
# 1. file is not managed by git
|
||
|
# 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
|
||
|
if git_content.is_managed_by_git():
|
||
|
if git_content.is_committed():
|
||
|
content.date = git_content.get_oldest_commit_date()
|
||
|
|
||
|
if git_content.is_modified():
|
||
|
content.modified = fs_modified_time
|
||
|
else:
|
||
|
content.modified = git_content.get_newest_commit_date()
|
||
|
else:
|
||
|
# File isn't committed
|
||
|
content.date = fs_creation_time
|
||
|
else:
|
||
|
# file is not managed by git
|
||
|
content.date = fs_creation_time
|
||
|
|
||
|
# Clean up content attributes
|
||
|
if not hasattr(content, 'modified'):
|
||
|
content.modified = content.date
|
||
|
|
||
|
if hasattr(content, 'date'):
|
||
|
content.locale_date = strftime(content.date, content.date_format)
|
||
|
|
||
|
if hasattr(content, 'modified'):
|
||
|
content.locale_modified = strftime(
|
||
|
content.modified, content.date_format)
|
||
|
|
||
|
|
||
|
@content_git_object_init.connect
|
||
|
def git_sha_metadata(content, git_content):
|
||
|
'''
|
||
|
Add sha metadata to content
|
||
|
'''
|
||
|
if not content.settings['GIT_SHA_METADATA']:
|
||
|
return
|
||
|
|
||
|
if not git_content.is_committed():
|
||
|
return
|
||
|
|
||
|
content.metadata['gitsha_newest'] = str(git_content.get_newest_commit())
|
||
|
content.metadata['gitsha_oldest'] = str(git_content.get_oldest_commit())
|
||
|
|
||
|
|
||
|
@content_git_object_init.connect
|
||
|
def git_permalink(content, git_content):
|
||
|
'''
|
||
|
Add git based permalink id to content metadata
|
||
|
'''
|
||
|
if not content.settings['GIT_GENERATE_PERMALINK']:
|
||
|
return
|
||
|
|
||
|
if not string_to_bool(content.metadata.get('git_permalink', 'yes')):
|
||
|
# Disable for this content
|
||
|
return
|
||
|
|
||
|
if not git_content.is_committed():
|
||
|
return
|
||
|
|
||
|
permalink_hash = hashlib.sha1()
|
||
|
permalink_hash.update(str(git_content.get_oldest_commit()))
|
||
|
permalink_hash.update(str(git_content.get_oldest_filename()))
|
||
|
git_permalink_id = base64.urlsafe_b64encode(permalink_hash.digest())
|
||
|
permalink_id_metadata_key = content.settings['PERMALINK_ID_METADATA_KEY']
|
||
|
|
||
|
if permalink_id_metadata_key in content.metadata:
|
||
|
content.metadata[permalink_id_metadata_key] = (
|
||
|
','.join((
|
||
|
content.metadata[permalink_id_metadata_key], git_permalink_id)))
|
||
|
else:
|
||
|
content.metadata[permalink_id_metadata_key] = git_permalink_id
|