* * reads last change date form mercurial * * writes last edite date to front matter /***************************************************************************** *****************************************************************************/ const fs = require('fs').promises const path = require('path') const { spawn } = require('child_process') const front = require('front-matter') const yaml = require('js-yaml') /***************************************************************************** *****************************************************************************/ const hgLogArgs = ['log', '--follow', '--pager', 'never', '--color', 'never'] const yamlDumpSettings = { indent: 2 } /***************************************************************************** *****************************************************************************/ getMdPaths(path.join(__dirname, '../hugo/content/')).then(paths => paths.map(async function(file) { const [commits, { attributes, body }] = await Promise.all([ const lastmod = commits[0].date const date = commits[commits.length - 1].date const newFrontString = yaml .dump({ ...attributes, lastmod, date }, yamlDumpSettings) const output = `---\n${newFrontString}\n---\n\n${body}` await fs.writeFile(file, output) console.log(`Updated: ${file}`) /***************************************************************************** *****************************************************************************/ * Get an orderd array commits for a file * @param {string} file the file path function getCommits(file) { return new Promise((resolve, reject) => { const log = spawn('hg', [...hgLogArgs, file]) log.stdout.on('data', data => { log.on('close', code => { new Error(`Unexpected return code from hg log ${code}`) resolve(commits.sort((a, b) => a.date - b.date).reverse()) * Converts the raw commit data from log into a a commit object * @param {string} commitString raw commit from hg output function parseCommit(commitString) { const [, key, value] = /(\w+):\s+(.+)/.exec(line) commit[key] = new Date(value) * Filters out commits that contain an automation flag const filterCommits = ({ summary }) => !/^\[(Automated|Auto|Minor)\]/i.test(summary) /***************************************************************************** *****************************************************************************/ * reads and parses a markdown file for frontmatter * @param {string} file path to markdown file async function getFrontMatter(file) { return fs.readFile(file, 'utf8').then(contents => front(contents)) * creates a list of all markdown files in a directory * @param {string} directory directory to search for markdown files async function getMdPaths(directory) { let items = (await fs.readdir(directory)).map(i => path.join(directory, i)) const stat = await fs.stat(item) if (stat.isDirectory()) { const nueveau = (await fs.readdir(item)).map(i => } else if (stat.isFile() && mdRegex.test(item)) {