2011-11-18 35 views
6

Tôi đã đấu tranh để đăng một sự khác biệt lên ReviewBoard thông qua API của họ. Tôi đã quản lý để đăng nhập vào máy chủ và tạo một bài đăng mới, nhưng tôi đã không đăng chính xác nội dung của tệp khác.Làm thế nào để bạn đăng một khác biệt lên ReviewBoard thông qua API của nó?

Tôi mới để viết loại ứng dụng, nhưng mục tiêu của tôi là phải có một kịch bản một bước để:

  1. diff một tập tin (pre-cam) với kho svn,
  2. add yêu cầu đánh giá để Xem lại và đăng sự khác biệt từ tệp hiện tại,

Có thể sau này, tập lệnh có thể là một phần của móc trước svn.

nỗ lực python của tôi trông giống như:

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) 

Với mã này tôi nhận được một YÊU CẦU BAD (400) lỗi, cụ thể là: "Một hoặc nhiều lĩnh vực có lỗi" (105).

Tôi biết rằng có một số thư viện ở đó có thể nói chuyện với API ReviewBoard. Tôi cũng biết rằng bài đánh giá sau tồn tại. Tôi không muốn phải phân phối cho các nhà phát triển khác một thư viện python và sau khi xem xét có vẻ ít linh hoạt khi các tập tin diffing từ nhiều địa điểm.

Từ gợi ý dưới đây, tôi đã thêm các phản ứng máy chủ ở đây:

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 

Thoạt nhìn tôi đoán là một cái gì đó đang xảy ra để xử lý mật khẩu của tôi. Tôi không chắc điều gì đang xảy ra với nó. Chỉ trong trường hợp, đây là cách tôi tạo xác thực của mình:

manager_passwd = urllib.request.HTTPPasswordMgr() 
manager_passwd.add_password(...) 
handler_passwd = urllib.request.HTTPBasicAuthHandler(manager_passwd) 
opener = urllib.request.build_opener(handler_passwd) 

Xác thực có vẻ hoạt động. Tôi đã thử nghiệm nó bằng cách tạo một bài đánh giá mới. Vì vậy, đó là khi tôi đăng các diff rằng xác thực không thành công.

+0

poster có vẻ giống như một sự lựa chọn tốt, nhưng nó là một lib bên ngoài: [poster_doc] (http://atlee.ca/software/poster/) – KlingonJoe

+0

đây là một liên kết đến một câu hỏi tương tự: [using multipartposthandler to post form dữ liệu với python] (http://stackoverflow.com/questions/680305/using-multipartposthandler-to-post-form-data-with-python) – KlingonJoe

+0

Đặt [mức gỡ rối httplib] (http://stackoverflow.com/ câu hỏi/789856 /) đến 1 để bạn có thể xem tiêu đề được gửi và nếu bạn không thấy vấn đề thì hãy thêm thông tin đó trong câu hỏi của bạn. –

Trả lời

2

Đánh giá đã là công cụ python để đăng khác biệt với API của họ, nó được gọi là postreview.py. Bạn có thể tìm thấy nó tại địa chỉ:

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

Grab và sử dụng ReviewBoardServer của họ để đăng nhập và viết diff!

(Ngoài ra, trong yêu cầu của bạn, yêu cầu xác thực có, nhưng cũng là tệp cookie. Đó là lý do tại sao bạn cần 2 yêu cầu (một để đăng nhập và nhận cookie, một yêu cầu khác để gửi khác biệt.))

+0

Cảm ơn, ReviewBoardServer là một gợi ý tốt. Tôi không phải ngửi qua tất cả các bài đánh giá sau. – KlingonJoe

Các vấn đề liên quan