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)
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)
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