Skip to content

fix: env doctor はリンク先のリポジトリで除外設定を判定する - #95

Merged
takemi-ohama merged 1 commit into
mainfrom
fix/env-doctor-symlink-ignore
Aug 15, 2026
Merged

takemi-ohama merged 1 commit into
mainfrom
fix/env-doctor-symlink-ignore

Conversation

@takemi-ohama

Copy link
Copy Markdown
Contributor

背景

PLAN35 (#90) で追加した devbase env doctor の除外設定チェックが、プラグイン経由でプロジェクトを取り込んでいる環境で常に誤報していた。

$ devbase env doctor
! 除外設定を確認できませんでした
    /Users/xxx/devbase で git check-ignore を実行できません
    (git が無い、または Git リポジトリではありません)

実際には git も入っており、DEVBASE_ROOT も Git リポジトリである。

原因

projects/<name> がプラグイン経由で別リポジトリへのシンボリックリンクになっている場合、DEVBASE_ROOT を作業ディレクトリにした git check-ignore はリンクを越えたパスを拒む。

$ git check-ignore --no-index -q -- projects/adminer/.env
fatal: pathspec 'projects/adminer/.env' is beyond a symbolic link
$ echo $?
128

_git_check_ignore は 0/1 以外を「判定できない」として None を返し、_check_gitignore は最初の None で警告を出して return していたため、

  1. 診断メッセージが事実と異なる(git はある / Git リポジトリでもある)
  2. 以降の点検パスが未検査のまま打ち切られる

の 2 点が起きていた。

変更

  • リンクを解いた実体の位置から所属リポジトリを引き直し、そのリポジトリからの相対パスで check-ignore を実行する (_probe_location)。リンク先の平文を除外できているかを決めるのはリンク先リポジトリの .gitignore なので、判定先を移すのが正しい。問うている内容 (この平文はコミットされうるか) は変えていない
  • 除外されていない場合は projects/x/.env → /path/to/other-repo/projects/x/.env の形で実体の位置も報告し、どちらの .gitignore を直すべきか分かるようにした
  • 判定できなかったパスで打ち切らず、最後にまとめて注意として報告する。打ち切ると確かめられるはずのパスの漏れまで見逃すため
  • 一覧の表示上限 (10 件) を _MAX_LISTED として既存箇所と共有

テスト

追加 3 件:

テスト 内容
test_doctor_checks_symlinked_projects_in_their_own_repository リンク先リポジトリが .env を除外していれば警告なしで通る
test_doctor_reports_linked_projects_that_are_not_ignored 除外していなければ実体の位置ごとエラー報告する
test_doctor_keeps_checking_after_an_undeterminable_path 1 件判定不能でも残りの点検を続ける
  • uv run pytest — 1229 passed
  • uvx ruff check --select=E9,F63,F7,F82 lib tests — pass (CI と同条件)

実環境での確認

42 プロジェクトすべてが symlink の環境で、修正前は注意 3 件(うち 1 件が本誤報)→ 修正後は誤報が消えて注意 2 件(退避平文と旧控えファイルの案内のみ)になることを確認済み。

🤖 Generated with Claude Code

`projects/<name>` がプラグイン経由で別リポジトリへのシンボリックリンクに
なっている環境では、`git check-ignore --no-index -- projects/<name>/.env` が
`fatal: pathspec ... is beyond a symbolic link` で 128 を返す。doctor はこれを
「git が無い、または Git リポジトリではありません」と報告し、そこで残りの
点検も打ち切っていた。実際には Git も devbase も正常で、診断だけが誤っていた。

リンクを解いた実体から所属リポジトリを引き直し、そのリポジトリからの相対パスで
判定する。問うている内容 (この平文はコミットされうるか) は変えず、判定先だけを
実際にそのファイルを管理しているリポジトリへ移す。除外されていない場合は実体の
位置も報告に添え、どちらの .gitignore を直せばよいか分かるようにした。

あわせて、1 件でも判定できなかった時点で打ち切る挙動をやめ、確かめられなかった
パスをまとめて注意として報告するようにした。打ち切ると、確かめられるはずの
パスの漏れまで見逃す。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@takemi-ohama
takemi-ohama merged commit 4fdb4ac into main Aug 15, 2026
5 checks passed
@takemi-ohama
takemi-ohama deleted the fix/env-doctor-symlink-ignore branch August 15, 2026 17:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant