Esempio n. 1
0
    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))
Esempio n. 2
0
    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])
Esempio n. 3
0
  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])
Esempio n. 4
0
  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')