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

[インデックス 13697] ファイルの概要

コミット

  • コミットハッシュ: f653dfeb498b96c72fbad92ef3dab2887435230f
  • 作者: Shenghou Ma minux.ma@gmail.com
  • コミット日時: 2012年8月28日 火曜日 04:03:27 +0800
  • コミットメッセージ:
    cmd/api: recognize version "devel" as dev. branch and apply -next
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/6476066
    

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/f653dfeb498b96c72fbad92ef3dab2887435230f

元コミット内容

cmd/api: recognize version "devel" as dev. branch and apply -next

このコミットは、Go言語のcmd/apiツールにおいて、Goのバージョンが"devel"である場合に、開発ブランチとして認識し、-nextオプションで指定されたAPI定義ファイルを適用できるようにする変更です。

変更の背景

Go言語の開発プロセスにおいて、安定版リリースとは別に、開発中の最新版(開発ブランチ)が存在します。cmd/apiツールは、GoのAPIの互換性をチェックするために使用されます。これまでは、runtime.Version()が"weekly"(週次リリース版)を含む場合にのみ、-nextオプションで指定されたAPI定義ファイル(将来のAPI変更を記述したもの)が適用されていました。

しかし、Goの開発ブランチは必ずしも"weekly"という文字列をバージョンに含んでいるわけではなく、特に開発の最先端では"devel"というバージョン文字列が使われることがあります。このコミット以前は、"devel"バージョンのGoを使用している場合、cmd/apiツールは-nextオプションを無視してしまい、開発中のAPI変更を正しくチェックできないという問題がありました。

この変更の目的は、"devel"バージョンも開発ブランチとして適切に認識させ、将来のAPI変更に対するチェックを開発の早い段階で行えるようにすることです。これにより、APIの互換性維持がより確実になり、開発者が最新のAPI変更に追従しやすくなります。

前提知識の解説

  • Go言語のバージョン管理: Go言語は、安定版リリース(例: Go 1.x)と、その間の開発版(例: weeklyリリース、開発ブランチのdevelバージョン)が存在します。runtime.Version()関数は、現在実行中のGoプログラムが使用しているGoのバージョン文字列を返します。例えば、go1.0.3devel +a1b2c3dのような文字列が返されます。
  • cmd/apiツール: Go言語の標準ライブラリに含まれるツールの一つで、GoのAPIの互換性をチェックするために使用されます。新しいGoのバージョンがリリースされる際に、既存のプログラムとの互換性が損なわれないように、APIの変更点を検出します。
  • -nextオプション: cmd/apiツールで使用されるオプションで、将来のAPI変更を記述したファイル(通常はapi/next.txtのようなファイル)を指定します。このファイルには、次のリリースで追加される予定のAPIや、変更されるAPIの定義が含まれています。cmd/apiは、このファイルと現在のAPI定義を比較することで、将来のAPI変更が互換性を損なわないか、あるいは意図した変更であるかを検証します。
  • API互換性: ソフトウェア開発において、API(Application Programming Interface)の互換性は非常に重要です。特にライブラリやフレームワークでは、APIの変更が既存のユーザーコードを壊さないように細心の注意が払われます。Go言語では、後方互換性を非常に重視しており、APIの変更は厳格に管理されています。cmd/apiツールはその管理を支援するものです。
  • strings.Contains()関数: Go言語の標準ライブラリstringsパッケージに含まれる関数で、ある文字列が別の文字列の部分文字列として含まれているかどうかをチェックします。
  • runtime.Version()関数: Go言語の標準ライブラリruntimeパッケージに含まれる関数で、現在実行中のGoプログラムのバージョン文字列を返します。

技術的詳細

このコミットは、src/cmd/api/goapi.goファイル内のmain関数におけるバージョンチェックロジックを変更しています。

変更前は以下の条件文でした。

if !strings.Contains(runtime.Version(), "weekly") {
    // ... -nextオプションを無視するロジック ...
}

このロジックは、「現在のGoのバージョン文字列に"weekly"が含まれていない場合」に-nextオプションを無視するというものでした。これは、"weekly"リリース版以外のバージョン(例えば、安定版リリース)では、将来のAPI変更をチェックする必要がない、あるいはチェックすべきではないという前提に基づいています。

変更後は以下の条件文になりました。

if !strings.Contains(runtime.Version(), "weekly") && runtime.Version() != "devel" {
    // ... -nextオプションを無視するロジック ...
}

この変更により、条件が「現在のGoのバージョン文字列に"weekly"が含まれておらず、かつ、バージョン文字列が"devel"ではない場合」に-nextオプションを無視するように拡張されました。

つまり、この条件文の否定(ifブロックに入らない場合)が-nextオプションを適用する条件となります。

  • 変更前: strings.Contains(runtime.Version(), "weekly") の場合、-nextオプションが適用される。
  • 変更後: strings.Contains(runtime.Version(), "weekly") または runtime.Version() == "devel" の場合、-nextオプションが適用される。

これにより、Goの開発ブランチでよく使われる"devel"というバージョン文字列を持つGoバイナリでcmd/apiを実行した場合でも、-nextオプションが正しく機能し、開発中のAPI変更を検証できるようになりました。これは、GoのAPI互換性チェックプロセスをより堅牢にし、開発の最前線でのAPI変更の追跡を容易にするための重要な改善です。

コアとなるコードの変更箇所

変更はsrc/cmd/api/goapi.goファイルのmain関数内の一行です。

--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -100,7 +100,7 @@ func setContexts() {
 func main() {
 	flag.Parse()

-	if !strings.Contains(runtime.Version(), "weekly") {
+	if !strings.Contains(runtime.Version(), "weekly") && runtime.Version() != "devel" {
 		if *nextFile != "" {
 			fmt.Printf("Go version is %q, ignoring -next %s\\n", runtime.Version(), *nextFile)
 			*nextFile = ""

具体的には、if文の条件式に&& runtime.Version() != "devel"が追加されました。

コアとなるコードの解説

変更された行は、cmd/apiツールが-nextオプションで指定されたAPI定義ファイルを適用するかどうかを決定するロジックの一部です。

元のコード:

if !strings.Contains(runtime.Version(), "weekly") {
    // ...
}

この条件は、「現在のGoのバージョン文字列に"weekly"が含まれていない場合」に真となります。この場合、cmd/api-nextオプションを無視します。つまり、"weekly"バージョンでのみ-nextオプションが有効でした。

変更後のコード:

if !strings.Contains(runtime.Version(), "weekly") && runtime.Version() != "devel" {
    // ...
}

この新しい条件は、「現在のGoのバージョン文字列に"weekly"が含まれておらず、かつ、バージョン文字列が"devel"ではない場合」に真となります。 この条件が真の場合、引き続き-nextオプションは無視されます。

この変更の論理的な意味は以下の通りです。 -nextオプションが有効になる条件は、上記のif文の条件が偽になる場合です。

  • 変更前: strings.Contains(runtime.Version(), "weekly") が真の場合(つまり、バージョンが"weekly"を含む場合)に-nextが有効。
  • 変更後: strings.Contains(runtime.Version(), "weekly") が真、または runtime.Version() == "devel" が真の場合に-nextが有効。

これにより、Goの開発ブランチで使われる"devel"バージョンも、"weekly"バージョンと同様に、将来のAPI変更をチェックするための-nextオプションの適用対象となりました。これは、GoのAPI互換性チェックのワークフローを、より広範な開発環境に対応させるための修正です。

関連リンク

参考にした情報源リンク

  • コミットメッセージに記載されているGoのコードレビューシステムへのリンク: https://golang.org/cl/6476066 (これはGoの内部的なコードレビューシステムであり、現在はアクセスできない可能性がありますが、当時の変更の議論や背景を理解するための重要な情報源です。)
  • Go言語のソースコード(src/cmd/api/goapi.go): https://github.com/golang/go/blob/master/src/cmd/api/goapi.go (コミット時点のコードとは異なる可能性がありますが、現在の実装を確認できます。)