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

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

このコミットは、Go言語のコードレビューシステムで使用されるcodereview.pyスクリプトにおいて、リリースブランチの検出ロジックを更新するものです。具体的には、Go 1.0のリリースに伴い、リリースブランチの命名規則がrelease-branch.rXXXからrelease-branch.goXXXへと変更されたことに対応するための修正です。これにより、システムが新しい命名規則のリリースブランチを正しく認識し、将来的な問題(特にtags.sortに関連する問題)を回避できるようになります。

コミット

Go言語のコードレビューツールであるRietveldのヘルパースクリプトcodereview.pyが、新しいリリースブランチの命名規則(release-branch.goXXX)を認識するように更新されました。以前のrelease-branch.rXXXという命名規則からGo 1.0リリース後の新しい規則への移行に対応し、リリースブランチの検出ロジックを修正しています。これにより、将来的にリリースブランチのソート順序に関する潜在的な問題を回避します。

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

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

元コミット内容

commit d2e70054c9c530214d9945fabbb82b2a7433644d
Author: Russ Cox <rsc@golang.org>
Date:   Wed Apr 25 13:44:30 2012 -0700

    codereview: look for new release branches
    
    R=adg
    CC=golang-dev
    https://golang.org/cl/6127048
---
 lib/codereview/codereview.py | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/lib/codereview/codereview.py b/lib/codereview/codereview.py
index 5ae31f34e4..b72cd86b07 100644
--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -2610,15 +2610,14 @@ def RietveldSetup(ui, repo):\n 	
 	global releaseBranch
 	tags = repo.branchtags().keys()
-\tif 'release-branch.r100' in tags:\n+\tif 'release-branch.go10' in tags:\n \t\t# NOTE(rsc): This tags.sort is going to get the wrong\n-\t\t# answer when comparing release-branch.r99 with\n-\t\t# release-branch.r100.  If we do ten releases a year\n-\t\t# that gives us 4 years before we have to worry about this.\n-\t\traise hg_util.Abort('tags.sort needs to be fixed for release-branch.r100')\n+\t\t# answer when comparing release-branch.go9 with\n+\t\t# release-branch.go10.  It will be a while before we care.\n+\t\traise hg_util.Abort('tags.sort needs to be fixed for release-branch.go10')\n \ttags.sort()\n \tfor t in tags:\n-\t\tif t.startswith('release-branch.'):\n+\t\tif t.startswith('release-branch.go'):\n \t\t\treleaseBranch = t			
 \n #######################################################################

変更の背景

この変更は、Go言語のバージョン管理とリリースプロセスにおける重要な転換期に発生しました。2012年3月にGo 1.0がリリースされ、これはGo言語にとって最初の安定版リリースであり、将来のGo 1.xバージョンとの後方互換性を保証するというコミットメントが確立されました。

これ以前は、リリースブランチの命名規則がrelease-branch.rXXXのような形式であったと考えられます(例: release-branch.r100)。しかし、Go 1.0のリリースを機に、より明確でバージョン番号に即したrelease-branch.goXXXという新しい命名規則(例: release-branch.go10)が導入されました。

codereview.pyは、GoプロジェクトのコードレビューシステムであるRietveldと連携して動作するスクリプトであり、リリースブランチを正しく識別する必要がありました。古い命名規則のままでは、新しいリリースブランチを認識できず、特にtags.sort()関数がリリースブランチのソート順序を誤って解釈する可能性がありました。このコミットは、この命名規則の変更に対応し、システムが新しいリリースブランチを正確に処理できるようにするために行われました。

前提知識の解説

  • codereview.py: Go言語プロジェクトでかつて使用されていたコードレビューシステムRietveldのヘルパースクリプトです。Mercurialリポジトリと連携し、コードレビューのワークフローをサポートしていました。RietveldはGoogleが開発したPythonベースのコードレビューツールで、SubversionやMercurialなどのバージョン管理システムと統合されていました。
  • Rietveld: Googleが開発したオープンソースのコードレビューツールです。Pythonで書かれており、Webインターフェースを通じてコードの変更点をレビューし、コメントを付けたり、承認したりする機能を提供していました。Goプロジェクトでは初期の頃にRietveldがコードレビューに利用されていました。
  • Goリリースブランチ: Go言語の開発では、安定版リリースごとに特定のブランチが作成されます。これらのブランチは、そのバージョンのバグ修正やメンテナンスのために使用されます。命名規則は時間の経過とともに進化しており、このコミットの時点ではrelease-branch.rXXXからrelease-branch.goXXXへの移行期でした。
  • tags.sort()とソート順序の問題: バージョン管理システムでは、タグ(リリースブランチもタグとして扱われることがある)をソートする際に、文字列としてのソートが行われることがあります。例えば、release-branch.r99release-branch.r100を文字列としてソートすると、r100r99の前に来てしまうなど、数値としての期待される順序と異なる結果になることがあります。このコミットメッセージのコメントでは、この潜在的な問題が指摘されており、新しい命名規則でも同様の問題が発生する可能性が示唆されていますが、当面は問題にならないと判断されています。

技術的詳細

このコミットは、lib/codereview/codereview.pyファイル内のRietveldSetup関数におけるリリースブランチの検出ロジックを変更しています。

変更点は以下の2点です。

  1. 特定のリリースブランチ名のチェック:

    • 変更前: if 'release-branch.r100' in tags:
    • 変更後: if 'release-branch.go10' in tags: この変更は、Go 1.0リリースに伴う命名規則の変更を直接反映しています。以前はr100という特定のブランチ名をチェックしていましたが、Go 1.0のリリースブランチがgo10という形式になることを想定して修正されました。これに関連するコメントも更新され、release-branch.go9release-branch.go10のソート順序に関する潜在的な問題が指摘されていますが、当面は懸念事項ではないとされています。
  2. リリースブランチのプレフィックスチェック:

    • 変更前: if t.startswith('release-branch.'):
    • 変更後: if t.startswith('release-branch.go'): これは、tagsリストをイテレートしてリリースブランチを特定する際の一般的なプレフィックスチェックをより厳密にしています。以前はrelease-branch.で始まるすべてのタグをリリースブランチと見なしていましたが、新しい命名規則ではrelease-branch.goで始まるもののみを対象とすることで、誤ったブランチの検出を防ぎ、将来の命名規則の変更にも対応しやすくなっています。

これらの変更により、codereview.pyはGo 1.0以降の新しいリリースブランチ命名規則に準拠し、コードレビューシステムがGoプロジェクトの最新のリリース戦略と同期して動作するようになります。

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

--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -2610,15 +2610,14 @@ def RietveldSetup(ui, repo):\n 	
 	global releaseBranch
 	tags = repo.branchtags().keys()
-\tif 'release-branch.r100' in tags:\n+\tif 'release-branch.go10' in tags:\n \t\t# NOTE(rsc): This tags.sort is going to get the wrong\n-\t\t# answer when comparing release-branch.r99 with\n-\t\t# release-branch.r100.  If we do ten releases a year\n-\t\t# that gives us 4 years before we have to worry about this.\n-\t\traise hg_util.Abort('tags.sort needs to be fixed for release-branch.r100')\n+\t\t# answer when comparing release-branch.go9 with\n+\t\t# release-branch.go10.  It will be a while before we care.\n+\t\traise hg_util.Abort('tags.sort needs to be fixed for release-branch.go10')\n \ttags.sort()\n \tfor t in tags:\n-\t\tif t.startswith('release-branch.'):\n+\t\tif t.startswith('release-branch.go'):\n \t\t\treleaseBranch = t			
 \n #######################################################################

コアとなるコードの解説

  • global releaseBranch: releaseBranch変数がグローバルスコープで定義されていることを示しています。この変数は、現在のリポジトリで検出されたリリースブランチの名前を保持するために使用されます。
  • tags = repo.branchtags().keys(): Mercurialリポジトリオブジェクトrepoから、すべてのブランチタグのキー(名前)を取得し、tags変数にリストとして格納しています。
  • - if 'release-branch.r100' in tags:: 変更前のコードでは、特定の古いリリースブランチ名release-branch.r100がタグリストに存在するかどうかをチェックしていました。これは、おそらく過去のリリースブランチの命名規則の例としてハードコードされていたものです。
  • + if 'release-branch.go10' in tags:: 変更後のコードでは、新しい命名規則の例であるrelease-branch.go10をチェックしています。これはGo 1.0リリースに対応するブランチ名を示唆しています。
  • コメントの変更:
    • 古いコメント: This tags.sort is going to get the wrong answer when comparing release-branch.r99 with release-branch.r100. If we do ten releases a year that gives us 4 years before we have to worry about this. raise hg_util.Abort('tags.sort needs to be fixed for release-branch.r100')
    • 新しいコメント: This tags.sort is going to get the wrong answer when comparing release-branch.go9 with release-branch.go10. It will be a while before we care. raise hg_util.Abort('tags.sort needs to be fixed for release-branch.go10') このコメントは、tags.sort()が文字列としてソートを行うため、r99r100(またはgo9go10)のような数値を含むタグ名が正しくソートされない可能性があるという既知の問題を指摘しています。しかし、この問題が実際に影響を及ぼすまでには時間があるため、当面は警告として残しつつ、新しい命名規則に合わせてメッセージを更新しています。hg_util.Abortは、この問題が顕在化した際にプログラムを中断するためのものです。
  • tags.sort(): 取得したタグのリストをソートしています。前述のコメントにあるように、このソートが文字列ベースで行われるため、数値の大小関係が正しく反映されない場合があります。
  • - if t.startswith('release-branch.'):: 変更前のループでは、release-branch.で始まるすべてのタグをリリースブランチとして識別していました。これは一般的なプレフィックスですが、将来的にrelease-branch.experimentalのような非リリースブランチが追加された場合に誤って検出される可能性があります。
  • + if t.startswith('release-branch.go'):: 変更後のループでは、release-branch.goで始まるタグのみをリリースブランチとして識別するように変更されました。これにより、Go言語の公式リリースブランチのみを対象とすることが明確になり、より堅牢な検出ロジックになっています。
  • releaseBranch = t: 検出されたリリースブランチの名前をreleaseBranch変数に代入しています。

関連リンク

参考にした情報源リンク