From 5a4803a3d794d44b17c305ed85143aa981d1396f Mon Sep 17 00:00:00 2001 From: Cotes Chung <11371340+cotes2020@users.noreply.github.com> Date: Mon, 18 Nov 2019 21:36:45 +0800 Subject: [PATCH] Add new feature to lastmod script tool. --- _scripts/py/update_posts_lastmod.py | 109 ++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 32 deletions(-) diff --git a/_scripts/py/update_posts_lastmod.py b/_scripts/py/update_posts_lastmod.py index fb5db8b..be3e781 100755 --- a/_scripts/py/update_posts_lastmod.py +++ b/_scripts/py/update_posts_lastmod.py @@ -16,58 +16,81 @@ Licensed under MIT import sys import glob import os +import getopt import subprocess import shutil +import datetime +import time +from enum import Enum from ruamel.yaml import YAML + from utils.common import get_yaml from utils.common import check_py_version -POSTS_PATH = "_posts" +Date = Enum('Date', ('GIT', 'FS')) + +POSTS_PATH = '_posts' def help(): print("Usage: " - " python update_posts_lastmod.py [option]\n" + " python update_posts_lastmod.py [options]\n" "Options:\n" - " -v, --verbose Print verbose logs\n") + " -f, --file Read a file.\n" + " -d, --dir 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 yaml = YAML() - for post in glob.glob(os.path.join(POSTS_PATH, "*.md")): - git_log_count = subprocess.getoutput( - "git log --pretty=%ad \"{}\" | wc -l".format(post)) + for post in glob.glob(path): - if git_log_count == "1": - continue + lastmod = '' - git_lastmod = subprocess.getoutput( - "git log -1 --pretty=%ad --date=iso \"{}\"".format(post)) + if date == Date.GIT: + git_log_count = subprocess.getoutput( + "git log --pretty=%ad \"{}\" | wc -l".format(post)) - if not git_lastmod: - continue + if git_log_count == "1": + continue - lates_commit = subprocess.check_output( - ['git', 'log', '-1', '--pretty=%B', post]).decode('utf-8') + git_lastmod = subprocess.getoutput( + "git log -1 --pretty=%ad --date=iso \"{}\"".format(post)) - if "[Automation]" in lates_commit and "Lastmod" in lates_commit: - continue + if not git_lastmod: + 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) meta = yaml.load(frontmatter) if 'seo' in meta: if ('date_modified' in meta['seo'] and - meta['seo']['date_modified'] == git_lastmod): + meta['seo']['date_modified'] == lastmod): continue else: - meta['seo']['date_modified'] = git_lastmod + meta['seo']['date_modified'] = lastmod else: - meta.insert(line_num, 'seo', dict(date_modified=git_lastmod)) + meta.insert(line_num, 'seo', dict(date_modified=lastmod)) output = 'new.md' if os.path.isfile(output): @@ -99,23 +122,45 @@ def update_lastmod(verbose): print("[INFO] Success to update lastmod for {} post(s).".format(count)) -def main(): +def main(argv): check_py_version() + path = os.path.join(POSTS_PATH, "*.md") verbose = False + date = Date.GIT - if len(sys.argv) > 1: - for arg in sys.argv: - if arg == sys.argv[0]: - continue + try: + opts, args = getopt.getopt( + argv, "hf:d:vt:", + ["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: - if arg == '-v' or arg == '--verbose': - verbose = True - else: - help() - return + help() + sys.exit(2) - update_lastmod(verbose) + update_lastmod(path, verbose, date) -main() +main(sys.argv[1:])