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

[インデックス 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であれば、以下の処理が試みられます。

  1. import plan9: plan9モジュールをインポートしようとします。このモジュールは、PythonからPlan 9固有のシステムコールや機能にアクセスするためのものと考えられます。
  2. 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モジュールを利用しています。

  1. if os.sys.platform == 'plan9':: この行は、現在のオペレーティングシステムがPlan 9であるかどうかをチェックします。os.sys.platformは、Pythonが実行されているプラットフォームを示す文字列を返します(例: 'linux', 'darwin', 'win32', 'plan9')。この条件が真の場合にのみ、Plan 9固有の処理が実行されます。

  2. try...except ImportError:: このブロックは、plan9モジュールのインポートが失敗した場合に備えています。plan9モジュールはPlan 9環境に特化したものであり、他のOSでは利用できないため、ImportErrorが発生する可能性があります。このtry...exceptにより、モジュールが見つからない場合でもプログラムがクラッシュすることなく、単にPlan 9固有の処理をスキップします。

  3. import plan9: plan9モジュールをインポートします。このモジュールは、Plan 9のファイルシステム操作(特にbind)をPythonから実行するためのAPIを提供します。

  4. 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のファイルシステム設計思想に合わせた、よりクリーンで整理された設定ファイルの管理を実現するための重要な調整です。

関連リンク

参考にした情報源リンク

  • コミットメッセージ内のGoogle+リンクは現在利用できません。
  • Plan 9のファイルシステムに関する一般的な情報源。
  • Pythonのosモジュールに関するドキュメント。
  • Goのコードレビューシステムに関する一般的な知識。