[Rails] Rails.app.revisionがアプリケーションルートのGitリポジトリを正しく参照するように修正

rails/rails

背景

#56490で導入された変更により、Rails.app.revisionがカレントワーキングディレクトリの.gitをチェックするようになっていました。この実装では、アプリケーションが別のディレクトリから実行された場合に正しいリビジョン情報を取得できない問題がありました。

例えば、Railsアプリケーションが/var/www/myappにデプロイされているが、/tmpから実行された場合、/tmp/.gitを参照してしまい、意図したリビジョン情報が得られませんでした。

技術的な変更内容

変更前の実装

if Dir.exist?(".git")
  rev = `git rev-parse HEAD 2> /dev/null`.strip.presence
  rev if $?.success?
end

この実装では、カレントディレクトリに.gitが存在するかをチェックし、バッククォートでgitコマンドを実行していました。実行ディレクトリに依存するため、アプリケーションルート以外から起動すると失敗します。

変更後の実装

r, w = IO.pipe
if system("git", "-C", root.to_s, "rev-parse", "HEAD", in: File::NULL, err: File::NULL, out: w)
  r.read.strip
else
  r.close
  nil
end

改善された実装では以下の技術的な変更が加えられています。

主要な改善点

1. Git作業ディレクトリの明示的な指定

git -Cオプションを使用することで、gitコマンドを実行する作業ディレクトリを明示的に指定できます。root.to_sはRailsアプリケーションのルートディレクトリを指すため、カレントディレクトリに関係なく正しいリポジトリを参照します。

2. セキュアなコマンド実行

バッククォート構文からRubyのsystemメソッドに変更されています。systemメソッドでは引数を個別に渡すことで、シェルインジェクションのリスクを軽減できます。

3. パイプを使った出力のキャプチャ

r, w = IO.pipe

IO.pipeを使用して、読み取り側(r)と書き込み側(w)のパイプを作成しています。gitコマンドの標準出力をパイプの書き込み側にリダイレクトし、読み取り側から結果を取得します。

4. 標準入出力の制御

in: File::NULL, err: File::NULL, out: w
  • in: File::NULL: 標準入力を/dev/nullにリダイレクト
  • err: File::NULL: 標準エラー出力を/dev/nullにリダイレクト
  • out: w: 標準出力をパイプの書き込み側にリダイレクト

これにより、不要な出力を抑制しつつ、必要な情報だけを取得できます。

5. エラーハンドリングの改善

if system(...)
  r.read.strip
else
  r.close
  nil
end

systemメソッドはコマンドが成功した場合にtrueを返します。失敗時には明示的にパイプをクローズしてnilを返すことで、リソースリークを防ぎます。

実用的な影響

この修正により、以下のようなシナリオで正しく動作するようになります。

# /var/www/myapp がRailsアプリケーションルート
Dir.chdir("/tmp")  # 別のディレクトリに移動

# 修正前: /tmp/.git を探してしまう → 失敗
# 修正後: /var/www/myapp/.git を正しく参照 → 成功
Rails.application.revision  # => "abc123def456..."

デプロイスクリプトやバックグラウンドジョブなど、Railsアプリケーションを異なるディレクトリから起動するケースで、Rails.app.revisionが確実に機能するようになります。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成、カスタムMarkdown構文、対象読者への適合性、すべての項目でガイドラインを完全に遵守しています。特にコードブロック前後の空行やファイル名付きシンタックスハイライトが正しく使用されており、可読性が高いです。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ✓ PASS

技術的な正確性と表現の適切性

Diff内容との照合、技術用語の正確性、説明の技術的正確性、すべての点で問題ありません。コードの引用は正確であり、`git -C`や`system`メソッド、`IO.pipe`に関する技術的な解説は的確かつ論理的です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

PRの内容と完全に整合しており、ハルシネーションは検出されませんでした。PRで言及されている問題の背景、修正内容、さらには先行するPR番号(#56490)への言及も正確です。記事の主張はすべてPR情報とDiffによって裏付けられています。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除