Как опубликовать diff в ReviewBoard через его API? - PullRequest
6 голосов
/ 19 ноября 2011

Я изо всех сил пытался опубликовать diff в ReviewBoard через их API.Мне удалось войти на сервер и создать новое сообщение, но мне не удалось правильно опубликовать содержимое файла diff.

Я новичок в написании такого рода приложений, но моя цельдолжен иметь одношаговый скрипт для:

  1. diff файла (pre-commit) с репозиторием svn,
  2. добавления запроса рецензирования в ReviewBoard и публикации различий из текущегоfile,

Может быть позже, скрипт может быть частью svn pre-commit hook.

Моя попытка 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).

Я знаю, что есть некоторые библиотеки, которые могут взаимодействовать с API ReviewBoard.Я также знаю, что пост-обзор существует.Я бы предпочел не распространять среди других разработчиков другую библиотеку 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, аутентификация не пройдена.

1 Ответ

2 голосов
/ 09 декабря 2011

В Reviewboard уже есть инструмент Python для публикации различий с их API, он называется postreview.py. Вы можете найти его по адресу:

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

Захватите и используйте их ReviewBoardServer для входа и публикации различий!

(Кроме того, в вашем запросе требуется аутентификация да, но также и файл cookie. Вот почему вам нужно 2 запроса (один для входа в систему и получения файла cookie, другой для отправки различий.))

...