Add new feature to lastmod script tool.

This commit is contained in:
Cotes Chung 2019-11-18 21:36:45 +08:00
parent 299d7e799f
commit 5a4803a3d7

View file

@ -16,58 +16,81 @@ Licensed under MIT
import sys import sys
import glob import glob
import os import os
import getopt
import subprocess import subprocess
import shutil import shutil
import datetime
import time
from enum import Enum
from ruamel.yaml import YAML from ruamel.yaml import YAML
from utils.common import get_yaml from utils.common import get_yaml
from utils.common import check_py_version from utils.common import check_py_version
POSTS_PATH = "_posts" Date = Enum('Date', ('GIT', 'FS'))
POSTS_PATH = '_posts'
def help(): def help():
print("Usage: " print("Usage: "
" python update_posts_lastmod.py [option]\n" " python update_posts_lastmod.py [options]\n"
"Options:\n" "Options:\n"
" -v, --verbose Print verbose logs\n") " -f, --file <file path> Read a file.\n"
" -d, --dir <directory path> Read from a directory.\n"
" -h, --help Print help information\n"
" -v, --verbose Print verbose logs\n"
" -t, --datetime < git | fs > Chose post's datetime source, "
"'git' for git-log, 'fs' for filesystem, default to 'git'.\n")
def update_lastmod(verbose): def update_lastmod(path, verbose, date):
count = 0 count = 0
yaml = YAML() yaml = YAML()
for post in glob.glob(os.path.join(POSTS_PATH, "*.md")): for post in glob.glob(path):
git_log_count = subprocess.getoutput(
"git log --pretty=%ad \"{}\" | wc -l".format(post))
if git_log_count == "1": lastmod = ''
continue
git_lastmod = subprocess.getoutput( if date == Date.GIT:
"git log -1 --pretty=%ad --date=iso \"{}\"".format(post)) git_log_count = subprocess.getoutput(
"git log --pretty=%ad \"{}\" | wc -l".format(post))
if not git_lastmod: if git_log_count == "1":
continue continue
lates_commit = subprocess.check_output( git_lastmod = subprocess.getoutput(
['git', 'log', '-1', '--pretty=%B', post]).decode('utf-8') "git log -1 --pretty=%ad --date=iso \"{}\"".format(post))
if "[Automation]" in lates_commit and "Lastmod" in lates_commit: if not git_lastmod:
continue continue
lates_commit = subprocess.check_output(
['git', 'log', '-1', '--pretty=%B', post]).decode('utf-8')
if "[Automation]" in lates_commit and "Lastmod" in lates_commit:
continue
lastmod = git_lastmod
elif date == Date.FS:
t = os.path.getmtime(post)
dt = datetime.datetime.fromtimestamp(t)
lastmod = dt.strftime('%F %T') + time.strftime(' %z')
frontmatter, line_num = get_yaml(post) frontmatter, line_num = get_yaml(post)
meta = yaml.load(frontmatter) meta = yaml.load(frontmatter)
if 'seo' in meta: if 'seo' in meta:
if ('date_modified' in meta['seo'] and if ('date_modified' in meta['seo'] and
meta['seo']['date_modified'] == git_lastmod): meta['seo']['date_modified'] == lastmod):
continue continue
else: else:
meta['seo']['date_modified'] = git_lastmod meta['seo']['date_modified'] = lastmod
else: else:
meta.insert(line_num, 'seo', dict(date_modified=git_lastmod)) meta.insert(line_num, 'seo', dict(date_modified=lastmod))
output = 'new.md' output = 'new.md'
if os.path.isfile(output): if os.path.isfile(output):
@ -99,23 +122,45 @@ def update_lastmod(verbose):
print("[INFO] Success to update lastmod for {} post(s).".format(count)) print("[INFO] Success to update lastmod for {} post(s).".format(count))
def main(): def main(argv):
check_py_version() check_py_version()
path = os.path.join(POSTS_PATH, "*.md")
verbose = False verbose = False
date = Date.GIT
if len(sys.argv) > 1: try:
for arg in sys.argv: opts, args = getopt.getopt(
if arg == sys.argv[0]: argv, "hf:d:vt:",
continue ["file=", "dir=", "help", "verbose", "datetime="])
except getopt.GetoptError:
help()
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
help()
sys.exit()
elif opt == '-f' or opt == '--file':
path = arg
elif opt == '-d' or opt == '--dir':
path = os.path.join(arg, "*.md")
elif opt == '-v' or opt == '--verbose':
verbose = True
elif opt == '-t' or opt == '--datetime':
if arg == 'git':
date = Date.GIT
elif arg == 'fs':
date = Date.FS
else: else:
if arg == '-v' or arg == '--verbose': help()
verbose = True sys.exit(2)
else:
help()
return
update_lastmod(verbose) update_lastmod(path, verbose, date)
main() main(sys.argv[1:])