2011-11-18 13 views
6

Starałem się opublikować diff w aplikacji ReviewBoard za pośrednictwem interfejsu API. Udało mi się zalogować na serwer i utworzyć nowy wpis, ale nie udało mi się poprawnie opublikować zawartości pliku diff.Jak przesłać wiadomość do tablicy recenzji za pośrednictwem interfejsu API?

Jestem nowy na pisanie tego rodzaju aplikacji, ale moim celem jest mieć skrypt jeden krok do:

  1. diff pliku (pre-commit) z repozytorium SVN,
  2. add prośba o sprawdzenie do tablicy recenzji i opublikowanie pliku różnic z bieżącego pliku,

Może być później, skrypt może być częścią svn przed zatwierdzeniem haka.

Mój pyton próba wygląda następująco:

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) 

Z tym kodem dostaję Bad Request (400) błąd, w szczególności: "jeden lub więcej pól miały błędy" (105).

Mam świadomość, że istnieje kilka bibliotek, które mogą rozmawiać z API ReviewBoard. Jestem również świadomy, że istnieje przegląd końcowy. Wolałbym nie przekazywać innym programistom innej biblioteki Pythona, a post-recenzji wydaje się mniej elastyczna, gdy porównuje się pliki z wielu lokalizacji.

z poniższej sugestii, mam dodać odpowiedź serwera tutaj:

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 

Na pierwszy rzut oka Domyślam się, że coś się dzieje z moim obsługi haseł. Nie jestem pewien, co się z tym dzieje. Na wszelki wypadek, w ten sposób generuję moje uwierzytelnienie:

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

Wydaje się, że uwierzytelnianie działa. Przetestowałem go, tworząc nowy wpis opinii. Tak więc, kiedy publikuję diff, uwierzytelnianie nie powiedzie się.

+0

plakat wydaje się być dobrym, bardzo dobrym wyborem, ale jest to biblioteka zewnętrzna: [poster_doc] (http://atlee.ca/software/poster/) – KlingonJoe

+0

tutaj jest link do podobnego pytania: [używanie wielostronicowego podajnika do publikowania formularza dane z pythonem] (http://stackoverflow.com/questions/680305/using-multipartposthandhand-to-post-form-data-with-python) – KlingonJoe

+0

Ustaw [poziom debugowania httplib] (http://stackoverflow.com/ pytania/789856 /) do 1, dzięki czemu możesz zobaczyć wysyłane nagłówki, a jeśli nie widzisz problemu, dodaj te informacje w twoim pytaniu. –

Odpowiedz

2

Przeglądarka ma już narzędzie Pythona do publikowania różnic z ich API, nazywa się to postreview.py. Można go znaleźć pod adresem:

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

pobrać i używać ich ReviewBoardServer do logowania i umieścić diff!

(Ponadto w swoim wniosku, uwierzytelnianie jest wymagane tak, ale również plików cookies. Dlatego trzeba 2 wnioski (jeden dla logowania i dostać cookie, drugi do wysyłania diff.))

+0

Dzięki, ReviewBoardServer to dobra sugestia. Nie muszę teraz wąchać całej tej recenzji. – KlingonJoe