リポジトリ定義済み設定 — 3部作の第2部: Autoprops

この記事は、元の場所http://blogs.collab.net/subversion/the-road-to-repository-dictated-configuration-day-2-autopropsから許可を得てミラーリングされています。無効なリンクは削除または更新されています。

著者: Paul Burba

投稿日時 2013-06-25

自動プロパティ

第1部では、Subversion 1.8 の新しい継承可能なプロパティ機能について説明しました。この機能により、リポジトリ定義済み設定 (RDC) の道が開かれることをお約束しました。今日は、1.8 の RDC 関連機能の最初の部分である新しいsvn:auto-propsプロパティをご紹介します。

ちょっと待って…RDC って一体何?

Subversion は、Subversion クライアントの操作のさまざまな側面を制御する、広範なユーザー設定可能なオプションを提供しています。同じ場所に少数のコミッタしかいないリポジトリの場合、これらの設定を手動で同期するのはそれほど難しくないでしょう。しかし、大規模で分散されたグループの場合、全員が同じ設定を持つようにすることはますます困難になります。Subversion は、フックスクリプトを介して、これらの設定の一部を強制するためのメカニズムを提供しています。しかし、フックスクリプトは、その性質上、事後的な強制しか行いません。フックスクリプトは、正しく設定されていないユーザーによるコミットを拒否できますが、ユーザーの設定を修正することはできません。

より良い解決策は、リポジトリの動作コピーに対して直接的、間接的に適用されるリポジトリ全体のsettingsをクライアントの設定をシームレスに補完する、リポジトリ定義済み1設定です。この分野で最も一般的に要求される機能の1つは、Subversion 1.8 が新しい予約済みsvn:auto-propsプロパティで提供する、自動プロパティ設定のリポジトリ定義済み値です。

1.8 より前の Autoprops

これは高レベルのリフレッシュです。詳細については、Subversionによるバージョン管理の書籍を参照してください。

Subversion 1.7 では、svn addまたはsvn importサブコマンドを使用してファイルをバージョン管理に追加すると、Subversion はそのファイルに共通のプロパティを自動的に設定しようとします。これらのプロパティの一部(例:svn:executablesvn:mime-type)は設定に関係なく設定されますが、他のプロパティ(例:svn:eol-style2は、個々の実行時設定の詳細に依存します。これらの設定は、コマンドラインで–config-optionおよび–config-dirオプションを使用して上書きできます。

今日私たちに関心のある設定セクションは、auto-props です。このセクションでは、追加/インポートされたファイルに自動的に設定されるプロパティを定義できます。たとえば、次のような設定があるとします3

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = yes

### Section for configuring automatic properties.
[auto-props]
### The format of the entries is:
###   file-name-pattern = propname[=value][;propname[=value]...]
### The file-name-pattern can contain wildcards (such as '*' and
### '?').  All entries which match (case-insensitively) will be
### applied to the file.  Note that auto-props functionality
### must be enabled, which is typically done by setting the
### 'enable-auto-props' option.
*.c = svn:eol-style=native
*.cpp = svn:eol-style=native
*.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
*.dsp = svn:eol-style=CRLF
*.dsw = svn:eol-style=CRLF
*.sh = svn:eol-style=native;svn:executable
*.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
*.png = svn:mime-type=image/png
*.jpg = svn:mime-type=image/jpeg
Makefile = svn:eol-style=native

上記の設定では、.c拡張子のファイルをバージョン管理下に置くと、そのファイルにはsvn:eol-styleプロパティがnativeの値で自動的に設定されます。

1.8.0>svn st
?       src\panel.c

1.8.0>svn add src\panel.c
A         src\panel.c

1.8.0>svn proplist src\panel.c --verbose
Properties on 'src\panel.c':
  svn:eol-style
    native

素晴らしいですが、リポジトリ管理者であれば、すべてのユーザーがこのように設定を手動で設定することを期待する必要があります4。リポジトリ(またはリポジトリ内のプロジェクト)の目的の auto-prop 定義をユーザーにプッシュする方が良いでしょう5

svn:auto-props プロパティ

…新しいsvn:auto-propsプロパティが登場します。この新しいプロパティの値は、auto-props 実行時設定オプションと同じ形式にする必要があります。つまり、FILE_PATTERN = PROPNAME=VALUE[;PROPNAME=VALUE ...]形式の、改行で区切られた複数のキーバリューペアです。

前の例のランタイム設定と非常によく似た値で、リポジトリのルートにsvn:auto-propsプロパティを設定している場合があります。

1.8.0>svn pg svn:auto-props http://svn.example.com/repos --verbose
Properties on 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.cpp = svn:eol-style=native
    *.h = svn:keywords=Author Date Id Rev URL;svn:eol-style=native
    *.dsp = svn:eol-style=CRLF
    *.dsw = svn:eol-style=CRLF
    *.sh = svn:eol-style=native;svn:executable
    *.txt = svn:eol-style=native;svn:keywords=Author Date Id Rev URL;
    *.png = svn:mime-type=image/png
    *.jpg = svn:mime-type=image/jpeg
    Makefile = svn:eol-style=native

svn:auto-propsプロパティの値は、プロパティを継承するディレクトリの場所に追加またはインポートされたパスに対する自動プロパティを定義します。

例:リポジトリルートから継承された svn:auto-props

新しいプロパティが自動プロパティを設定する方法の非常に簡単な例を見てみましょう。実行時設定では auto-props が定義されていないと仮定します。

### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
enable-auto-props = no

さらに、リポジトリ管理者が以前にリポジトリのルートにsvn:auto-propsプロパティを設定していると仮定します6

1.8.0>svn propget svn:auto-props --verbose -R http://svn.example.com/repos
Properties on 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.h = svn:eol-style=native
    *.py = svn:eol-style=native

現在のプロジェクトの新しいワーキングコピーをチェックアウトします。

1.8.0>svn co http://svn.example.com/repos/calc/trunk calc-trunk-wc
A    calc-trunk-wc\doc
A    calc-trunk-wc\src
A    calc-trunk-wc\doc\INSTALL
A    calc-trunk-wc\FAQ
A    calc-trunk-wc\src\button.c
A    calc-trunk-wc\src\integer.c
A    calc-trunk-wc\src\real.c
A    calc-trunk-wc\src\main.c
A    calc-trunk-wc\Makefile
A    calc-trunk-wc\README
 U   calc-trunk-wc
Checked out revision 480.

作業後、バージョン管理下に置く新しいファイルがあります。

1.8.0>svn st calc-trunk-wc
?       calc-trunk-wc\src\bindings.h

1.8.0>svn add calc-trunk-wc\src\bindings.h
A         calc-trunk-wc\src\bindings.h

そうすると、リポジトリのルートから継承されたsvn:auto-propsプロパティにより、追加されたファイルにsvn_eol-styleプロパティが自動的に設定されます。

1.8.0>svn pg svn:auto-props -v --show-inherited-props calc-trunk-wc\src\bindings.h
Inherited properties on 'calc-trunk-wc\src\bindings.h',
from 'http://svn.example.com/repos':
  svn:auto-props
    *.c = svn:eol-style=native
    *.h = svn:eol-style=native
    *.py = svn:eol-style=native

1.8.0>svn pl -v calc-trunk-wc\src\bindings.h
Properties on 'calc-trunk-wc\src\bindings.h':
  svn:eol-style
    native

自動プロパティの階層

前の例はおそらく、遭遇するsvn:auto-propsに関連する最も単純なケースでしょう。しかし、次のような場合はどうなりますか?

これらの場合、次のルールが適用されます。

A) svn:auto-propsは実行時設定のauto-propsを上書きします。 svn:auto-propsで定義された特定のパターンに対する自動プロパティは、auto-props実行時設定7にある同じパターンに対する同じauto-propを上書きします。

B) より近いsvn:auto-propsが優先されます。 同じパターンに対する自動プロパティが複数の親のsvn:auto-propsプロパティから継承されている場合、パス的に近い親がより遠い親を上書きします。

C) 明示的なsvn:auto-propsは継承されたものを優先します。 特定のパターンに対してパスに明示的に設定されたsvn:auto-propsプロパティで定義された自動プロパティは、任意の親から継承された同一のパターンに対する同じauto-prop(s)を上書きします。

D) ファイルが複数のパターンに一致する場合、保証はありません。 auto-props 実行時設定オプションと同様に、ファイルが同じプロパティの値を定義する複数ファイルパターンに一致する場合、どのパターンの値が自動的に適用されるかの保証はありません。たとえば、追加されたファイルfoo.pyが次の両方の値を継承する場合。

*.py = svn:eol-style=native
*.p* = svn:eol-style=CRLF

追加されたファイルfoo.pyにどのeol-styleが設定されるかの保証はありません。

E) --no-auto-propsは自動プロパティを無効にします。 auto-props 実行時オプションと同様に、コマンドラインで--no-auto-propsオプションを使用すると、svn:auto-propsプロパティが無視されます。

F) 実行時設定で自動プロパティを無効にしても、RDCには影響しません。 実行時設定オプションのenable-auto-propsがnoに設定されている場合でも、svn:auto-propsは無効になりません。

<pre>### Set enable-auto-props to 'yes' to enable automatic properties
### for 'svn add' and 'svn import', it defaults to 'no'.
### Automatic properties are defined in the section 'auto-props'.
### Note: Setting this option to 'no' has no effect on the behavior of
### the svn:auto-props property
enable-auto-props = no</pre>
<

どこに配置するべきか

svn:auto-propsは継承可能であることを忘れないでください。そのため、通常はリポジトリのルートにプロパティを設定するだけで済みます。リポジトリに異なる設定を必要とする複数の異なるプロジェクトがある場合は、各プロジェクトのルートフォルダにプロパティを配置できます8。継承可能なプロパティに関しては、少ないほど良いことを忘れないでください。特定のリポジトリパスが複数の親から同じ値を継承するようにsvn:auto-propsを設定している場合、おそらく必要以上に多くのことを行っているでしょう。

注記

  1. 完全開示:ここで説明されているリポジトリ「定義済み」設定は、実際には動作の良い1.8以降のクライアントへの提案に過ぎません。古いクライアントは明らかに新しい指示を理解しません。新しいクライアントでも、ユーザーがクライアントを変更してサーバー側の提案を無視することは比較的簡単です。結局のところ、Subversionオープンソースです!この現実を踏まえ、100%のコンプライアンスが必要な場合は、フックスクリプトによる望ましい動作のサーバー側強制が依然として推奨されます。

  2. svn:mime-type は実際には両方のカテゴリに分類されます。実行時設定で設定できますが、何も定義されていない場合、Subversion はハードコーディングされたルールセットを使用して MIME タイプを自動的に設定しようとします。

  3. ここでは簡略化していることを認めます。単一ユーザー設定だけでなく、最大4つの場所で定義できます。

    1. ユーザーごとの実行時設定
    2. ユーザーごとのレジストリ値(Windowsのみ)
    3. マシンごとの実行時設定
    4. システム全体のレジストリ値(Windowsのみ)

    番号の小さい設定は、番号の大きい設定よりも優先されます。このブログの例では、簡略化のため、設定#2~#4は空であり、設定全体は#1のみに定義されていると仮定します。

  4. Subversionは、デフォルトの設定では自動プロパティを設定しません。

  5. つまり、リポジトリが設定を決定します!

  6. svn:auto-propsプロパティは、ディレクトリに対してのみ設定できることに注意してください。

  7. 標準のランタイム設定、または--config-dirオプションで指定された設定のいずれかです。

  8. パート1で説明したように、すべてのユーザーは、svn:auto-propsを設定したディレクトリへの読み取りアクセス権を持っている必要があります。そうでない場合、そのパスから継承できません。

著者について

ポール・バーバは、Apache Software FoundationのSubversionプロジェクトのコミッターであり、過去9年間Subversionに取り組んでいます。彼はニューハンプシャー州の自宅でCollabnetのソフトウェアエンジニアとして勤務しており、コーディングをしていないときは、甥っ子とスキーをしたり、友人とマウンテンバイクに乗ったり、妻と旅行に出かけたりしています。昔、ポールはニューハンプシャー大学でビジネスの学位を取得しました。比較的最近、ボストン大学でコンピュータサイエンスの修士号を取得しました。