[インデックス 17755] ファイルの概要
このコミットは、Goのコードレビューツールにおける設定ファイルの取り扱いに関する変更です。特に、Plan 9オペレーティングシステム環境下でのドットファイル(設定ファイル)の配置場所を、ユーザーのホームディレクトリからより「健全な」場所へ移動させることを目的としています。
コミット
commit e67b0e688565f4112983d983f76642cf20021fcd
Author: Jeff Sickel <jas@corpus-callosum.com>
Date: Mon Oct 7 11:41:27 2013 -0400
codereview: move dotfiles out of user home director to something sane.
See Rob Pike's lesson on shortcuts, https://plus.google.com/101960720994009339267/posts/R58WgWwN9jp
R=golang-dev, r, rsc
CC=aram.h, golang-dev
https://golang.org/cl/14374045
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e67b0e688565f4112983d983f76642cf20021fcd
元コミット内容
codereview: move dotfiles out of user home director to something sane.
(コードレビュー: ドットファイルをユーザーのホームディレクトリから、より健全な場所へ移動する。)
See Rob Pike's lesson on shortcuts, https://plus.google.com/101960720994009339267/posts/R58WgWwN9jp
(Rob Pikeのショートカットに関する教訓を参照。)
変更の背景
この変更の背景には、Unix系システムで慣習的にユーザーのホームディレクトリに配置される「ドットファイル」(.bashrc
, .vimrc
などの隠し設定ファイル)の管理方法に対する、より洗練されたアプローチを求める思想があります。特に、コミットメッセージで参照されているRob Pikeの「ショートカットに関する教訓」は、システム設計において安易なショートカットや慣習に囚われず、より原理的でクリーンな設計を追求することの重要性を示唆しています。
従来のUnix系システムでは、多くのアプリケーションがユーザー固有の設定をホームディレクトリ直下のドットファイルに保存します。これは便利である一方で、ホームディレクトリが多数の隠しファイルで散らかり、バックアップや同期の際に問題を引き起こす可能性があります。
Plan 9オペレーティングシステムは、Unixとは異なるファイルシステム設計思想を持っており、設定ファイルやユーザーデータは通常、~/lib
のような専用のディレクトリに整理されます。このコミットは、GoのコードレビューツールがPlan 9環境で動作する際に、Plan 9のファイルシステム慣習に則り、ドットファイルをより適切な場所に配置するように調整することを目的としています。これにより、Plan 9の設計哲学との整合性を高め、より「健全な」ファイル管理を実現しようとしています。
前提知識の解説
ドットファイル (Dotfiles)
ドットファイルとは、ファイル名の先頭にピリオド(.
)が付いているファイルのことです。Unix系オペレーティングシステムでは、これらのファイルはデフォルトで隠しファイルとして扱われ、通常はユーザーの設定やアプリケーションの設定が保存されます。例えば、シェル(Bash, Zshなど)の設定ファイルである.bashrc
や.zshrc
、Vimエディタの設定ファイルである.vimrc
などが典型的なドットファイルです。
Plan 9 オペレーティングシステム
Plan 9は、ベル研究所で開発された分散オペレーティングシステムです。Unixの後継として設計され、Unixの多くの概念を洗練させ、新しいアプローチを導入しました。特に、Plan 9のファイルシステムは「すべてがファイルである」というUnixの哲学をさらに推し進め、ネットワークリソースやプロセスなどもファイルとして表現されます。
Plan 9では、ユーザーの設定ファイルやライブラリは、Unixのようにホームディレクトリ直下に散らばるのではなく、~/lib
のような特定のディレクトリに集約されることが一般的です。これは、ファイルシステムの整理整頓と、設定の共有や管理を容易にするための設計思想に基づいています。
plan9.bind
(Plan 9のファイルシステム操作)
Plan 9のファイルシステムには、bind
という重要な操作があります。これは、あるディレクトリツリーを別のディレクトリツリーに「マウント」するような機能を提供します。Unixのmount
コマンドに似ていますが、より柔軟で、既存のディレクトリに新しい内容を重ね合わせる(オーバーレイする)ことも可能です。
このコミットで言及されているplan9.bind
は、Pythonのplan9
モジュールが提供する関数であると推測されます。これは、PythonプログラムからPlan 9のbind
操作を実行するためのインターフェースを提供し、ファイルシステムの構造を動的に変更することを可能にします。
技術的詳細
このコミットの技術的な核心は、GoのコードレビューツールがPlan 9環境で実行される際に、その設定ファイル(ドットファイル)のパスを動的に変更する点にあります。
変更はlib/codereview/codereview.py
ファイルに対して行われています。このPythonスクリプトは、Goのコードレビューシステムの一部であり、おそらくクライアント側のツールやユーティリティを提供しています。
コードの変更箇所を見ると、os.sys.platform == 'plan9'
という条件分岐があります。これは、現在の実行環境がPlan 9であるかどうかをチェックしています。
もし環境がPlan 9であれば、以下の処理が試みられます。
import plan9
:plan9
モジュールをインポートしようとします。このモジュールは、PythonからPlan 9固有のシステムコールや機能にアクセスするためのものと考えられます。plan9.bind(os.path.expanduser("~/lib"), os.path.expanduser("~"), plan9.MBEFORE)
:os.path.expanduser("~/lib")
: ユーザーのホームディレクトリ内のlib
ディレクトリの絶対パスを生成します。Plan 9では、このlib
ディレクトリが設定ファイルやライブラリの標準的な置き場所です。os.path.expanduser("~")
: ユーザーのホームディレクトリの絶対パスを生成します。plan9.MBEFORE
:bind
操作のモードを指定するフラグです。MBEFORE
は、新しいディレクトリツリー(ここでは~/lib
)を既存のディレクトリツリー(ここでは~
)の「前に」バインドすることを意味します。これにより、~/lib
内のファイルが、ホームディレクトリ直下の同名のファイルを「隠す」形でアクセスできるようになります。
このbind
操作の目的は、コードレビューツールがホームディレクトリ直下でドットファイルを探すような挙動をしていた場合でも、実際には~/lib
内の対応するファイルを参照するようにリダイレクトすることです。これにより、Plan 9のファイルシステム慣習に沿った形で設定ファイルを管理できるようになります。
try...except ImportError
ブロックは、plan9
モジュールが利用できない場合(例えば、Plan 9以外のOSで実行されている場合や、モジュールがインストールされていない場合)にエラーを回避するためのものです。
コアとなるコードの変更箇所
--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -61,6 +61,14 @@ import time
from mercurial import commands as hg_commands
from mercurial import util as hg_util
+# bind Plan 9 preferred dotfile location
+if os.sys.platform == 'plan9':
+ try:
+ import plan9
+ n = plan9.bind(os.path.expanduser("~/lib"), os.path.expanduser("~"), plan9.MBEFORE)
+ except ImportError:
+ pass
+
defaultcc = None
codereview_disabled = None
real_rollback = None
コアとなるコードの解説
追加されたコードは、Pythonのos
モジュールと、Plan 9固有のplan9
モジュールを利用しています。
-
if os.sys.platform == 'plan9':
: この行は、現在のオペレーティングシステムがPlan 9であるかどうかをチェックします。os.sys.platform
は、Pythonが実行されているプラットフォームを示す文字列を返します(例:'linux'
,'darwin'
,'win32'
,'plan9'
)。この条件が真の場合にのみ、Plan 9固有の処理が実行されます。 -
try...except ImportError:
: このブロックは、plan9
モジュールのインポートが失敗した場合に備えています。plan9
モジュールはPlan 9環境に特化したものであり、他のOSでは利用できないため、ImportError
が発生する可能性があります。このtry...except
により、モジュールが見つからない場合でもプログラムがクラッシュすることなく、単にPlan 9固有の処理をスキップします。 -
import plan9
:plan9
モジュールをインポートします。このモジュールは、Plan 9のファイルシステム操作(特にbind
)をPythonから実行するためのAPIを提供します。 -
n = plan9.bind(os.path.expanduser("~/lib"), os.path.expanduser("~"), plan9.MBEFORE)
: これが変更の核心となる部分です。os.path.expanduser("~/lib")
: ユーザーのホームディレクトリ内のlib
サブディレクトリへのパスを展開します。Plan 9では、このlib
ディレクトリがユーザー固有の設定ファイルやライブラリを格納する推奨される場所です。os.path.expanduser("~")
: ユーザーのホームディレクトリへのパスを展開します。plan9.MBEFORE
:bind
操作のモードを指定する定数です。MBEFORE
は、最初の引数で指定されたディレクトリ(~/lib
)を、2番目の引数で指定されたディレクトリ(~
)に「前置」してバインドすることを意味します。これにより、例えば~/foo
というファイルにアクセスしようとした場合、まず~/lib/foo
が存在するかどうかをチェックし、存在すればそちらを使用します。存在しない場合にのみ、元の~/foo
が使用されます。
このbind
操作により、Goのコードレビューツールがホームディレクトリ直下で設定ファイルを探すような内部ロジックを持っていたとしても、Plan 9環境では自動的に~/lib
内の対応するファイルが優先的に参照されるようになります。これは、Plan 9のファイルシステム設計思想に合わせた、よりクリーンで整理された設定ファイルの管理を実現するための重要な調整です。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- Plan 9 from Bell Labs: https://9p.io/plan9/
- Goのコードレビューシステム (Gerrit): https://go-review.googlesource.com/
参考にした情報源リンク
- コミットメッセージ内のGoogle+リンクは現在利用できません。
- Plan 9のファイルシステムに関する一般的な情報源。
- Pythonの
os
モジュールに関するドキュメント。 - Goのコードレビューシステムに関する一般的な知識。