[インデックス 11386] ファイルの概要
このコミットは、src/cmd/gofix/go1pkgrename.go
と src/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.crypto
やcode.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.go
の go1PackageRenames
変数に、サブリポジトリへのパッケージリネームルールが追加されています。
--- 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.crypto
、code.google.com/p/go.net
、code.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
適用後に期待される新しいパスに書き換えられているかを確認しています。これは、変更が正しく機能することを保証するための重要なステップです。
関連リンク
- Go CL 5576044: https://golang.org/cl/5576044
参考にした情報源リンク
- Go 1.0 Release Notes (Package Path Changes): https://go.dev/doc/go1#package_paths
- Go Subrepositories on GitHub: https://github.com/golang/go/wiki/SubRepositories
- Go 1.0 and gofix: https://go.dev/blog/go1
- The Go Programming Language Blog: Go 1 and the Future of Go Programs: https://go.dev/blog/go1compat
- Go 1.1 Release Notes (go fix): https://go.dev/doc/go1.1#go_fix