私は、APIを使ってReviewBoardに差分を投稿するのに苦労しています。私はサーバにログインして新しい投稿を作成することができましたが、diffファイルの内容を正しく投稿できませんでした。ReviewBoardにdiffを投稿するにはどうすればよいですか?
私はこの種のアプリケーションを書くことへの新たなんだけど、私の目標は、1つのステップのスクリプトを持つことです:SVNリポジトリを持つファイル(事前にコミット)、
- ReviewBoardへのレビュー要求と現在のファイルからdiffを投稿する
このスクリプトは、svn pre-commitフックの一部になる可能性があります。
私のpythonの試みは次のようになります。このコードで
import urllib.request
import urllib.parse
import os.path
... login to the reviewboard server with
urllib.request.HTTPBasicAuthHandler ...
diff_path = '/path/to/file'
diff_name = 'my.diff'
diff_path = os.path.join(diff_path, diff_name)
diff_val = open(diff_path,'r')
# load the diff into the http data POST request
diff_header = \
'-- SoMe BoUnDaRy \n' \
+ 'Content-Disposition: form-data; name=path; filename=' \
+ '"' + diff_name + '"\n\n' \
+ diff_val.read() + '\n' \
+ '-- SoMe BoUnDaRy --'
data ={'path': diff_header, 'basedir': '/path/to/file/in/rep'}
print(data['path'])
data = urllib.parse.urlencode(data)
data = data.encode('utf-8')
opener.open( \
'http://xxx.xxx.x.xxx/api/review-requests/26/diffs/', data)
私は具体的には、BAD REQUEST(400)のエラーを取得:(105) "は、一つ以上のフィールドがエラーを持っていました"。
ReviewBoard APIと話すことができるライブラリがいくつかあります。私は、事後レビューが存在することも承知しています。私はむしろ、他の開発者に別のPythonライブラリを配布する必要はなく、複数の場所からファイルを比較する際のポストレビューの柔軟性が低いように見えます。
以下の提案から、私はここでサーバーの応答を追加しました:私の推測では、何かが私のパスワードハンドラに起こっているということです一見
CREATING PASSWD MANAGER...
CREATING PASSWD MANAGER... done
CREATING PASSWD HANDLER...
CREATING PASSWD HANDLER... done
CREATING URL OPENER...
CREATING URL OPENER... done
LOADING DIFF...
send: b'POST /api/review-requests/26/diffs/ HTTP/1.1\r\nAccept-Encoding:
identity\r\nContent-Length: 723\r\nHost: xxx.xxx.x.xxx\r\nContent-Type:
application/x-www-form-urlencoded\r\nConnection: close\r\nUser-Agent:
[empty no username+password] Python-urllib/3.2\r\n\r\
npath=--+SoMe+BoUnDaRy+++%...[the rest of my post]
reply: 'HTTP/1.1 401 UNAUTHORIZED\r\n'
header: Date header: Server header: Content-Language header: Expires header:
Vary header: Cache-Control header: WWW-Authenticate header:
Content-Length header: Last-Modified header: Connection header:
Content-Type send: b'POST /api/review-requests/26/diffs/
HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 723\r\nHost:
xxx.xxx.x.xxx\r\nUser-Agent: Python-urllib/3.2\r\nConnection:
close\r\nContent-Type: application/x-www-form-urlencoded\r\nAuthorization:
Basic [with username+password]\r\n\r\npath=
--+SoMe+BoUnDaRy+++%0AContent-Disposition%...
reply: 'HTTP/1.1 400 BAD REQUEST\r\n'
header: Date header: Server header: Content-Language header: Expires header:
Vary header: Cache-Control header: Set-Cookie header: Content-Length header:
Last-Modified header: Connection header: Content-Type HTTPError thrown
を。私は何が起こっているのか分かりません。場合によっては、これが私の認証を生成する方法です。
manager_passwd = urllib.request.HTTPPasswordMgr()
manager_passwd.add_password(...)
handler_passwd = urllib.request.HTTPBasicAuthHandler(manager_passwd)
opener = urllib.request.build_opener(handler_passwd)
認証が動作しているようです。私は新しいレビュー投稿を作成してテストしました。つまり、認証が失敗したことをdiffに通知するのです。
posterは非常に良い選択だと思われますが、外部のライブラリです:[poster_doc](http://atlee.ca/software/poster/) – KlingonJoe
ここに類似の質問へのリンクがあります: [multipartposthandlerを使用してフォームを投稿するデータとpython](http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) – KlingonJoe
[httplibデバッグレベル]を設定します(http://stackoverflow.com/質問/ 789856 /)を1にして、ヘッダーが送信されていることを確認してください。問題が表示されない場合は、その情報を追加してくださいあなたの質問に。 –