[インデックス 10450] ファイルの概要
このコミットは、Goプロジェクトのコードレビューシステムで使用されるMercurial拡張機能の重要な更新を元に戻し、再適用するものです。具体的には、Mercurialのバージョンチェックを更新し、古いバージョン(1.4)のサポートを終了し、Mercurial 1.9以降を必須とし、2.0を推奨するように変更しています。また、Mercurialの内部APIの変更に対応するためのコードの広範なリファクタリングと、コードレビューワークフローを強制するための新しいテストスクリプトの追加が含まれています。
コミット
commit ab957154b68e1fe996241447ba2eb9ab893ddbef
Author: Russ Cox <rsc@golang.org>
Date: Fri Nov 18 12:58:44 2011 -0500
codereview: undo last night's rollback
Update version check from 1.4 to 1.9. Suggest 2.0.
R=golang-dev, r, r
CC=golang-dev
https://golang.org/cl/5413046
---
doc/install.html | 2 +-\n lib/codereview/codereview.py | 1145 +++++++++++++++++++++++-------------------\n lib/codereview/test.sh | 198 ++++++++\n 3 files changed, 826 insertions(+), 519 deletions(-)
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/ab957154b68e1fe996241447ba2eb9ab893ddbef
元コミット内容
codereview: undo last night's rollback
Update version check from 1.4 to 1.9. Suggest 2.0.
R=golang-dev, r, r
CC=golang-dev
https://golang.org/cl/5413046
変更の背景
このコミットの背景には、Goプロジェクトが当時使用していたコードレビューシステム(Rietveldベース)とバージョン管理システム(Mercurial)の進化があります。コミットメッセージにある「undo last night's rollback」という記述は、前夜に行われた変更(おそらくMercurialの新しいバージョンへの対応)が何らかの理由で元に戻されたが、このコミットでその変更を再適用または修正して導入していることを示唆しています。
主な目的は、Mercurialのバージョン要件を更新することです。以前はMercurial 1.4以降を必要としていましたが、このコミットでは1.9以降を必須とし、2.0を推奨しています。これは、Mercurialの新しいバージョンで導入されたAPIの変更に対応し、コードレビューツールがこれらの新しいAPIを適切に利用できるようにするためです。古いMercurialバージョンとの互換性を維持するコストを削減し、より新しい機能や改善を活用することが狙いです。
また、lib/codereview/codereview.py
ファイル内の広範な変更は、Mercurialの内部APIの変更(特にscmutil
パッケージの移動やcommands
モジュールの利用方法)に適応するためのものです。これにより、コードレビュー拡張機能が将来のMercurialバージョンでも安定して動作することが期待されます。
新しいテストスクリプトlib/codereview/test.sh
の追加は、これらの変更が正しく機能し、コードレビューワークフローが意図した通りに動作することを検証するためのものです。特に、hg commit
のような直接的なMercurialコマンドの使用を制限し、コードレビューシステムを介したコミット(hg submit
など)を強制する動作がテストされています。
前提知識の解説
- Mercurial (Hg): 分散型バージョン管理システム(DVCS)の一つで、Gitと同様にコードの変更履歴を管理します。Goプロジェクトは初期にMercurialを使用していました。
- Rietveld: Googleが開発したWebベースのコードレビューシステムです。MercurialやSubversionなどのバージョン管理システムと連携して動作し、パッチのアップロード、レビューコメントの追加、変更の承認などを行います。GoプロジェクトのコードレビューはRietveldをベースにしていました。
- Mercurial拡張機能: MercurialはPythonで書かれており、ユーザーはPythonスクリプトを記述することでMercurialの機能を拡張できます。このコミットで変更されている
codereview.py
は、Mercurialのコードレビュー拡張機能です。 easy_install
: Pythonのパッケージ管理ツールの一つで、Pythonパッケージのインストールを容易にします。pip
が登場する以前は広く使われていました。hg
コマンド: Mercurialのコマンドラインインターフェースです。例えば、hg commit
は変更をコミットするコマンド、hg pull
はリモートリポジトリから変更を取得するコマンドです。- Mercurialの内部API: MercurialはPythonで書かれているため、その内部機能はPythonモジュールとして公開されています。拡張機能はこれらの内部APIを呼び出して動作します。しかし、これらのAPIはMercurialのバージョンアップに伴って変更されることがあり、拡張機能側もそれに合わせて更新する必要があります。
scmutil
: Mercurialの内部モジュールの一つで、SCM(Source Code Management)ユーティリティ機能を提供します。HTMLParser
: Pythonの標準ライブラリに含まれるモジュールで、HTMLドキュメントを解析するためのクラスを提供します。json
モジュール: Pythonの標準ライブラリに含まれるモジュールで、JSONデータのエンコードとデコードを扱います。Python 2.6で標準化される前は、simplejson
という外部パッケージとして提供されていました。precommithook
: バージョン管理システムにおいて、コミットが実行される前に特定のスクリプトを実行するためのフック(hook)です。このコミットでは、Mercurialのprecommit
フックを利用して、直接的なhg commit
を無効化し、コードレビュー拡張機能を通じたコミットを強制しています。
技術的詳細
このコミットの技術的詳細は、主にlib/codereview/codereview.py
ファイル内のMercurial拡張機能のPythonコードの変更に集中しています。
-
Mercurialバージョン要件の更新:
- 以前のMercurial 1.3/1.4のバージョンチェックが削除され、Mercurial 1.9以降を必須とし、2.0を推奨する新しいチェックが導入されました。
- これにより、古いMercurialバージョンに起因する互換性の問題が解消され、より新しいMercurialの機能を利用できるようになります。
-
Mercurial内部APIの適応:
mercurial.cmdutil
からmercurial.scmutil
へのモジュールの移動に対応しています。Mercurial 1.9でcmdutil.match
とcmdutil.revpair
がscmutil
に移動したため、コードがその変更に適応しています。- Mercurialのコマンドを直接呼び出す代わりに、
mercurial.commands
モジュール(hg_commands
としてインポート)を介して呼び出すように変更されています。これにより、Mercurialの内部APIの変更に対する堅牢性が向上しています。例えば、commands.remove
はhg_commands.remove
に、commands.add
はhg_commands.add
に変更されています。 mercurial.util.Abort
の代わりにmercurial.util.hg_util.Abort
を使用するように変更されています。
-
json
モジュールのインポートの簡素化:- Python 2.6以降で
json
が標準ライブラリになったため、以前のtry-except
ブロック(simplejson
やdjango.utils.simplejson
を試す)が削除され、直接import json
する形に変更されました。これにより、コードが簡潔になり、Python 2.6以降の環境での依存関係が明確になります。
- Python 2.6以降で
-
コードレビューワークフローの強化:
precommithook
が導入され、Mercurialのprecommit
フックを利用して、直接hg commit
コマンドが実行されるのを防ぐようになりました。これにより、ユーザーはhg mail
、hg upload
、hg submit
といったコードレビュー拡張機能が提供するコマンドを使用することが強制されます。これは、Goプロジェクトのコードレビュープロセスを厳密に適用するための重要な変更です。repo.rollback
もnorollback
関数に置き換えられ、直接的なロールバック操作も制限されています。@clnumber
パターン(例:@123456
)をMercurialのファイルパターンとして解釈する機能が強化されました。これにより、特定のコードレビュー(CL)に関連するファイルを簡単に指定できるようになります。また、@default
という新しいパターンが追加され、既存のCLに属さない変更されたファイルを指定できるようになりました。
-
ステータス表示の改善:
- 長時間実行されるコマンドのステータスを表示するための
StatusThread
が導入されました。これにより、ユーザーはコマンドの進行状況をより明確に把握できるようになります。
- 長時間実行されるコマンドのステータスを表示するための
-
テストスクリプトの追加:
lib/codereview/test.sh
という新しいシェルスクリプトが追加されました。このスクリプトは、ローカルのRietveldサーバーと連携して、コードレビュー拡張機能の様々な機能をテストします。これには、CLの作成、パッチの適用、コミット、同期、そしてhg commit
などの制限されたコマンドの動作確認が含まれます。これは、変更の検証と将来の回帰テストのための重要な追加です。
-
doc/install.html
の更新:- Mercurialのインストール手順が
sudo easy_install mercurial
からsudo easy_install mercurial==2.0
に変更されました。これは、Mercurial 2.0を推奨バージョンとして明示するための変更です。
- Mercurialのインストール手順が
これらの変更は、GoプロジェクトのコードレビューシステムがMercurialの進化に対応し、より堅牢で管理しやすいものになることを目指しています。
コアとなるコードの変更箇所
このコミットのコアとなるコードの変更箇所は、主にlib/codereview/codereview.py
ファイルに集中しています。
-
Mercurialバージョンチェックの更新:
--- a/lib/codereview/codereview.py +++ b/lib/codereview/codereview.py @@ -110,14 +60,6 @@ # in Mercurial 1.9 the cmdutil.match and cmdutil.revpair moved to scmutil if hgversion >= '1.9': from mercurial import scmutil -else: - scmutil = cmdutil - -oldMessage = """ -The code review extension requires Mercurial 1.3 or newer. - -To install a new Mercurial, - - sudo easy_install mercurial - -works on most systems. -""" - -linuxMessage = """ -You may need to clear your current Mercurial installation by running: - - sudo apt-get remove mercurial mercurial-common - sudo rm -rf /etc/mercurial -""" - -if hgversion < '1.3': - msg = oldMessage - if os.access("/etc/mercurial", 0): - msg += linuxMessage - raise util.Abort(msg)
この部分では、古いMercurialバージョンチェック(1.3未満)が削除され、Mercurial 1.9以降を前提とするように変更されています。
-
Mercurialコマンドラッパーの導入とAPI呼び出しの変更:
lib/codereview/codereview.py
の後半に、hg_matchPattern
,hg_heads
,hg_incoming
,hg_log
,hg_outgoing
,hg_pull
,hg_push
,hg_commit
といった新しいヘルパー関数が追加されています。これらの関数は、Mercurialのcommands
モジュールをラップし、より安定したAPI呼び出しを提供します。例えば、
submit
コマンド内の変更:--- a/lib/codereview/codereview.py +++ b/lib/codereview/codereview.py @@ -1687,16 +1836,14 @@ def submit(ui, repo, *pats, **opts):\n if missing_codereview:\n return missing_codereview\n # We already called this on startup but sometimes Mercurial forgets.\n set_mercurial_encoding_to_utf8()\n \n - other = getremote(ui, repo, opts)\n - repo.ui.quiet = True\n - if not opts["no_incoming"] and incoming(repo, other):\n - return "local repository out of date; must sync before submit"\n + if not opts["no_incoming"] and hg_incoming(ui, repo):\n + need_sync()\n \n cl, err = CommandLineCL(ui, repo, pats, opts, defaultcc=defaultcc)\n if err != "":\n return err
incoming(repo, other)
の呼び出しがhg_incoming(ui, repo)
に置き換えられています。 -
precommithook
の導入:--- a/lib/codereview/codereview.py +++ b/lib/codereview/codereview.py @@ -2027,10 +2146,55 @@ cmdtable = {\n ),\n }\n +#######################################################################\n +# Mercurial extension initialization\n +\n +def norollback(*pats, **opts):\n +\t"""(disabled when using this extension)"""\n +\traise hg_util.Abort("codereview extension enabled; use undo instead of rollback")\n +\n +def reposetup(ui, repo):\n +\tglobal codereview_disabled\n +\tglobal defaultcc\n +\t\n +\trepo_config_path = ''\n +\t# Read repository-specific options from lib/codereview/codereview.cfg\n +\ttry:\n +\t\trepo_config_path = repo.root + '/lib/codereview/codereview.cfg'\n +\t\tf = open(repo_config_path)\n +\t\tfor line in f:\n +\t\t\tif line.startswith('defaultcc: '):\n +\t\t\t\tdefaultcc = SplitCommaSpace(line[10:])\n +\texcept:\n +\t\t# If there are no options, chances are good this is not\n +\t\t# a code review repository; stop now before we foul\n +\t\t# things up even worse. Might also be that repo doesn't\n +\t\t# even have a root. See issue 959.\n +\t\tif repo_config_path == '':\n +\t\t\tcodereview_disabled = 'codereview disabled: repository has no root'\n +\t\telse:\n +\t\t\tcodereview_disabled = 'codereview disabled: cannot open ' + repo_config_path\n +\t\treturn\n +\n +\tInstallMatch(ui, repo)\n +\tReadContributors(ui, repo)\n +\tRietveldSetup(ui, repo)\n +\n +\t# Disable the Mercurial commands that might change the repository.\n +\t# Only commands in this extension are supposed to do that.\n +\tui.setconfig("hooks", "precommit.codereview", precommithook)\n +\n +\t# Rollback removes an existing commit. Don't do that either.\n +\tglobal real_rollback\n +\treal_rollback = repo.rollback\n +\trepo.rollback = norollback\n +\t\n \n #######################################################################\n # Wrappers around upload.py for interacting with Rietveld
reposetup
関数内でui.setconfig("hooks", "precommit.codereview", precommithook)
が呼び出され、precommithook
がMercurialのprecommit
フックとして登録されています。 -
lib/codereview/test.sh
の新規追加: このファイル全体が新規追加されており、コードレビュー拡張機能の動作を検証するためのテストスイートとして機能します。
コアとなるコードの解説
-
Mercurialバージョンチェックの更新: 古いバージョンチェックの削除は、コードベースの複雑さを軽減し、Mercurialの新しいバージョンに特化した最適化や機能を利用できるようにするためのものです。Mercurial 1.9以降を必須とすることで、開発環境の統一と、より新しいMercurial APIへの依存を可能にしています。
-
Mercurialコマンドラッパーの導入とAPI呼び出しの変更:
hg_matchPattern
などの新しいヘルパー関数は、Mercurialの内部APIを直接呼び出すのではなく、mercurial.commands
モジュールを介して呼び出すための抽象化レイヤーを提供します。これは、Mercurialの内部APIがバージョン間で変更される可能性があるため、拡張機能の堅牢性を高めるための一般的なプラクティスです。これらのラッパーを使用することで、将来MercurialのAPIが変更された場合でも、ラッパー関数のみを更新すればよく、コードベース全体を変更する必要がなくなります。 -
precommithook
の導入:precommithook
は、Mercurialのprecommit
フックとして機能します。このフックは、ユーザーがhg commit
を実行しようとしたときに自動的に呼び出されます。precommithook
は、commit_okay
というグローバル変数がTrue
でない限り、コミットを中断し、ユーザーに「codereview extension enabled; use mail, upload, or submit instead of commit」というメッセージを表示します。これにより、Goプロジェクトのコードレビュープロセスに従って、変更がRietveldシステムを介してレビューおよび提出されることが強制されます。commit_okay
は、hg submit
のようなコードレビュー拡張機能のコマンドが内部的にコミットを実行する際に一時的にTrue
に設定されます。 -
lib/codereview/test.sh
の新規追加: このシェルスクリプトは、Mercurial拡張機能の動作を自動的にテストするためのものです。must()
関数とnot()
関数は、コマンドの成功/失敗をチェックするためのヘルパーです。- テストは、Mercurialリポジトリの初期設定、コードレビュー拡張機能の有効化、
CONTRIBUTORS
ファイルの追加、最初のコミットの実行など、一連のステップを実行します。 test_clpatch()
は、hg clpatch
コマンドを使用して、別のクライアントで作成されたCLを適用し、その後のhg submit
とhg sync
の動作を検証します。test_reviewer()
は、レビューアなしでのhg submit
が失敗することを確認します。test_linearity()
は、複数の変更が線形にコミットされるシナリオをテストします。test_restrict()
は、hg ci
(commit)、hg rollback
、hg backout
といった直接的なMercurialコマンドが、コードレビュー拡張機能が有効な場合に制限されることを確認します。
これらの変更は、Goプロジェクトのコードレビュープロセスをより厳密に強制し、Mercurialのバージョンアップに対応することで、開発ワークフローの安定性と効率性を向上させることを目的としています。
関連リンク
- Mercurial 公式サイト: https://www.mercurial-scm.org/
- Rietveld (Google Code Archive): https://code.google.com/archive/p/rietveld/ (Rietveldは現在アーカイブされていますが、当時の情報源として)
- Goプロジェクトのコードレビュープロセス (当時の情報): Goプロジェクトの初期のコードレビューに関するドキュメントや議論は、Goのメーリングリストや古いWikiページに存在した可能性があります。
参考にした情報源リンク
- Mercurialの公式ドキュメント(特にPython APIに関するセクション)
- Pythonの
json
モジュールとsimplejson
の歴史に関する情報 easy_install
に関する情報- GoプロジェクトのGitHubリポジトリのコミット履歴と関連するコードレビュー(CL)
- Mercurialの
scmutil
モジュールに関する情報