[インデックス 11036] ファイルの概要
このコミットは、Go言語の初期のパッケージ管理ツールである goinstall
において、Google CodeでホストされているSubversion (SVN) リポジトリのチェックアウトURLが正しくない問題を修正するものです。具体的には、SVNリポジトリに対しては従来のURL形式を使用するように goinstall
のロジックを調整し、テストケースもそれに合わせて更新しています。
コミット
commit c2ea4122965373610f3521f1de689f6955c5da6b
Author: Andrew Gerrand <adg@golang.org>
Date: Fri Jan 6 09:20:59 2012 +1100
goinstall: use correct checkout URL for Google Code svn repos
Fixes #2655.
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5510045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/c2ea4122965373610f3521f1de689f6955c5da6b
元コミット内容
goinstall: use correct checkout URL for Google Code svn repos
Fixes #2655.
R=golang-dev, gri
CC=golang-dev
https://golang.org/cl/5510045
変更の背景
この変更は、Go言語の初期のパッケージ取得ツールである goinstall
が、Google CodeでホストされているSubversion (SVN) リポジトリを正しくチェックアウトできないという問題(Issue #2655)に対応するために行われました。
当時のGoogle Codeは、Git、Mercurial (hg)、Subversion (svn) など複数のバージョン管理システムをサポートしていましたが、それぞれのシステムでリポジトリのチェックアウトURLの形式が異なっていました。goinstall
は、Google Codeのリポジトリタイプを判別し、適切なURLを生成するロジックを持っていましたが、SVNリポジトリの場合に誤ったURLを生成してしまうバグが存在したと考えられます。
このバグにより、ユーザーが goinstall
を使ってGoogle Code上のSVNリポジトリからパッケージを取得しようとすると、チェックアウトが失敗し、開発体験が損なわれる可能性がありました。このコミットは、その問題を解決し、goinstall
がGoogle CodeのSVNリポジトリを正しく扱えるようにすることを目的としています。
前提知識の解説
-
goinstall
:goinstall
は、Go言語の初期(Go 1.0以前)に存在したコマンドラインツールで、Goパッケージをインターネットから取得し、ビルドしてインストールする役割を担っていました。現在のgo get
コマンドの前身にあたります。goinstall
は、指定されたインポートパス(例:code.google.com/p/go.example/hello
)を解析し、そのパスに対応するバージョン管理システム(Git, Mercurial, Subversionなど)とリポジトリのURLを特定して、ソースコードをダウンロードしていました。 -
Google Code: Google Codeは、かつてGoogleが提供していたオープンソースプロジェクトのホスティングサービスです。プロジェクトのソースコードリポジトリ(主にSubversion、後にGitやMercurialもサポート)、バグトラッカー、Wiki、ダウンロードなどを提供していました。2015年にサービスを終了し、多くのプロジェクトがGitHubなどの他のプラットフォームへ移行しました。このコミットが作成された2012年時点では、Google CodeはGo言語プロジェクトを含む多くのオープンソースプロジェクトで広く利用されていました。
-
Subversion (SVN): Subversionは、集中型バージョン管理システム(CVCS)の一種です。Gitのような分散型バージョン管理システム(DVCS)が普及する以前は、オープンソースプロジェクトや企業で広く利用されていました。SVNリポジトリは通常、
svn checkout
コマンドを使用して特定のURLからチェックアウトされます。Google Codeでは、SVNリポジトリのURLはhttp://[projectname].googlecode.com/svn
のような形式が一般的でした。
技術的詳細
このコミットの技術的な核心は、goinstall
がGoogle Codeのリポジトリタイプを判別する際に、SVNリポジトリに対して特別な処理を追加した点にあります。
goinstall
は、code.google.com/p/projectname
のようなインポートパスを受け取ると、まずそのプロジェクトのHTMLページをスクレイピングして、使用されているバージョン管理システム(VCS)の種類(Git, hg, svnなど)を特定していました。このスクレイピング結果に基づいて、適切なチェックアウトURLを構築します。
問題は、SVNリポジトリの場合、他のVCS(GitやMercurial)とは異なる、より古い形式のURL (http://[projectname].googlecode.com/svn
) を使用する必要があったことです。goinstall
の既存のロジックでは、このSVN特有のURL形式を正しく生成できていなかったため、チェックアウトが失敗していました。
このコミットでは、VCSの種類が "svn" であると判別された場合に、明示的に http://%s.googlecode.com/svn
という形式のURLを構築するように条件分岐を追加しています。これにより、goinstall
はGoogle Code上のSVNリポジトリを正しく識別し、適切なURLでチェックアウトを実行できるようになります。
コアとなるコードの変更箇所
src/cmd/goinstall/download.go
の googleRepo
構造体の Repo
メソッド内の変更がコアとなります。
--- a/src/cmd/goinstall/download.go
+++ b/src/cmd/goinstall/download.go
@@ -236,9 +236,13 @@ func (r *googleRepo) Repo(client *http.Client) (url, root string, vcs *vcs, err
}\n
// Scrape result for vcs details.
- m := googleRepoRe.FindSubmatch(b)
- if len(m) == 2 {
- if v := vcsMap[string(m[1])]; v != nil {
+ if m := googleRepoRe.FindSubmatch(b); len(m) == 2 {
+ s := string(m[1])
+ if v := vcsMap[s]; v != nil {
+ if s == "svn" {
+ // Subversion still uses the old-style URL.
+ r.url = fmt.Sprintf("http://%s.googlecode.com/svn", p[0])
+ }
r.vcs = v
return r.url, r.root, r.vcs, nil
}
また、テストファイル src/cmd/goinstall/download_test.go
も、SVNリポジトリの期待されるチェックアウトURLを修正するために更新されています。
--- a/src/cmd/goinstall/download_test.go
+++ b/src/cmd/goinstall/download_test.go
@@ -31,7 +31,7 @@ var FindPublicRepoTests = []struct {
"code.google.com/p/repo/path/foo",
"svn",
"code.google.com/p/repo",
- "https://code.google.com/p/repo",
+ "https://repo.googlecode.com/svn",
&testTransport{
"https://code.google.com/p/repo/source/checkout",
`<tt id="checkoutcmd">svn checkout https://...`,
コアとなるコードの解説
src/cmd/goinstall/download.go
の変更点について解説します。
-
VCSタイプの抽出:
googleRepoRe.FindSubmatch(b)
は、Google CodeのHTMLページからVCSタイプ(例: "svn", "git", "hg")を正規表現で抽出し、m[1]
に格納します。s := string(m[1])
で、抽出されたVCSタイプが文字列s
に変換されます。 -
SVN特有のURL処理:
if s == "svn" { ... }
という条件分岐が追加されました。これは、抽出されたVCSタイプが "svn" である場合にのみ実行されます。 このブロック内で、r.url = fmt.Sprintf("http://%s.googlecode.com/svn", p[0])
という行が追加されています。r.url
は、最終的にgoinstall
が使用するチェックアウトURLです。fmt.Sprintf
は、フォーマットされた文字列を生成するGoの関数です。http://%s.googlecode.com/svn
は、Google CodeのSVNリポジトリの標準的なURL形式です。p[0]
は、インポートパス(例:code.google.com/p/repo
)から抽出されたプロジェクト名(例:repo
)に対応します。 この行により、SVNリポジトリの場合にのみ、正しい旧式のSVNチェックアウトURLがr.url
に設定されるようになります。
-
テストケースの更新:
src/cmd/goinstall/download_test.go
のFindPublicRepoTests
配列内のテストケースが更新されました。 以前は、SVNリポジトリの期待されるURLがhttps://code.google.com/p/repo
となっていましたが、これはGoogle CodeのプロジェクトページへのURLであり、SVNのチェックアウトURLとしては不適切でした。 変更後、期待されるURLはhttps://repo.googlecode.com/svn
となり、これはSVNリポジトリをチェックアウトするための正しい形式です。このテストケースの更新により、SVNリポジトリのURL生成ロジックが正しく機能していることを検証できるようになりました。
これらの変更により、goinstall
はGoogle Code上のSVNリポジトリを正しく識別し、適切なURLでチェックアウトを実行できるようになり、Issue #2655で報告された問題が解決されました。
関連リンク
- Go CL 5510045: https://golang.org/cl/5510045
- 関連するGo Issue: #2655 (Google Codeのサービス終了に伴い、直接アクセスは困難な可能性があります)
参考にした情報源リンク
- Google Codeのサービス終了に関する一般的な情報
- Go言語の初期のパッケージ管理(
goinstall
とgo get
の違いなど)に関する一般的な情報 - Subversion (SVN) の基本的なチェックアウトURL形式に関する一般的な情報