Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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がこのファイルを無視するように指示し、リポジトリの健全性を保つことを目的としています。

前提知識の解説

このコミットを理解するためには、以下の概念について理解しておく必要があります。

  1. Mercurial (hg) と .hgignore:

    • Mercurial: Gitと同様の分散型バージョン管理システム(DVCS)です。Goプロジェクトは歴史的にMercurialを使用していましたが、後にGitに移行しました。このコミットはMercurial時代のものです。
    • .hgignore: Mercurialにおいて、特定のファイルやディレクトリをバージョン管理の対象から除外するための設定ファイルです。Gitにおける.gitignoreファイルと全く同じ目的を持ちます。このファイルに記述されたパターンに一致するファイルは、hg addhg commitの対象から自動的に除外されます。ビルド生成物、一時ファイル、ログファイル、IDEの設定ファイルなどを無視するために使用されます。
  2. Cgo:

    • Cgoは、GoプログラムからC言語のコードを呼び出したり、C言語のコードからGoの関数を呼び出したりするためのGoの機能です。これにより、既存のCライブラリをGoプロジェクトで再利用したり、パフォーマンスが重要な部分をCで記述したりすることが可能になります。
    • Cgoを使用するプログラムは、GoコンパイラとCコンパイラ(通常はGCCやClang)の両方を使用してビルドされます。このビルドプロセス中に、中間ファイルや最終的な実行ファイルが生成されます。
  3. テストスクリプト (test.bash):

    • ソフトウェア開発において、テストの実行を自動化するためにシェルスクリプトがよく使用されます。Goプロジェクトでは、test.bashのようなスクリプトが、特定のテストスイートのビルド、実行、結果の検証、そして一時ファイルのクリーンアップを担当することが一般的です。
    • このコミットの文脈では、test.bashがCgoテストの実行ファイルを生成し、テストが成功した場合にはそれを削除するものの、テストが失敗した場合には削除しないという不完全なクリーンアップロジックを持っていたことが問題でした。
  4. ビルドアーティファクト:

    • ソースコードをコンパイル、リンク、またはその他のビルドプロセスを経て生成されるファイルのことです。これには、実行可能ファイル(バイナリ)、ライブラリ、オブジェクトファイル、中間コード、ログファイルなどが含まれます。
    • 通常、ビルドアーティファクトはソースコードからいつでも再生成できるため、バージョン管理システムには含めず、無視リストに追加することが推奨されます。

技術的詳細

このコミットの技術的な核心は、バージョン管理システムにおける「無視リスト」の正確な設定にあります。

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という名前のファイルを無視するようになります。これは、ビルドプロセスとテストスクリプトの実際の挙動に合わせて、無視リストを正確に調整したものです。

関連リンク

参考にした情報源リンク