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

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

このコミットは、src/cmd/gofix/go1pkgrename.gosrc/cmd/gofix/go1pkgrename_test.go の2つのファイルを変更しています。具体的には、go1pkgrename.go に26行、go1pkgrename_test.go に4行が追加され、合計30行の挿入が行われています。

コミット

commit b6f671b90124e0326e32793bbaeb59eaa43b4c2f
Author: Russ Cox <rsc@golang.org>
Date:   Wed Jan 25 15:30:03 2012 -0500

    gofix: update go1pkgrename for subrepositories
    
    R=golang-dev, bradfitz
    CC=golang-dev
    https://golang.org/cl/5576044

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

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

元コミット内容

gofix: update go1pkgrename for subrepositories

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/5576044

変更の背景

このコミットは、Go 1.0のリリースに伴うパッケージパスの変更と、Goエコシステムにおける「サブリポジトリ (subrepositories)」の導入に対応するためのものです。Go 1.0では、標準ライブラリの安定性と一貫性を確立するために、パッケージの階層が再編成されました。これには、一部のパッケージが標準ライブラリ内のサブディレクトリに移動されたり(例: unicode/utf8)、あるいはメインのGoリポジトリから独立した「サブリポジトリ」へと移管されたりする変更が含まれていました。

サブリポジトリは、実験的なパッケージや特定の目的を持つパッケージをメインのGoディストリビューションから分離し、go get コマンドを通じて独立して管理・配布できるようにするために導入されました。これにより、これらのパッケージはGo 1互換性保証の対象外となり、メインのGoリリースサイクルとは異なるペースで開発・変更が可能になりました。

gofix ツールは、Go 1.0への移行を支援するために開発されたユーティリティであり、古いGoコードを新しいGo 1.0の規約に自動的に適合させる役割を担っていました。このコミットは、特にサブリポジトリへのパッケージ移動に対応するため、gofix が正しくパッケージのインポートパスを書き換えられるように go1pkgrename 処理を更新することを目的としています。

前提知識の解説

  • gofix ツール: gofix (後に go tool fix となった) は、Go 1.0のリリース時に導入されたコマンドラインツールです。Go言語のAPIやパッケージ構造の変更に伴い、既存のGoコードを自動的に新しい規約に適合させるために使用されました。例えば、パッケージ名の変更や関数のシグネチャ変更などに対応し、開発者が手動でコードを修正する手間を省くことを目的としていました。
  • Goパッケージ管理: Go言語では、コードはパッケージとして組織されます。パッケージは、関連する機能の集合であり、インポートパス(例: fmt, net/http)によって識別されます。Go 1.0以前は、パッケージの構造が現在とは異なり、一部のパッケージはトップレベルに存在していました。
  • Goサブリポジトリ (Subrepositories): Go 1.0のリリースに伴い、一部のパッケージはメインのGoリポジトリから分離され、code.google.com/p/go.cryptocode.google.com/p/go.net のような独立したリポジトリ(サブリポジトリ)として管理されるようになりました。これらのサブリポジトリは、Goの標準ライブラリとは異なり、Go 1互換性保証の対象外であり、より頻繁な変更や実験的な機能の導入が可能でした。ユーザーは go get コマンドを使用してこれらのパッケージを取得し、プロジェクトに組み込むことができました。

技術的詳細

このコミットの技術的な核心は、gofix ツールがGo 1.0のパッケージ変更、特にサブリポジトリへの移行を適切に処理できるように、その内部ロジックを更新することにあります。

gofix は、Goソースコードを解析し、特定のパターンに一致するインポートパスやパッケージ名を検出すると、それを新しいパスや名前に自動的に書き換えます。この処理は、go1pkgrename.go ファイル内の go1PackageRenames という構造体配列によって定義されています。この配列は、古いパッケージパスと新しいパッケージパスのペアを保持しており、gofix はこのマッピングに基づいてコードの変換を行います。

このコミットでは、go1PackageRenames 配列に、Go 1.0でサブリポジトリに移動されたパッケージの新しいマッピングが追加されています。具体的には、以下のサブリポジトリに関連するパッケージが追加されました。

  • go.crypto サブリポジトリ: crypto/bcrypt, crypto/blowfish, crypto/cast5, crypto/md4, crypto/ocsp, crypto/openpgp およびそのサブパッケージ、crypto/ripemd160, crypto/twofish, crypto/xtea, exp/ssh など、暗号関連のパッケージが code.google.com/p/go.crypto 配下に移動されました。
  • go.net サブリポジトリ: net/dict, net/websocket, exp/spdy など、ネットワーク関連のパッケージが code.google.com/p/go.net 配下に移動されました。
  • go.codereview サブリポジトリ: encoding/git85, patch など、コードレビュー関連のパッケージが code.google.com/p/go.codereview 配下に移動されました。

これらの変更により、Go 1.0以前のコードでこれらのパッケージをインポートしていた場合でも、gofix を実行することで、自動的に新しいサブリポジトリのパスに書き換えられ、Go 1.0環境でコンパイルできるようになります。

また、go1pkgrename_test.go には、crypto/bcrypt パッケージのインポートパスが正しく書き換えられることを確認するためのテストケースが追加されています。これにより、gofix の変更が意図通りに機能することが保証されます。

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

src/cmd/gofix/go1pkgrename.gogo1PackageRenames 変数に、サブリポジトリへのパッケージリネームルールが追加されています。

--- a/src/cmd/gofix/go1pkgrename.go
+++ b/src/cmd/gofix/go1pkgrename.go
@@ -50,6 +50,32 @@ var go1PackageRenames = []struct{ old, new string }{\
 	{"utf16", "unicode/utf16"},\
 	{"utf8", "unicode/utf8"},\
 	{"xml", "encoding/xml"},\
+\
+\t// go.crypto sub-repository
+\t{"crypto/bcrypt", "code.google.com/p/go.crypto/bcrypt"},\
+\t{"crypto/blowfish", "code.google.com/p/go.crypto/blowfish"},\
+\t{"crypto/cast5", "code.google.com/p/go.crypto/cast5"},\
+\t{"crypto/md4", "code.google.com/p/go.crypto/md4"},\
+\t{"crypto/ocsp", "code.google.com/p/go.crypto/ocsp"},\
+\t{"crypto/openpgp", "code.google.com/p/go.crypto/openpgp"},\
+\t{"crypto/openpgp/armor", "code.google.com/p/go.crypto/openpgp/armor"},\
+\t{"crypto/openpgp/elgamal", "code.google.com/p/go.crypto/openpgp/elgamal"},\
+\t{"crypto/openpgp/errors", "code.google.com/p/go.crypto/openpgp/errors"},\
+\t{"crypto/openpgp/packet", "code.google.com/p/go.crypto/openpgp/packet"},\
+\t{"crypto/openpgp/s2k", "code.google.com/p/go.crypto/openpgp/s2k"},\
+\t{"crypto/ripemd160", "code.google.com/p/go.crypto/ripemd160"},\
+\t{"crypto/twofish", "code.google.com/p/go.crypto/twofish"},\
+\t{"crypto/xtea", "code.google.com/p/go.crypto/xtea"},\
+\t{"exp/ssh", "code.google.com/p/go.crypto/ssh"},\
+\
+\t// go.net sub-repository
+\t{"net/dict", "code.google.com/p/go.net/dict"},\
+\t{"net/websocket", "code.google.com/p/go.net/websocket"},\
+\t{"exp/spdy", "code.google.com/p/go.net/spdy"},\
+\
+\t// go.codereview sub-repository
+\t{"encoding/git85", "code.google.com/p/go.codereview/git85"},\
+\t{"patch", "code.google.com/p/go.codereview/patch"},\
 };
 
 var go1PackageNameRenames = []struct{ newPath, old, new string }{

src/cmd/gofix/go1pkgrename_test.go には、crypto/bcrypt のリネームをテストするコードが追加されています。

--- a/src/cmd/gofix/go1pkgrename_test.go
+++ b/src/cmd/gofix/go1pkgrename_test.go
@@ -41,6 +41,8 @@ import (\
 	"utf16"\
 	"utf8"\
 	"xml"\
+\
+\t"crypto/bcrypt"\
 )\
 `,\
 		Out: `package main\
@@ -73,6 +75,8 @@ import (\
 	"text/template/parse"\
 	"unicode/utf16"\
 	"unicode/utf8"\
+\
+\t"code.google.com/p/go.crypto/bcrypt"\
 )\
 `,\
 	},\

コアとなるコードの解説

go1pkgrename.go の変更は、go1PackageRenames というグローバル変数に新しいエントリを追加するものです。この変数は、gofix ツールがGo 1.0への移行時にパッケージのインポートパスを自動的に書き換えるためのマッピングテーブルとして機能します。

追加されたエントリは、Goの標準ライブラリから code.google.com/p/go.cryptocode.google.com/p/go.netcode.google.com/p/go.codereview といったサブリポジトリに移動されたパッケージの古いパスと新しいパスのペアを定義しています。例えば、{"crypto/bcrypt", "code.google.com/p/go.crypto/bcrypt"} というエントリは、古いコードで import "crypto/bcrypt" と書かれていた場合、gofix がこれを import "code.google.com/p/go.crypto/bcrypt" に自動的に書き換えることを意味します。

これにより、Go 1.0以前のコードベースが、Go 1.0の新しいパッケージ構造に適合するように、gofix を実行するだけで簡単に更新できるようになります。

go1pkgrename_test.go の変更は、この新しいリネームルールが正しく適用されることを検証するためのテストケースを追加しています。具体的には、crypto/bcrypt パッケージのインポートを含むGoコードスニペットが、gofix 適用後に期待される新しいパスに書き換えられているかを確認しています。これは、変更が正しく機能することを保証するための重要なステップです。

関連リンク

参考にした情報源リンク