This commit is contained in:
parent
c18e2fabae
commit
10c59e3d86
@ -7,17 +7,18 @@ date: "2024-02-08T17:18:56+0900"
|
|||||||
- [[Quartz]]で公開する際、記事ののcreated dateとlast modified dateを管理したいが、前者はgitの情報から得るのが難しい
|
- [[Quartz]]で公開する際、記事ののcreated dateとlast modified dateを管理したいが、前者はgitの情報から得るのが難しい
|
||||||
- 知らんけど多分ファイルのリネームとかの問題があるからだと思う
|
- 知らんけど多分ファイルのリネームとかの問題があるからだと思う
|
||||||
- ファイルシステムのタイムスタンプを使えばいいが、リモートマシンでは`git push`された時に作成されたことになってしまうので、ローカルのタイムスタンプの情報を引っこ抜いて、frontmatterに記入したい
|
- ファイルシステムのタイムスタンプを使えばいいが、リモートマシンでは`git push`された時に作成されたことになってしまうので、ローカルのタイムスタンプの情報を引っこ抜いて、frontmatterに記入したい
|
||||||
- `getfileinfo`でもファイル作成日は取得できるが、シェルスクリプトでファイルの中身を書き換えるとcreated dateが結構すぐ変わってしまう(sedとか)
|
- `getfileinfo`や`stat -f " %SB"`でもファイル作成日は取得できるが、シェルスクリプトでファイルの中身を書き換えるとcreated dateが結構すぐ変わってしまう(sedとか)
|
||||||
- しかし、`stat -f "%SB"`で得られるBirth Dateは残っていることが多い
|
- また、gitで複数環境で作業している場合、リモートで作ったファイルはgit pullした日がBirth Dateになる
|
||||||
- ただ、gitで複数環境で作業している場合、リモートで作ったファイルはgit pullした日がBirth Dateになる
|
- なので、次のようなシェルスクリプトを各git環境で実行することで、フロントマッター、全ての環境でのBirth date、もしくはgit blameしたうちの最古のコミット履歴のタイムスタンプのうちから一番古いものをフロントマッターに上書きする
|
||||||
- なので、次のようなシェルスクリプトを各git環境で実行することで全ての環境でのBirth dateのうち一番古いものをフロントマッターに上書きする
|
|
||||||
- 必要なツールはいずれもbrewで入れられる
|
- 必要なツールはいずれもbrewで入れられる
|
||||||
- `gsed`(フロントマッターのない記事に新たにメタデータを作る。macのsedは使用が違ってややこしいためgsedを使った)
|
- `gsed`(フロントマッターのない記事に新たにメタデータを作る。macのsedは使用が違ってややこしいためgsedを使った)
|
||||||
- `yq`(yamlをいい感じに書き換えてくれる)
|
- `yq`(yamlをいい感じに書き換えてくれる)
|
||||||
|
- 実装が雑なのでフロントマッターがないファイルは2回実行せんとダメかも
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
cwd=`dirname "${0}"`
|
cwd=`dirname "${0}"`
|
||||||
|
|
||||||
function rewritedate () {
|
function rewritedate () {
|
||||||
echo "$1 : $2"
|
echo "$1 : $2"
|
||||||
echo $2 | xargs -I{} yq -i --front-matter="process" '.date="{}"' "$1"
|
echo $2 | xargs -I{} yq -i --front-matter="process" '.date="{}"' "$1"
|
||||||
@ -27,19 +28,29 @@ IFS=$'\n'
|
|||||||
for f in $FILES
|
for f in $FILES
|
||||||
do
|
do
|
||||||
BDATE=$(stat -f "%SB" "$f");
|
BDATE=$(stat -f "%SB" "$f");
|
||||||
|
DATE=$(LC_ALL=C date -j -f "%b %d %H:%M:%S %Y" "$BDATE" "+%FT%T%z");
|
||||||
FLINE=$(head -n 1 "$f");
|
FLINE=$(head -n 1 "$f");
|
||||||
ORIGINDATE=$(yq --front-matter=extract '.date' "$f" | date "+%s")
|
|
||||||
LOCALDATE=$(LC_ALL=C date -j -f "%b %d %H:%M:%S %Y" "$BDATE" | date "+%s");
|
LOCALDATE=$(LC_ALL=C date -j -f "%b %d %H:%M:%S %Y" "$BDATE" "+%s" );
|
||||||
|
GITDATERAW=$(git blame $f |tail -1| grep -Eo '\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}');
|
||||||
|
GITDATE=$(LC_ALL=C date -j -f "%Y-%m-%d %H:%M:%S" "$GITDATERAW" "+%s");
|
||||||
|
GITDATE_2=$(LC_ALL=C date -j -f "%Y-%m-%d %H:%M:%S" "$GITDATERAW" "+%FT%T%z");
|
||||||
if [[ "$FLINE" == "---" ]];
|
if [[ "$FLINE" == "---" ]];
|
||||||
then
|
then
|
||||||
|
ORIGINDATE_RAW=$(yq --front-matter=extract '.date' "$f")
|
||||||
|
ORIGINDATE=$(date -j -f "%FT%T%z" "$ORIGINDATE_RAW" "+%s")
|
||||||
|
|
||||||
if [ $LOCALDATE -lt $ORIGINDATE ]; then
|
if [ $LOCALDATE -lt $ORIGINDATE ]; then
|
||||||
echo "$f has frontmatter and date of local file is older. overwriting."
|
echo "$f has frontmatter and date of local file is older. overwriting."
|
||||||
DATE=$(LC_ALL=C date -j -Iseconds -f "%b %d %H:%M:%S %Y" "$BDATE");
|
rewritedate $f $DATE
|
||||||
rewritedate $f $BDATE
|
fi
|
||||||
|
|
||||||
|
if [ $GITDATE -lt $LOCALDATE ]; then
|
||||||
|
echo "Oldest commit date is older than birth date. overwriting"
|
||||||
|
rewritedate $f $GITDATE_2
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
echo "$f has no frontmatter, adding to it";
|
echo "$f has no frontmatter, adding to it";
|
||||||
DATE=$(LC_ALL=C date -j -Iseconds -f "%b %d %H:%M:%S %Y" "$BDATE");
|
|
||||||
gsed -i '1i---\n---' "$f"
|
gsed -i '1i---\n---' "$f"
|
||||||
rewritedate $f $DATE
|
rewritedate $f $DATE
|
||||||
fi
|
fi
|
||||||
|
Loading…
Reference in New Issue
Block a user