From f95b76e356776eee6bc3c25f31b375aea147c7a5 Mon Sep 17 00:00:00 2001 From: Vincent A Date: Sat, 2 Nov 2013 11:36:16 +0100 Subject: [PATCH] github: edit issue --- modules/github/backend.py | 18 +++++++++++++++--- modules/github/browser.py | 28 +++++++++++++++++++++++----- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/modules/github/backend.py b/modules/github/backend.py index 2a895340..e9c6160c 100644 --- a/modules/github/backend.py +++ b/modules/github/backend.py @@ -64,7 +64,7 @@ class GithubBackend(BaseBackend, ICapBugTracker): return project def get_issue(self, _id): - project_id, issue_number = _id.rsplit('/', 1) + project_id, issue_number = self._extract_issue_id(_id) project = self.get_project(project_id) d = self.browser.get_issue(project_id, issue_number) @@ -94,7 +94,11 @@ class GithubBackend(BaseBackend, ICapBugTracker): def post_issue(self, issue): assert not issue.attachments - self.browser.post_issue(issue) + if issue.id and issue.id != '0': + _, issue_number = self._extract_issue_id(issue.id) + self.browser.edit_issue(issue, issue_number) + else: + self.browser.post_issue(issue) def update_issue(self, issue_id, update): assert not update.attachments @@ -111,7 +115,7 @@ class GithubBackend(BaseBackend, ICapBugTracker): yield Version(d['id'], d['name']) def _make_issue(self, d, project): - _id = '%s/%s' % (project.id, d['number']) + _id = self._build_issue_id(project.id, d['number']) issue = Issue(_id) issue.project = project issue.title = d['title'] @@ -163,3 +167,11 @@ class GithubBackend(BaseBackend, ICapBugTracker): u.changes = [] u.attachments = [self._make_attachment(dattach) for dattach in d['attachments']] return u + + @staticmethod + def _extract_issue_id(_id): + return _id.rsplit('/', 1) + + @staticmethod + def _build_issue_id(project_id, issue_number): + return '%s/%s' % (project_id, issue_number) diff --git a/modules/github/browser.py b/modules/github/browser.py index fd53afaa..e18f0d0d 100644 --- a/modules/github/browser.py +++ b/modules/github/browser.py @@ -83,16 +83,25 @@ class GithubBrowser(BaseBrowser): break def post_issue(self, issue): + base_data = self._issue_post_body(issue) + url = 'https://api.github.com/repos/%s/issues' % issue.project.id + json = self.do_post(url, base_data) + issue_number = json['id'] + return self._make_issue(issue.project.id, issue_number, json) + + def edit_issue(self, issue, issue_number): + base_data = self._issue_post_body(issue) + url = 'https://api.github.com/repos/%s/issues/%s' % (issue.project.id, issue_number) + self.do_patch(url, base_data) + return issue + + def _issue_post_body(self, issue): data = {'title': issue.title, 'body': issue.body} if issue.assignee: data['assignee'] = issue.assignee.id if issue.version: data['milestone'] = issue.version.id - base_data = json_module.dumps(data) - url = 'https://api.github.com/repos/%s/issues' % issue.project.id - json = self.do_post(url, base_data) - issue_number = json['id'] - return self._make_issue(issue.project.id, issue_number, json) + return json_module.dumps(data) def post_comment(self, issue_id, comment): project_id, issue_number = issue_id.rsplit('/', 1) @@ -170,6 +179,15 @@ class GithubBrowser(BaseBrowser): req = self.request_class(url, data, headers=headers) return self.get_document(self.openurl(req)) + def do_patch(self, url, data): + class PatchRequest(self.request_class): + def get_method(self): + return 'PATCH' + headers = self.auth_headers() + headers.update({'Accept': 'application/vnd.github.preview'}) + req = PatchRequest(url, data, headers=headers) + return self.get_document(self.openurl(req)) + def auth_headers(self): if self.username: return {'Authorization': 'Basic %s' % b64encode('%s:%s' % (self.username, self.password))}