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

[インデックス 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コードの変更に集中しています。

  1. Mercurialバージョン要件の更新:

    • 以前のMercurial 1.3/1.4のバージョンチェックが削除され、Mercurial 1.9以降を必須とし、2.0を推奨する新しいチェックが導入されました。
    • これにより、古いMercurialバージョンに起因する互換性の問題が解消され、より新しいMercurialの機能を利用できるようになります。
  2. Mercurial内部APIの適応:

    • mercurial.cmdutilからmercurial.scmutilへのモジュールの移動に対応しています。Mercurial 1.9でcmdutil.matchcmdutil.revpairscmutilに移動したため、コードがその変更に適応しています。
    • Mercurialのコマンドを直接呼び出す代わりに、mercurial.commandsモジュール(hg_commandsとしてインポート)を介して呼び出すように変更されています。これにより、Mercurialの内部APIの変更に対する堅牢性が向上しています。例えば、commands.removehg_commands.removeに、commands.addhg_commands.addに変更されています。
    • mercurial.util.Abortの代わりにmercurial.util.hg_util.Abortを使用するように変更されています。
  3. jsonモジュールのインポートの簡素化:

    • Python 2.6以降でjsonが標準ライブラリになったため、以前のtry-exceptブロック(simplejsondjango.utils.simplejsonを試す)が削除され、直接import jsonする形に変更されました。これにより、コードが簡潔になり、Python 2.6以降の環境での依存関係が明確になります。
  4. コードレビューワークフローの強化:

    • precommithookが導入され、Mercurialのprecommitフックを利用して、直接hg commitコマンドが実行されるのを防ぐようになりました。これにより、ユーザーはhg mailhg uploadhg submitといったコードレビュー拡張機能が提供するコマンドを使用することが強制されます。これは、Goプロジェクトのコードレビュープロセスを厳密に適用するための重要な変更です。
    • repo.rollbacknorollback関数に置き換えられ、直接的なロールバック操作も制限されています。
    • @clnumberパターン(例: @123456)をMercurialのファイルパターンとして解釈する機能が強化されました。これにより、特定のコードレビュー(CL)に関連するファイルを簡単に指定できるようになります。また、@defaultという新しいパターンが追加され、既存のCLに属さない変更されたファイルを指定できるようになりました。
  5. ステータス表示の改善:

    • 長時間実行されるコマンドのステータスを表示するためのStatusThreadが導入されました。これにより、ユーザーはコマンドの進行状況をより明確に把握できるようになります。
  6. テストスクリプトの追加:

    • lib/codereview/test.shという新しいシェルスクリプトが追加されました。このスクリプトは、ローカルのRietveldサーバーと連携して、コードレビュー拡張機能の様々な機能をテストします。これには、CLの作成、パッチの適用、コミット、同期、そしてhg commitなどの制限されたコマンドの動作確認が含まれます。これは、変更の検証と将来の回帰テストのための重要な追加です。
  7. doc/install.htmlの更新:

    • Mercurialのインストール手順がsudo easy_install mercurialからsudo easy_install mercurial==2.0に変更されました。これは、Mercurial 2.0を推奨バージョンとして明示するための変更です。

これらの変更は、GoプロジェクトのコードレビューシステムがMercurialの進化に対応し、より堅牢で管理しやすいものになることを目指しています。

コアとなるコードの変更箇所

このコミットのコアとなるコードの変更箇所は、主にlib/codereview/codereview.pyファイルに集中しています。

  1. 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以降を前提とするように変更されています。

  2. 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)に置き換えられています。

  3. 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フックとして登録されています。

  4. lib/codereview/test.shの新規追加: このファイル全体が新規追加されており、コードレビュー拡張機能の動作を検証するためのテストスイートとして機能します。

コアとなるコードの解説

  1. Mercurialバージョンチェックの更新: 古いバージョンチェックの削除は、コードベースの複雑さを軽減し、Mercurialの新しいバージョンに特化した最適化や機能を利用できるようにするためのものです。Mercurial 1.9以降を必須とすることで、開発環境の統一と、より新しいMercurial APIへの依存を可能にしています。

  2. Mercurialコマンドラッパーの導入とAPI呼び出しの変更: hg_matchPatternなどの新しいヘルパー関数は、Mercurialの内部APIを直接呼び出すのではなく、mercurial.commandsモジュールを介して呼び出すための抽象化レイヤーを提供します。これは、Mercurialの内部APIがバージョン間で変更される可能性があるため、拡張機能の堅牢性を高めるための一般的なプラクティスです。これらのラッパーを使用することで、将来MercurialのAPIが変更された場合でも、ラッパー関数のみを更新すればよく、コードベース全体を変更する必要がなくなります。

  3. 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に設定されます。

  4. lib/codereview/test.shの新規追加: このシェルスクリプトは、Mercurial拡張機能の動作を自動的にテストするためのものです。

    • must()関数とnot()関数は、コマンドの成功/失敗をチェックするためのヘルパーです。
    • テストは、Mercurialリポジトリの初期設定、コードレビュー拡張機能の有効化、CONTRIBUTORSファイルの追加、最初のコミットの実行など、一連のステップを実行します。
    • test_clpatch()は、hg clpatchコマンドを使用して、別のクライアントで作成されたCLを適用し、その後のhg submithg syncの動作を検証します。
    • test_reviewer()は、レビューアなしでのhg submitが失敗することを確認します。
    • test_linearity()は、複数の変更が線形にコミットされるシナリオをテストします。
    • test_restrict()は、hg ci(commit)、hg rollbackhg 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モジュールに関する情報