[このドキュメントの単一ページバージョンも表示できます。]
Subversion はもともと CollabNet (https://www.collab.net/) によってスポンサーされ、ホストされていましたが、Apache License, Version 2.0 の下にある真のオープンソースプロジェクトです。Subversion の開発者の中には、Subversion を改善するために雇用主から給与を受け取っている人もいますが、多くの人はより良いバージョン管理システムを構築することに関心のある優れたボランティアです。
コミュニティは主に IRC、メーリングリスト、および Subversion リポジトリを通じて存在します。参加するには
irc.libera.chat の #svn-dev チャンネルに参加してください(Web インターフェースまたはMatrix、または任意の IRC ソフトウェアを使用してください。アーカイブはこちら)。
"dev"、"commits"、および "announce" メーリングリストに参加してください。dev リスト(dev@subversion.apache.org)は、ほとんどすべての議論が行われる場所です。すべての開発に関する質問はそこに送る必要がありますが、最初にリストのアーカイブを確認することをお勧めします。「commits」リストは、自動コミットメールを受信します。詳細については、https://subversion.dokyumento.jp/mailing-lists.htmlを参照してください。
https://svn.apache.org/repos/asf/subversion/trunk/から最新の開発ソースのコピーを入手してください
新しい開発は常に trunk で行われます。バグ修正、機能強化、および新機能は、そこからさまざまなリリースブランチにバックポートされます。
ここ数年、Subversion コミュニティは年に一度ベルリンでハッカソンを開催しています: 2016、2015、2014、2013、2012、2011 および 2010 [archive.org からリンクされています。一部のメディアリンクは機能しません]。
コードを書くこと、またはバグデータベースのテストや管理を支援することなど、プロジェクトに参加する方法はたくさんあります。貢献したい場合は、以下を参照してください
コードを送信するには、パッチを dev@subversion.apache.org に送信するだけです。いいえ、待ってください。まずこのファイルの残りの部分を読んでから、dev@subversion.apache.org にパッチの送信を開始してください。 :-)
問題データベースの管理を支援するには、問題の要約を確認し、無効であるか、他の問題の重複である問題を調べてテストしてください。両方の種類は非常に一般的です。1 つ目は、コード内の他の変更の副作用として、バグが気付かないうちに修正されることが多いため、2 つ目は、すでに報告されていることに気付かずに問題を提出する人がいるためです。問題がわからない場合は、dev@subversion.apache.org に質問を投稿してください。(「Subversion: 私たちがあなたを助けるためにここにいます!」)
支援するもう 1 つの方法は、Subversion の自動ビルドとテストスイートの実行をいくつかのプラットフォームでセットアップし、出力を notifications@subversion.apache.org メーリングリストに送信することです。詳細については、メーリングリストのページを参照してください。
最後に、Subversion プロジェクトのオンラインの性質と、その事実から生じる人間との接触の抽象化にもかかわらず、すべての貢献の終わりには実際の人がいることを認識することが重要です。他のすべてのコミュニティメンバーを、自分が扱われたいと思うように扱ってください。貢献者をではなく、貢献をレビューしてください。他人を煩わせたり、自分で簡単にイライラしたりしないでください。
設計
設計仕様は 2000 年 6 月に作成され、少し古くなっています。しかし、リポジトリの内部動作と Subversion のさまざまなレイヤーについて、理論的な優れた導入を提供します。
API ドキュメント
詳細については、公開 API ドキュメントのセクションを参照してください。
デルタエディター
Karl Fogel は、O'Reilly の 2007 年の本 Beautiful Code: Leading Programmers Explain How They Think で、Subversion のデルタエディターインターフェイスの設計と使用について説明する章を執筆しました。
ネットワークプロトコル
WebDAV Usage ドキュメントは、Subversion の DAV ネットワークプロトコルを紹介するものであり、HTTP の拡張方言であり、「http://」または「https://」で始まる URL を使用します。
SVN Protocol ドキュメントには、Subversion ra_svn ネットワークプロトコルの正式な説明が含まれています。これは、ポート 3690(デフォルト)上のカスタムプロトコルであり、その URL は「svn://」または「svn+ssh://」で始まります。
ユーザーマニュアル
Version Control with Subversion は O'Reilly が出版した本で、Subversion を効果的に使用する方法を詳しく解説しています。本のテキストは無料で、積極的に改訂されています。オンライン版は、https://svnbook.red-bean.com/で入手できます。XML ソースと他の言語への翻訳は、https://sourceforge.net/projects/svnbook/ の独自のレポジトリで管理されています。
システムノート
システムの特定の側面に関する設計アイデアの多くは、notes/ ディレクトリの個々のファイルに文書化されています。
コードを投稿する前に、既存のコードベースとインターフェイスを理解する必要があります。
Subversion のコピーをチェックアウトします(まだコミットアクセス権を持つアカウントを持っていない場合は、匿名で)。コードを見ることができます。
'subversion/include/' 内には、大量のドキュメントコメントを含むヘッダーファイルがたくさんあります。これらに目を通すと、実装の詳細をかなりよく理解できるでしょう。以下に、推奨される熟読順序を示します。
基本ビルディングブロック: svn_string.h、 svn_error.h、 svn_types.h
重要なインターフェイス: svn_delta.h
クライアント側のインターフェイス: svn_ra.h、 svn_wc.h、 svn_client.h
リポジトリとバージョン付きファイルシステム: svn_repos.h、 svn_fs.h
Subversion は、C89/C90 方言のANSI/ISO C のみを使用し、Apache Portable Runtime (APR) ライブラリを使用することで、移植性を維持しようとしています。APR は Apache httpd サーバーで使用される移植レイヤーであり、詳細については、https://apr.apache.org/を参照してください。
Subversion は APR に大きく依存しているため、まず APR の特定のヘッダーファイル('apr/include/' を参照)に目を通さなければ、Subversion を理解するのが難しい場合があります。
メモリプール: apr_pools.h
ファイルシステムアクセス: apr_file_io.h
ハッシュと配列: apr_hash.h、 apr_tables.h
Subversion は、信頼性が高く安全なソフトウェアを提供しようともしています。これは、C プログラミング言語での安全なプログラミングを理解している開発者によってのみ実現できます。この背後にある完全な根拠については、'notes/assurance.txt' を参照してください。特に、David Wheeler の Secure Programming( 'notes/assurance.txt' に記載)を注意深く読むようにしてください。変更のセキュリティへの影響について質問がある場合は、開発者メーリングリストでレビューを求めることを強くお勧めします。
ソースツリーの簡単なガイド
doc/
ユーザーおよび開発者のドキュメント。
tools/
Subversion で動作するが、Subversion が依存しないもの。tools/ のコードは Subversion プロジェクトによって共同で保守され、Subversion 自体と同じオープンソースの著作権の下にあります。
contrib/
Subversion で動作するが、Subversion が依存しないもので、Subversion 開発に参加する場合としない場合がある個人によって保守されます。contrib/ のコードはオープンソースですが、Subversion 自体とは異なるライセンスまたは著作権所有者を持っている場合があります。
subversion/
Subversion 自体のソースコード(外部ライブラリとは対照的)。
subversion/include/
Subversion ライブラリのユーザー向けの公開ヘッダーファイル。
subversion/include/private/
Subversion ライブラリが内部で共有するプライベートヘッダーファイル。
subversion/libsvn_fs/
バージョニング「ファイルシステム」API。
subversion/libsvn_repos/
`libsvn_fs' コアを中心に構築されたリポジトリ機能。
subversion/libsvn_delta/
ツリーデルタ、テキストデルタ、プロパティデルタの共通コード。
subversion/libsvn_wc/
ワーキングコピーの共通コード。
subversion/libsvn_ra/
リポジトリアクセスの共通コード。
subversion/libsvn_client/
クライアント操作の共通コード。
subversion/svn/
コマンドラインクライアント。
subversion/tests/
自動テストスイート。
Subversion プロジェクトは、アクティブな開発が共通のトランクで行われることを強く推奨しています。トランクに加えられた変更は、最も高い可視性を持ち、リリースされていないコードから期待できる最大の動作を得ることができます。ただし、これがすべての人にとって有益となるためには、当社のトランクは常に安定している必要があります。ビルドできる必要があります。動作する必要があります。リリース準備ができていないかもしれませんが、テストスイートの準備は確実に行う必要があります。
また、大規模な変更をいくつかの小さく、論理的なコミットに分割することを強く推奨します。各コミットは、前述の安定性の要件を満たすことが期待されます。
とはいえ、特に大規模な変更(新機能、大規模なコードの再編成など)にこれらのすべてのポリシーを適用することがほぼ不可能であることを理解しています。カスタムブランチを開発タスク専用に使用することを検討できるのは、そのような状況です。ブランチベースの開発をスムーズに進めるためのガイドラインを以下に示します。
ブランチベースの開発は、特に複雑なものではありません。トランク(または、作業のソースおよび宛先として最も適したブランチ)からブランチを作成し、そのブランチで作業を行います。Subversion のマージ追跡機能は、この方法で作業する際に必要な精神的なオーバーヘッドを大幅に軽減するのに役立ちました。そのため、この機能を十分に活用すること(Subversion 1.5 以降のクライアントを使用し、すべてのマージをブランチのルートとの間で行うこと)を強く推奨します。
ブランチのログメッセージに関するポリシーについては、「ログメッセージの書き方」のセクションを参照してください。
複数のコミットを伴う段階的な機能やバグ修正に取り組んでおり、中間段階の一部がトランクに適用するには十分に安定していない場合は、/branches に一時ブランチを作成してください。許可を得る必要はありません。自由に行ってください。一時ブランチで実験的なアイデアを試すのも問題ありません。また、上記のすべてのことは、部分的なコミッターだけでなく、完全なコミッターにも当てはまります。他のASFプロジェクトのコミッターにも当てはまりますが、作業しようとしている問題を開発者メーリングリスト(dev@)で相談してください。自己紹介と、取り組む予定の問題を説明してください。
ブランチが完了したら(トランクにマージするか、放棄した場合)、必ず削除することを忘れないでください。
実験的なブランチへのコミットアクセスを提供する際のポリシーについては、「部分的なコミットアクセスに関するセクション」も参照してください。
長期間存続すると予想されるブランチの場合は、ブランチのルートに次の名前のファイルを作成し、定期的に更新することをお勧めします。BRANCH-READMEこのようなファイルは、ブランチの以下の側面を記述するための素晴らしい中心的な場所を提供します。
ブランチの基本的な目的:修正するためのバグや実装する機能は何か。関連する課題番号は何か。どのようなリストディスカッションスレッドが存在するか。状況を説明するための設計ドキュメントは存在するか。
使用しているブランチ管理のスタイル:これは、定期的に親ブランチと同期し、最終的にその親ブランチに再統合される機能ブランチですか?近い将来、親ブランチにマージされる予定のないフォークですか?他のブランチとの関係はありますか?
ブランチで達成する必要のあるタスクは何ですか?それらのタスクは誰かが担当していますか?さらに設計に関するインプットが必要ですか?他の人はどのようにあなたを助けることができますか?
以下に、私たちが言っていることを示す BRANCH-README ファイルの例を示します。
This branch exists for the resolution of issue #8810, per the ideas documented in /trunk/notes/frobnobbing-feature.txt. It is a feature branch, receiving regular sync merges from /trunk, and expected to be reintegrated back thereto. TODO: * compose regression tests [DONE] * add frob identification logic [STARTED (fitz)] * add nobbing bits []
なぜこれほどまでにこだわるのか?それは、このプロジェクトがコミュニケーションとコラボレーションを理想としており、前者が強調される場合に後者が発生する可能性が高いことを理解しているからです。
ブランチをソースにマージするときは、必ずBRANCH-READMEファイルを削除してください。
パブリックか内部かに関わらず、すべての関数は、その関数が何をするかを説明するドキュメントコメントから始める必要があります。ドキュメントには、関数が受け取るすべてのパラメータ、可能なすべての戻り値、および(自明でない場合)関数がエラーを返す可能性のある条件を記述する必要があります。
内部ドキュメントの場合は、ドキュメント文字列でパラメータ名を大文字で記述してください。実際の宣言で大文字でなくても、人間の読者にとって目立つようにするためです。
パブリックまたは準パブリックAPI関数の場合、ドキュメント文字列は宣言されている.hファイルの関数の上に配置する必要があります。それ以外の場合は、.cファイルの関数定義の上に配置します。
構造体型の場合は、構造体自体だけでなく、構造体の個々のメンバーもドキュメント化してください。
実際のソースコードの場合は、各関数のチャンクを内部的にドキュメント化して、Subversionに詳しい人が実装されているアルゴリズムを理解できるようにしてください。明白なドキュメントや過度に冗長なドキュメントを含めないでください。コメントはコードの理解を助けるものであり、妨げるものであってはなりません。
例:
/*** How not to document. Don't do this. ***/
/* Make a foo object. */
static foo_t *
make_foo_object(arg1, arg2, apr_pool_t *pool)
{
/* Create a subpool. */
apr_pool_t *subpool = svn_pool_create(pool);
/* Allocate a foo object from the main pool */
foo_t *foo = apr_palloc(pool, sizeof(*foo));
...
}
代わりに、次のように適切なサイズのコードチャンクをドキュメント化します。
/* Transmit the segment (if its within the scope of our concern). */ SVN_ERR(maybe_crop_and_send_segment(segment, start_rev, end_rev, receiver, receiver_baton, subpool)); /* If we've set CURRENT_REV to SVN_INVALID_REVNUM, we're done (and didn't ever reach END_REV). */ if (! SVN_IS_VALID_REVNUM(current_rev)) break; /* If there's a gap in the history, we need to report as much (if the gap is within the scope of our concern). */ if (segment->range_start - current_rev < 1) { svn_location_segment_t *gap_segment; gap_segment = apr_pcalloc(subpool, sizeof(*gap_segment)); gap_segment->range_end = segment->range_start - 1; gap_segment->range_start = current_rev + 1; gap_segment->path = NULL; SVN_ERR(maybe_crop_and_send_segment(gap_segment, start_rev, end_rev, receiver, receiver_baton, subpool)); }
Subversionコードを読んで、ドキュメントが実際にはどのように見えるかの概要を把握してください。特に、doxygenの例については、 subversion/include/*.hを参照してください。
パブリックインターフェースドキュメントには、Doxygen形式を使用します。これは、パブリックヘッダーファイルに含まれるすべてのものを意味します。生成されたドキュメントは、最新および一部の以前のSubversionソース用にWebサイトで公開されています。
ソースをマークアップするために利用可能なdoxygenコマンドのごく一部のみを使用します。doxygenドキュメントを作成する際は、次の規則が適用されます。
@a
、型とマクロ名の前に@c
を付けてください。<tt>...</tt>
を使用し、タイプライターフォントで1つの単語のみを表示するには@p
を使用します。TRUE
、FALSE
、NULL
などの定数値は、すべて大文字にする必要があります。@defgroup
と@{...@}
を使用してそれらをグループ化します。コマンドの完全なリストについては、Doxygenマニュアルを参照してください。
最新のソースコードを入手するには、以下を実行します。
svn checkout https://svn.apache.org/repos/asf/subversion/trunk/ svn-trunk
そして、次の指示に従います。INSTALLファイル。(svnクライアントがない場合は、ソースtarballをダウンロードしてください。)
パッチが新しい機能を実装する場合、または大量のコードを変更する場合は、最初に開発者メーリングリスト(dev@)で話し合うことを忘れないでください。(#svn-devのIRCも、メーリングリストでの議論の代わりではなく、議論前の簡単なフィードバックには適切です。IRCで質問する場合は、全員が常にオンラインであるわけではないため(特に週末)、返信があるまでしばらくお待ちください。)これは、コミュニティが提案された機能や実装の詳細に関する懸念を表明し、改善を提案できるようにするためです。フィードバックは後で(コードが記述される前でさえ)提供されるよりも、できるだけ早く提供される方が、すべての関係者にとって常に優れています。
パッチについて質問がある場合は、IRCまたはdev@でお気軽にお尋ねください。
パッチをdev@subversion.apache.orgに送信し、件名の先頭を次のようにします。[PATCH]。これにより、パッチマネージャーがパッチをすぐに見つけることができます。たとえば、
Subject: [PATCH] fix for rev printing bug in svn status
パッチが特定の課題に対応する場合は、課題番号も記載してください。"[PATCH] 課題 #1729: ...". 特定の課題に関心のある開発者は、メールを読む必要があることを知ることができます。
パッチの送信には、1つの論理的な変更を含める必要があります。1つの送信でN個の無関係な変更を混在させないでください。代わりにN個の別々のメールを送信してください。
次のコマンドを使用してパッチを生成します。svn diff -x-pSubversionトランクのワーキングコピーの先頭から。差分を適用するファイルがリビジョン管理下でない場合は、次を使用することで同じ効果が得られます。diff -u.
パッチにログメッセージを含めてください。適切なログメッセージは、潜在的なレビュー担当者がパッチの変更を理解するのに役立ち、適用される可能性が高まります。ログメッセージはメールの本文、またはパッチ添付ファイルの先頭に記述できます(下記参照)。いずれの場合も、「ログメッセージの書き方」に記載されているガイドラインに従い、次のように三重の角括弧で囲む必要があります。
[[[ Fix issue #1729: Don't crash because of a missing file. * subversion/libsvn_ra_ansible/get_editor.c (frobnicate_file): Check that file exists before frobnicating. ]]]
(括弧は実際にはログメッセージの一部ではなく、ログメッセージを周囲のコンテキストから明確に区別する方法にすぎません。)
可能であれば、text/x-diff
、text/x-patch
、またはtext/plain
のMIMEタイプでパッチを添付ファイルとして送信してください。ほとんどのメールリーダーはインラインで表示でき、パッチを添付ファイルとして添付することで、メッセージからパッチを簡単に抽出できます。アーカイブまたは圧縮された形式(tar、gzip、zip、bzip2など)でパッチを送信しないでください。これにより、ユーザーがメールリーダーでパッチを直接レビューできなくなります。
これらのMIMEタイプのいずれかでパッチを添付できない場合、またはパッチが非常に短い場合は、メッセージの本文に直接含めてもかまいません。ただし、注意してください。一部のメールエディターは、長い行の途中に不要な改行を挿入して、インラインパッチを改ざんします。メールソフトウェアでこのような処理が行われる可能性があると思われる場合は、代わりに添付ファイルを使用してください。
パッチが新しい機能を実装する場合は、メールでその機能を完全に説明してください。パッチがバグを修正する場合は、バグの詳細を説明し、再現手順を示してください。これらのガイドラインの例外は、パッチが課題データベースの特定の課題に対応する場合です。その場合は、「ログメッセージの書き方」で説明されているように、ログメッセージで課題番号を参照するだけで済みます。
パッチは、適用される前に数回のフィードバックと変更を経ることが通常です。パッチがすぐに承認されなくても、落胆しないでください。それはあなたが失敗したという意味ではなく、すべてのコード送信を注視している多くの人がいることを意味するだけであり、少なくとも少し改善の余地がないパッチはまれです。パッチに対する人々の応答について話し合った後、適切な変更を加えて再送信し、次のラウンドのフィードバックを待って、コミッターが適用するまで、泡立てて、すすぎ、繰り返します。送信する前に、プロジェクトのコーディング規則を確認してパッチに適用することで、いくつかの反復を回避できます。
しばらくの間応答がなく、パッチが適用されているのを確認できない場合は、単に人々が非常に忙しいことを意味する場合があります。遠慮なく再投稿し、まだ応答を待っていることを指摘してください。パッチ管理は高度に並列化可能であり、コーディングだけでなく管理の分担も肩代わりする必要があると考えるとよいでしょう。すべてのパッチは、プロセスを管理してくれる誰かを必要としており、それを行うのに最も適した人は、元の提出者です。