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

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

コミット

このコミット bf67a7b9b12f0f35c46aa39de65f7c67bfb5238c は、Go言語の標準ライブラリから src/pkg/net/dict パッケージと src/pkg/patch パッケージを削除するものです。コミットメッセージは「build: fix build」となっており、ビルドの問題を修正するためにこれらのパッケージが削除されたことを示唆しています。また、「I said rm, but not hg rm. I never was good at Simon says.」という記述は、以前の削除試行が不完全であったこと、そしてMercurial (hg) とGitのコマンドの違いに言及している可能性があります。

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

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

元コミット内容

commit bf67a7b9b12f0f35c46aa39de65f7c67bfb5238c
Author: Russ Cox <rsc@golang.org>
Date:   Wed Jan 25 15:41:49 2012 -0500

    build: fix build
    
    I said rm, but not hg rm.
    I never was good at Simon says.
    
    TBR=bradfitz
    CC=golang-dev
    https://golang.org/cl/5574066
---
 src/pkg/net/dict/Makefile   |   7 -
 src/pkg/net/dict/dict.go    | 210 ------------------------
 src/pkg/patch/Makefile      |  14 --
 src/pkg/patch/apply.go      |  54 ------
 src/pkg/patch/git.go        | 121 --------------
 src/pkg/patch/patch.go      | 321 ------------------------------------\
 src/pkg/patch/patch_test.go | 390 --------------------------------------------
 src/pkg/patch/textdiff.go   | 179 --------------------\
 8 files changed, 1296 deletions(-)

変更の背景

このコミットは、Go言語の標準ライブラリから net/dict および patch パッケージを削除するものです。Go言語の標準ライブラリは、その設計哲学として「小さく、しかし強力に」という原則を持っています。これは、必要最小限の機能を提供し、より専門的な機能は外部パッケージとして提供されるべきであるという考え方に基づいています。

net/dict パッケージは、RFC 2229 で定義されている Dictionary Server Protocol (DICT) を実装していました。これは、オンライン辞書サービスにアクセスするためのプロトコルです。一方、patch パッケージは、diff コマンドによって生成されるパッチファイルを解析し、適用するための機能を提供していました。これには、テキストパッチだけでなく、Gitのバイナリパッチの解析機能も含まれていました。

これらのパッケージは、Go言語の初期段階で標準ライブラリの一部として含まれていましたが、その後の開発において、利用頻度や汎用性の観点から、標準ライブラリに含めるには適切ではないと判断された可能性があります。特に、patch パッケージのようなバージョン管理システムに関連する低レベルの機能は、特定のユースケースに特化しすぎていると見なされたのかもしれません。

コミットメッセージの「build: fix build」という記述は、これらのパッケージが何らかのビルド上の問題を引き起こしていたか、あるいは単に不要な依存関係となっていたことを示唆しています。また、「I said rm, but not hg rm. I never was good at Simon says.」という表現は、以前にこれらのファイルを削除しようとした際に、バージョン管理システム(おそらくMercurialからGitへの移行期であったため、hg rmgit rm の違い)の操作を誤り、完全に削除できていなかったことを示唆するユーモラスな表現です。これにより、ビルドシステムが期待する状態と実際のファイルシステムの状態に不整合が生じ、ビルドエラーが発生していた可能性が考えられます。

前提知識の解説

Go言語のパッケージと標準ライブラリ

Go言語は、コードのモジュール化と再利用を促進するために「パッケージ」という概念を採用しています。標準ライブラリは、Go言語のインストール時に同梱される一連のパッケージであり、ネットワーキング、ファイルI/O、暗号化、データ構造など、幅広い基本的な機能を提供します。Goの標準ライブラリは、その品質と安定性で知られていますが、その範囲は厳選されており、すべての可能な機能を含むわけではありません。

Dictionary Server Protocol (DICT) - RFC 2229

DICTプロトコルは、クライアントが辞書サーバーに接続し、単語の定義や関連情報(類義語、反意語など)を検索するためのTCP/IPベースのプロトコルです。RFC 2229 で標準化されており、主にオンライン辞書サービスで利用されます。基本的なコマンドには、DEFINE(定義の検索)、MATCH(パターンマッチング)、SHOW DB(利用可能な辞書の表示)などがあります。

パッチと差分 (Diff)

ソフトウェア開発において、「パッチ」とは、あるファイルやコードベースに加えられた変更を記述したファイルのことです。通常、diff コマンド(Unix系のシステムで広く使われるツール)によって生成されます。diff は、2つのファイルまたはディレクトリツリー間の差分を比較し、その違いを人間が読める形式や、別のプログラムが適用できる形式で出力します。

パッチの形式にはいくつか種類があります。

  • Unified Diff: 最も一般的な形式で、変更された行の前後数行のコンテキストを含み、追加された行は +、削除された行は - で示されます。
  • Context Diff: Unified Diffに似ていますが、異なる表示形式です。
  • Git Binary Patch: Gitがバイナリファイルの変更を扱う際に使用する特殊な形式です。これは、テキストファイルのように行単位で差分を表現できないため、バイナリデータそのものの変更を効率的に表現するためのメカニズムです。

バージョン管理システム (VCS) とファイル削除

  • Git: 分散型バージョン管理システムで、現在のソフトウェア開発で最も広く使われています。ファイルの削除は git rm コマンドで行います。これにより、ファイルがワーキングディレクトリから削除され、次のコミットでリポジトリからも削除されるようにステージングされます。
  • Mercurial (Hg): Gitと同様に分散型バージョン管理システムですが、Gitとは異なる設計思想とコマンド体系を持っています。ファイルの削除は hg rm コマンドで行います。

コミットメッセージの「I said rm, but not hg rm.」は、GoプロジェクトがMercurialからGitへ移行する過渡期、あるいは開発者が両方のシステムを使い分けていた時期に、ファイル削除のコマンドを混同したことへの言及である可能性があります。単に rm コマンドでファイルを削除しただけでは、バージョン管理システムにはその変更が伝わらず、リポジトリからはファイルが削除されません。そのため、ビルドシステムが古いファイルパスを参照し続け、ビルドエラーが発生することがあります。

技術的詳細

このコミットでは、以下の8つのファイルがGo標準ライブラリから完全に削除されています。

  1. src/pkg/net/dict/Makefile
  2. src/pkg/net/dict/dict.go
  3. src/pkg/patch/Makefile
  4. src/pkg/patch/apply.go
  5. src/pkg/patch/git.go
  6. src/pkg/patch/patch.go
  7. src/pkg/patch/patch_test.go
  8. src/pkg/patch/textdiff.go

これらの削除は、Go言語の標準ライブラリの範囲をより厳密に定義し、特定のユースケースに特化した機能は外部パッケージとして提供するという方針の一環と考えられます。

net/dict パッケージの削除

net/dict パッケージは、RFC 2229 に基づくDICTプロトコルのクライアント実装を提供していました。このパッケージが削除されたことにより、Goの標準ライブラリはDICTプロトコルを直接サポートしなくなりました。これは、DICTプロトコルの利用頻度がGoの標準ライブラリに含めるほど高くないと判断されたためか、あるいはより汎用的なネットワークI/O機能(net パッケージなど)を使って、必要に応じてユーザーが独自のDICTクライアントを実装できると判断されたためと考えられます。

patch パッケージの削除

patch パッケージは、diff 形式のパッチを解析し、適用するための機能を提供していました。これには、テキストベースのパッチ(textdiff.go)とGitのバイナリパッチ(git.go)の両方を扱う能力が含まれていました。このパッケージの削除は、Goの標準ライブラリがパッチ適用のようなバージョン管理システムに密接に関連する低レベルの機能を提供しないという方針を示しています。このような機能は、通常、バージョン管理ツール自体や、それらをラップする特定のビルドツールやデプロイツールによって処理されるべきであるという考え方に基づいている可能性があります。

特に、patch パッケージは、Go言語のビルドシステムやツールチェインの内部で利用されていた可能性も考えられますが、このコミットによってその依存関係が解消されたことを意味します。

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

このコミットは、既存のコードの削除のみを行っており、新たなコードの追加や変更はありません。削除されたファイルは以下の通りです。

  • src/pkg/net/dict/Makefile
  • src/pkg/net/dict/dict.go
  • src/pkg/patch/Makefile
  • src/pkg/patch/apply.go
  • src/pkg/patch/git.go
  • src/pkg/patch/patch.go
  • src/pkg/patch/patch_test.go
  • src/pkg/patch/textdiff.go

これらのファイルは、Go言語の標準ライブラリの src/pkg ディレクトリ以下に存在していました。

コアとなるコードの解説

削除された各ファイルは、Go言語の標準ライブラリの一部として、特定の機能を提供していました。

  • src/pkg/net/dict/Makefile: net/dict パッケージのビルド設定を記述したMakefileです。Goモジュールシステムが導入される前のGoプロジェクトでは、パッケージのビルドにMakefileが使用されることが一般的でした。
  • src/pkg/net/dict/dict.go: Dictionary Server Protocol (RFC 2229) のクライアントサイドの実装が含まれていました。Client 構造体、Dial 関数、Close メソッド、Dict 構造体、Dicts メソッド、Defn 構造体、Define メソッドなどが定義されており、DICTサーバーとの通信、辞書リストの取得、単語の定義検索などの機能を提供していました。
  • src/pkg/patch/Makefile: patch パッケージのビルド設定を記述したMakefileです。
  • src/pkg/patch/apply.go: パッチセットをファイルに適用するためのロジックが含まれていました。Op 構造体(パッチ適用操作を表す)や Apply メソッドなどが定義されており、パッチによって記述された変更を既存のファイル内容に適用し、新しいファイル状態を生成する機能を提供していました。
  • src/pkg/patch/git.go: Gitのバイナリパッチを解析するためのロジックが含まれていました。gitSHA1 関数(GitオブジェクトのSHA-1ハッシュ計算)、GitBinaryLiteral 構造体、ParseGitBinary 関数などが定義されており、Gitのバイナリ差分形式を解釈し、適用する機能を提供していました。
  • src/pkg/patch/patch.go: パッチファイルの一般的な解析と構造化のためのコアロジックが含まれていました。Set 構造体(パッチの集合)、File 構造体(単一ファイルへの変更)、Verb 型(ファイル操作の種類:追加、コピー、削除、編集、リネーム)、Diff インターフェース、Parse 関数などが定義されており、CVS、Subversion、Mercurial、Gitなどの様々なバージョン管理ツールが生成するパッチテキストを解析し、Goのデータ構造に変換する機能を提供していました。
  • src/pkg/patch/patch_test.go: patch パッケージのテストコードが含まれていました。TestFileApply 関数や様々なパッチ形式のテストケースが定義されており、パッチ解析と適用機能の正確性を検証していました。
  • src/pkg/patch/textdiff.go: テキストベースのパッチ(Unified Diffなど)を解析し、適用するためのロジックが含まれていました。TextDiff 型、TextChunk 構造体、ParseTextDiff 関数、Apply メソッドなどが定義されており、テキストファイルの行単位の差分を解釈し、適用する機能を提供していました。

これらのファイルの削除により、Goの標準ライブラリは、DICTプロトコルクライアント機能と、汎用的なパッチ解析・適用機能を提供しなくなりました。これらの機能が必要な場合は、外部のサードパーティライブラリを利用するか、ユーザー自身が実装する必要があります。

関連リンク

参考にした情報源リンク

  • Go言語の公式ドキュメントとパッケージリファレンス
  • RFC 2229 の仕様書
  • GitおよびMercurialのドキュメンテーション
  • GitHub上のGo言語リポジトリのコミット履歴と関連する議論
  • Go言語の標準ライブラリの設計原則に関する一般的な情報