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

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

このコミットは、Go言語のコマンドラインツール cmd/go において、Mercurial (hg) バージョン管理システムでのSSHプロトコルサポートを追加するものです。具体的には、src/cmd/go/vcs.go ファイル内のMercurialに関する設定に、SSHスキームが追加されています。

コミット

commit a61dcef23275880d901db5a158fd1d9a9e71a00d
Author: Dustin Shields-Cloues <dcloues@gmail.com>
Date:   Tue Jan 22 14:43:37 2013 -0500

    cmd/go: add hg ssh support
    
    R=golang-dev, rsc, bradfitz
    CC=golang-dev
    https://golang.org/cl/7133048

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

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

元コミット内容

cmd/go: add hg ssh support

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

変更の背景

Go言語の go get コマンドは、指定されたURLからパッケージを自動的にダウンロードし、ビルドする機能を提供します。この機能は、Git、Mercurial (hg)、Subversion (svn) などの様々なバージョン管理システム (VCS) に対応しています。

このコミットが作成された2013年当時、Mercurialリポジトリへのアクセスは主にHTTP/HTTPSプロトコルを介して行われていました。しかし、多くの開発現場では、セキュアな通信と認証のためにSSHプロトコルが広く利用されています。特にプライベートなリポジトリや、より厳格なアクセス制御が必要な場合にはSSHが不可欠です。

このコミットの背景には、go get コマンドがMercurialリポジトリをSSH経由で取得できるようにすることで、開発者の利便性とセキュリティを向上させるという目的があります。これにより、SSHで保護されたMercurialリポジトリからGoパッケージを直接取得できるようになり、開発ワークフローがよりスムーズになります。

前提知識の解説

Go言語の go get コマンド

go get はGo言語のツールチェーンの一部であり、リモートリポジトリからGoパッケージとその依存関係をダウンロードし、ローカルの GOPATH に配置するコマンドです。このコマンドは、内部的に様々なバージョン管理システムと連携し、指定されたURLスキームに基づいて適切なVCSクライアントを呼び出します。

Mercurial (hg)

Mercurialは、Gitと同様に分散型バージョン管理システム (DVCS) の一つです。シンプルなコマンド体系と堅牢な設計が特徴で、大規模なプロジェクトでも利用されていました。Mercurialリポジトリは、hg clone コマンドなどでクローンされ、変更履歴が管理されます。

SSH (Secure Shell)

SSHは、ネットワークを介してコンピュータを安全に操作するためのプロトコルです。主にリモートログインやファイル転送(SCP、SFTP)に利用されますが、バージョン管理システムのリポジトリへのアクセスにも広く使われます。SSHは公開鍵認証やパスワード認証をサポートし、通信内容を暗号化することでセキュリティを確保します。

MercurialにおけるSSHの利用は、通常 ssh://user@host/path/to/repo のようなURL形式で指定され、SSHエージェントや ~/.ssh/config の設定を利用して認証が行われます。

src/cmd/go/vcs.go ファイル

src/cmd/go/vcs.go は、Go言語の cmd/go ツールがサポートする様々なバージョン管理システム(Git, Mercurial, Subversionなど)に関するロジックを定義しているファイルです。このファイルには、各VCSのコマンド、URLスキーム、リポジトリのクローンや更新方法などが構造体として定義されています。go get コマンドがリポジトリのURLを解析する際に、このファイルに定義された情報が参照されます。

技術的詳細

vcs.go ファイル内では、各バージョン管理システムが vcsCmd という構造体で表現されています。この構造体には、そのVCSがサポートするプロトコルスキームのリストが含まれています。

Mercurial (hg) の場合、vcsHg という変数に vcsCmd 構造体のインスタンスが割り当てられています。この構造体内の scheme フィールドは、MercurialリポジトリのURLとして認識されるプロトコルスキームの文字列スライスです。

このコミット以前は、vcsHg.scheme には httpshttp のみが含まれていました。これは、go get がMercurialリポジトリを扱う際に、これらのプロトコルスキームを持つURLのみをMercurialリポジトリとして認識し、Mercurialクライアントを呼び出すことを意味します。

今回の変更では、この scheme スライスに ssh が追加されました。これにより、go getssh:// で始まるMercurialリポジトリのURLも正しく認識し、Mercurialクライアント(内部的にはSSH経由で通信を行うように設定されたMercurial)を呼び出すことができるようになります。

具体的には、go getssh:// スキームを持つURLを検出すると、vcsHg の設定に基づいてMercurialコマンドを実行します。Mercurial自体は、SSHクライアント(通常はシステムにインストールされている ssh コマンド)を利用してリモートリポジトリと通信します。この連携により、SSH鍵やSSHエージェントの設定が自動的に利用され、セキュアな認証と通信が実現されます。

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

変更は src/cmd/go/vcs.go ファイルの1箇所のみです。

--- a/src/cmd/go/vcs.go
+++ b/src/cmd/go/vcs.go
@@ -81,7 +81,7 @@ var vcsHg = &vcsCmd{
 	tagSyncCmd:     "update -r {tag}",
 	tagSyncDefault: "update default",
 
-	scheme:  []string{"https", "http"},
+	scheme:  []string{"https", "http", "ssh"},
 	pingCmd: "identify {scheme}://{repo}",
 }

コアとなるコードの解説

変更された行は vcsHg 構造体の scheme フィールドの定義です。

	scheme:  []string{"https", "http", "ssh"},

この行は、Mercurial (hg) バージョン管理システムがサポートするURLスキームのリストを定義しています。

  • scheme:: vcsCmd 構造体のフィールド名で、このVCSが認識するプロトコルスキームのリストを保持します。
  • []string{"https", "http", "ssh"}: 文字列のスライス(配列)であり、MercurialリポジトリのURLとして go get が認識すべきスキームを指定しています。
    • "https": HTTPSプロトコル。セキュアなHTTP通信。
    • "http": HTTPプロトコル。通常のWeb通信。
    • "ssh": SSHプロトコル。セキュアなリモートアクセスおよび認証された通信。

この変更により、go get コマンドは、例えば go get ssh://hg.example.com/my/repo のようなコマンドが実行された際に、それがMercurialリポジトリであり、SSHプロトコルを使用してアクセスすべきであることを正しく判断できるようになります。これにより、MercurialのSSHサポートが go get コマンドに統合され、より柔軟なリポジトリの取得が可能になりました。

関連リンク

参考にした情報源リンク

  • Go言語のソースコード (特に src/cmd/go/vcs.go の現在のバージョン)
  • Mercurialのドキュメント (SSHに関する設定やURL形式)
  • 一般的なバージョン管理システムとSSHの連携に関する知識
  • コミットメッセージに記載されているGoのコードレビューリンク: https://golang.org/cl/7133048 (現在はGoのGerritインスタンスにリダイレクトされます)