2011-11-18 39 views
6

私は、APIを使ってReviewBoardに差分を投稿するのに苦労しています。私はサーバにログインして新しい投稿を作成することができましたが、diffファイルの内容を正しく投稿できませんでした。ReviewBoardにdiffを投稿するにはどうすればよいですか?

私はこの種のアプリケーションを書くことへの新たなんだけど、私の目標は、1つのステップのスクリプトを持つことです:SVNリポジトリを持つファイル(事前にコミット)、

  • アドオンデフ

    1. 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に通知するのです。

  • +0

    posterは非常に良い選択だと思われますが、外部のライブラリです:[poster_doc](http://atlee.ca/software/poster/) – KlingonJoe

    +0

    ここに類似の質問へのリンクがあります: [multipartposthandlerを使用してフォームを投稿するデータとpython](http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) – KlingonJoe

    +0

    [httplibデバッグレベル]を設定します(http://stackoverflow.com/質問/ 789856 /)を1にして、ヘッダーが送信されていることを確認してください。問題が表示されない場合は、その情報を追加してくださいあなたの質問に。 –

    答えて

    2

    Reviewboardには、すでにAPIを使って差分を投稿するためのpythonツールがあります。これはpostreview.pyと呼ばれています。あなたはでそれを見つけることができます。

    http://reviewboard.googlecode.com/svn/trunk/wxpostreview/postreview.py

    グラブやログインのための彼らのReviewBoardServerを使用して差分を投稿します!

    (また、あなたの要求に、真偽がyes必要とするだけでなく、クッキーファイルされています。あなたが2つのリクエスト(ログインのための1つを必要とクッキー、差分を送信するための別のものを得る理由です。))

    +0

    ThanksBoardServerは良い提案です。私は今、すべてのポストレビューを嗅ぐ必要はありません。 – KlingonJoe

    関連する問題