[インデックス 18443] ファイルの概要
このコミットは、Go言語のコードレビューシステムの一部である lib/codereview/codereview.py
ファイルに対する変更です。このファイルは、Mercurial (hg) をベースとしたGoプロジェクトのコードレビュープロセスを管理するためのスクリプトであり、特に変更セット (CL: Change List) の提出 (submit) 処理に関わっています。
コミット
commit d0252b17ce16dfc9725a3945d9a1fa2fe3e507c2
Author: Russ Cox <rsc@golang.org>
Date: Mon Feb 10 14:40:19 2014 -0500
lib/codereview: allow addca CLs without LGTM
LGTM=gri
R=golang-codereviews, gri
CC=golang-codereviews
https://golang.org/cl/61610043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/d0252b17ce16dfc9725a3945d9a1fa2fe3e507c2
元コミット内容
lib/codereview: allow addca CLs without LGTM
このコミットは、「addca」によって生成された変更セット (CL) が、LGTM (Looks Good To Me) なしで提出されることを許可するように、コードレビューツールを変更します。
変更の背景
Goプロジェクトのコードベースでは、手動でのコード変更だけでなく、自動生成されたコードや、特定のツールによって管理される変更も存在します。addca
は、おそらくGoプロジェクト内部で使用される、特定の種類の変更を自動的に追加・コミットするためのツールであると推測されます。
通常のコードレビュープロセスでは、変更がコードベースにマージされる前に、少なくとも一人のレビュアーからのLGTM (Looks Good To Me) が必要です。これは、コードの品質、正確性、およびプロジェクトのガイドラインへの準拠を保証するための重要なステップです。
しかし、addca
のような自動化されたツールによって生成される変更は、人間によるレビューが不要、または不適切である場合があります。例えば、機械的に生成される定型的な変更、データファイルの更新、または特定の自動化されたプロセスによってのみ変更されるべきファイルなどが考えられます。このような変更に対してLGTMを強制することは、プロセスを不必要に遅延させ、オーバーヘッドを増やすことになります。
このコミットの背景には、addca
によって生成されるCLが、通常のコードレビュープロセスとは異なる性質を持つため、LGTMの要件を免除することで、開発ワークフローの効率化を図る目的があったと考えられます。
前提知識の解説
- Go言語のコードレビュープロセス: Goプロジェクトでは、Mercurial (hg) と Gerrit を組み合わせたコードレビューシステムが使用されていました(現在はGitとGerritが主流)。開発者は変更をCL (Change List) として提出し、レビュアーがそのCLをレビューし、問題がなければLGTM (Looks Good To Me) を与えます。LGTMが付与されたCLは、最終的にコードベースにマージされます。
- LGTM (Looks Good To Me): コードレビューにおいて、レビュアーが変更内容を承認し、マージしても良いと判断したことを示すシグナルです。通常、LGTMがないCLはマージされません。
- CL (Change List): コードレビューシステムにおける変更の単位。一連の関連するコード変更をまとめたものです。
codereview.py
: Goプロジェクトのコードレビュープロセスを支援するPythonスクリプト。CLの提出、レビュー、ステータス管理など、様々な機能を提供します。addca
: コミットのコードから推測される、Goプロジェクト内部で使用される自動化されたツール。A+C:
で始まるコミットディスクリプションとGenerated by addca.
という文字列、そしてレビュアーにgobot
が含まれることから、特定の自動化されたコミットを生成するボットまたはスクリプトであると考えられます。gobot
: Goプロジェクトに関連する自動化されたタスクを実行するボットアカウント。
技術的詳細
このコミットは、lib/codereview/codereview.py
ファイル内の submit
関数と、新しく追加された isAddca
関数に焦点を当てています。
-
submit
関数の変更:submit
関数は、CLをコードベースに提出する際の主要なロジックを含んでいます。変更前は、CLがLGTMを受けていない場合、またはtbr
(To Be Reviewed) オプションが設定されていない場合に、提出を中止するエラー (hg_util.Abort
) を発生させていました。 変更後、この条件にand not isAddca(cl)
が追加されました。これは、CLがaddca
によって生成されたものであるとisAddca
関数が判断した場合、LGTMの要件をスキップすることを意味します。 -
isAddca
関数の追加: この新しい関数は、与えられたCLがaddca
によって生成されたものであるかどうかを判定します。以下の3つの条件をすべて満たす場合にTrue
を返します。cl.desc.startswith('A+C:')
: CLのディスクリプション(説明文)が'A+C:'
で始まること。これはaddca
が生成するCLの命名規則の一部である可能性が高いです。'Generated by addca.' in cl.desc
: CLのディスクリプションに'Generated by addca.'
という文字列が含まれていること。これはaddca
が生成するCLに付与する特定の署名のようなものです。isGobot
: CLのレビュアー (cl.reviewer
) に'gobot'
、'gobot@swtch.com'
、または'gobot@golang.org'
のいずれかが含まれていること。これは、addca
がgobot
アカウントによって操作されていることを示唆しています。
これらの変更により、addca
によって自動生成された特定の種類のCLは、通常の人間によるLGTMプロセスを経ることなく、直接提出できるようになります。これにより、自動化されたワークフローの効率が向上します。
コアとなるコードの変更箇所
--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -1935,7 +1935,7 @@ def submit(ui, repo, *pats, **opts):
about = ""
- if not cl.lgtm and not opts.get('tbr'):
+ if not cl.lgtm and not opts.get('tbr') and not isAddca(cl):
raise hg_util.Abort("this CL has not been LGTM'ed")
if cl.lgtm:
about += "LGTM=" + JoinComma([CutDomain(who) for (who, line, approval) in cl.lgtm if approval]) + "\n"
@@ -2050,6 +2050,11 @@ def submit(ui, repo, *pats, **opts):
return err
return 0
+def isAddca(cl):
+ rev = cl.reviewer
+ isGobot = 'gobot' in rev or 'gobot@swtch.com' in rev or 'gobot@golang.org' in rev
+ return cl.desc.startswith('A+C:') and 'Generated by addca.' in cl.desc and isGobot
+
#######################################################################
# hg sync
コアとなるコードの解説
-
submit
関数内の変更:if not cl.lgtm and not opts.get('tbr') and not isAddca(cl):
この行は、CLが提出される際のLGTMチェックの条件を変更しています。not cl.lgtm
: CLがLGTMを受けていない。not opts.get('tbr')
:tbr
オプションが指定されていない(tbr
は「To Be Reviewed」の略で、レビューが必要なことを示すオプション)。not isAddca(cl)
: 新しく追加されたisAddca
関数がFalse
を返す、つまりCLがaddca
によって生成されたものではない。 これら3つの条件がすべて真の場合にのみ、"this CL has not been LGTM'ed"
というエラーが発生し、提出が中止されます。これにより、isAddca(cl)
がTrue
を返す(つまりaddca
によって生成されたCLである)場合は、LGTMやtbr
の要件が免除されることになります。
-
isAddca
関数の定義:def isAddca(cl): rev = cl.reviewer isGobot = 'gobot' in rev or 'gobot@swtch.com' in rev or 'gobot@golang.org' in rev return cl.desc.startswith('A+C:') and 'Generated by addca.' in cl.desc and isGobot
この関数は、CLオブジェクト
cl
を引数に取り、そのCLがaddca
によって生成されたものかどうかをブール値で返します。rev = cl.reviewer
: CLのレビュアー情報を取得します。isGobot = 'gobot' in rev or 'gobot@swtch.com' in rev or 'gobot@golang.org' in rev
: レビュアーリストにgobot
またはその関連メールアドレスが含まれているかをチェックします。return cl.desc.startswith('A+C:') and 'Generated by addca.' in cl.desc and isGobot
: 最終的な判定ロジックです。CLのディスクリプションが'A+C:'
で始まり、かつ'Generated by addca.'
という文字列を含み、かつレビュアーにgobot
が含まれている場合にTrue
を返します。
この変更は、Goプロジェクトの自動化されたワークフローと手動のコードレビュープロセスとの間のバランスを取るための具体的な実装例であり、特定の自動生成された変更に対しては、より柔軟な提出メカニズムを提供しています。
関連リンク
- Go言語のコードレビュープロセスに関する一般的な情報:
- Contributing to the Go project (Go公式ドキュメントの貢献ガイド)
- Gerrit Code Review (Gerritの公式サイト)
参考にした情報源リンク
- Go言語の公式ドキュメント
- Gerrit Code Reviewのドキュメント
- Mercurial (hg) のドキュメント
- コミットメッセージとコード差分
- GoプロジェクトのGitHubリポジトリ
gobot
に関する一般的な知識 (Goプロジェクトにおける自動化ボットの役割)