From d04fef3539082b392fa6d9cd8aefe1d9a864bf8c Mon Sep 17 00:00:00 2001 From: gapul <92638132+gapul@users.noreply.github.com> Date: Tue, 28 Jul 2026 09:29:09 +0900 Subject: [PATCH] =?UTF-8?q?feat(just):=20maintain=20=E3=81=AE=E5=86=92?= =?UTF-8?q?=E9=A0=AD=E3=81=A7=20dotfiles=20=E3=82=92=20git=20pull=20(?= =?UTF-8?q?=E3=83=AF=E3=83=B3=E3=82=B7=E3=83=A7=E3=83=83=E3=83=88=E5=8C=96?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit maintain は flake input を更新するのに自分のリポは pull せず、local が古い まま旧レシピで維持して失敗する事故が起きていた。maintain の趣旨は「全部 最新にする」なので、冒頭で本体ツリーを git pull --rebase --autostash する。 - main ブランチのときだけ pull (feature/detached では触らない)。WIP は autostash。 - pull が post-merge/post-rewrite hook を発火し二重 rebuild になるのを、 DOTFILES_MAINTAIN=1 を export し hook 側で早期 exit して抑止。 - macOS/Linux 両 maintain に適用。 Co-Authored-By: Claude Opus 4.8 (1M context) --- Justfile | 20 ++++++++++++++++++++ nix/home/git-hooks.nix | 7 +++++++ 2 files changed, 27 insertions(+) diff --git a/Justfile b/Justfile index ac893810..1be4ae06 100644 --- a/Justfile +++ b/Justfile @@ -206,6 +206,16 @@ _maintain-macos: mkdir "$maintenance_lock" 2>/dev/null || { echo "failed to acquire maintenance lock" >&2; exit 1; } fi echo $$ > "$maintenance_lock/pid" + export DOTFILES_MAINTAIN=1 + # 古い設定のまま維持する事故を防ぐため、まず自分の dotfiles を最新化する。 + # main ブランチのときだけ (feature ブランチや detached では pull しない)。git 操作は + # 常に本体ツリーを対象にする。pull は post-merge/post-rewrite hook を発火するが、 + # 上で export した DOTFILES_MAINTAIN=1 で hook 側 rebuild はスキップされる + # (この後 just rebuild を自前で回すので二重 rebuild を避ける)。 + if [ "$(git -C "$HOME/.dotfiles" branch --show-current 2>/dev/null)" = "main" ]; then + echo "━━━ git pull (--rebase --autostash)" + git -C "$HOME/.dotfiles" pull --rebase --autostash + fi just outdated lock="{{flake}}/flake.lock" old_lock=$(mktemp) @@ -241,6 +251,16 @@ _maintain-linux: mkdir "$maintenance_lock" 2>/dev/null || { echo "failed to acquire maintenance lock" >&2; exit 1; } fi echo $$ > "$maintenance_lock/pid" + export DOTFILES_MAINTAIN=1 + # 古い設定のまま維持する事故を防ぐため、まず自分の dotfiles を最新化する。 + # main ブランチのときだけ (feature ブランチや detached では pull しない)。git 操作は + # 常に本体ツリーを対象にする。pull は post-merge/post-rewrite hook を発火するが、 + # 上で export した DOTFILES_MAINTAIN=1 で hook 側 rebuild はスキップされる + # (この後 just rebuild を自前で回すので二重 rebuild を避ける)。 + if [ "$(git -C "$HOME/.dotfiles" branch --show-current 2>/dev/null)" = "main" ]; then + echo "━━━ git pull (--rebase --autostash)" + git -C "$HOME/.dotfiles" pull --rebase --autostash + fi just outdated lock="{{flake}}/flake.lock" old_lock=$(mktemp) diff --git a/nix/home/git-hooks.nix b/nix/home/git-hooks.nix index b2fe35c4..a8a44772 100644 --- a/nix/home/git-hooks.nix +++ b/nix/home/git-hooks.nix @@ -25,6 +25,13 @@ let guardAndRebuild = range: label: '' DOTFILES_DIR="${dotfilesDir}" + # `just maintain` が内部で叩く git pull からは回さない。maintain は pull の後に + # 自前で rebuild するため、ここで走ると二重 rebuild になる (maintain が + # DOTFILES_MAINTAIN=1 を export している)。 + if [ -n "''${DOTFILES_MAINTAIN:-}" ]; then + exit 0 + fi + # worktree からは回さない (本体ツリーのみ)。共有 .git/hooks 経由で worktree でも # 発火しうるため、toplevel が本体と一致するときだけ続行する。 if [ "$(${git} rev-parse --show-toplevel 2>/dev/null)" != "$DOTFILES_DIR" ]; then