Po mojom predchádzajúcom pokuse získať dátum zverejnenia a dátum úpravy príspevku, ktorý žije výhradne v gite, som narazil na slepú uličku, pretože som nedokázal spoľahlivo vyriešiť spracovanie premenovaní. Nakoniec som však našiel funkčný spôsob.

  • Začnite prípravou súboru s git históriou obsahujúcou premenovanie
git log --follow --name-status renamed-blog-post.md

Všimnite si parameter follow, ktorý pomáha vyprodukovať výstup, ktorý môže vyzerať takto

commit 48831b93a453f7c88838620509ccae6f9feaf851 (HEAD -> master)
Author: Peter Babič <peter@peterbabic.com>
Date:   Thu Dec 3 22:07:31 2020 +0100

    add additional sentence to to blog post

M       renamed-blog-post.md

commit f6732cbfb7d787f62190b983f73901dd05f749e5
Author: Peter Babič <peter@peterbabic.com>
Date:   Thu Dec 3 21:51:19 2020 +0100

    insert a chapter into post

M       renamed-blog-post.md

commit 70955f7c2ecdec469226f8226a10ad313497972e
Author: Peter Babič <peter@peterbabic.com>
Date:   Thu Dec 3 21:49:27 2020 +0100

    rename blog post

R100    blog-post.md    renamed-blog-post.md

commit 86b45b4a5a7aee4726834e70f0ede60ac961abc5
Author: Peter Babič <peter@peterbabic.com>
Date:   Thu Dec 3 20:54:27 2020 +0100

    insert blog post file to track

A       blog-post.md

Cieľom je mať dátumy prístupné v Typescript

  • Nainštalovať potrebné balíčky
npm install gitlog date-fns
  • Nainštalovať potrebné vývojárske balíčky
npm install -D typescript ts-node-dev
  • Minimálny tsconfig.json, ktorý mi fungoval
{
  "compilerOptions": {
    "target": "es6",
    "module": "commonjs",
    "lib": ["ES2017", "DOM"]
  }
}
  • Minimálny kód pre server.ts vyzerá takto
import gitlog, { GitlogOptions } from "gitlog"

const options: GitlogOptions = {
  repo: ".",
  fields: ["subject", "authorName", "authorDate"] as const,
  branch: "--follow",
  file: "renamed-blog-post.md",
}

gitlog(options).forEach(entry => console.log(entry))

branch: "--follow" je bohužiaľ hack – v čase písania je gitlog vo verzii 4.0.3 a nepodporuje parameter follow priamo. Prehliadnutie kódu však odhaľuje, že branch umožňuje vložiť akýkoľvek text, nielen názvy vetví, pretože tam nie je žiadna sanitizácia.

  • Spustenie skriptu
npx ts-node-dev server.ts

Produkuje požadované výsledky, vlastnosť authorDate sa ľahko parsuje

{
  status: [ 'M' ],
  files: [ 'renamed-blog-post.md' ],
  subject: 'add additional sentence to to blog post',
  authorName: 'Peter Babič',
  authorDate: '2020-12-03 22:07:31 +0100'
}
{
  status: [ 'M' ],
  files: [ 'renamed-blog-post.md' ],
  subject: 'insert a chapter into post',
  authorName: 'Peter Babič',
  authorDate: '2020-12-03 21:51:19 +0100'
}
{
  status: [ 'R100', 'D' ],
  files: [ 'renamed-blog-post.md', 'blog-post.md' ],
  subject: 'rename blog post',
  authorName: 'Peter Babič',
  authorDate: '2020-12-03 21:49:27 +0100'
}
{
  status: [ 'A' ],
  files: [ 'blog-post.md' ],
  subject: 'insert blog post file to track',
  authorName: 'Peter Babič',
  authorDate: '2020-12-03 20:54:27 +0100'
}

Kroky parsovania môžu potom zahŕňať

  1. Otočiť záznamy
  2. Záznam so stavom A obsahuje dátum vytvorenia súboru (príspevok bol zverejnený)
  3. Posledný záznam so stavom M obsahuje dátum poslednej úpravy
  4. Ak posledný záznam má stav R a jeho skóre je nižšie ako 100, znamená to, že súbor bol premenovaný a upravený, teraz sa načíta dátum poslednej úpravy

Podrobnosti o skóre z git diff dokumentácie

Písmená stavu C a R sú vždy nasledované skóre (udávajúcim percento podobnosti medzi zdrojom a cieľom presunu alebo kopírovania). Za písmenom stavu M môže nasledovať skóre (udávajúce percento nepodobnosti) pri prepisovaní súborov.

Hotovo!

Zdrojové kódy sú dostupné v repozitári