[インデックス 12797] ファイルの概要
このコミットは、Go言語の実験的なパッケージ exp/terminal
を削除するものです。このパッケージは、VT100ターミナルとのインタラクション、特にライン入力の読み取りやパスワードの読み取り、カーソル操作などを扱う機能を提供していました。コミットメッセージによると、この機能は code.google.com/p/go.crypto/ssh/terminal
という別のリポジトリに移行されたため、元の場所からは削除されました。
コミット
commit dc640ebd1a340a53db2c5520afca8643fd8f063e
Author: David Symonds <dsymonds@golang.org>
Date: Fri Mar 30 15:27:39 2012 +1100
exp/terminal: delete.
This is now known as code.google.com/p/go.crypto/ssh/terminal.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5970044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/dc640ebd1a3400a53db2c5520afca8643fd8f063e
元コミット内容
exp/terminal: delete.
This is now known as code.google.com/p/go.crypto/ssh/terminal.
変更の背景
このコミットの背景には、Go言語の標準ライブラリの整理と、特定の機能の専門化があります。exp
(experimental) パッケージは、Goの標準ライブラリに含める前に、新しいアイデアやAPIを試すための場所として機能していました。exp/terminal
パッケージは、ターミナル操作に関する低レベルな機能を提供していましたが、このような機能は、よりセキュリティに特化した文脈、特にSSHクライアントやサーバーの実装において重要になります。
Goプロジェクトは、標準ライブラリの肥大化を防ぎ、特定のドメインに特化した機能を適切な場所に配置する方針を持っています。terminal
パッケージの機能が go.crypto/ssh/terminal
に移動されたのは、この機能が暗号化やセキュアな通信に関連する ssh
パッケージの一部としてより適切であると判断されたためと考えられます。これにより、標準ライブラリはよりスリムに保たれ、ターミナル操作の専門的な側面は、より適切な専門リポジトリで開発・保守されることになりました。
前提知識の解説
Go言語の exp
パッケージ
Go言語の標準ライブラリには、exp
というプレフィックスを持つパッケージ群が存在しました。これらは「実験的 (experimental)」なパッケージであり、将来的に標準ライブラリに取り込まれる可能性のある機能や、まだAPIが安定していない機能が置かれていました。exp
パッケージのコードは、標準ライブラリの一部として配布されますが、そのAPIの安定性や将来的な存在は保証されません。開発者は、これらのパッケージを使用する際には、APIの変更や削除のリスクを考慮する必要がありました。
VT100ターミナルとエスケープシーケンス
VT100は、DEC(Digital Equipment Corporation)が開発したビデオディスプレイターミナルで、1978年にリリースされました。これは、現代の多くのターミナルエミュレータの事実上の標準となり、その制御シーケンス(エスケープシーケンス)は、テキストの色付け、カーソル移動、画面クリアなど、ターミナル上での様々な操作を行うための標準的な方法として広く採用されています。エスケープシーケンスは、ASCIIのエスケープ文字(\x1b
または ESC
)で始まり、その後に特定の文字の組み合わせが続きます。例えば、\x1b[31m
はテキストを赤色にするためのシーケンスです。
ターミナルの「raw mode」
ターミナルは通常、「カノニカルモード(cooked mode)」で動作します。このモードでは、入力された文字はすぐにアプリケーションに渡されず、行全体が入力されてEnterキーが押されるまでバッファリングされます。また、バックスペースやCtrl+Cなどの特殊なキー入力は、ターミナルドライバによって処理されます。
一方、「raw mode(生モード)」では、これらの処理が無効になります。入力された文字は即座にアプリケーションに渡され、特殊なキー入力もそのままアプリケーションに送られます。これにより、アプリケーションはキー入力に対してより細かく制御できるようになり、インタラクティブなコマンドラインインターフェースや、パスワード入力時のエコーバック抑制(入力文字が表示されないようにする)などを実装することが可能になります。exp/terminal
パッケージは、このようなraw modeへの切り替えや、その状態の管理を行う機能を含んでいました。
code.google.com/p/go.crypto/ssh/terminal
go.crypto
は、Go言語における暗号化および関連するセキュリティプロトコルを扱うためのパッケージ群を含むリポジトリです。このリポジトリは、Goの標準ライブラリとは別に開発・配布されており、より専門的なセキュリティ関連の機能を提供しています。ssh/terminal
は、Secure Shell (SSH) プロトコルに関連するターミナル操作の機能、特にパスワード入力時のエコー抑制や、SSHセッション内でのターミナル設定の管理などを担当しています。exp/terminal
の機能がここに移行されたのは、その機能がSSHのようなセキュリティが重視される文脈で特に有用であるためです。
技術的詳細
このコミットは、src/pkg/exp/terminal
ディレクトリとその内容を完全に削除するものです。削除されたファイルは以下の3つです。
src/pkg/exp/terminal/terminal.go
: ターミナル操作の主要なロジックが含まれていました。Terminal
構造体、エスケープシーケンスの定義、キー入力の処理 (handleKey
メソッド)、カーソル移動、ラインの書き込み、パスワードの読み取り (ReadPassword
)、ラインの読み取り (ReadLine
) などの機能が実装されていました。src/pkg/exp/terminal/terminal_test.go
:terminal.go
の機能に対するテストコードが含まれていました。MockTerminal
を使用してターミナルをシミュレートし、キー入力やラインの読み取りが正しく動作するかを検証していました。src/pkg/exp/terminal/util.go
: ターミナルに関する低レベルなユーティリティ関数が含まれていました。具体的には、ファイルディスクリプタがターミナルであるかどうかの判定 (IsTerminal
)、ターミナルをraw modeに設定する (MakeRaw
)、元の状態に戻す (Restore
)、ターミナルのサイズを取得する (GetSize
)、そしてエコーなしでパスワードを読み取る (ReadPassword
) といった機能が、syscall
パッケージを使用して実装されていました。特にutil.go
は、Linuxシステムコールを直接利用してターミナル設定を変更しており、OS依存のコードでした。
これらのファイルが削除されたことにより、Goの標準ライブラリからターミナル操作に関する実験的な機能が完全に消滅しました。これにより、Goの標準ライブラリはよりコアな機能に集中し、ターミナル操作のような専門的な機能は、より適切な外部パッケージ (go.crypto/ssh/terminal
) で管理されることになりました。
コアとなるコードの変更箇所
このコミットは、既存のコードの変更ではなく、ファイルの削除のみを行っています。
削除されたファイル:
src/pkg/exp/terminal/terminal.go
(520行削除)src/pkg/exp/terminal/terminal_test.go
(110行削除)src/pkg/exp/terminal/util.go
(115行削除)
合計で745行が削除されています。
コアとなるコードの解説
このコミットには、新しいコードの追加や既存コードの修正は含まれていません。代わりに、src/pkg/exp/terminal
ディレクトリ内の全てのファイルが削除されています。これは、このパッケージの機能が別の場所 (code.google.com/p/go.crypto/ssh/terminal
) に完全に移行されたため、元の場所での存在意義がなくなったことを意味します。
削除されたコードは、Go言語でターミナルとインタラクトするための基本的な機能を提供していました。例えば、terminal.go
は、ユーザーからのキー入力を処理し、カーソルを移動させ、ラインを編集するなどの、インタラクティブなシェルやCLIアプリケーションで必要となる機能を提供していました。util.go
は、OSのシステムコールを利用してターミナルの設定(例: エコーの有無、カノニカルモード/rawモード)を直接操作する低レベルな機能を提供していました。これらの機能は、Goの標準ライブラリの exp
パッケージとして提供されていましたが、より専門的な go.crypto/ssh
パッケージの一部として再構築されたため、削除されました。
関連リンク
- Go言語の
exp
パッケージに関する議論やドキュメント(当時のもの) go.crypto
リポジトリ: https://pkg.go.dev/golang.org/x/cryptogolang.org/x/crypto/ssh/terminal
パッケージのドキュメント: https://pkg.go.dev/golang.org/x/crypto/ssh/terminal
参考にした情報源リンク
- Go言語の公式ドキュメント
go.crypto
リポジトリのソースコード- VT100ターミナルに関する一般的な情報源 (例: Wikipedia)
- ターミナルI/Oに関するUNIX/Linuxのドキュメント (termiosなど)