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

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

このコミットは、Goプロジェクトのコードレビューツールであるcodereview.pyスクリプトにおけるエラーメッセージの改善を目的としています。具体的には、ユーザーがコミット権限を持っていない場合に表示されるエラーメッセージをより分かりやすくすることで、問題の特定と解決を支援します。

コミット

commit 4b2eb3f9f8638295acf1414d02489697c2d2cb6f
Author: Francesc Campoy <campoy@golang.org>
Date:   Wed May 22 16:27:39 2013 -0700

    codereview.py: improve error message when user is not a committer
    
    R=adg, bradfitz, r
    CC=golang-dev
    https://golang.org/cl/9626045

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

https://github.com/golang/go/commit/4b2eb3f9f8638295acf1414d02489697c2d2cb6f

元コミット内容

 lib/codereview/codereview.py | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/lib/codereview/codereview.py b/lib/codereview/codereview.py
index f839263c55..f8edbcde00 100644
--- a/lib/codereview/codereview.py
+++ b/lib/codereview/codereview.py
@@ -1960,6 +1960,9 @@ def submit(ui, repo, *pats, **opts):\n 			# Remote repository had changes we missed.\n 			need_sync()\n 		raise\n+	except urllib2.HTTPError, e:\n+\t\tprint >>sys.stderr, "pushing to remote server failed; do you have commit permissions?"\n+\t\traise\n except:\n 	real_rollback()\n 	raise

変更の背景

Goプロジェクトでは、コードレビューにGerritというシステムを使用しています。開発者が変更を提案し、レビューを経て最終的にリポジトリにマージする際、git-codereviewツールの一部であるcodereview.pyスクリプトが利用されます。このスクリプトのsubmitコマンドは、ローカルのGitリポジトリとGerritコードレビューシステム間のやり取りを仲介します。

以前は、ユーザーがコミット権限(Gerrit上での変更をマージする権限)を持たずに変更をプッシュしようとした場合、一般的なHTTPエラーが発生し、そのエラーメッセージだけでは問題の原因が特定しにくいという課題がありました。このコミットは、このような状況でより具体的で役立つエラーメッセージを提供することで、ユーザーが自身の権限不足を迅速に理解し、適切な対応を取れるようにすることを目的としています。

前提知識の解説

  • Gerrit: Gerritは、GitリポジトリのためのWebベースのコードレビューおよびプロジェクト管理ツールです。変更がメインのコードベースにマージされる前に、チームメンバーが変更をレビューし、承認することを可能にします。Goプロジェクトでは、Gerritがコードレビューワークフローの中心的な役割を担っています。
  • codereview.py / git-codereview: これはGoプロジェクトで利用されるコマンドラインツールで、ローカルのGitリポジトリとGerritサーバー間の連携を容易にします。開発者はこのツールを使って、変更のアップロード、レビューの開始、そして承認された変更の提出(コミット)を行います。
  • コミット権限: Gerritでは、ユーザーに対して様々な権限が細かく設定されています。コミット権限とは、具体的にはGerritサーバーに対して変更をプッシュし、リポジトリにマージする権限を指します。この権限は、プロジェクトの管理者によって特定のユーザーやグループに付与されます。権限がないユーザーがコミット操作を行おうとすると、GerritサーバーはHTTPエラーを返します。
  • urllib2.HTTPError: Pythonのurllib2モジュールは、URLを開くための機能を提供します。Webリクエスト中にHTTPエラー(例: 403 Forbidden, 401 Unauthorizedなど)が発生した場合、urllib2.HTTPError例外が送出されます。この例外は、HTTPステータスコードや関連する情報を含んでいます。

技術的詳細

この変更は、codereview.pyスクリプト内のsubmit関数に焦点を当てています。submit関数は、開発者がコードレビューを完了し、変更をリポジトリに提出しようとしたときに呼び出されます。このプロセス中、スクリプトはGerritサーバーに対してHTTPリクエストを送信し、変更をプッシュしようとします。

変更前は、GerritサーバーからのHTTPエラー(特に権限関連のエラー)が発生した場合、一般的なexceptブロックで捕捉され、詳細な情報が提供されませんでした。このコミットでは、urllib2.HTTPErrorという特定の例外を明示的に捕捉する新しいexceptブロックが追加されています。

この新しいexceptブロック内で、標準エラー出力(sys.stderr)に対して「pushing to remote server failed; do you have commit permissions?」(リモートサーバーへのプッシュに失敗しました。コミット権限がありますか?)というメッセージが出力されます。これにより、ユーザーはHTTPエラーが単なるネットワークの問題ではなく、自身のコミット権限に関連するものである可能性が高いことを即座に理解できます。メッセージの出力後、元の例外は再度raiseされ、プログラムの通常の例外処理フローが維持されます。

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

lib/codereview/codereview.pyファイルのsubmit関数内に、以下の3行が追加されています。

+	except urllib2.HTTPError, e:
+		print >>sys.stderr, "pushing to remote server failed; do you have commit permissions?"
+		raise

このコードは、既存のtry...exceptブロックの直後、かつ一般的なexceptブロックの前に挿入されています。

コアとなるコードの解説

  1. except urllib2.HTTPError, e::
    • これはPythonの例外処理構文です。urllib2.HTTPErrorという特定の例外が発生した場合に、このブロック内のコードが実行されます。
    • eは、捕捉された例外オブジェクトを指す変数です。このコミットではe自体は直接使用されていませんが、例外の詳細情報(HTTPステータスコードなど)にアクセスするために利用できます。
  2. print >>sys.stderr, "pushing to remote server failed; do you have commit permissions?":
    • この行は、指定されたエラーメッセージを標準エラー出力(通常はコンソール)に表示します。
    • sys.stderrを使用することで、通常のプログラム出力とは別にエラーメッセージを出力し、ユーザーがエラーを認識しやすくします。
    • メッセージの内容は、プッシュ操作が失敗したことと、その原因がコミット権限にある可能性を示唆しています。
  3. raise:
    • このキーワードは、捕捉した例外を再送出します。
    • これにより、このexceptブロックでメッセージを出力した後も、上位の例外ハンドラやプログラムのデフォルトの例外処理メカニズムが引き続き機能し、エラーが適切に伝播されます。これは、単にメッセージを表示して処理を続行するのではなく、エラー状態を維持するために重要です。

この変更により、submit操作中にurllib2.HTTPErrorが発生した場合、より具体的なエラーメッセージがユーザーに提示され、デバッグや問題解決の効率が向上します。

関連リンク

参考にした情報源リンク