[インデックス 12528] ファイルの概要
このコミットは、Go言語プロジェクトのリポジトリにおけるバージョン管理設定ファイルである.hgignore
(Mercurialの無視リストファイル)の変更に関するものです。具体的には、misc/cgo/testso
ディレクトリ内のテスト関連ファイルに対する無視ルールが更新され、testso
という名前のファイルではなく、main
という名前のファイルが無視されるように修正されました。これは、テストスクリプトが失敗した場合に生成されるmain
実行ファイルが適切にクリーンアップされない問題に対処するための変更です。
コミット
このコミットは、Goリポジトリの.hgignore
ファイルにおける無視ルールの調整を目的としています。misc/cgo/testso/testso
というパスで指定されていた無視対象が、misc/cgo/testso/main
に変更されました。この変更の理由は、test.bash
スクリプトがテスト失敗時にmain
という実行ファイルを削除しないため、このファイルをバージョン管理システムから無視することが望ましいと判断されたためです。これにより、不要なビルドアーティファクトがリポジトリに誤って追加されることを防ぎます。
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/b492bbe0d6e34b1b6a225ad98ba44eda9e23362f
元コミット内容
commit b492bbe0d6e34b1b6a225ad98ba44eda9e23362f
Author: Francisco Souza <franciscossouza@gmail.com>
Date: Thu Mar 8 12:49:23 2012 -0500
hgignore: ignoring misc/cgo/testso/main instead of /misc/cgo/testso/testso
test.bash does not remove main if the test fails, so it is good to keep main in .hgignore.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5784057
---
.hgignore | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n
diff --git a/.hgignore b/.hgignore
index d6ba72c6bc..741d7c61b2 100644
--- a/.hgignore
+++ b/.hgignore
@@ -27,7 +27,7 @@ doc/tmpltohtml
doc/articles/wiki/*.bin
misc/cgo/life/run.out
misc/cgo/stdio/run.out
-misc/cgo/testso/testso
+misc/cgo/testso/main
misc/dashboard/builder/builder
misc/goplay/goplay
misc/osx/*.pkg
変更の背景
この変更の背景には、Goプロジェクトのテストインフラストラクチャにおける特定の挙動があります。misc/cgo/testso
ディレクトリは、Cgo(GoとC言語の相互運用機能)に関連するテストコードを格納していると考えられます。これらのテストは、通常、test.bash
のようなシェルスクリプトによって実行されます。
問題は、test.bash
スクリプトがテストを実行する際に、一時的な実行ファイル(この場合はmain
という名前のバイナリ)を生成するものの、テストが失敗した場合にその生成されたファイルを適切にクリーンアップ(削除)しないという点にありました。これにより、テストが失敗した環境では、不要なmain
バイナリが残存し、これが誤ってバージョン管理システム(当時はMercurial)にコミットされてしまう可能性がありました。
バージョン管理システムにビルドアーティファクトや一時ファイルをコミットすることは、リポジトリの肥大化、不必要な差分の発生、ビルドの再現性の低下など、様々な問題を引き起こします。そのため、このような一時ファイルはバージョン管理の対象から除外することがベストプラクティスとされています。
このコミットは、この問題を解決するために、test.bash
がクリーンアップしないmain
バイナリを明示的に.hgignore
ファイルに追加することで、Mercurialがこのファイルを無視するように指示し、リポジトリの健全性を保つことを目的としています。
前提知識の解説
このコミットを理解するためには、以下の概念について理解しておく必要があります。
-
Mercurial (
hg
) と.hgignore
:- Mercurial: Gitと同様の分散型バージョン管理システム(DVCS)です。Goプロジェクトは歴史的にMercurialを使用していましたが、後にGitに移行しました。このコミットはMercurial時代のものです。
- .hgignore: Mercurialにおいて、特定のファイルやディレクトリをバージョン管理の対象から除外するための設定ファイルです。Gitにおける
.gitignore
ファイルと全く同じ目的を持ちます。このファイルに記述されたパターンに一致するファイルは、hg add
やhg commit
の対象から自動的に除外されます。ビルド生成物、一時ファイル、ログファイル、IDEの設定ファイルなどを無視するために使用されます。
-
Cgo:
- Cgoは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。
- Cgoを使用するプログラムは、GoコンパイラとCコンパイラ(通常はGCCやClang)の両方を使用してビルドされます。このビルドプロセス中に、中間ファイルや最終的な実行ファイルが生成されます。
-
テストスクリプト (
test.bash
):- ソフトウェア開発において、テストの実行を自動化するためにシェルスクリプトがよく使用されます。Goプロジェクトでは、
test.bash
のようなスクリプトが、特定のテストスイートのビルド、実行、結果の検証、そして一時ファイルのクリーンアップを担当することが一般的です。 - このコミットの文脈では、
test.bash
がCgoテストの実行ファイルを生成し、テストが成功した場合にはそれを削除するものの、テストが失敗した場合には削除しないという不完全なクリーンアップロジックを持っていたことが問題でした。
- ソフトウェア開発において、テストの実行を自動化するためにシェルスクリプトがよく使用されます。Goプロジェクトでは、
-
ビルドアーティファクト:
- ソースコードをコンパイル、リンク、またはその他のビルドプロセスを経て生成されるファイルのことです。これには、実行可能ファイル(バイナリ)、ライブラリ、オブジェクトファイル、中間コード、ログファイルなどが含まれます。
- 通常、ビルドアーティファクトはソースコードからいつでも再生成できるため、バージョン管理システムには含めず、無視リストに追加することが推奨されます。
技術的詳細
このコミットの技術的な核心は、バージョン管理システムにおける「無視リスト」の正確な設定にあります。
Goプロジェクトのmisc/cgo/testso
ディレクトリには、Cgoの共有ライブラリ(Shared Object, .so
)に関するテストが含まれています。これらのテストは、Cgoの機能を使ってGoとCのコードを連携させ、動的にロードされるライブラリの挙動を検証するものです。
テストプロセスでは、GoのソースコードとCのソースコードがコンパイルされ、最終的に実行可能なバイナリが生成されます。このバイナリは、テストの実行に使用されます。コミットメッセージによると、この実行ファイルはmain
という名前で生成されることが示唆されています。
以前の.hgignore
ファイルでは、misc/cgo/testso/testso
というパスが無視対象として指定されていました。これは、おそらく過去のテスト実行ファイルの名前や、特定のビルドアーティファクトの名前がtestso
であったことに由来すると考えられます。しかし、実際のテストスクリプト(test.bash
)が生成する実行ファイルの名前がmain
であり、かつテスト失敗時にこのmain
ファイルが削除されないという問題が浮上しました。
この状況では、テストが失敗するたびにmisc/cgo/testso/main
というファイルが残り、Mercurialがこのファイルを「追跡されていないファイル」として認識し、開発者が誤ってコミットしてしまうリスクがありました。これを防ぐために、無視リストのパターンをmisc/cgo/testso/testso
からmisc/cgo/testso/main
へと変更する必要がありました。
この変更により、misc/cgo/testso/main
ファイルはMercurialによって自動的に無視されるようになり、テストの成功・失敗にかかわらず、この一時的な実行ファイルがリポジトリに混入するのを防ぐことができます。これは、リポジトリのクリーンさを保ち、開発者が意図しないファイルをコミットするのを防ぐための、バージョン管理における一般的なベストプラクティスに沿った修正です。
コアとなるコードの変更箇所
変更は単一のファイル.hgignore
に対して行われました。
--- a/.hgignore
+++ b/.hgignore
@@ -27,7 +27,7 @@ doc/tmpltohtml
doc/articles/wiki/*.bin
misc/cgo/life/run.out
misc/cgo/stdio/run.out
-misc/cgo/testso/testso
+misc/cgo/testso/main
misc/dashboard/builder/builder
misc/goplay/goplay
misc/osx/*.pkg
具体的には、29行目の-misc/cgo/testso/testso
が削除され、代わりに+misc/cgo/testso/main
が追加されました。
コアとなるコードの解説
この変更は、.hgignore
ファイル内の特定の行を修正することで、Mercurialが無視するファイルの名前を変更しています。
-misc/cgo/testso/testso
: この行は、以前はmisc/cgo/testso/testso
というパスにあるファイルをMercurialが無視するように指示していました。これは、misc/cgo/testso
ディレクトリ内でtestso
という名前のファイル(おそらく実行ファイルや中間ファイル)が生成されることを想定していたものです。+misc/cgo/testso/main
: この行は、新しく追加されたルールで、misc/cgo/testso/main
というパスにあるファイルをMercurialが無視するように指示します。コミットメッセージにあるように、test.bash
スクリプトが生成する実際の実行ファイルの名前がmain
であり、テスト失敗時にこれが残存するため、このファイルを無視対象に含める必要がありました。
この変更により、Mercurialはmisc/cgo/testso/testso
という名前のファイルを無視しなくなり(もしそのようなファイルが生成されるのであれば、それは追跡対象になり得る)、代わりにmisc/cgo/testso/main
という名前のファイルを無視するようになります。これは、ビルドプロセスとテストスクリプトの実際の挙動に合わせて、無視リストを正確に調整したものです。
関連リンク
- Go Code Review (Gerrit) の変更リスト: https://golang.org/cl/5784057
参考にした情報源リンク
- Go言語の公式ドキュメント (Cgoに関する情報): https://go.dev/cmd/cgo/
- Mercurialの公式ドキュメント (.hgignoreに関する情報): https://www.mercurial-scm.org/wiki/hgignore
- Gitの公式ドキュメント (.gitignoreに関する情報 - 概念は.hgignoreと共通): https://git-scm.com/docs/gitignore
- 一般的なバージョン管理におけるビルドアーティファクトの無視に関するベストプラクティス。