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

[インデックス 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.gogoogleRepo 構造体の 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 の変更点について解説します。

  1. VCSタイプの抽出: googleRepoRe.FindSubmatch(b) は、Google CodeのHTMLページからVCSタイプ(例: "svn", "git", "hg")を正規表現で抽出し、m[1] に格納します。 s := string(m[1]) で、抽出されたVCSタイプが文字列 s に変換されます。

  2. 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 に設定されるようになります。
  3. テストケースの更新: src/cmd/goinstall/download_test.goFindPublicRepoTests 配列内のテストケースが更新されました。 以前は、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言語の初期のパッケージ管理(goinstallgo get の違いなど)に関する一般的な情報
  • Subversion (SVN) の基本的なチェックアウトURL形式に関する一般的な情報