def post(self): if not validate_captcha(self): return url = self.request.get('url') match = re.match(r'https://github.com/(.*?)/([^/]*)(.*)', url) if match is None: self.response.set_status(400) self.response.write('Unable to understand url (%s)' % url) owner = match.group(1) repo = match.group(2) tail = match.group(3) # SHA already defined match = re.match(r'.*commits?/(.*)', tail) if match: self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Content-Type'] = 'application/json' self.response.write('%s/%s/%s' % (owner, repo, match.group(1))) util.new_task(util.ingest_preview_task(owner, repo), params={ 'commit': match.group(1), 'url': url }, target='manage') return # Resolve SHA using these patterns and Github API tail = re.sub(r'/pull/(.*)', r'pull/\1/head', tail) tail = re.sub(r'/tree/(.*)', r'heads/\1', tail) tail = re.sub(r'^$', r'heads/master', tail) if not tail: self.response.set_status(400) self.response.write('Unable to understand url (%s)' % url) response = util.github_get('repos', owner, repo, 'git/refs/' + tail) if response.status_code == 404: self.response.set_status(400) self.response.write('Error resolving url (%s)' % url) sha = json.loads(response.content)['object']['sha'] util.new_task(util.ingest_preview_task(owner, repo), params={ 'commit': sha, 'url': url }, target='manage') self.response.headers['Access-Control-Allow-Origin'] = '*' self.response.headers['Content-Type'] = 'application/json' self.response.write('%s/%s/%s' % (owner, repo, sha))
def test_ingest_preview(self): self.respond_to_github('https://api.github.com/repos/org/repo', '{"owner":{"login":"******"},"name":"repo"}') self.respond_to_github( 'https://api.github.com/repos/org/repo/contributors', '["a"]') self.respond_to_github( 'https://api.github.com/repos/org/repo/stats/participation', '{}') self.respond_to_github( 'https://raw.githubusercontent.com/org/repo/master/bower.json', '{"license": "MIT"}') response = self.app.get(util.ingest_preview_task('org', 'repo'), params={ 'commit': 'commit-sha', 'url': 'url' }, headers={'X-AppEngine-QueueName': 'default'}) self.assertEqual(response.status_int, 200) library = Library.get_by_id('org/repo') self.assertIsNotNone(library) self.assertIsNone(library.error) self.assertTrue(library.shallow_ingestion) version = Version.get_by_id('commit-sha', parent=library.key) self.assertEquals(version.status, Status.pending) self.assertEquals(version.sha, 'commit-sha') self.assertEquals(version.url, 'url') self.assertTrue(version.preview) tasks = self.tasks.get_filtered_tasks() self.assertEqual(len(tasks), 2) self.assertEqual([ util.ingest_analysis_task('org', 'repo', 'commit-sha'), util.ingest_version_task('org', 'repo', 'commit-sha'), ], [task.url for task in tasks])
def test_ingest_preview(self): self.respond_to_github('https://api.github.com/repos/org/repo', '{"owner":{"login":"******"},"name":"repo"}') self.respond_to_github('https://api.github.com/repos/org/repo/contributors', '["a"]') self.respond_to_github('https://api.github.com/repos/org/repo/stats/participation', '{}') self.respond_to_github('https://raw.githubusercontent.com/org/repo/master/bower.json', '{"license": "MIT"}') response = self.app.get(util.ingest_preview_task('org', 'repo'), params={'commit': 'commit-sha', 'url': 'url'}, headers={'X-AppEngine-QueueName': 'default'}) self.assertEqual(response.status_int, 200) library = Library.get_by_id('org/repo') self.assertIsNotNone(library) self.assertIsNone(library.error) self.assertTrue(library.shallow_ingestion) version = Version.get_by_id('commit-sha', parent=library.key) self.assertEquals(version.status, Status.pending) self.assertEquals(version.sha, 'commit-sha') self.assertEquals(version.url, 'url') self.assertTrue(version.preview) tasks = self.tasks.get_filtered_tasks() self.assertEqual(len(tasks), 2) self.assertEqual([ util.ingest_analysis_task('org', 'repo', 'commit-sha'), util.ingest_version_task('org', 'repo', 'commit-sha'), ], [task.url for task in tasks])
def post(self): if self.request.headers.get('X-Github-Event') != 'pull_request': self.response.set_status(202) # Accepted self.response.write('Payload was not for a pull_request, aborting.') return payload = json.loads(self.request.body) if payload['action'] != 'opened' and payload['action'] != 'synchronize': self.response.set_status(202) # Accepted self.response.write('Payload was not opened or synchronize, aborting.') return # Original repo origin_owner = payload['repository']['owner']['login'] origin_repo = payload['repository']['name'] origin_full_name = payload['repository']['full_name'] # Repo where the pull request came from. pull_owner = payload['pull_request']['head']['repo']['owner']['login'] pull_repo = payload['pull_request']['head']['repo']['name'] key = ndb.Key(Library, Library.id(origin_owner, origin_repo)) library = key.get(read_policy=ndb.EVENTUAL_CONSISTENCY) if library is None: logging.error('No library object found for %s', origin_full_name) self.response.set_status(400) # Bad request self.response.write('It does not seem like this repository was registered') return sha = payload['pull_request']['head']['sha'] parsed_url = urlparse(self.request.url) params = { 'state': 'success', 'target_url': '%s://%s/preview/%s/%s/%s' % (parsed_url.scheme, parsed_url.netloc, pull_owner, pull_repo, sha), 'description': 'Preview is ready!', # TODO: Don't lie 'context': 'webcomponents/preview' } response = util.github_post('repos', origin_owner, origin_repo, 'statuses/%s' % sha, params, library.github_access_token) if response.status_code != 201: logging.error('Failed to set status on Github PR. Github returned %s:%s', response.status_code, response.content) self.response.set_status(500) self.response.write('Failed to set status on PR.') return pull_request_url = payload['pull_request']['url'] util.new_task(util.ingest_preview_task(pull_owner, pull_repo), params={'commit': sha, 'url': pull_request_url}, target='manage')