def test_redirect_git_numbering(self):
        my_repo = model_helpers.create_repo()
        my_repo.project = 'chromium'
        my_repo.repo = 'chromium/src'
        my_repo.put()
        my_commit = model_helpers.create_commit()
        my_commit.project = my_repo.project
        my_commit.repo = my_repo.repo
        my_commit.put()
        my_numberings = model_helpers.create_numberings()
        my_numberings[1].project = my_repo.project
        my_numberings[1].repo = my_repo.repo

        for numbering in my_numberings:
            numbering.put()

        generated = controller.calculate_redirect('100')
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_FROM_NUMBER,
            redirect_url=my_commit.redirect_url,
            repo=my_commit.repo,
            project=my_commit.project,
            git_sha=my_commit.git_sha,
            repo_url='https://chromium.googlesource.com/chromium/src/',
        )

        self.assertEqual(generated, expected)
    def test_redirect_numeric_log_fallback(self):
        # If we don't know about one of the numbers, assume they're short hashes.
        my_repo = model_helpers.create_repo()
        my_repo.project = 'chromium'
        my_repo.repo = 'chromium/src'
        my_repo.put()
        first_commit = model_helpers.create_commit()
        first_commit.git_sha = 'deadbeef' * 5
        first_commit.project = my_repo.project
        first_commit.repo = my_repo.repo
        first_commit.put()
        my_numberings = model_helpers.create_numberings()
        my_numberings[1].git_sha = 'deadbeef' * 5
        my_numberings[1].project = my_repo.project
        my_numberings[1].repo = my_repo.repo

        for numbering in my_numberings:
            numbering.put()

        query = '100..123456'
        generated = controller.calculate_redirect(query)
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_LOG,
            redirect_url=(
                'https://chromium.googlesource.com/chromium/src/+log/%s' %
                query),
        )
        self.assertEquals(generated, expected)
Exemple #3
0
def calculate_redirect(arg):
    """Given a query, return a redirect URL depending on a fixed set of rules."""
    if NUMBER_REGEX.match(arg):
        numbering = fetch_default_number(arg)
        if numbering:
            repo_obj = models.Repo.get_key_by_id(numbering.project,
                                                 numbering.repo).get()
            repo_url = calculate_repo_url(repo_obj)
            return models.Redirect(
                redirect_type=models.RedirectType.GIT_FROM_NUMBER,
                redirect_url=numbering.redirect_url,
                project=numbering.project,
                repo=numbering.repo,
                git_sha=numbering.git_sha,
                repo_url=repo_url,
            )

    if FULL_GIT_SHA.match(arg):
        revision_map = ndb.Key(models.RevisionMap, arg).get()
        if revision_map:
            repo_obj = models.Repo.get_key_by_id(revision_map.project,
                                                 revision_map.repo).get()
            repo_url = calculate_repo_url(repo_obj)
            return models.Redirect(
                redirect_type=models.RedirectType.GIT_FULL,
                redirect_url=revision_map.redirect_url,
                project=revision_map.project,
                repo=revision_map.repo,
                git_sha=revision_map.git_sha,
                repo_url=repo_url,
            )

    if RIETVELD_REGEX.match(arg):
        return models.Redirect(
            redirect_type=models.RedirectType.RIETVELD,
            redirect_url='https://codereview.chromium.org/%s' % arg)

    if SHORT_GIT_SHA.match(arg) and not NUMBER_REGEX.match(arg):
        return models.Redirect(
            redirect_type=models.RedirectType.GIT_SHORT,
            redirect_url='https://chromium.googlesource.com/chromium/src/+/%s'
            % (arg, ))

    return None
    def test_redirect_gerrit(self):
        query = 'c'
        generated = controller.calculate_redirect(query)

        expected = models.Redirect(
            redirect_type=models.RedirectType.GERRIT,
            redirect_url='https://chromium-review.googlesource.com/c',
        )

        self.assertEquals(generated, expected)
    def test_redirect_rietveld(self):
        query = '10000000'
        generated = controller.calculate_redirect(query)

        expected = models.Redirect(
            redirect_type=models.RedirectType.RIETVELD,
            redirect_url='https://codereview.chromium.org/%s' % query,
        )

        self.assertEquals(generated, expected)
    def test_redirect_unknown_full_sha(self):
        query = 'deadbb0b' * 5
        generated = controller.calculate_redirect(query)

        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_FULL,
            redirect_url='https://chromium.googlesource.com/chromium/src/+/%s'
            % (query, ),
        )

        self.assertEquals(generated, expected)
    def test_redirect_short_git_sha(self):
        query = 'deadbeef'
        generated = controller.calculate_redirect(query)

        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_SHORT,
            redirect_url='https://chromium.googlesource.com/chromium/src/+/%s'
            % (query, ),
        )

        self.assertEquals(generated, expected)
    def test_redirect_short_log(self):
        query = 'deadbeef..baddecaf'
        generated = controller.calculate_redirect(query)

        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_LOG,
            redirect_url=(
                'https://chromium.googlesource.com/chromium/src/+log/%s' %
                query),
        )

        self.assertEquals(generated, expected)
    def test_redirect_crazy_log(self):
        my_repo = model_helpers.create_repo()
        my_repo.put()
        my_commit = model_helpers.create_commit()
        my_commit.put()

        query = '%s^^!...FEEDCAFEB33F@' % my_commit.git_sha
        generated = controller.calculate_redirect(query)
        expected_url = 'https://cool.googlesource.com/cool_src/+log/%s' % query
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_LOG,
            redirect_url=expected_url,
            repo=my_commit.repo,
            repo_url='https://cool.googlesource.com/cool_src/',
        )
        self.assertEqual(generated, expected)
    def test_redirect_numeric_log(self):
        # It's necessary to overwrite the model_helpers defaults with chromium/src
        # so that the numbering (which only works in chromium/src) can look up
        # the fake commits we create.
        my_repo = model_helpers.create_repo()
        my_repo.project = 'chromium'
        my_repo.repo = 'chromium/src'
        my_repo.put()
        first_commit = model_helpers.create_commit()
        first_commit.git_sha = 'deadbeef' * 5
        first_commit.project = my_repo.project
        first_commit.repo = my_repo.repo
        first_commit.put()
        second_commit = model_helpers.create_commit()
        second_commit.git_sha = 'baddecaf' * 5
        second_commit.project = my_repo.project
        second_commit.repo = my_repo.repo
        second_commit.put()
        my_numberings = model_helpers.create_numberings()
        my_numberings[1].git_sha = 'deadbeef' * 5
        my_numberings[1].project = my_repo.project
        my_numberings[1].repo = my_repo.repo
        my_numberings.append(
            models.NumberingMap(
                numbering_type=models.NumberingType.COMMIT_POSITION,
                numbering_identifier='refs/heads/master',
                number=123456,
                project='chromium',
                repo='chromium/src',
                git_sha=second_commit.git_sha,
                redirect_url='https://crrev.com/%s' % second_commit.git_sha))

        for numbering in my_numberings:
            numbering.put()

        generated = controller.calculate_redirect('100..123456')
        expected_url = ('https://chromium.googlesource.com/chromium/src/+log/'
                        'deadbeefdeadbeefdeadbeefdeadbeefdeadbeef..'
                        'baddecafbaddecafbaddecafbaddecafbaddecaf')
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_LOG,
            redirect_url=expected_url,
            repo=first_commit.repo,
            repo_url='https://chromium.googlesource.com/chromium/src/',
        )

        self.assertEqual(generated, expected)
    def test_redirect_git_sha(self):
        my_repo = model_helpers.create_repo()
        my_repo.put()
        my_commit = model_helpers.create_commit()
        my_commit.put()

        generated = controller.calculate_redirect(my_commit.git_sha)
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_FULL,
            redirect_url=my_commit.redirect_url,
            repo=my_commit.repo,
            project=my_commit.project,
            git_sha=my_commit.git_sha,
            repo_url='https://cool.googlesource.com/cool_src/',
        )

        self.assertEqual(expected, generated)
    def test_redirect_full_log(self):
        my_repo = model_helpers.create_repo()
        my_repo.put()
        first_commit = model_helpers.create_commit()
        first_commit.put()
        second_commit = model_helpers.create_commit()
        second_commit.git_sha = 'baddecaf' * 5
        second_commit.put()

        query = '%s..%s' % (first_commit.git_sha, second_commit.git_sha)
        generated = controller.calculate_redirect(query)
        expected_url = 'https://cool.googlesource.com/cool_src/+log/%s' % query
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_LOG,
            redirect_url=expected_url,
            repo=first_commit.repo,
            repo_url='https://cool.googlesource.com/cool_src/',
        )
        self.assertEqual(generated, expected)
    def test_redirect_svn_numbering(self):
        my_repo = model_helpers.create_repo()
        my_repo.put()
        my_commit = model_helpers.create_commit()
        my_commit.put()
        my_numberings = model_helpers.create_numberings()
        my_numberings[0].numbering_identifier = 'svn://svn.chromium.org/chrome'

        for numbering in my_numberings:
            numbering.put()

        generated = controller.calculate_redirect('100')
        expected = models.Redirect(
            redirect_type=models.RedirectType.GIT_FROM_NUMBER,
            redirect_url=my_commit.redirect_url,
            repo=my_commit.repo,
            project=my_commit.project,
            git_sha=my_commit.git_sha,
            repo_url='https://cool.googlesource.com/cool_src/',
        )

        self.assertEqual(generated, expected)
Exemple #14
0
def calculate_redirect(arg):
    """Given a query, return a redirect URL depending on a fixed set of rules."""
    # NB: When adding new matchers, please update the usage in main.html.

    if NUMBER_REGEX.match(arg):
        numbering = fetch_default_number(arg)
        if numbering:
            repo_obj = models.Repo.get_key_by_id(numbering.project,
                                                 numbering.repo).get()
            repo_url = calculate_repo_url(repo_obj)
            return models.Redirect(
                redirect_type=models.RedirectType.GIT_FROM_NUMBER,
                redirect_url=numbering.redirect_url,
                project=numbering.project,
                repo=numbering.repo,
                git_sha=numbering.git_sha,
                repo_url=repo_url,
            )

    if FULL_GIT_SHA.match(arg):
        revision_map = ndb.Key(models.RevisionMap, arg).get()
        if revision_map:
            repo_obj = models.Repo.get_key_by_id(revision_map.project,
                                                 revision_map.repo).get()
            repo_url = calculate_repo_url(repo_obj)
            return models.Redirect(
                redirect_type=models.RedirectType.GIT_FULL,
                redirect_url=revision_map.redirect_url,
                project=revision_map.project,
                repo=revision_map.repo,
                git_sha=revision_map.git_sha,
                repo_url=repo_url,
            )
        return models.Redirect(
            redirect_type=models.RedirectType.GIT_FULL,
            redirect_url='https://chromium.googlesource.com/chromium/src/+/%s'
            % (arg, ))

    if GERRIT_REGEX.match(arg):
        return models.Redirect(
            redirect_type=models.RedirectType.GERRIT,
            redirect_url='https://%s-review.googlesource.com/c' %
            (GERRIT_HOST_MAP[arg]))

    if RIETVELD_REGEX.match(arg):
        return models.Redirect(
            redirect_type=models.RedirectType.RIETVELD,
            redirect_url='https://codereview.chromium.org/%s' % arg)

    if SHORT_GIT_SHA.match(arg) and not NUMBER_REGEX.match(arg):
        return models.Redirect(
            redirect_type=models.RedirectType.GIT_SHORT,
            redirect_url='https://chromium.googlesource.com/chromium/src/+/%s'
            % (arg, ))

    if GIT_LOG_REGEX.match(arg):
        m = GIT_LOG_REGEX.match(arg)
        first_arg, infix, second_arg, suffix = m.groups()

        if NUMBER_REGEX.match(first_arg) and NUMBER_REGEX.match(second_arg):
            # Both were given as numbers, so look them both up.
            first_numbering = fetch_default_number(first_arg)
            second_numbering = fetch_default_number(second_arg)
            if first_numbering and second_numbering and (
                    first_numbering.repo == second_numbering.repo):
                repo_obj = models.Repo.get_key_by_id(
                    first_numbering.project, first_numbering.repo).get()
                repo_url = calculate_repo_url(repo_obj)
                redirect_url = '%s+log/%s%s%s%s' % (
                    repo_url, first_numbering.git_sha, infix,
                    second_numbering.git_sha, suffix)
                return models.Redirect(
                    redirect_type=models.RedirectType.GIT_LOG,
                    redirect_url=redirect_url,
                    repo=first_numbering.repo,
                    repo_url=repo_url)

        if len(first_arg) == 40:
            # The first was a full hash, so look it up and blindly forward the rest.
            revision_map = ndb.Key(models.RevisionMap, first_arg).get()
            if revision_map:
                repo_obj = models.Repo.get_key_by_id(revision_map.project,
                                                     revision_map.repo).get()
                repo_url = calculate_repo_url(repo_obj)
                redirect_url = '%s+log/%s' % (repo_url, arg)
                return models.Redirect(
                    redirect_type=models.RedirectType.GIT_LOG,
                    redirect_url=redirect_url,
                    repo=revision_map.repo,
                    repo_url=repo_url)

        redirect_url = (
            'https://chromium.googlesource.com/chromium/src/+log/%s' % arg)
        return models.Redirect(redirect_type=models.RedirectType.GIT_LOG,
                               redirect_url=redirect_url)

    return None