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

[インデックス 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 関数に焦点を当てています。

  1. submit 関数の変更: submit 関数は、CLをコードベースに提出する際の主要なロジックを含んでいます。変更前は、CLがLGTMを受けていない場合、または tbr (To Be Reviewed) オプションが設定されていない場合に、提出を中止するエラー (hg_util.Abort) を発生させていました。 変更後、この条件に and not isAddca(cl) が追加されました。これは、CLが addca によって生成されたものであると isAddca 関数が判断した場合、LGTMの要件をスキップすることを意味します。

  2. 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' のいずれかが含まれていること。これは、addcagobot アカウントによって操作されていることを示唆しています。

これらの変更により、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言語の公式ドキュメント
  • Gerrit Code Reviewのドキュメント
  • Mercurial (hg) のドキュメント
  • コミットメッセージとコード差分
  • GoプロジェクトのGitHubリポジトリ
  • gobot に関する一般的な知識 (Goプロジェクトにおける自動化ボットの役割)