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č <[email protected]>
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č <[email protected]>
Date: Thu Dec 3 21:51:19 2020 +0100
insert a chapter into post
M renamed-blog-post.md
commit 70955f7c2ecdec469226f8226a10ad313497972e
Author: Peter Babič <[email protected]>
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č <[email protected]>
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.tsvyzerá 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ť
- Otočiť záznamy
- Záznam so stavom A obsahuje dátum vytvorenia súboru (príspevok bol zverejnený)
- Posledný záznam so stavom M obsahuje dátum poslednej úpravy
- 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