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

[インデックス 12110] ファイルの概要

このコミットは、Go言語プロジェクトの初期のコードレビュープロセスで使用されていた lib/codereview/codereview.py スクリプトに対する変更です。このファイルは、Mercurial (Hg) リポジトリとGoogle Codeを連携させ、コード変更の提出(コミット)時に、その変更がGoogle Code上のどこでレビューされているかを示すURLをコミットメッセージに自動的に含める機能を提供していました。

コミット

commit d86213c3718c300bf1638ab15b0b361212fe68a8
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Tue Feb 21 16:10:48 2012 -0500

    codereview: add submit message support for newer clone URL and subrepos
    
    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5689063

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/d86213c3718c300bf1638ab15b0b361212fe68a8

元コミット内容

codereview: add submit message support for newer clone URL and subrepos

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5689063

変更の背景

Go言語プロジェクトは、その初期段階において、Google Codeをホスティングプラットフォームとして利用し、バージョン管理システムにはMercurial (Hg) を採用していました。コードレビュープロセスは、codereview.pyというPythonスクリプトを中心に行われていました。

このスクリプトの重要な機能の一つは、開発者がコード変更をコミットする際に、その変更がGoogle Code上のどのURLでレビューされているかを示すリンクを自動的にコミットメッセージに挿入することでした。しかし、Google CodeのMercurialリポジトリのクローンURLの形式にはいくつかのバリエーションが存在し、特に新しい形式や、Mercurialの「サブリポジトリ」機能を使用している場合のURL形式に対応できていませんでした。

このコミットは、codereview.pyがこれらの新しいURL形式(例: code.google.com/p/projectname/code.google.com/p/projectname.subrepo/)を正しく認識し、対応するGoogle Codeの変更詳細ページへのリンクを正確に生成できるようにするために行われました。これにより、コミットメッセージの有用性が保たれ、コードレビューの追跡がスムーズに行われることが保証されました。

前提知識の解説

  • Google Code: Googleがかつて提供していたオープンソースプロジェクトホスティングサービスです。バージョン管理システムとしてSubversion、Git、Mercurial (Hg) をサポートしていました。Go言語プロジェクトは、Git/GitHubに移行する以前は、MercurialとGoogle Codeを使用してコードの管理とレビューを行っていました。Google Codeは2015年にサービスを終了しています。
  • Mercurial (Hg): Gitと同様の分散型バージョン管理システムです。リポジトリのクローンURLにはいくつかの形式があり、特にGoogle Codeではプロジェクト名を含む特定のパス構造を持っていました。
  • Mercurialのサブリポジトリ: Gitのサブモジュールに相当する機能で、一つのリポジトリ内に別のリポジトリを埋め込むことができます。これにより、関連する複数のプロジェクトをまとめて管理することが可能になります。Google Codeでは、code.google.com/p/mainproject.subrepo/ のようなURL形式でサブリポジトリが表現されることがありました。
  • Go言語のコードレビュープロセスとcodereview.py: Go言語プロジェクトは、初期には独自のコードレビューツールとプロセスを使用していました。codereview.py はその一部であり、Mercurialリポジトリから変更を抽出し、Google CodeのIssue Trackerと連携してコードレビューを管理し、最終的にコミットメッセージにレビューへのリンクを埋め込む役割を担っていました。
  • 正規表現 (Regular Expressions): テキストの中から特定のパターンを検索、置換、抽出するための強力なツールです。このコミットでは、MercurialリポジトリのクローンURLからプロジェクト名やサブリポジトリ名を正確に抽出するために使用されています。

技術的詳細

このコミットの核心は、codereview.pyスクリプト内のsubmit関数が、コミットメッセージに含める変更のURLを生成する際に、Google Codeの新しいURL形式とサブリポジトリのURL形式に対応できるように正規表現と条件分岐を拡張した点にあります。

変更前は、以下のシンプルな正規表現でURLを解析していました。 ^https?://([^@/]+@)?([^.]+)\\.googlecode\\.com/hg/? これは https://[user@]project.googlecode.com/hg/ のような形式を想定しており、m.group(2) でプロジェクト名 (project) を抽出していました。

変更後は、正規表現が大幅に拡張され、以下の2つの主要なパターンをOR (|) で結合しています。

  1. (^https?://([^@/]+@)?([^.]+)\\.googlecode\\.com/hg/?)

    • これは変更前のパターンとほぼ同じで、prj.googlecode.com/hg/ 形式に対応します。
    • m.group(1) がこのパターン全体にマッチし、m.group(3) がプロジェクト名 (prj) にマッチします。
  2. (^https?://([^@/]+@)?code\\.google\\.com/p/([^/.]+)(\\.[^./]+)?/?)

    • これは code.google.com/p/projectname/ または code.google.com/p/projectname.subrepo/ のような新しい形式に対応します。
    • m.group(4) がこのパターン全体にマッチします。
    • m.group(6) がプロジェクト名 (projectname) にマッチします。
    • m.group(7) がオプションのサブリポジトリ部分 (.subrepo) にマッチします。

この新しい正規表現のマッチ結果に基づいて、以下の条件分岐でchangeURLを生成します。

  • if m.group(1):
    • 最初のパターン (prj.googlecode.com/hg/) にマッチした場合。
    • changeURL = "http://code.google.com/p/%s/source/detail?r=%s" % (m.group(3), changeURL)
    • m.group(3) から抽出したプロジェクト名を使用します。
  • elif m.group(4) and m.group(7):
    • 2番目のパターン (code.google.com/p/projectname.subrepo/) にマッチし、かつサブリポジトリ部分 (.subrepo) が存在する場合。
    • changeURL = "http://code.google.com/p/%s/source/detail?r=%s&repo=%s" % (m.group(6), changeURL, m.group(7)[1:])
    • m.group(6) から抽出したプロジェクト名と、m.group(7) から抽出したサブリポジトリ名(先頭の.を除去)を使用して、サブリポジトリ固有のURLを生成します。
  • elif m.group(4):
    • 2番目のパターン (code.google.com/p/projectname/) にマッチしたが、サブリポジトリ部分が存在しない場合。
    • changeURL = "http://code.google.com/p/%s/source/detail?r=%s" % (m.group(6), changeURL)
    • m.group(6) から抽出したプロジェクト名を使用します。

この変更により、codereview.pyはGoogle Code上の様々なMercurialリポジトリのクローンURLから、正確な変更詳細ページへのリンクを生成できるようになり、コミットメッセージに適切な情報を含めることが可能になりました。

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

--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -1949,9 +1949,17 @@ def submit(ui, repo, *pats, **opts):\n 	# We're committed. Upload final patch, close review, add commit message.\n 	changeURL = hg_node.short(node)\n 	url = ui.expandpath("default")\n-	m = re.match("^https?://([^@/]+@)?([^.]+)\\.googlecode\\.com/hg/?", url)\n+	m = re.match("(^https?://([^@/]+@)?([^.]+)\\.googlecode\\.com/hg/?)" + "|" +\n+		"(^https?://([^@/]+@)?code\\.google\\.com/p/([^/.]+)(\\.[^./]+)?/?)", url)\n 	if m:\n-\t\tchangeURL = "http://code.google.com/p/%s/source/detail?r=%s" % (m.group(2), changeURL)\n+\t\tif m.group(1): # prj.googlecode.com/hg/ case\n+\t\t\tchangeURL = "http://code.google.com/p/%s/source/detail?r=%s" % (m.group(3), changeURL)\n+\t\telif m.group(4) and m.group(7): # code.google.com/p/prj.subrepo/ case\n+\t\t\tchangeURL = "http://code.google.com/p/%s/source/detail?r=%s&repo=%s" % (m.group(6), changeURL, m.group(7)[1:])\n+\t\telif m.group(4): # code.google.com/p/prj/ case\n+\t\t\tchangeURL = "http://code.google.com/p/%s/source/detail?r=%s" % (m.group(6), changeURL)\n+\t\telse:\n+\t\t\tprint >>sys.stderr, "URL: ", url\n 	else:\n 	\tprint >>sys.stderr, "URL: ", url\n 	pmsg = "*** Submitted as " + changeURL + " ***\\n\\n" + message\n```

## コアとなるコードの解説

変更は `lib/codereview/codereview.py` ファイルの `submit` 関数内に集中しています。

1.  **正規表現の拡張**:
    *   元の正規表現 `^https?://([^@/]+@)?([^.]+)\\.googlecode\\.com/hg/?` は、`project.googlecode.com/hg/` のような形式のみを対象としていました。
    *   変更後、正規表現は `re.match` の引数として渡される文字列が大幅に拡張されました。具体的には、`|` (OR) 演算子を使って、以下の2つのパターンを組み合わせることで、より多様なGoogle CodeのURL形式に対応しています。
        *   `(^https?://([^@/]+@)?([^.]+)\\.googlecode\\.com/hg/?)`: 従来の `project.googlecode.com/hg/` 形式。
        *   `(^https?://([^@/]+@)?code\\.google\\.com/p/([^/.]+)(\\.[^./]+)?/?)`: 新しい `code.google.com/p/projectname/` または `code.google.com/p/projectname.subrepo/` 形式。
    *   これにより、`m` オブジェクトが持つグループ (`m.group(N)`) の意味が変わり、より多くの情報を抽出できるようになりました。

2.  **条件分岐の追加とURL生成ロジックの変更**:
    *   正規表現のマッチ結果 `m` が存在する場合 (`if m:` のブロック内) の処理が変更されました。
    *   `if m.group(1):`
        *   これは、最初の正規表現パターン(`project.googlecode.com/hg/` 形式)にマッチした場合に実行されます。
        *   `m.group(3)` からプロジェクト名を抽出し、従来のURL形式で `changeURL` を生成します。
    *   `elif m.group(4) and m.group(7):`
        *   これは、2番目の正規表現パターン(`code.google.com/p/projectname.subrepo/` 形式)にマッチし、かつサブリポジトリ部分 (`.subrepo`) が存在する場合に実行されます。
        *   `m.group(6)` からプロジェクト名を、`m.group(7)` からサブリポジトリ名(先頭の`.`を除去)を抽出し、`&repo=` パラメータを含むURLを生成します。これにより、サブリポジトリ内の変更への正確なリンクが提供されます。
    *   `elif m.group(4):`
        *   これは、2番目の正規表現パターン(`code.google.com/p/projectname/` 形式)にマッチしたが、サブリポジトリ部分が存在しない場合に実行されます。
        *   `m.group(6)` からプロジェクト名を抽出し、標準的なURL形式で `changeURL` を生成します。
    *   `else:`
        *   どのパターンにもマッチしなかった場合、エラーメッセージを標準エラー出力に表示します。

これらの変更により、`codereview.py`はGoogle Code上のMercurialリポジトリの多様なURL構造に対応できるようになり、コミットメッセージに埋め込まれる変更へのリンクの正確性と堅牢性が向上しました。

## 関連リンク

*   Go言語のコードレビューシステム (Gerrit): [https://golang.org/cl/5689063](https://golang.org/cl/5689063) (このコミットがGoのGerritシステムに提出された際の変更リストへのリンク)

## 参考にした情報源リンク

*   Google Code (Wikipedia): [https://ja.wikipedia.org/wiki/Google_Code](https://ja.wikipedia.org/wiki/Google_Code)
*   Mercurial (Wikipedia): [https://ja.wikipedia.org/wiki/Mercurial](https://ja.wikipedia.org/wiki/Mercurial)
*   Mercurial Subrepositories: [https://www.mercurial-scm.org/wiki/Subrepository](https://www.mercurial-scm.org/wiki/Subrepository) (Mercurialのサブリポジトリに関する公式ドキュメント)
*   Python reモジュール (正規表現): [https://docs.python.org/ja/3/library/re.html](https://docs.python.org/ja/3/library/re.html)