From metatracker at psf.upfronthosting.co.za Mon Aug 1 13:30:16 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Mon, 01 Aug 2016 17:30:16 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue586, issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1470072616.62.0.308659840329.issue590@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 2 20:03:28 2016 From: metatracker at psf.upfronthosting.co.za (=?utf-8?q?St=C3=A9phane_Wirtel?=) Date: Wed, 03 Aug 2016 00:03:28 +0000 Subject: [Tracker-discuss] [issue602] automatic redirect to https Message-ID: <1470182608.3.0.837626835489.issue602@psf.upfronthosting.co.za> New submission from St?phane Wirtel: Currently, we can reach b.p.o via http and this protocol is unsafe. Please, could you redirect the stream to https ? Thank you ---------- messages: 3122 nosy: matrixise priority: urgent status: unread title: automatic redirect to https _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 2 20:07:42 2016 From: metatracker at psf.upfronthosting.co.za (=?utf-8?q?St=C3=A9phane_Wirtel?=) Date: Wed, 03 Aug 2016 00:07:42 +0000 Subject: [Tracker-discuss] [issue603] update the SSL certificate Message-ID: <1470182862.63.0.941603312183.issue603@psf.upfronthosting.co.za> New submission from St?phane Wirtel: See this report on https://bugs.python.org https://www.ssllabs.com/ssltest/analyze.html?d=bugs.python.org&s=2a01%3a4f8%3a131%3a2480%3a0%3a0%3a0%3a3&latest https://www.ssllabs.com/ssltest/analyze.html?d=bugs.python.org&s=46.4.197.70 Thank you, Stephane ---------- messages: 3123 nosy: matrixise priority: urgent status: unread title: update the SSL certificate _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Aug 3 01:54:03 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 03 Aug 2016 05:54:03 +0000 Subject: [Tracker-discuss] [issue602] automatic redirect to https In-Reply-To: <1470182608.3.0.837626835489.issue602@psf.upfronthosting.co.za> Message-ID: <1470203643.04.0.969967046737.issue602@psf.upfronthosting.co.za> Berker Peksag added the comment: This is a duplicate of issue 463. ---------- nosy: +berker.peksag status: unread -> resolved superseder: +HTTPS only version for login for this tracker _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Aug 3 12:53:55 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Wed, 03 Aug 2016 16:53:55 +0000 Subject: [Tracker-discuss] [issue603] update the SSL certificate In-Reply-To: <1470182862.63.0.941603312183.issue603@psf.upfronthosting.co.za> Message-ID: <1470243235.43.0.350554577909.issue603@psf.upfronthosting.co.za> R David Murray added the comment: Grade: C. That is pretty uninformative. Did I miss something? ---------- nosy: +r.david.murray status: unread -> chatting _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Aug 3 18:28:50 2016 From: metatracker at psf.upfronthosting.co.za (Ezio Melotti) Date: Wed, 03 Aug 2016 22:28:50 +0000 Subject: [Tracker-discuss] [issue552] Modules and interest no longer displayed in nosy list completion In-Reply-To: <1410971215.15.0.384646968238.issue552@psf.upfronthosting.co.za> Message-ID: <1470263330.2.0.497866082778.issue552@psf.upfronthosting.co.za> Ezio Melotti added the comment: I applied the patch (thanks Berker!) in https://hg.python.org/tracker/python-dev/rev/b1707303899e and the issue seems now resolved. If the problem persists wait for a day for the cached (and missing) data to expire -- the script will then try to fetch them again. ---------- status: chatting -> resolved _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sat Aug 6 10:35:21 2016 From: metatracker at psf.upfronthosting.co.za (Nick Coghlan) Date: Sat, 06 Aug 2016 14:35:21 +0000 Subject: [Tracker-discuss] [issue603] update the SSL certificate In-Reply-To: <1470182862.63.0.941603312183.issue603@psf.upfronthosting.co.za> Message-ID: <1470494121.31.0.785394930573.issue603@psf.upfronthosting.co.za> Nick Coghlan added the comment: I'm not sure why the direct link isn't working, but if you click on the "46.4.197.70" heading it will take you through to the detailed report. "High"lights: * This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. * Certificate has a weak signature and expires after 2015. Upgrade to SHA2 to avoid browser warnings. * The server supports only older protocols, but not the current best TLS 1.2. Grade capped to C. * The server does not support Forward Secrecy with the reference browsers. Of those, only the SHA1 signature is related to the cert itself - the rest have to do with Upfront's server configuration. ---------- nosy: +ncoghlan _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sat Aug 6 16:40:33 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Sat, 06 Aug 2016 20:40:33 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1470516033.58.0.950311396057.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: roundup/pull_request.py: > key = os.environ['SECRET_KEY'] If this env is missing the code throws KeyError, which is not nice. It would be better to check if it exists and fail nicely, informing about the problem. > def testPullRequestEventForTitle(self): > # When the title of a PR has string "fixes bpo123" > dummy_client = self._make_client("pullrequestevent.txt") But both pullrequestevent.txt and pullrequestevent1.txt have 'fixes bpo1' in body, not in title. > return self.db.issue.create(title=title) I haven't seen the issue being created, when testing this locally. I mean, the code goes this path, but there's no new issue in the bugtracker, am I missing something here? OK I got it, here's again the problem with per issue URL, iow. I'm failing this condition: > issue_exists = len(self.db.issue.filter(None, {'id': issue_id})) == 1 > url_exists = len(self.db.pull_request.filter(None, {'url': url})) == 1 > if issue_exists and not url_exists: The issue exists, but unfortunately I'm again using the same PR URL. You should check just this issue's urls. > title_match = self.issue_re.search(title) > body_match = self.issue_re.search(body) This matching code only matches the last one, so if I specify multiple fixes bpoX, bpoY, only Y will be updated. > self._validate_webhook_secret() > self._verify_request() > self._extract() _verify_request should come before _validate_webhook_secret, otherwise if somebody sends you malformed data (wrong event, method, content type) you first try to interpret it in secret validation, instead of rejecting the request. Generally, try more defensive approach when accessing dictionaries, since this endpoint will be available to outside world, it may be a potential place to attacks, this means you should be prepared to KeyErrors at any place you're accessing dictionary. A except KeyError at one of the higher levels (eg. _extract) will be perfectly fine and that should immediately throw Reject exception. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sun Aug 7 08:46:16 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Sun, 07 Aug 2016 12:46:16 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1470573976.69.0.993199404864.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: Should I throw Reject exception if 'SECRET_KEY' is not set as an environment variable too? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sun Aug 7 09:09:31 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Sun, 07 Aug 2016 13:09:31 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1470575371.05.0.692360917135.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch. There are two main changes :- 1. If multiple issues are referenced, the PR is linked to each one of them. 2. raises Reject exception if any key is missing. (even for environment variable) _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/cgi/client.py b/roundup/cgi/client.py index e71983d..abfbf51 100644 --- a/roundup/cgi/client.py +++ b/roundup/cgi/client.py @@ -22,6 +22,7 @@ from roundup.cgi.form_parser import FormParser from roundup.mailer import Mailer, MessageSendError, encode_quopri from roundup.cgi import accept_language from roundup import xmlrpc +from roundup.pull_request import GitHubHandler from roundup.anypy.cookie_ import CookieError, BaseCookie, SimpleCookie, \ get_cookie_date @@ -378,6 +379,8 @@ class Client: try: if self.path == 'xmlrpc': self.handle_xmlrpc() + elif self.path == 'pull_request': + self.handle_pull_request() else: self.inner_main() finally: @@ -385,6 +388,34 @@ class Client: self.db.close() + def handle_pull_request(self): + # Set the charset and language, since other parts of + # Roundup may depend upon that. + self.determine_charset() + self.determine_language() + # Open the database as the correct user. + self.determine_user() + self.check_anonymous_access() + + try: + handler = GitHubHandler(self) + handler.dispatch() + except Unauthorised, message: + self.response_code = 403 + self.write(message) + except UnsupportedMediaType, message: + self.response_code = 415 + self.write(message) + except MethodNotAllowed, message: + self.response_code = 405 + self.write(message) + except Reject, message: + self.response_code = 400 + self.write(message) + else: + self.write("Done!") + + def handle_xmlrpc(self): if self.env.get('CONTENT_TYPE') != 'text/xml': self.write("This is the endpoint of Roundup Message-ID: <1470602432.78.0.0646985449667.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: I'm missing following elements in this submission: - tests: * negative cases (you only have unsupported media type and request method) but more is needed, iow. test every path: missing Github event, secret, etc. * issue created by anonymous, user with github username set * multiple fixes both in title like you have in pullrequestevent3.txt but also in title - code comments in roundup/pull_request.py And more comments: roundup/pull_request.py: > raise Reject("Key {} is not present".format(str(e))) This information is important for administrator, the requester should not see this information. Log the error and throw generic 'Invalid request' exception. > raise Reject('missing X-GitHub-Event header') Generally, you don't want to 'help' the attacker know what went wrong, but rather just throw generic 'Invalid request' exception in such cases, as well. > def _get_issue_id(self): With the new approach (multiple ids) it would be nice to rename the variables and methods to represent the plurality, iow. use ids in all those places. > ids = self.issue_id_re.findall(match.group()) > return ids Just return self_issue_id_re.findall(match.group()), you don't need that variable. > self._extract() Is vulnerable to other exceptions, I'm a lazy person and I test your code with following command: curl -X POST -H "content-type: application/json" -H "X-GitHub-Event: pull_request" -d @test/data/pullrequestevent3.txt http://localhost:9999/python-dev/pull_request doing so I frequently forgot you have additional data in the testfiles and I'm getting "ValueError: No JSON object could be decoded" at this point. Verify other exceptions and throw generic 'Invalid request' in those places (and don't forget to add tests). > url_exists = len(self.db.pull_request.filter(None, {'url': url})) == 1 Not being used, please remove this line. Unfortunately, I'm able to add multiple times the same URL, you should be checking the URLs but in the context of a single issue. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sun Aug 7 16:56:11 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Sun, 07 Aug 2016 20:56:11 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue586, issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1470603371.35.0.368821149731.issue590@psf.upfronthosting.co.za> Maciej Szulik added the comment: LGTM _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 8 13:50:28 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Mon, 08 Aug 2016 17:50:28 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1470602432.78.0.0646985449667.issue589@psf.upfronthosting.co.za> Message-ID: Anish Shah added the comment: > * multiple fixes both in title like you have in pullrequestevent3.txt but also in title Sorry. I didn't get you. You mean, same tests for PR body, right? > Is vulnerable to other exceptions, I'm a lazy person and I test your code with following > command: > curl -X POST -H "content-type: application/json" -H "X-GitHub-Event: pull_request" -d @test/data/pullrequestevent3.txt http://localhost:9999/python-dev/pull_request > doing so I frequently forgot you have additional data in the testfiles and I'm getting > "ValueError: No JSON object could be decoded" at this point. Verify other exceptions > and throw generic 'Invalid request' in those places (and don't forget to add tests) I was thinking of adding "Exception, e" instead of checking for just KeyError in dispatch method. But that will also catch Unauthorized, MethodNotAllowed and unsupportedmediatype. Can you suggest a better way to do this? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 8 14:02:49 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Mon, 08 Aug 2016 18:02:49 +0000 Subject: [Tracker-discuss] [issue593] Small improvements to issue.item.html In-Reply-To: <1465451224.3.0.969789688095.issue593@psf.upfronthosting.co.za> Message-ID: <1470679369.83.0.883375486109.issue593@psf.upfronthosting.co.za> R David Murray added the comment: If we are going to do anything with the assigned to field, I think we should just remove it. But if we don't remove it, I think having triagers in the assignment list is fine. They are on a path to be a developer, so if they want to use it I don't see why they shouldn't. But our tradition currently is that we *mostly* don't use it at all (other than Raymond), and when we do use it it is mostly for "X will do the next action on this issue", and the next action taker could well be a triager, if they are working on a patch. (Which might argue for allowing *any* valid account in the assigned to list.) ---------- status: unread -> chatting _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 9 09:01:27 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Tue, 09 Aug 2016 13:01:27 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1470747687.94.0.0988848287468.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: > Sorry. I didn't get you. You mean, same tests for PR body, right? Yeah, exactly that. I'd like to see both body and title tests. Sorry I was initially noting down my thoughts and apparently forgot to "normalize" that part of the sentence ;) > I was thinking of adding "Exception, e" instead of checking for just > KeyError in dispatch method. But that will also catch Unauthorized, > MethodNotAllowed and unsupportedmediatype. Can you suggest a better way to > do this? Only going through the code and figure out what are the possible exceptions and just name them explicitly. No magic option here, sorry :( _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 9 12:10:44 2016 From: metatracker at psf.upfronthosting.co.za (R David Murray) Date: Tue, 09 Aug 2016 16:10:44 +0000 Subject: [Tracker-discuss] [issue603] update the SSL certificate In-Reply-To: <1470182862.63.0.941603312183.issue603@psf.upfronthosting.co.za> Message-ID: <1470759044.95.0.102596923583.issue603@psf.upfronthosting.co.za> R David Murray added the comment: Well, we can edit the apache server config too. In fact, I thought I'd done the diffie-hellman fix, but I guess I didn't. I don't understand the 'cert expires' part, it was renewed in September of 2015. Is there any reason we couldn't use letsencrypt for bugs? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Aug 10 10:03:56 2016 From: metatracker at psf.upfronthosting.co.za (Berker Peksag) Date: Wed, 10 Aug 2016 14:03:56 +0000 Subject: [Tracker-discuss] [issue593] Small improvements to issue.item.html In-Reply-To: <1465451224.3.0.969789688095.issue593@psf.upfronthosting.co.za> Message-ID: <1470837836.94.0.878541991967.issue593@psf.upfronthosting.co.za> Berker Peksag added the comment: > They are on a path to be a developer, so if they want to use it I don't see why they shouldn't. It creates an unnecessary confusion. I don't want to check https://docs.python.org/devguide/developers.html everytime I want to commit a stale/old patch to be honest. Note that sometimes their usernames are different than their real names which make the whole process more time consuming. I see the assigned to field as "I'm going to commit this" and it looks like other developers see it as the same: http://bugs.python.org/issue21578 > If we are going to do anything with the assigned to field, I think we should just remove it. I can live without it but I guess we need to discuss it on core-workflow first? I'd prefer applying a three line patch rather than starting a long thread on core-workflow :) _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 9 14:31:16 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Tue, 09 Aug 2016 18:31:16 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1470767476.5.0.429906232377.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: new tests: - secret key missing - Github event missing in header - non json body - multiple references in PR body - CREATE_ISSUE is not set and no issue is reference in PR - if github field of user is set, then PR/issue is assigned to that user or else anonymous _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- commit a565735c6ebbb0a664cd7f9e5b68a406094ecf0f Author: Anish Shah Date: Wed Jul 27 00:03:46 2016 +0530 Add GitHub PR to bpo using webhooks diff --git a/roundup/cgi/client.py b/roundup/cgi/client.py index e71983d..abfbf51 100644 --- a/roundup/cgi/client.py +++ b/roundup/cgi/client.py @@ -22,6 +22,7 @@ from roundup.cgi.form_parser import FormParser from roundup.mailer import Mailer, MessageSendError, encode_quopri from roundup.cgi import accept_language from roundup import xmlrpc +from roundup.pull_request import GitHubHandler from roundup.anypy.cookie_ import CookieError, BaseCookie, SimpleCookie, \ get_cookie_date @@ -378,6 +379,8 @@ class Client: try: if self.path == 'xmlrpc': self.handle_xmlrpc() + elif self.path == 'pull_request': + self.handle_pull_request() else: self.inner_main() finally: @@ -385,6 +388,34 @@ class Client: self.db.close() + def handle_pull_request(self): + # Set the charset and language, since other parts of + # Roundup may depend upon that. + self.determine_charset() + self.determine_language() + # Open the database as the correct user. + self.determine_user() + self.check_anonymous_access() + + try: + handler = GitHubHandler(self) + handler.dispatch() + except Unauthorised, message: + self.response_code = 403 + self.write(message) + except UnsupportedMediaType, message: + self.response_code = 415 + self.write(message) + except MethodNotAllowed, message: + self.response_code = 405 + self.write(message) + except Reject, message: + self.response_code = 400 + self.write(message) + else: + self.write("Done!") + + def handle_xmlrpc(self): if self.env.get('CONTENT_TYPE') != 'text/xml': self.write("This is the endpoint of Roundup Message-ID: <1470945934.16.0.10751732343.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: Those are the three remaining issues, all the rest looks good. roundup/pull_request.py: > except Unauthorised, message: > logging.error(message, exc_info=True) > raise Unauthorised(message) > except MethodNotAllowed, message: > logging.error(message, exc_info=True) > raise MethodNotAllowed(message) > except UnsupportedMediaType, message: > logging.error(message, exc_info=True) > raise UnsupportedMediaType(message) You can just re-rise an exception with rise, like so: except UnsupportedMediaType, message: logging.error(message, exc_info=True) raise > if 'pull_request' in self.data['issue']: > return self.data['issue']['pull_request']['html_url']\ > .encode('utf-8') You can safely just return without the if, like you do in other methods. You have the "safety net" at dispatch level, iow. try-except clauses. There's still a problem that multiple calls to the same bug will create multiple links to the same PR. Example: create issue1 and invoke curl -H "X-GitHub-Event: pull_request" -H "content-type: application/json" -H "X-Hub-Signature: sha1=2c74c307193b7276fef7b1776956da2288034e5b" -d @test/data/pullrequestevent.txt localhost:9999/python-dev/pull_request several times, you'll get that many https://github.com/AnishShah/cpython/pull/11 urls as you invoked the curl. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Thu Aug 11 16:12:40 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Thu, 11 Aug 2016 20:12:40 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1470945934.16.0.10751732343.issue589@psf.upfronthosting.co.za> Message-ID: Anish Shah added the comment: > There's still a problem that multiple calls to the same bug will create multiple links to the same PR. > Example: create issue1 and invoke curl -H "X-GitHub-Event: pull_request" -H "content-type: application/json" -H "X-Hub-Signature: sha1=2c74c307193b7276fef7b1776956da2288034e5b" -d @test/data/pullrequestevent.txt localhost:9999/python-dev/pull_request > several times, you'll get that many https://github.com/AnishShah/cpython/pull/11 urls as you invoked the curl. > I think, It's because I removed "url_exist" check according to your previous review. But, since these requests are triggered by GitHub, there will be only one request for "opened" action. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Thu Aug 11 16:22:15 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Thu, 11 Aug 2016 20:22:15 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1470946935.66.0.418071932931.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: > I think, It's because I removed "url_exist" check according to your > previous review. > But, since these requests are triggered by GitHub, there will be only one > request for "opened" action. url_exists was removed due to not being able to link the same pr to multiple issues. The point about GH making only single opened request is valid, but as usual it's better to be prepared, so if it's not a big deal try adding one, if the amount of work is too much, we'll live with what we have. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Thu Aug 11 16:25:50 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Thu, 11 Aug 2016 20:25:50 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1470946935.66.0.418071932931.issue589@psf.upfronthosting.co.za> Message-ID: Anish Shah added the comment: Oops. Got it now. I will include the changes. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Fri Aug 12 11:52:35 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Fri, 12 Aug 2016 15:52:35 +0000 Subject: [Tracker-discuss] [issue589] Add GitHub PR to b.p.o issues using GitHub webhooks (depends on issue586) In-Reply-To: <1464035377.63.0.520552418309.issue589@psf.upfronthosting.co.za> Message-ID: <1471017155.26.0.958332743236.issue589@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch with all three changes _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/cgi/client.py b/roundup/cgi/client.py index e71983d..abfbf51 100644 --- a/roundup/cgi/client.py +++ b/roundup/cgi/client.py @@ -22,6 +22,7 @@ from roundup.cgi.form_parser import FormParser from roundup.mailer import Mailer, MessageSendError, encode_quopri from roundup.cgi import accept_language from roundup import xmlrpc +from roundup.pull_request import GitHubHandler from roundup.anypy.cookie_ import CookieError, BaseCookie, SimpleCookie, \ get_cookie_date @@ -378,6 +379,8 @@ class Client: try: if self.path == 'xmlrpc': self.handle_xmlrpc() + elif self.path == 'pull_request': + self.handle_pull_request() else: self.inner_main() finally: @@ -385,6 +388,34 @@ class Client: self.db.close() + def handle_pull_request(self): + # Set the charset and language, since other parts of + # Roundup may depend upon that. + self.determine_charset() + self.determine_language() + # Open the database as the correct user. + self.determine_user() + self.check_anonymous_access() + + try: + handler = GitHubHandler(self) + handler.dispatch() + except Unauthorised, message: + self.response_code = 403 + self.write(message) + except UnsupportedMediaType, message: + self.response_code = 415 + self.write(message) + except MethodNotAllowed, message: + self.response_code = 405 + self.write(message) + except Reject, message: + self.response_code = 400 + self.write(message) + else: + self.write("Done!") + + def handle_xmlrpc(self): if self.env.get('CONTENT_TYPE') != 'text/xml': self.write("This is the endpoint of Roundup Message-ID: <1471203463.72.0.955057567604.issue589@psf.upfronthosting.co.za> Maciej Szulik added the comment: LGTM _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sun Aug 14 15:51:59 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Sun, 14 Aug 2016 19:51:59 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue586, issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1471204319.04.0.316455474812.issue590@psf.upfronthosting.co.za> Maciej Szulik added the comment: Anish while reviewing 592 I've got into trouble applying the roundup part on top of 589, I guess due to the amount of changes in it. Can you please update the patch so it applies cleanly? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sun Aug 14 15:57:45 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Sun, 14 Aug 2016 19:57:45 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471204665.74.0.0339028315478.issue592@psf.upfronthosting.co.za> Maciej Szulik added the comment: Anish, can you please update the roundup part so that it applies cleanly and apply all the suggestions discussed on core-workflow mailing list? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 15 14:17:23 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Mon, 15 Aug 2016 18:17:23 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue586, issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1471285043.14.0.0115348957543.issue590@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch. it can be applied without any failures. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 15 15:33:45 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Mon, 15 Aug 2016 19:33:45 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471289625.35.0.623152454076.issue592@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch so that it applies cleanly. I will add the suggestions in a few days. _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/pull_request.py b/roundup/pull_request.py index fc70ca5..e8af62a 100644 --- a/roundup/pull_request.py +++ b/roundup/pull_request.py @@ -1,4 +1,5 @@ from roundup.exceptions import * +from roundup import date import hashlib import hmac @@ -15,6 +16,9 @@ else: return a == b +valid_events = ('pull_request', 'issue_comment', 'pull_request_review_comment') + + class GitHubHandler: def __init__(self, client): @@ -43,7 +47,7 @@ class GitHubHandler: def _extract(self): event = self._get_event() - if event not in ('pull_request', 'issue_comment'): + if event not in valid_events: raise Reject('Unkown X-GitHub-Event {}'.format(event)) data = json.loads(self.form.value) if event == 'pull_request': @@ -52,6 +56,9 @@ class GitHubHandler: elif event == 'issue_comment': handler = IssueComment(self.db, data) handler.dispatch() + elif event == 'pull_request_review_comment': + handler = PullRequestReviewComment(self.db, data) + handler.dispatch() def _validate_webhook_secret(self): key = os.environ['SECRET_KEY'] @@ -95,6 +102,32 @@ class Event: self.db.issue.set(issue_id, pull_requests=urls) self.db.commit() + def handle_comment(self, comment): + url = self._get_url() + issue_id = self._get_issue_id_using_url(url) + if issue_id is not None: + user_id = self.db.user.lookup("admin") + messages = self.db.issue.get(issue_id, "messages") + now = date.Date(".") + min_date = now - date.Interval("00:30") + date_range_string = "from " + str(min_date) + msg_ids = self.db.msg.filter(None, {"is_github_comment": True, + "creation": date_range_string}) + if not bool(msg_ids): + msg_id = self.db.msg.create(content=comment, author=user_id, + date=now, is_github_comment=True) + messages.append(msg_id) + self.db.issue.set(issue_id, messages=messages) + self.db.commit() + + def _get_issue_id_using_url(self, url): + pr_id = self.db.pull_request.filter(None, {'url': url}) + pr_exists = len(pr_id) == 1 + if pr_exists: + issue_id = self.db.issue.filter(None, {'pull_requests': pr_id[0]}) + if len(issue_id) == 1: + return issue_id[0] + def _get_issue_ids(self): raise NotImplementedError @@ -166,8 +199,10 @@ class IssueComment(Event): action = self.data['action'].encode('utf-8') issue_id = self._get_issue_ids() url = self._get_url() + comment = self._get_comment() if action == 'created' and issue_id is not None: self.handle_create(url, issue_id) + self.handle_comment(comment) def _get_issue_ids(self): body = self.data['comment']['body'].encode('utf-8') @@ -181,3 +216,26 @@ class IssueComment(Event): def _get_github_username(self): return self.data['issue']['user']['login'].encode('utf-8') + + def _get_comment(self): + comment_user = self.data['comment']['user']['login'].encode('utf-8') + comment = self.data['comment']['body'].encode('utf-8') + url = self.data['comment']['html_url'].encode('utf-8') + return '%s left a comment on GitHub:\n\n%s\n\n%s' % (comment_user, + comment, url) + + +class PullRequestReviewComment(IssueComment): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + action = self.data['action'].encode('utf-8') + comment = self._get_comment() + if action == 'created': + self.handle_comment(comment) + + def _get_url(self): + return self.data['pull_request']['html_url'] diff --git a/share/roundup/templates/classic/schema.py b/share/roundup/templates/classic/schema.py index 34ae90b..9b548fb 100644 --- a/share/roundup/templates/classic/schema.py +++ b/share/roundup/templates/classic/schema.py @@ -61,7 +61,8 @@ msg = FileClass(db, "msg", summary=String(), files=Multilink("file"), messageid=String(), - inreplyto=String()) + inreplyto=String(), + is_github_comment=Boolean()) file = FileClass(db, "file", name=String()) diff --git a/test/data/pullrequestreviewcomment.txt b/test/data/pullrequestreviewcomment.txt new file mode 100644 index 0000000..bbd143b --- /dev/null +++ b/test/data/pullrequestreviewcomment.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 04c7e753.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/375c44e +X-GitHub-Event: pull_request_review_comment +X-GitHub-Delivery: a2367880-2729-11e6-844b-d35793a4447d +content-type: application/json +X-Hub-Signature: sha1=7f716a5dc13d23aee2cb6edc6b32770769be188b +Content-Length: 21289 + +{"action":"created","comment":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170226","id":65170226,"diff_hunk":"@@ -1,5 +1,3 @@\n-test","path":"README","position":1,"original_position":1,"commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","original_commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_ur l":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Good! LGTM :)","created_at":"2016-05-31T12:17:25Z","updated_at":"2016-05-31T12:17:25Z","html_url":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170226","pull_request_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170226"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170226"},"pull_request":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"}}},"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/11","diff_url":"https://github.com/AnishShah/cpython/pull/11.diff","patch_url":"https://g ithub.com/AnishShah/cpython/pull/11.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/11","number":11,"state":"closed","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://ap i.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-31T12:17:25Z","closed_at":"2016-05-24T13:18:36Z","merged_at":"2016-05-24T13:18:36Z","merge_commit_sha":"96b494a55816c63dcb7dcca3cb6d64064c639c67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"label":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubuse rcontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v= 3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/Anish Shah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cp ython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}" ,"compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016 -05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https:// api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/Anis hShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishSh ah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/An ishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpy thon/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":" Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython ","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api. github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpytho n/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cp ython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url" :"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestreviewcomment1.txt b/test/data/pullrequestreviewcomment1.txt new file mode 100644 index 0000000..aae34b4 --- /dev/null +++ b/test/data/pullrequestreviewcomment1.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 04c7e753.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/375c44e +X-GitHub-Event: pull_request_review_comment +X-GitHub-Delivery: a6629600-2729-11e6-9058-134ca76c843d +content-type: application/json +X-Hub-Signature: sha1=45a30197e4e7672bf9579ac12db8e82d9f98d321 +Content-Length: 21278 + +{"action":"created","comment":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170239","id":65170239,"diff_hunk":"@@ -1,5 +1,3 @@\n-test","path":"README","position":1,"original_position":1,"commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","original_commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_ur l":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Yep","created_at":"2016-05-31T12:17:32Z","updated_at":"2016-05-31T12:17:32Z","html_url":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170239","pull_request_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170239"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170239"},"pull_request":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"}}},"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/11","diff_url":"https://github.com/AnishShah/cpython/pull/11.diff","patch_url":"https://github.com/ AnishShah/cpython/pull/11.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/2","number":11,"state":"closed","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.co m/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-31T12:17:32Z","closed_at":"2016-05-24T13:18:36Z","merged_at":"2016-05-24T13:18:36Z","merge_commit_sha":"96b494a55816c63dcb7dcca3cb6d64064c639c67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"label":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.co m/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravata r_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpytho n","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/r efs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_u rl":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:1 8:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github. com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists {/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/ teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpy thon/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downlo ads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","ha s_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{ "login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/ repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/co mments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deplo yments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://a pi.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/test_pull_request.py b/test/test_pull_request.py index a9bf4ab..76b487e 100644 --- a/test/test_pull_request.py +++ b/test/test_pull_request.py @@ -243,6 +243,29 @@ class TestCase(unittest.TestCase): state = self.db.pull_request.get(urls[0], 'state') self.assertEqual(state, "closed") + def testNonLinkedPullRequestReviewComments(self): + # Pull Request which is not linked to any issues on b.p.o + dummy_client = self._make_client("pullrequestreviewcomment.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 0) + + def testPullRequestReviewComments(self): + # Pull Request which is linked to an issue on b.p.o + dummy_client = self._make_client("pullrequestevent.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.db.close() + dummy_client = self._make_client("pullrequestreviewcomment.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 1) + self.db.close() + dummy_client = self._make_client("pullrequestreviewcomment1.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 1) + def test_suite(): suite = unittest.TestSuite() From metatracker at psf.upfronthosting.co.za Tue Aug 16 15:03:01 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Tue, 16 Aug 2016 19:03:01 +0000 Subject: [Tracker-discuss] [issue590] Show Pull Request status on b.p.o (depends on issue586, issue589) In-Reply-To: <1468432537.9.0.749472602209.issue590@psf.upfronthosting.co.za> Message-ID: <1471374181.83.0.766356990984.issue590@psf.upfronthosting.co.za> Maciej Szulik added the comment: Thanks, works ok. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Wed Aug 17 12:48:16 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Wed, 17 Aug 2016 16:48:16 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471452496.61.0.355905531315.issue592@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch. now, GitHub name, comment and link to the PR will be posted on b.p.o _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/pull_request.py b/roundup/pull_request.py index fc70ca5..6f92b83 100644 --- a/roundup/pull_request.py +++ b/roundup/pull_request.py @@ -1,4 +1,5 @@ from roundup.exceptions import * +from roundup import date import hashlib import hmac @@ -15,6 +16,9 @@ else: return a == b +valid_events = ('pull_request', 'issue_comment', 'pull_request_review_comment') + + class GitHubHandler: def __init__(self, client): @@ -43,7 +47,7 @@ class GitHubHandler: def _extract(self): event = self._get_event() - if event not in ('pull_request', 'issue_comment'): + if event not in valid_events: raise Reject('Unkown X-GitHub-Event {}'.format(event)) data = json.loads(self.form.value) if event == 'pull_request': @@ -52,6 +56,9 @@ class GitHubHandler: elif event == 'issue_comment': handler = IssueComment(self.db, data) handler.dispatch() + elif event == 'pull_request_review_comment': + handler = PullRequestReviewComment(self.db, data) + handler.dispatch() def _validate_webhook_secret(self): key = os.environ['SECRET_KEY'] @@ -95,6 +102,32 @@ class Event: self.db.issue.set(issue_id, pull_requests=urls) self.db.commit() + def handle_comment(self, comment): + url = self._get_url() + issue_id = self._get_issue_id_using_url(url) + if issue_id is not None: + user_id = self.db.user.lookup("admin") + messages = self.db.issue.get(issue_id, "messages") + now = date.Date(".") + min_date = now - date.Interval("00:30") + date_range_string = "from " + str(min_date) + msg_ids = self.db.msg.filter(None, {"is_github_comment": True, + "creation": date_range_string}) + if not bool(msg_ids): + msg_id = self.db.msg.create(content=comment, author=user_id, + date=now, is_github_comment=True) + messages.append(msg_id) + self.db.issue.set(issue_id, messages=messages) + self.db.commit() + + def _get_issue_id_using_url(self, url): + pr_id = self.db.pull_request.filter(None, {'url': url}) + pr_exists = len(pr_id) == 1 + if pr_exists: + issue_id = self.db.issue.filter(None, {'pull_requests': pr_id[0]}) + if len(issue_id) == 1: + return issue_id[0] + def _get_issue_ids(self): raise NotImplementedError @@ -166,8 +199,10 @@ class IssueComment(Event): action = self.data['action'].encode('utf-8') issue_id = self._get_issue_ids() url = self._get_url() + comment = self._get_comment() if action == 'created' and issue_id is not None: self.handle_create(url, issue_id) + self.handle_comment(comment) def _get_issue_ids(self): body = self.data['comment']['body'].encode('utf-8') @@ -181,3 +216,26 @@ class IssueComment(Event): def _get_github_username(self): return self.data['issue']['user']['login'].encode('utf-8') + + def _get_comment(self): + comment_user = self.data['comment']['user']['login'].encode('utf-8') + comment = self.data['comment']['body'].encode('utf-8') + url = self._get_url() + return '%s left a comment on GitHub:\n\n%s\n\n%s' % (comment_user, + comment, url) + + +class PullRequestReviewComment(IssueComment): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + action = self.data['action'].encode('utf-8') + comment = self._get_comment() + if action == 'created': + self.handle_comment(comment) + + def _get_url(self): + return self.data['pull_request']['html_url'] diff --git a/share/roundup/templates/classic/schema.py b/share/roundup/templates/classic/schema.py index 34ae90b..9b548fb 100644 --- a/share/roundup/templates/classic/schema.py +++ b/share/roundup/templates/classic/schema.py @@ -61,7 +61,8 @@ msg = FileClass(db, "msg", summary=String(), files=Multilink("file"), messageid=String(), - inreplyto=String()) + inreplyto=String(), + is_github_comment=Boolean()) file = FileClass(db, "file", name=String()) diff --git a/test/data/pullrequestreviewcomment.txt b/test/data/pullrequestreviewcomment.txt new file mode 100644 index 0000000..bbd143b --- /dev/null +++ b/test/data/pullrequestreviewcomment.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 04c7e753.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/375c44e +X-GitHub-Event: pull_request_review_comment +X-GitHub-Delivery: a2367880-2729-11e6-844b-d35793a4447d +content-type: application/json +X-Hub-Signature: sha1=7f716a5dc13d23aee2cb6edc6b32770769be188b +Content-Length: 21289 + +{"action":"created","comment":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170226","id":65170226,"diff_hunk":"@@ -1,5 +1,3 @@\n-test","path":"README","position":1,"original_position":1,"commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","original_commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_ur l":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Good! LGTM :)","created_at":"2016-05-31T12:17:25Z","updated_at":"2016-05-31T12:17:25Z","html_url":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170226","pull_request_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170226"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170226"},"pull_request":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"}}},"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/11","diff_url":"https://github.com/AnishShah/cpython/pull/11.diff","patch_url":"https://g ithub.com/AnishShah/cpython/pull/11.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/11","number":11,"state":"closed","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://ap i.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-31T12:17:25Z","closed_at":"2016-05-24T13:18:36Z","merged_at":"2016-05-24T13:18:36Z","merge_commit_sha":"96b494a55816c63dcb7dcca3cb6d64064c639c67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"label":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubuse rcontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v= 3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/Anish Shah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cp ython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}" ,"compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016 -05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https:// api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/Anis hShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishSh ah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/An ishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpy thon/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":" Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython ","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api. github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpytho n/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cp ython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url" :"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestreviewcomment1.txt b/test/data/pullrequestreviewcomment1.txt new file mode 100644 index 0000000..aae34b4 --- /dev/null +++ b/test/data/pullrequestreviewcomment1.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 04c7e753.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/375c44e +X-GitHub-Event: pull_request_review_comment +X-GitHub-Delivery: a6629600-2729-11e6-9058-134ca76c843d +content-type: application/json +X-Hub-Signature: sha1=45a30197e4e7672bf9579ac12db8e82d9f98d321 +Content-Length: 21278 + +{"action":"created","comment":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170239","id":65170239,"diff_hunk":"@@ -1,5 +1,3 @@\n-test","path":"README","position":1,"original_position":1,"commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","original_commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_ur l":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Yep","created_at":"2016-05-31T12:17:32Z","updated_at":"2016-05-31T12:17:32Z","html_url":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170239","pull_request_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170239"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170239"},"pull_request":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"}}},"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/11","diff_url":"https://github.com/AnishShah/cpython/pull/11.diff","patch_url":"https://github.com/ AnishShah/cpython/pull/11.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/2","number":11,"state":"closed","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.co m/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-31T12:17:32Z","closed_at":"2016-05-24T13:18:36Z","merged_at":"2016-05-24T13:18:36Z","merge_commit_sha":"96b494a55816c63dcb7dcca3cb6d64064c639c67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"label":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.co m/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravata r_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpytho n","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/r efs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_u rl":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:1 8:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github. com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists {/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/ teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpy thon/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downlo ads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","ha s_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{ "login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/ repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/co mments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deplo yments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://a pi.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/test_pull_request.py b/test/test_pull_request.py index a9bf4ab..76b487e 100644 --- a/test/test_pull_request.py +++ b/test/test_pull_request.py @@ -243,6 +243,29 @@ class TestCase(unittest.TestCase): state = self.db.pull_request.get(urls[0], 'state') self.assertEqual(state, "closed") + def testNonLinkedPullRequestReviewComments(self): + # Pull Request which is not linked to any issues on b.p.o + dummy_client = self._make_client("pullrequestreviewcomment.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 0) + + def testPullRequestReviewComments(self): + # Pull Request which is linked to an issue on b.p.o + dummy_client = self._make_client("pullrequestevent.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.db.close() + dummy_client = self._make_client("pullrequestreviewcomment.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 1) + self.db.close() + dummy_client = self._make_client("pullrequestreviewcomment1.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 1) + def test_suite(): suite = unittest.TestSuite() From metatracker at psf.upfronthosting.co.za Fri Aug 19 17:34:06 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Fri, 19 Aug 2016 21:34:06 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471642446.82.0.964625739708.issue592@psf.upfronthosting.co.za> Maciej Szulik added the comment: Here are my comments: - roundup/pull_request.py > def handle_comment(self, comment): > url = self._get_url() > issue_id = self._get_issue_id_using_url(url) > if issue_id is not None: > user_id = self.db.user.lookup("admin") It would be nice to have the user configurable, not admin hardcoded. > min_date = now - date.Interval("00:30") It would be nice to have this value configurable, as well. Additionally, this will allow you to set this value short for tests and make sure that comments are applied when time delta is bigger than given value or not if shorter. > if not bool(msg_ids): There's no need to cast to bool, in Python empty collections are False. In that case if msg_ids is sufficient in here. > pr_exists = len(pr_id) == 1 > if pr_exists: There's no need to create a variable here, just checking the condition is perfectly fine, here: if len(pr_id) == 1: > def _get_comment(self): > comment_user = self.data['comment']['user']['login'].encode('utf-8') > comment = self.data['comment']['body'].encode('utf-8') > url = self._get_url() > return '%s left a comment on GitHub:\n\n%s\n\n%s' % (comment_user, comment, url) I thought we agreed just to have 'User X left a comment: linkt_to_pr'. > now = date.Date(".") > min_date = now - date.Interval("00:30") > date_range_string = "from " + str(min_date) Did that work for you? For me, and I've spent last hour or so trying it out it did not. But the form "date_from;date_to" worked properly. In that case I'd suggest using: date_range_string = str(min_date) + ";" + str(now) since that one is working properly. The previous one is returning more than you actually need. _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sat Aug 20 04:15:23 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Sat, 20 Aug 2016 08:15:23 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471680923.25.0.823638024638.issue592@psf.upfronthosting.co.za> Anish Shah added the comment: > It would be nice to have the user configurable, not admin hardcoded. By configurable, do you mean creating an env var? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Sat Aug 20 07:37:58 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Sat, 20 Aug 2016 11:37:58 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471693078.33.0.366661518964.issue592@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch :) _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/roundup/pull_request.py b/roundup/pull_request.py index fc70ca5..f5f8c06 100644 --- a/roundup/pull_request.py +++ b/roundup/pull_request.py @@ -1,4 +1,5 @@ from roundup.exceptions import * +from roundup import date import hashlib import hmac @@ -15,6 +16,9 @@ else: return a == b +valid_events = ('pull_request', 'issue_comment', 'pull_request_review_comment') + + class GitHubHandler: def __init__(self, client): @@ -43,7 +47,7 @@ class GitHubHandler: def _extract(self): event = self._get_event() - if event not in ('pull_request', 'issue_comment'): + if event not in valid_events: raise Reject('Unkown X-GitHub-Event {}'.format(event)) data = json.loads(self.form.value) if event == 'pull_request': @@ -52,6 +56,9 @@ class GitHubHandler: elif event == 'issue_comment': handler = IssueComment(self.db, data) handler.dispatch() + elif event == 'pull_request_review_comment': + handler = PullRequestReviewComment(self.db, data) + handler.dispatch() def _validate_webhook_secret(self): key = os.environ['SECRET_KEY'] @@ -95,6 +102,33 @@ class Event: self.db.issue.set(issue_id, pull_requests=urls) self.db.commit() + def handle_comment(self, comment): + url = self._get_url() + issue_id = self._get_issue_id_using_url(url) + if issue_id is not None: + user_id = self.db.user.lookup(os.environ.get('GITHUB_COMMENT_USER', + 'admin')) + messages = self.db.issue.get(issue_id, 'messages') + now = date.Date('.') + min_date = now - date.Interval(os.environ.get('TIME_INTERVAL', + '00:30')) + date_range_string = str(min_date)+';'+str(now) + msg_ids = self.db.msg.filter(None, {'is_github_comment': True, + 'creation': date_range_string}) + if not msg_ids: + msg_id = self.db.msg.create(content=comment, author=user_id, + date=now, is_github_comment=True) + messages.append(msg_id) + self.db.issue.set(issue_id, messages=messages) + self.db.commit() + + def _get_issue_id_using_url(self, url): + pr_id = self.db.pull_request.filter(None, {'url': url}) + if len(pr_id) == 1: + issue_id = self.db.issue.filter(None, {'pull_requests': pr_id[0]}) + if len(issue_id) == 1: + return issue_id[0] + def _get_issue_ids(self): raise NotImplementedError @@ -166,8 +200,10 @@ class IssueComment(Event): action = self.data['action'].encode('utf-8') issue_id = self._get_issue_ids() url = self._get_url() + comment = self._get_comment() if action == 'created' and issue_id is not None: self.handle_create(url, issue_id) + self.handle_comment(comment) def _get_issue_ids(self): body = self.data['comment']['body'].encode('utf-8') @@ -181,3 +217,25 @@ class IssueComment(Event): def _get_github_username(self): return self.data['issue']['user']['login'].encode('utf-8') + + def _get_comment(self): + comment_user = self.data['comment']['user']['login'].encode('utf-8') + comment = self.data['comment']['body'].encode('utf-8') + url = self._get_url() + return '%s left a comment on GitHub:\n\n%s' % (comment_user, url) + + +class PullRequestReviewComment(IssueComment): + + def __init__(self, db, data): + self.db = db + self.data = data + + def dispatch(self): + action = self.data['action'].encode('utf-8') + comment = self._get_comment() + if action == 'created': + self.handle_comment(comment) + + def _get_url(self): + return self.data['pull_request']['html_url'] diff --git a/share/roundup/templates/classic/schema.py b/share/roundup/templates/classic/schema.py index 34ae90b..9b548fb 100644 --- a/share/roundup/templates/classic/schema.py +++ b/share/roundup/templates/classic/schema.py @@ -61,7 +61,8 @@ msg = FileClass(db, "msg", summary=String(), files=Multilink("file"), messageid=String(), - inreplyto=String()) + inreplyto=String(), + is_github_comment=Boolean()) file = FileClass(db, "file", name=String()) diff --git a/test/data/pullrequestreviewcomment.txt b/test/data/pullrequestreviewcomment.txt new file mode 100644 index 0000000..bbd143b --- /dev/null +++ b/test/data/pullrequestreviewcomment.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 04c7e753.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/375c44e +X-GitHub-Event: pull_request_review_comment +X-GitHub-Delivery: a2367880-2729-11e6-844b-d35793a4447d +content-type: application/json +X-Hub-Signature: sha1=7f716a5dc13d23aee2cb6edc6b32770769be188b +Content-Length: 21289 + +{"action":"created","comment":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170226","id":65170226,"diff_hunk":"@@ -1,5 +1,3 @@\n-test","path":"README","position":1,"original_position":1,"commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","original_commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_ur l":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Good! LGTM :)","created_at":"2016-05-31T12:17:25Z","updated_at":"2016-05-31T12:17:25Z","html_url":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170226","pull_request_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170226"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170226"},"pull_request":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"}}},"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/11","diff_url":"https://github.com/AnishShah/cpython/pull/11.diff","patch_url":"https://g ithub.com/AnishShah/cpython/pull/11.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/11","number":11,"state":"closed","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://ap i.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-31T12:17:25Z","closed_at":"2016-05-24T13:18:36Z","merged_at":"2016-05-24T13:18:36Z","merge_commit_sha":"96b494a55816c63dcb7dcca3cb6d64064c639c67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"label":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubuse rcontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v= 3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/Anish Shah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cp ython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}" ,"compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016 -05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https:// api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/Anis hShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishSh ah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/An ishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpy thon/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":" Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython ","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api. github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpytho n/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cp ython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url" :"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/data/pullrequestreviewcomment1.txt b/test/data/pullrequestreviewcomment1.txt new file mode 100644 index 0000000..aae34b4 --- /dev/null +++ b/test/data/pullrequestreviewcomment1.txt @@ -0,0 +1,11 @@ +POST /python-dev/pull_request HTTP/1.1 +Host: 04c7e753.ngrok.io +Accept: */* +User-Agent: GitHub-Hookshot/375c44e +X-GitHub-Event: pull_request_review_comment +X-GitHub-Delivery: a6629600-2729-11e6-9058-134ca76c843d +content-type: application/json +X-Hub-Signature: sha1=45a30197e4e7672bf9579ac12db8e82d9f98d321 +Content-Length: 21278 + +{"action":"created","comment":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170239","id":65170239,"diff_hunk":"@@ -1,5 +1,3 @@\n-test","path":"README","position":1,"original_position":1,"commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","original_commit_id":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_ur l":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"body":"Yep","created_at":"2016-05-31T12:17:32Z","updated_at":"2016-05-31T12:17:32Z","html_url":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170239","pull_request_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments/65170239"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11#discussion_r65170239"},"pull_request":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"}}},"pull_request":{"url":"https://api.github.com/repos/AnishShah/cpython/pulls/11","id":71217981,"html_url":"https://github.com/AnishShah/cpython/pull/11","diff_url":"https://github.com/AnishShah/cpython/pull/11.diff","patch_url":"https://github.com/ AnishShah/cpython/pull/11.patch","issue_url":"https://api.github.com/repos/AnishShah/cpython/issues/2","number":11,"state":"closed","locked":false,"title":"\"Test\"","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.co m/users/AnishShah/received_events","type":"User","site_admin":false},"body":"fixes bpo1","created_at":"2016-05-24T13:18:19Z","updated_at":"2016-05-31T12:17:32Z","closed_at":"2016-05-24T13:18:36Z","merged_at":"2016-05-24T13:18:36Z","merge_commit_sha":"96b494a55816c63dcb7dcca3cb6d64064c639c67","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits","review_comments_url":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments","review_comment_url":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1","head":{"label":"AnishShah:revert-1-test","ref":"revert-1-test","sha":"886390c8473a1d52e07d20fd97176a56c153b9a1","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.co m/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravata r_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpytho n","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/r efs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_u rl":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:1 8:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"AnishShah:master","ref":"master","sha":"a4df66a97c15e7b4145d8e4081cfa6fb316aa466","user":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github. com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"repo":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists {/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/ teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpy thon/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/comments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downlo ads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deployments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","ha s_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11"},"html":{"href":"https://github.com/AnishShah/cpython/pull/11"},"issue":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2"},"comments":{"href":"https://api.github.com/repos/AnishShah/cpython/issues/2/comments"},"review_comments":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/comments"},"review_comment":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AnishShah/cpython/pulls/11/commits"},"statuses":{"href":"https://api.github.com/repos/AnishShah/cpython/statuses/886390c8473a1d52e07d20fd97176a56c153b9a1"}}},"repository":{"id":59477756,"name":"cpython","full_name":"AnishShah/cpython","owner":{ "login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://api.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/AnishShah/cpython","description":"Semi-official read-only mirror of the CPython Mercurial repository","fork":true,"url":"https://api.github.com/repos/AnishShah/cpython","forks_url":"https://api.github.com/repos/AnishShah/cpython/forks","keys_url":"https://api.github.com/repos/AnishShah/cpython/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AnishShah/cpython/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AnishShah/cpython/teams","hooks_url":"https://api.github.com/repos/AnishShah/cpython/hooks","issue_events_url":"https://api.github.com/repos/AnishShah/cpython/issues/events{/number}","events_url":"https://api.github.com/repos/AnishShah/cpython/events","assignees_url":"https://api.github.com/repos/AnishShah/cpython/assignees{/user}","branches_url":"https://api.github.com/repos/AnishShah/cpython/branches{/branch}","tags_url":"https://api.github.com/repos/AnishShah/cpython/tags","blobs_url":"https://api.github.com/repos/AnishShah/cpython/git/blobs{/sha}","git_tags_url":"https://api.github.com/ repos/AnishShah/cpython/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AnishShah/cpython/git/refs{/sha}","trees_url":"https://api.github.com/repos/AnishShah/cpython/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AnishShah/cpython/statuses/{sha}","languages_url":"https://api.github.com/repos/AnishShah/cpython/languages","stargazers_url":"https://api.github.com/repos/AnishShah/cpython/stargazers","contributors_url":"https://api.github.com/repos/AnishShah/cpython/contributors","subscribers_url":"https://api.github.com/repos/AnishShah/cpython/subscribers","subscription_url":"https://api.github.com/repos/AnishShah/cpython/subscription","commits_url":"https://api.github.com/repos/AnishShah/cpython/commits{/sha}","git_commits_url":"https://api.github.com/repos/AnishShah/cpython/git/commits{/sha}","comments_url":"https://api.github.com/repos/AnishShah/cpython/comments{/number}","issue_comment_url":"https://api.github.com/repos/AnishShah/cpython/issues/co mments{/number}","contents_url":"https://api.github.com/repos/AnishShah/cpython/contents/{+path}","compare_url":"https://api.github.com/repos/AnishShah/cpython/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AnishShah/cpython/merges","archive_url":"https://api.github.com/repos/AnishShah/cpython/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AnishShah/cpython/downloads","issues_url":"https://api.github.com/repos/AnishShah/cpython/issues{/number}","pulls_url":"https://api.github.com/repos/AnishShah/cpython/pulls{/number}","milestones_url":"https://api.github.com/repos/AnishShah/cpython/milestones{/number}","notifications_url":"https://api.github.com/repos/AnishShah/cpython/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AnishShah/cpython/labels{/name}","releases_url":"https://api.github.com/repos/AnishShah/cpython/releases{/id}","deployments_url":"https://api.github.com/repos/AnishShah/cpython/deplo yments","created_at":"2016-05-23T11:39:11Z","updated_at":"2016-05-23T11:39:38Z","pushed_at":"2016-05-24T13:18:37Z","git_url":"git://github.com/AnishShah/cpython.git","ssh_url":"git at github.com:AnishShah/cpython.git","clone_url":"https://github.com/AnishShah/cpython.git","svn_url":"https://github.com/AnishShah/cpython","homepage":"","size":276521,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"},"sender":{"login":"AnishShah","id":3175743,"avatar_url":"https://avatars.githubusercontent.com/u/3175743?v=3","gravatar_id":"","url":"https://api.github.com/users/AnishShah","html_url":"https://github.com/AnishShah","followers_url":"https://api.github.com/users/AnishShah/followers","following_url":"https://api.github.com/users/AnishShah/following{/other_user}","gists_url":"https://a pi.github.com/users/AnishShah/gists{/gist_id}","starred_url":"https://api.github.com/users/AnishShah/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AnishShah/subscriptions","organizations_url":"https://api.github.com/users/AnishShah/orgs","repos_url":"https://api.github.com/users/AnishShah/repos","events_url":"https://api.github.com/users/AnishShah/events{/privacy}","received_events_url":"https://api.github.com/users/AnishShah/received_events","type":"User","site_admin":false}} diff --git a/test/test_pull_request.py b/test/test_pull_request.py index a9bf4ab..e87dc6f 100644 --- a/test/test_pull_request.py +++ b/test/test_pull_request.py @@ -2,6 +2,7 @@ import unittest import os import db_test_base import cgi +import time from BaseHTTPServer import BaseHTTPRequestHandler from StringIO import StringIO from roundup.cgi import client @@ -243,6 +244,37 @@ class TestCase(unittest.TestCase): state = self.db.pull_request.get(urls[0], 'state') self.assertEqual(state, "closed") + def testNonLinkedPullRequestReviewComments(self): + # Pull Request which is not linked to any issues on b.p.o + dummy_client = self._make_client("pullrequestreviewcomment.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 0) + + def testPullRequestReviewComments(self): + # Pull Request which is linked to an issue on b.p.o + dummy_client = self._make_client("pullrequestevent.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.db.close() + dummy_client = self._make_client("pullrequestreviewcomment.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 1) + self.db.close() + time.sleep(1) + dummy_client = self._make_client("pullrequestreviewcomment1.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 1) + self.db.close() + os.environ['TIME_INTERVAL'] = '00:00:05' + time.sleep(6) + dummy_client = self._make_client("pullrequestreviewcomment1.txt") + handler = GitHubHandler(dummy_client) + handler.dispatch() + self.assertEqual(len(self.db.issue.get("1", "messages")), 2) + def test_suite(): suite = unittest.TestSuite() From metatracker at psf.upfronthosting.co.za Mon Aug 22 12:50:34 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 22 Aug 2016 16:50:34 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1468432227.01.0.946283993334.issue592@psf.upfronthosting.co.za> Message-ID: <1471884634.6.0.154106197695.issue592@psf.upfronthosting.co.za> Maciej Szulik added the comment: LGTM _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 22 12:51:19 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Mon, 22 Aug 2016 16:51:19 +0000 Subject: [Tracker-discuss] [issue592] Show GitHub comments on b.p.o (depends on issue590) In-Reply-To: <1471884634.6.0.154106197695.issue592@psf.upfronthosting.co.za> Message-ID: Anish Shah added the comment: Great! :) _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 22 13:17:20 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 22 Aug 2016 17:17:20 +0000 Subject: [Tracker-discuss] [issue600] Convert patches to GitHub Pull Request In-Reply-To: <1466359411.87.0.930389612417.issue600@psf.upfronthosting.co.za> Message-ID: <1471886240.0.0.986346659337.issue600@psf.upfronthosting.co.za> Maciej Szulik added the comment: > endpoint = 'https://api.github.com/repos/AnishShah/cpython/pulls' That endpoint doesn't look right, does it ;) ? > "body": "fixes issue {}".format(issue_id), ... > commit_msg = 'Fixes issue {} : {}'.format(issue_id, title) It would be nice to use 'Fixes issue bpo' in both cases, to be consistent and so that patch from #589 links the issue properly, even if you're doing this manually in the next lines. > issue_pr = db.issue.get(issue_id, 'github_pullrequest_urls') This needs update to reflect current state of #586, additionally you should update the title to have that dependency in the title, like the others. > # err takes stdout > # if err: > # raise Exception(err) We do need proper error handling, still. > filename = db.file.get(file_id, 'name') > content = db.file.get(file_id, 'content') > fp = open(os.path.join(path, filename), 'wb') > fp.write(content) > fp.close() Create a ContextManager (you need to write one manually) using tempfile.mkdtemp to create a temporary directory and clean it afterwards. > # git_workflow(newvalues) If not needed - remove, if needed - uncomment. Would it be hard to add test cases covering that flow? _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Mon Aug 22 14:46:35 2016 From: metatracker at psf.upfronthosting.co.za (Anish Shah) Date: Mon, 22 Aug 2016 18:46:35 +0000 Subject: [Tracker-discuss] [issue600] Convert patches to GitHub Pull Request (depends on issue586) In-Reply-To: <1466359411.87.0.930389612417.issue600@psf.upfronthosting.co.za> Message-ID: <1471891595.13.0.94944454108.issue600@psf.upfronthosting.co.za> Anish Shah added the comment: I have updated the patch. > We do need proper error handling, still. The problem is "err" variable has stdout of that process. So, even if we change/push branch, it will be non-empty. Any idea how to solve this problem? One more thing, if we create PR using API, it triggers GitHub webhooks. So, I'm removing the part where we are storing the response in DB. Also, I'm not sure how to add tests for this. ---------- title: Convert patches to GitHub Pull Request -> Convert patches to GitHub Pull Request (depends on issue586) _______________________________________________________ PSF Meta Tracker _______________________________________________________ -------------- next part -------------- diff --git a/detectors/patches.py b/detectors/patches.py index 18d3db4..9e2e01e 100644 --- a/detectors/patches.py +++ b/detectors/patches.py @@ -5,10 +5,97 @@ import posixpath import identify_patch +import os +import subprocess +import string +import random +import json +import requests +import tempfile +import shutil +import logging patchtypes = ('.diff', '.patch') sourcetypes = ('.diff', '.patch', '.py') + +class TemporaryDirectory(object): + + def __enter__(self): + self.name = tempfile.mkdtemp() + return self.name + + def __exit__(self, *args): + shutil.rmtree(self.name) + + +def create_pull_request(db, head, base, issue_id, issue_title): + endpoint = 'https://api.github.com/repos/python/cpython/pulls' + access_token = os.environ['ACCESS_TOKEN'] + headers = {'Authorization': 'token {}'.format(access_token)} + data = json.dumps({ + "title": "{}".format(issue_title), + "body": "fixes issue bpo{}".format(issue_id), + "base": base, "head": head}) + response = requests.post(endpoint, headers=headers, data=data) + if not response.ok: + logging.error(response.text, exc_info=True) + raise Exception('Error while creating pull request') + else: + response_body = response.json() + url = response_body['html_url'] + state = response_body['state'] + pr_id = db.pull_request.create(url=url, state=state) + issue_pr = db.issue.get(issue_id, 'pull_requests') + issue_pr.append(pr_id) + db.issue.set(issue_id, pull_requests=issue_pr) + db.commit() + + +def git_command(command, path): + process = subprocess.Popen(command, cwd=path, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = process.communicate() + # err takes stdout + # if err: + # raise Exception(err) + + +def git_workflow(db, issue_id, file_id): + try: + path = os.environ['GIT_PATH'] + versions = map(lambda id: (db.version.get(id, 'name'), db.version.get(id, 'order')), + db.issue.get(issue_id, 'versions')) + title = db.issue.get(issue_id, 'title') + commit_msg = 'Fixes issue bpo{} : {}'.format(issue_id, title) + if len(versions) == 0: + parent_branch = "master" + else: + version = versions.pop() + if version[1] == 1: + parent_branch = "master" + else: + parent_branch = version[0].split()[1] + branch_name = ''.join([random.choice(string.ascii_letters) for i in range(random.choice(range(10, 20)))]) + with TemporaryDirectory() as temp_dir: + filepath = os.path.join(temp_dir, db.file.get(file_id, 'name')) + content = db.file.get(file_id, 'content') + with open(filepath, 'wb') as fp: + fp.write(content) + git_command("git checkout {}".format(parent_branch), path) + git_command("git checkout -b {}".format(branch_name), path) + git_command("git apply {}".format(filepath), path) + git_command("git add -A", path) + git_command("git commit -m \"{}\"".format(commit_msg), path) + git_command("git push origin {}".format(branch_name), path) + git_command("git checkout {}".format(parent_branch), path) + git_command("git branch -D {}".format(branch_name), path) + create_pull_request(db, branch_name, parent_branch, issue_id, title) + except Exception, message: + logging.error(message, exc_info=True) + raise ValueError('Error!') + + def ispatch(file, types): return posixpath.splitext(file)[1] in types @@ -26,6 +113,7 @@ def patches_keyword(db, cl, nodeid, newvalues): for fileid in newfiles: if ispatch(db.file.get(fileid, 'name'), patchtypes): newpatch = True + git_workflow(db, nodeid, fileid) break if newpatch: # Add the patch keyword if its not already there diff --git a/initial_data.py b/initial_data.py index dc0ed4f..a9eee3a 100644 --- a/initial_data.py +++ b/initial_data.py @@ -49,13 +49,12 @@ component.create(name="Windows", order="18") component.create(name="XML", order="19") version = db.getclass('version') -version.create(name='Python 3.1', order='1') -version.create(name='Python 3.0', order='2') -version.create(name='Python 2.7', order='3') -version.create(name='Python 2.6', order='4') -version.create(name='Python 2.5', order='5') -version.create(name='Python 2.4', order='6') -version.create(name='3rd party', order='7') +version.create(name='Python 3.6', order='1') +version.create(name='Python 3.5', order='2') +version.create(name='Python 3.4', order='3') +version.create(name='Python 3.3', order='4') +version.create(name='Python 3.2', order='5') +version.create(name='Python 2.7', order='6') severity = db.getclass('severity') From metatracker at psf.upfronthosting.co.za Mon Aug 29 16:40:43 2016 From: metatracker at psf.upfronthosting.co.za (Maciej Szulik) Date: Mon, 29 Aug 2016 20:40:43 +0000 Subject: [Tracker-discuss] [issue600] Convert patches to GitHub Pull Request (depends on issue586) In-Reply-To: <1466359411.87.0.930389612417.issue600@psf.upfronthosting.co.za> Message-ID: <1472503243.36.0.0543699574651.issue600@psf.upfronthosting.co.za> Maciej Szulik added the comment: > I have updated the patch. Thank you, the patch itself LGTM. > > We do need proper error handling, still. > The problem is "err" variable has stdout of that process. So, even if we change/push branch, it will be non-empty. Any idea how to solve this problem? If I'm reading this [1] correctly communicate returns you a tuple where first argument is stdout contents and second stderr, isn't that what you want? > One more thing, if we create PR using API, it triggers GitHub webhooks. So, I'm removing the part where we are storing the response in DB. Yup, your webhook should handle that part nicely, already. > Also, I'm not sure how to add tests for this. Yeah, let's leave it like this for now. [1] https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 30 01:53:12 2016 From: metatracker at psf.upfronthosting.co.za (Aviv Palivoda) Date: Tue, 30 Aug 2016 05:53:12 +0000 Subject: [Tracker-discuss] [issue604] Login peoblems Message-ID: <1472536392.75.0.147354051696.issue604@psf.upfronthosting.co.za> New submission from Aviv Palivoda: Since yesterday I have problems with my login to bugs.python.org. After I login I can't move to any other page without being disconnected from my user. Username:palaviv at gmail.com UserID:23193 ---------- messages: 3159 nosy: palaviv priority: bug status: unread title: Login peoblems _______________________________________________________ PSF Meta Tracker _______________________________________________________ From metatracker at psf.upfronthosting.co.za Tue Aug 30 13:58:37 2016 From: metatracker at psf.upfronthosting.co.za (Aviv Palivoda) Date: Tue, 30 Aug 2016 17:58:37 +0000 Subject: [Tracker-discuss] [issue604] Login peoblems In-Reply-To: <1472536392.75.0.147354051696.issue604@psf.upfronthosting.co.za> Message-ID: <1472579917.83.0.579049796223.issue604@psf.upfronthosting.co.za> Aviv Palivoda added the comment: Seems to work now... ---------- status: unread -> resolved _______________________________________________________ PSF Meta Tracker _______________________________________________________ From roundup-admin at psf.upfronthosting.co.za Tue Aug 30 16:44:11 2016 From: roundup-admin at psf.upfronthosting.co.za (Python tracker) Date: Tue, 30 Aug 2016 20:44:11 +0000 Subject: [Tracker-discuss] Failed issue tracker submission Message-ID: <20160830204411.BABDA56897@psf.upfronthosting.co.za> The node specified by the designator in the subject of your message ("28894") does not exist. Subject was: "[issue28894]" Mail Gateway Help ================= Incoming messages are examined for multiple parts: . In a multipart/mixed message or part, each subpart is extracted and examined. The text/plain subparts are assembled to form the textual body of the message, to be stored in the file associated with a "msg" class node. Any parts of other types are each stored in separate files and given "file" class nodes that are linked to the "msg" node. . In a multipart/alternative message or part, we look for a text/plain subpart and ignore the other parts. . A message/rfc822 is treated similar tomultipart/mixed (except for special handling of the first text part) if unpack_rfc822 is set in the mailgw config section. Summary ------- The "summary" property on message nodes is taken from the first non-quoting section in the message body. The message body is divided into sections by blank lines. Sections where the second and all subsequent lines begin with a ">" or "|" character are considered "quoting sections". The first line of the first non-quoting section becomes the summary of the message. Addresses --------- All of the addresses in the To: and Cc: headers of the incoming message are looked up among the user nodes, and the corresponding users are placed in the "recipients" property on the new "msg" node. The address in the From: header similarly determines the "author" property of the new "msg" node. The default handling for addresses that don't have corresponding users is to create new users with no passwords and a username equal to the address. (The web interface does not permit logins for users with no passwords.) If we prefer to reject mail from outside sources, we can simply register an auditor on the "user" class that prevents the creation of user nodes with no passwords. Actions ------- The subject line of the incoming message is examined to determine whether the message is an attempt to create a new item or to discuss an existing item. A designator enclosed in square brackets is sought as the first thing on the subject line (after skipping any "Fwd:" or "Re:" prefixes). If an item designator (class name and id number) is found there, the newly created "msg" node is added to the "messages" property for that item, and any new "file" nodes are added to the "files" property for the item. If just an item class name is found there, we attempt to create a new item of that class with its "messages" property initialized to contain the new "msg" node and its "files" property initialized to contain any new "file" nodes. Triggers -------- Both cases may trigger detectors (in the first case we are calling the set() method to add the message to the item's spool; in the second case we are calling the create() method to create a new node). If an auditor raises an exception, the original message is bounced back to the sender with the explanatory message given in the exception. -------------- next part -------------- Return-Path: X-Original-To: report at bugs.python.org Delivered-To: roundup+tracker at psf.upfronthosting.co.za Received: from rs232.mailgun.us (rs232.mailgun.us [209.61.151.232]) by psf.upfronthosting.co.za (Postfix) with ESMTP id 67D5B56894 for ; Tue, 30 Aug 2016 22:44:10 +0200 (CEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=psf.io; q=dns/txt; s=pic; t=1472589848; h=Subject: To: From: Content-Transfer-Encoding: Content-Type: MIME-Version: Message-Id: Date: Sender; bh=6xB1oXkN1i0SLUqc9Y6eUqdDn3bthHJWH1w6/ZUz7I8=; b=P+dYuFfsHLZ46zKQPpyvw1BeLOs8tuR0p9nOgQIDPsB6rwgaq/dtOFZmiiDfC91Cf+BAhgIO ySkJ+aF65+bj9GvNFz1PsMQ+ysobWcniB97sHLDWP6jsCZS0W49vFk9QY6Wv3vKHmTYagwaS L98HqRg8nj85e9CsGM1p1Ng9+qc= DomainKey-Signature: a=rsa-sha1; c=nofws; d=psf.io; s=pic; q=dns; h=Sender: Date: Message-Id: MIME-Version: Content-Type: Content-Transfer-Encoding: From: To: Subject; b=VBpg+xwx4+RvAlOCrXsLgjWaOxveQVf0ykpdKi+IyhSYBQGHTt4r8li9sj65C2MLYbHQEo If3dzkKI1lnL2fncDHxcUZe5rii9Zk1wYa2UAUOY36n/e27CsjH4WC+fmVLV8rSgk4shnwXF ZXq1ecxzt5xeugj+VBg0WkDKZVojQ= Sender: tracker-discuss=python.org at psf.io Date: Tue, 30 Aug 2016 20:44:08 +0000 X-Mailgun-Sid: WyIzZGMxOSIsICJyZXBvcnRAYnVncy5weXRob24ub3JnIiwgIjliMWM2Il0= Message-Id: <20160830204408.2749.31340.0AF8BC89 at psf.io> Received: from hg.iad1.psf.io (hg.psf.io [23.253.158.192]) by mxa.mailgun.org with ESMTP id 57c5f018.7fbeb8d79490-in01; Tue, 30 Aug 2016 20:44:08 -0000 (UTC) MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 From: tracker-discuss at python.org To: report at bugs.python.org Subject: [issue28894] TmV3IGNoYW5nZXNldCBmNjczYTYwYmRjMWEgYnkgUmF5bW9uZCBIZXR0aW5nZXIgaW4gYnJhbmNo ICdkZWZhdWx0JzoKSXNzdWUgIzI4ODk0OiBGaXggdG9fYWRkcnMgcmVmcyBpbiBzbXRwbGliIGRv Y3MKaHR0cHM6Ly9oZy5weXRob24ub3JnL2NweXRob24vcmV2L2Y2NzNhNjBiZGMxYQo=