foozy@708: \chapter{File names and pattern matching} foozy@708: \label{chap:names} foozy@708: foozy@708: Mercurial は、 foozy@708: 一貫性と表現力を兼ね備えた方法でファイル名を扱う仕組みを提供しています。 foozy@708: foozy@708: \section{Simple file naming} foozy@708: foozy@708: Mercurial は foozy@708: ``under the hood''において、 foozy@708: ファイル名を取り扱う統一された仕組みを用いています。 foozy@708: ファイル名に関する全てのコマンドの挙動は統一されています。 foozy@708: ファイル名に対するコマンドの挙動は、以下のようになっています。 foozy@708: foozy@708: コマンド行で実ファイル名を明示的に指定した場合、 foozy@708: Mercurial は指定されたファイル名に厳密に作用します。 foozy@708: foozy@708: \interaction{filenames.files} foozy@708: foozy@708: ディレクトリ名を指定した場合、 foozy@708: Mercurial はその指定を、 foozy@708: ``当該ディレクトリならびにサブディレクトリ中の全てのファイル'' foozy@708: とみなします。 foozy@708: Mercurial は当該ディレクトリ配下のファイル・サブディレクトリを、 foozy@708: アルファベット順に走査します。 foozy@708: あるディレクトリの走査中にサブディレクトリに遭遇した場合、 foozy@708: 当該ディレクトリの走査よりも先に、 foozy@708: サブディレクトリの走査を実施します\footnote{訳注: 深さ優先(depth first)}。 foozy@708: foozy@708: \interaction{filenames.dirs} foozy@708: foozy@708: \section{Running commands without any file names} foozy@708: foozy@708: ファイル名を引数に取る Mercurial コマンドは、 foozy@708: 引数ないしパターン指定無しで起動された場合も、 foozy@708: 有用な基底時動作が定められています。 foozy@708: コマンドに期待される振る舞いは、 foozy@708: コマンドの用途に依存します。 foozy@708: ファイル名指定無しの起動において、 foozy@708: コマンドがどのように振舞うのかを推測するための、 foozy@708: 一般的な目安となる幾つかのルールを以下に示します。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item 殆どのコマンドは作業領域ディレクトリ全体に作用します。 foozy@708: 例えば、\hgcmd{add} コマンドなどがそうです。 foozy@708: foozy@708: \item 復旧が困難あるいは不可能な作用を及ぼすコマンドの場合、 foozy@708: 少なくとも1つ以上の名前ないしパターン(後述します) foozy@708: の明示的な指定を求める筈です。 foozy@708: この挙動により、 foozy@708: 例えば引数無しの \hgcmd{remove} 起動のような、 foozy@708: 不慮の事態によるファイルの削除等を防ぐことができます。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: この振る舞いがそぐわない状況であれば、 foozy@708: 簡単に振る舞いを変えることができます。 foozy@708: 作業領域ディレクトリ全体に作用するコマンドであれば、 foozy@708: ``\dirname{.}'' を指定することで、 foozy@708: コマンドの作用を現在のディレクトリおよびその配下に限定することができます。 foozy@708: foozy@708: \interaction{filenames.wdir-subdir} foozy@708: foozy@708: ルート以外のディレクトリでコマンドを実行した場合でも、 foozy@708: リポジトリのルートに対する相対的なファイル名を表示するコマンドもあります。 foozy@708: このようなコマンドは、 foozy@708: 明示的な名前を指定することで、 foozy@708: 現在のディレクトリ位置に対する相対的なファイル名を表示するようになります。 foozy@708: 非ルートディレクトリでの \hgcmd{status} 起動の際に foozy@708: \hgcmd{root} コマンドの出力を指定することで、 foozy@708: 対象を作業領域ディレクトリ全体に維持したまま、 foozy@708: 現在のディレクトリ位置に対する相対的なファイル名を表示させることができます。 foozy@708: foozy@708: \interaction{filenames.wdir-relname} foozy@708: foozy@708: \section{Telling you what's going on} foozy@708: foozy@708: 先の節における \hgcmd{add} コマンド実行例は、 foozy@708: Mercurial コマンドに関するもう一つの有益な事柄を示しています。 foozy@708: コマンド行で明示的な指定をしていないファイルに対してコマンドが作用する場合、 foozy@708: 通常は対象ファイル名を表示しますので、 foozy@708: 思わぬコマンドの実行結果に後から驚かされることはありません。 foozy@708: foozy@708: これは\emph{驚きを最小}にする原則に則ったものです。 foozy@708: コマンド行で厳密なファイル名を指定した場合には、 foozy@708: それを復唱する必要は無いでしょう。 foozy@708: ファイル名・ディレクトリ名ないしパターン(後述します) foozy@708: を指定しないことで\emph{暗に指定された}対象ファイルに foozy@708: Mercurial が作用する場合、 foozy@708: どのファイルを対象とするのかを通知するのは安全性の上で有用です。 foozy@708: foozy@708: 上記方針に沿って振舞うコマンド群は、 foozy@708: \hggopt{-q} オプションを指定することで、 foozy@708: その出力を抑止することができます。 foozy@708: 明示的にファイル名等を指定した場合でも、 foozy@708: \hggopt{-v} オプションを指定することで、 foozy@708: 全ての対象ファイル名を表示させることができます。 foozy@708: foozy@708: \section{Using patterns to identify files} foozy@708: foozy@708: ファイル名・ディレクトリ名による指定に加えて、 foozy@708: Mercurial では\emph{パターン}によるファイル指定機能が使用できます。 foozy@708: Mercurial のパターン操作は表現力に富んだものです。 foozy@708: foozy@708: Linux や MacOS のような Unix 的システムでは、 foozy@708: ファイル名とパターンとの間の突合せは通常シェルがその役目を負います。 foozy@708: これらのシステムでは、 foozy@708: パターンを指定している旨を foozy@708: Mercurial に対して明示的に指示する必要があります\footnote{訳注: foozy@708: シェルによる特殊文字展開の抑止の話であれば、 foozy@708: ``Mercurial に対して''ではなく、 foozy@708: ``シェルに対して''なのでは? foozy@708: それとも Windows バイナリ版では振る舞いが異なる?}。 foozy@708: Windows においては、 foozy@708: シェルによるパターンの展開が行われませんので、 foozy@708: Mercurial は自動的に指定されたものがパターンであると認識し、 foozy@708: ファイル名へと展開します。 foozy@708: foozy@708: コマンド行において、 foozy@708: ファイル名を指定する場所でパターンを使用するには、 foozy@708: 以下のように記述します。 foozy@708: foozy@708: \begin{codesample2} foozy@708: syntax:patternbody foozy@708: \end{codesample2} foozy@708: foozy@708: パターンの記述は、 foozy@708: パターンの種類を識別するための短い文字列、コロン、 foozy@708: そして実際のパターンを連結したものです。 foozy@708: foozy@708: Mercurial は2種類のパターン形式に対応しています。 foozy@708: 最も利用頻度が高いものは \texttt{glob} と呼ばれ、 foozy@708: Unix のシェルによるパターンマッチングと同様の機能を持つもので、 foozy@708: その振る舞いは Windows のコマンドプロンプトユーザにも馴染みがあることでしょう。 foozy@708: foozy@708: Windows において foozy@708: Mercurial が自動的にパターンマッチングを行う場合、 foozy@708: \texttt{glob} 形式とみなされます。 foozy@708: そのため、 foozy@708: Windows においては ``\texttt{glob:}'' 接頭辞を省略可能ですが、 foozy@708: 明示的に指定することも可能です。 foozy@708: foozy@708: \texttt{re} 形式は、 foozy@708: \texttt{glob} 形式よりも強力で、 foozy@708: regexps としても知られる正規表現を使用したパターンの記述が可能です。 foozy@708: foozy@708: ちなみに、以降の例では、 foozy@708: 全てのパターン指定を注意深く引用符で囲むことで、 foozy@708: Mercurial の処理の前にシェルによって展開されてしまうことを防いでいる、 foozy@708: という点に注意してください。 foozy@708: foozy@708: \subsection{Shell-style \texttt{glob} patterns} foozy@708: foozy@708: \texttt{glob} 形式によるマッチングの際に、 foozy@708: 使用可能なパターンについての概要を以下に示します。 foozy@708: foozy@708: パターン ``\texttt{*}'' は、 foozy@708: 同一ディレクトリ内で任意の文字列に合致します。 foozy@708: foozy@708: \interaction{filenames.glob.star} foozy@708: foozy@708: パターン ``\texttt{**}'' は、 foozy@708: ディレクトリ境界を超えて任意の文字列に合致します。 foozy@708: このパターンは Unix における標準的なものではありませんが、 foozy@708: 幾つかの著名なシェル実装で採用されており、 foozy@708: 非常に便利です。 foozy@708: foozy@708: \interaction{filenames.glob.starstar} foozy@708: foozy@708: パターン ``\texttt{?}'' は、 foozy@708: 単一の文字に合致します。 foozy@708: foozy@708: \interaction{filenames.glob.question} foozy@708: foozy@708: パターン ``\texttt{[}'' は、 foozy@708: \emph{文字集合}(character class)の開始を意味します。 foozy@708: このパターンは当該集合に属する任意の一文字に合致します。 foozy@708: 集合指定は ``\texttt{]}'' によって終了します。 foozy@708: 集合指定には、 foozy@708: ``\texttt{abcdef}'' の省略指定である foozy@708: ``\texttt{a-f}'' 形式の\emph{範囲}指定を、 foozy@708: 複数含めることが可能です。 foozy@708: foozy@708: \interaction{filenames.glob.range} foozy@708: foozy@708: 文字集合指定において foozy@708: ``\texttt{[}'' の直後の文字が ``\texttt{!}'' \footnote{訳注: foozy@708: 正規表現における ``\texttt{\^}'' による反転と異なる点に注意}の場合、 foozy@708: 集合指定は\emph{反転}され、 foozy@708: 集合に属さない任意の一文字に合致します。 foozy@708: foozy@708: パターン ``\texttt{\{}'' はサブパターンのグループ化の開始を意味し、 foozy@708: グループ中の何れかのサブパターンが合致した場合は、 foozy@708: グループ全体が合致したものとみなされます。 foozy@708: グループ指定におけるサブパターンの区切りには foozy@708: ``\texttt{,}'' が使用され、 foozy@708: ``\texttt{\}}'' がグループの終了を意味します。 foozy@708: foozy@708: \interaction{filenames.glob.group} foozy@708: foozy@708: \subsubsection{Watch out!} foozy@708: foozy@708: 任意のディレクトリにおけるパターン合致が必要な場合は、 foozy@708: 単一ディレクトリ内でのマッチングしか行わない foozy@708: ``\texttt{*}'' を使用すべきでは無い、 foozy@708: という点は忘れないようにしてください。 foozy@708: ``\texttt{*}'' の代わりに ``\texttt{**}'' を使用しましょう。 foozy@708: 両者の違いを以下で説明します。 foozy@708: foozy@708: \interaction{filenames.glob.star-starstar} foozy@708: foozy@708: \subsection{Regular expression matching with \texttt{re} patterns} foozy@708: foozy@708: Mercurial は(Python の内部的な正規表現エンジンを利用しているので) foozy@708: Python が受け付けるのと同じ正規表現を受け付けます。 foozy@708: この正規表現は Perl の正規表現文法を基にしており、 foozy@708: 最も多用されている(例えば Java でも使用されています)方言です。 foozy@708: foozy@708: 正規表現パターンはそれほど多用されるものではないので、 foozy@708: Mercurial の正規表現の詳細に関してここでは説明しません。 foozy@708: Perl 形式の正規表現は様々な形式で、 foozy@708: 多くのウェブサイトや出版物において余す所無く説明されています。 foozy@708: その代わりここでは、 foozy@708: Mercurial で正規表現を使用する必要に迫られた際に、 foozy@708: 知っておくべき幾つかの事柄について説明しようとおもいます。 foozy@708: foozy@708: 正規表現は、 foozy@708: リポジトリルートからの相対的なファイル名全体に対して適用されます。 foozy@708: 言い換えるなら、 foozy@708: \dirname{foo} サブディレクトリで作業している場合でも、 foozy@708: このディレクトリ配下のファイルに対してマッチングを行うなら、 foozy@708: 指定するパターンは foozy@708: ``\texttt{foo/}'' で始まっていなければなりません。 foozy@708: foozy@708: Perl 形式の正規表現に馴染んでいる場合、 foozy@708: Mercurial の正規表現は \emph{rooted} である点に注意してください\footnote{訳注: foozy@708: 暗黙のうちに ``\texttt{\^}'' が付与される、と理解すれば良いでしょう。}。 foozy@708: 正規表現は文字列先頭からマッチングを実施しますので、 foozy@708: 文字列途中に対するマッチングは行われません。 foozy@708: 任意の位置に対してマッチングを実施させたい場合、 foozy@708: パターンの記述を ``\texttt{.*}'' で始める必要があります。 foozy@708: foozy@708: \section{Filtering files} foozy@708: foozy@708: Mercurial が多様な方法を提供しているものは、 foozy@708: ファイルの指定方法だけではありません。 foozy@708: Mercurial は\emph{フィルタ}によるファイル選別の機能も提供しています。 foozy@708: ファイル名指定を受け付けるコマンドは、 foozy@708: 以下の2つのフィルタリングオプションも受け付けます。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item \hggopt{-I} ないし \hggopt{--include} により、 foozy@708: 合致したファイルのみを処理対象とみなすパターンを指定できます。 foozy@708: foozy@708: \item \hggopt{-X} ないし \hggopt{--exclude} により、 foozy@708: 合致したファイルを処理対象から\emph{除外}するパターンを指定できます。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: 複数の \hggopt{-I} および \hggopt{-X} オプションを、 foozy@708: コマンド行で好きなように混在させることができます。 foozy@708: Mercurial の基底動は、 foozy@708: 指定されたパターンを ``\texttt{glob}'' 形式とみなして解釈します foozy@708: (必要であれば明示的に ``\texttt{glob}'' を指定することも可能です)。 foozy@708: foozy@708: \hggopt{-I} フィルタは、 foozy@708: ``合致したファイルのみを処理対象とする'' foozy@708: ものと解釈すれば良いでしょう。 foozy@708: foozy@708: \interaction{filenames.filter.include} foozy@708: foozy@708: \hggopt{-X} フィルタは、 foozy@708: ``合致しないものを処理対象とする'' foozy@708: ものと解釈することができます。 foozy@708: foozy@708: \interaction{filenames.filter.exclude} foozy@708: foozy@708: \section{Ignoring unwanted files and directories} foozy@708: foozy@708: ※ 原文未稿 foozy@708: foozy@708: \section{Case sensitivity} foozy@708: \label{sec:names:case} foozy@708: foozy@708: Linux(ないし他の Unix 系 OS)と、 foozy@708: MacOS ないし Windows が混在する開発環境で作業する場合、 foozy@708: ファイル名における文字の大小(``N'' と ``n'')の扱い方針が全く異なる、 foozy@708: という知識を心に留めておく必要があります。 foozy@708: 良くある事では無いかもしれませんし、 foozy@708: 容易に解決できる可能性もありますが、 foozy@708: 知らない状況で遭遇した場合、 foozy@708: 非常に驚かされる問題でもあります。 foozy@708: foozy@708: OS およびファイルシステムに応じて、 foozy@708: ファイルおよびディレクトリ名の\emph{文字の大小}の扱いは異なります。 foozy@708: 名前における文字の大小の一般的な扱い方を、 foozy@708: 以下に3つ示します。 foozy@708: foozy@708: \begin{itemize} foozy@708: \item 完全に文字の大小を無視: foozy@708: ファイルの生成およびその後の扱いにおいて、 foozy@708: 文字の大文字・小文字は同じものとして扱われます。 foozy@708: 古い DOS 風のシステムで一般的な扱い方です。 foozy@708: foozy@708: \item 文字の大小は保持されるが無視: foozy@708: ファイルないしディレクトリ生成の際には、 foozy@708: 名前における文字の大小は保存され、 foozy@708: OS による検索や表示が可能です。 foozy@708: 存在するファイルが検索される場合、文字の大小は無視されます。 foozy@708: Windows や MacOS では標準的な仕様です。 foozy@708: \filename{foo} と \filename{FoO} は同じファイルとみなされます。 foozy@708: 大文字と小文字の互換性ある扱いは、 foozy@708: \emph{ケースフォールディング}(case folding)とも呼ばれます。 foozy@708: foozy@708: \item 文字の大小を区別: foozy@708: 名前における文字の大小は常に意味を持ちます。 foozy@708: \filename{foo} と \filename{FoO} は異なるファイルとして区別されます。 foozy@708: これは Linux や Unix における通常の振る舞いです。 foozy@708: foozy@708: \end{itemize} foozy@708: foozy@708: Unix 的なシステムの上では、 foozy@708: 上記の大文字・小文字の取り扱い形式のうちの``任意''のものが foozy@708: (あるいは全てが同時に)要求される可能性があります。 foozy@708: 例えば、 foozy@708: FAT32 ファイルシステムでフォーマットされた foozy@708: USB 小型メモリモジュールを Linux で使用する場合、 foozy@708: そのファイルシステム上での Linux の振る舞いは、 foozy@708: 文字の大小は保持しつつ無視するものとなります。 foozy@708: foozy@708: \subsection{Safe, portable repository storage} foozy@708: foozy@708: Mercurial のリポジトリ格納機能は、 foozy@708: 文字大小の区別の可否に\emph{影響を受けません}。 foozy@708: リポジトリの保存先ファイル名は元ファイル名を変換したものなので、 foozy@708: ファイルシステムにおける大文字小文字の区別の可否に関わり無く、 foozy@708: 構成管理情報を格納できます。 foozy@708: つまり、OS の標準的な複製ツールを使用して、 foozy@708: Mercurial のリポジトリを例えば USB 小型メモリモジュールに複製し、 foozy@708: Mac、Windows PC および Linux の間で持ち運ぶことができます。 foozy@708: foozy@708: \subsection{Detecting case conflicts} foozy@708: foozy@708: 作業領域ディレクトリにおける操作の際には、 foozy@708: Mercurial は作業領域を載せているファイルシステムの命名方針に従います。 foozy@708: ファイルシステムが文字の大小は保持しつつ無視するものであった場合、 foozy@708: 文字の大小のみが異なる名前を Mercurial は同じものとみなします。 foozy@708: foozy@708: この方針の重要な点は、 foozy@708: 文字大小を区別する(一般的な Linux や Unix における) foozy@708: ファイルシステムにおいて、 foozy@708: 文字大小を区別できない(Windows や MacOS の) foozy@708: ユーザが取り扱えないようなチェンジセットをコミットすることが可能である点です。 foozy@708: Linux の利用者が foozy@708: \filename{myfile.c} と foozy@708: \filename{MyFile.C} foozy@708: という名前の2つのファイルに対する変更をコミットした場合、 foozy@708: 変更内容はリポジトリに正しく保存されます。 foozy@708: 他の Linux 利用者の作業領域ディレクトリにおいても、 foozy@708: これらのファイルは異なるファイルとして正しく存在します。 foozy@708: foozy@708: Mercurial のリポジトリ格納機構が文字大小の扱いの可否に影響を受けないため、 foozy@708: Windows ないし MacOS 利用者がこの変更を取り込んでも、 foozy@708: 最初は問題が発生しません。 foozy@708: しかし、 foozy@708: 作業領域ディレクトリを当該チェンジセットで \hgcmd{update} foozy@708: しようとした場合、 foozy@708: あるいは当該チェンジセットと foozy@708: \hgcmd{merge} しようとした場合、 foozy@708: ファイルシステムが同じファイルとして扱う2つのファイルの衝突を見つけた foozy@708: Mercurial によって、 foozy@708: \hgcmd{update} ないし \hgcmd{merge} は禁止されます。 foozy@708: foozy@708: \subsection{Fixing a case conflict} foozy@708: foozy@708: 他のメンバーが Linux や Unix を使用している混在環境で foozy@708: Windows ないし MacOS を使用していて、 foozy@708: \hgcmd{update} あるいは \hgcmd{merge} の際に foozy@708: Mercurial が文字大小の衝突を報告する場合、 foozy@708: 問題の解決手順は簡単です。 foozy@708: foozy@708: 手近な Linux ないし Unix 利用者を探し、 foozy@708: 問題のリポジトリを \hgcmd{clone} してから、 foozy@708: 問題のファイルないしディレクトリを大文字小文字の衝突が発生しないように、 foozy@708: Mercurial の \hgcmd{rename} コマンドで改名をすれば良いのです。 foozy@708: その後、 foozy@708: 変更をコミットし、 foozy@708: \hgcmd{pull} ないし \hgcmd{push} で foozy@708: Windows や MacOS に変更を取り込み、 foozy@708: \hgcmd{update} によって衝突しない名前で変更内容を取り出します。 foozy@708: foozy@708: 大文字小文字の衝突を生じさせるチェンジセットそのものは、 foozy@708: プロジェクトの履歴に残っており、 foozy@708: 当該チェンジセットを Windows や foozy@708: MacOS 上で作業領域ディレクトリに取り出すことはできませんが、 foozy@708: 開発を継続することは可能です\footnote{訳注: foozy@708: 文字の大小とは関係ありませんが、 foozy@708: Windows は ``\texttt{con}'' や foozy@708: ``\texttt{aux}'' が特別扱いされるため、 foozy@708: 例えばこれらの名前を利用したディレクトリがある場合などは、 foozy@708: リポジトリの \hgcmd{pull} そのものができません。}。 foozy@708: foozy@708: \begin{note} foozy@708: 0.9.3 版以前の Mercurial は、 foozy@708: 大文字小文字に影響を受けないリポジトリ格納機構も、 foozy@708: 大文字小文字の名前衝突検知機能もありませんでした。 foozy@708: Mercurial の旧版を Windows や MacOS で使用している場合、 foozy@708: Mercurial の更新をお薦めします。 foozy@708: \end{note} foozy@708: foozy@708: %%% Local Variables: foozy@708: %%% mode: latex foozy@708: %%% TeX-master: "00book" foozy@708: %%% End: