Пример #1
0
 def unpack(self):
     return dict(
         commits=[
             ScmCommit.from_json(element) for element in json.loads(
                 UploadContext.from_zip(bytearray(self.commits)))
         ],
         sdk=None if self.sdk == '?' else self.sdk,
         test_results=json.loads(
             UploadContext.from_zip(bytearray(self.test_results))),
         timestamp=calendar.timegm(self.time_uploaded.timetuple()),
         version=self.upload_version,
     )
Пример #2
0
 def test_find_range_uuid(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL +
         '/api/commits?after_uuid=160166800000&before_uuid=160166800001')
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [Commit.from_json(element).hash for element in response.json()],
         [
             'bae5d1e90999d4f916a8a15810ccfa43f37a2fd6',
             'd8bce26fa65c6fc8f39c17927abb77f69fab82fc',
         ],
     )
Пример #3
0
    def test_register_with_partial_commit(self, client, **kwargs):
        with MockModelFactory.safari(), MockModelFactory.webkit(
        ), OutputCapture():
            self.assertEqual(
                200,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='safari',
                                      id='d8bce26fa65c')).status_code)
            response = client.get(self.URL +
                                  '/api/commits?repository_id=safari')
            self.assertEqual(200, response.status_code)
            self.assertEqual(
                Commit.from_json(response.json()[0]).message,
                'Patch Series\n',
            )
            self.assertEqual(
                404,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='safari',
                                      id='aaaaaaaaaaaaa')).status_code)

            self.assertEqual(
                200,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='webkit',
                                      id='6')).status_code)
            response = client.get(self.URL +
                                  '/api/commits?repository_id=webkit')
            self.assertEqual(200, response.status_code)
            self.assertEqual(
                Commit.from_json(response.json()[0]).message,
                '6th commit',
            )
            self.assertEqual(
                404,
                client.post(self.URL + '/api/commits',
                            data=dict(repository_id='webkit',
                                      id='1234')).status_code)
Пример #4
0
 def test_find_range_timestamp(self, client, **kwargs):
     self.register_all_commits(client)
     response = client.get(
         self.URL +
         '/api/commits?after_timestamp=1601637900&before_timestamp=1601639900'
     )
     self.assertEqual(200, response.status_code)
     self.assertEqual(
         [
             Commit.from_json(element).revision
             for element in response.json()
         ],
         [4, 6],
     )
Пример #5
0
 def run_function_through_redis_cache(self, key, function):
     result = self.redis.get('commit_mapping:' + key)
     if result:
         try:
             result = [
                 Commit.from_json(element) for element in json.loads(result)
             ]
         except ValueError:
             result = None
     if result is None:
         result = function()
     if result:
         self.redis.set('commit_mapping:' + key,
                        json.dumps(result, cls=Commit.Encoder),
                        ex=self.cache_timeout)
     return result
Пример #6
0
    def test_from_json_str(self):
        contributor = Contributor.from_scm_log(
            'Author: [email protected] <*****@*****.**>')
        self.assertEqual(
            Commit.from_json('''{
    "revision": 1,
    "hash": "c3bd784f8b88bd03f64467ddd3304ed8be28acbe",
    "identifier": "1@main",
    "timestamp": 1000,
    "author": "*****@*****.**",
    "message": "Message"
}'''),
            Commit(revision=1,
                   hash='c3bd784f8b88bd03f64467ddd3304ed8be28acbe',
                   identifier='1@main',
                   timestamp=1000,
                   author=Contributor.Encoder().default(contributor),
                   message='Message'),
        )
Пример #7
0
    def register(self, commit=None, fast=True):
        is_endpoint = not bool(commit)
        if is_endpoint:
            AssertRequest.is_type(['POST'])
            AssertRequest.no_query()

        if is_endpoint:
            try:
                commit = request.form or json.loads(request.get_data())
                if 'api_key' in commit:
                    del commit['api_key']
            except ValueError:
                abort(400, description='Expected uploaded data to be json')

        try:
            candidate = ScmCommit.from_json(commit)

            # Commit needs to be sufficiently defined
            if candidate.repository_id and candidate.branch and candidate.timestamp and (
                    candidate.revision or candidate.hash):
                self.commit_context.register_commit(candidate)
                if is_endpoint:
                    return jsonify({'status': 'ok'})
                return candidate
        except ValueError:
            pass

        required_args = ['repository_id']
        for arg in required_args:
            if arg not in commit:
                abort(400, description=f"'{arg}' required to define commit")

        has_ref = False
        one_of_args = ['id', 'ref', 'hash', 'revision', 'identifier']
        for arg in one_of_args:
            if arg in commit:
                if has_ref:
                    abort(400,
                          description='Multiple commit references specified')
                has_ref = True
        if not has_ref:
            abort(400, description='No commit reference specified')

        for arg in commit.keys():
            if arg in required_args or arg in one_of_args:
                continue
            if arg in ['branch', 'timestamp', 'order', 'committer', 'message']:
                abort(
                    400,
                    description=
                    'Not enough arguments provided to define a commit, but too many to search for a commit'
                )
            abort(400,
                  description=f"'{arg}' is not valid for defining commits")

        try:
            commit = self.commit_context.register_partial_commit(
                repository_id=commit.get('repository_id'),
                ref=commit.get('id') or commit.get('ref'),
                hash=commit.get('hash'),
                revision=commit.get('revision'),
                identifier=commit.get('identifier'),
                fast=fast,
            )
        except (RuntimeError, ScmBase.Exception) as error:
            abort(404, description=str(error))

        if is_endpoint:
            return jsonify({'status': 'ok'})
        return Commit(
            repository_id=commit.repository_id,
            id=commit.revision or commit.hash,
            branch=commit.branch,
            timestamp=commit.timestamp,
            order=commit.order,
            committer=commit.author.email if commit.author else None,
            message=commit.message,
        )