Как вы можете опубликовать diff на ReviewBoard через свой API?

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

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

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

Может быть, позже скрипт может быть частью 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, аутентификация терпит неудачу.

    One Solution collect form web for “Как вы можете опубликовать diff на ReviewBoard через свой API?”

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

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

    Возьмите и используйте их ReviewBoardServer для входа и публикации diff!

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

     
    Interesting Posts for Van-Lav

    Можно ли использовать атрибут класса как значение по умолчанию для метода экземпляра?

    Получить имена столбцов python numpy ndarray

    SqlAlchemy Core и голосовой запрос

    Python – как мне заставить использовать фабричный метод для создания объекта?

    Сортировка_пакетов Python pandas не работает

    Python – превратить содержимое файла в двоичный массив

    urllib.urlopen работает, но urllib2.urlopen не

    Как я могу заставить ipdb отображать больше строк контекста во время отладки?

    Как проверить, содержит ли RGB-изображение только один цвет?

    Pandas read_csv от url

    используя scrapy для удаления веб-сайта asp.net с помощью кнопок javascript и ajax-запросов

    В python есть хорошая идиома для использования контекстных менеджеров в настройке / отрыве

    Добавление функций «CRM» на сайт Django

    разбиение байтовой строки на строки

    Разделение строки без разрыва строки в список строк с максимальным количеством столбцов

    Python - лучший язык программирования в мире.