Skip to content

Commit

Permalink
[gitiles] Add parse_repo_url function
Browse files Browse the repository at this point in the history
Add a function to parse a Gitiles repo URL supporting various edge cases.

R=tandrii@chromium.org

Bug: 877161
Change-Id: Ib4d6a28a2ace2e594f1a4ca31460a446fc6fa052
Reviewed-on: https://chromium-review.googlesource.com/1204914
Commit-Queue: Nodir Turakulov <nodir@chromium.org>
Reviewed-by: Andrii Shyshkalov <tandrii@chromium.org>
  • Loading branch information
nodirt authored and Commit Bot committed Sep 4, 2018
1 parent e323bd9 commit f215ae6
Show file tree
Hide file tree
Showing 10 changed files with 188 additions and 0 deletions.
38 changes: 38 additions & 0 deletions recipes/recipe_modules/gitiles/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
# found in the LICENSE file.

import base64
import urlparse

from recipe_engine import recipe_api

Expand Down Expand Up @@ -200,3 +201,40 @@ def download_archive(self, repository_url, destination,
ex = self.m.step.StepFailure(step_name)
ex.gitiles_skipped_files = stat['names']
raise ex

def parse_repo_url(self, repo_url):
"""Returns (host, project) pair.
Returns (None, None) if repo_url is not recognized.
"""
return parse_repo_url(repo_url)


def parse_http_host_and_path(url):
# Copied from https://chromium.googlesource.com/infra/luci/recipes-py/+/809e57935211b3fcb802f74a7844d4f36eff6b87/recipe_modules/buildbucket/util.py
parsed = urlparse.urlparse(url)
if not parsed.scheme:
parsed = urlparse.urlparse('https://' + url)
if (parsed.scheme in ('http', 'https') and
not parsed.params and
not parsed.query and
not parsed.fragment):
return parsed.netloc, parsed.path
return None, None


def parse_repo_url(repo_url):
"""Returns (host, project) pair.
Returns (None, None) if repo_url is not recognized.
"""
# Adapted from https://chromium.googlesource.com/infra/luci/recipes-py/+/809e57935211b3fcb802f74a7844d4f36eff6b87/recipe_modules/buildbucket/util.py
host, project = parse_http_host_and_path(repo_url)
if not host or not project or '+' in project.split('/'):
return None, None
project = project.strip('/')
if project.startswith('a/'):
project = project[len('a/'):]
if project.endswith('.git'):
project = project[:-len('.git')]
return host, project
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"host",
"path/to/project"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"host",
"path/to/project"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"host",
"path/to/project"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"host",
"path/to/project"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"host",
"path/to/project"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"host",
"path/to/project"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"None",
"None"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[
{
"cmd": [
"echo",
"None",
"None"
],
"name": "build"
},
{
"name": "$result",
"recipe_result": null,
"status_code": 0
}
]
30 changes: 30 additions & 0 deletions recipes/recipe_modules/gitiles/tests/parse_repo_url.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Copyright 2018 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.

DEPS = [
'gitiles',
'recipe_engine/properties',
'recipe_engine/step',
]


def RunSteps(api):
repo_url = api.properties['repo_url']
host, project = api.gitiles.parse_repo_url(repo_url)
api.step('build', ['echo', str(host), str(project)])


def GenTests(api):

def case(name, repo_url):
return api.test(name) + api.properties(repo_url=repo_url)

yield case('basic', 'https://host/path/to/project')
yield case('http', 'http://host/path/to/project')
yield case('a prefix', 'https://host/a/path/to/project')
yield case('git suffix', 'https://host/path/to/project.git')
yield case('http and a prefix', 'http://host/a/path/to/project')
yield case('no scheme', 'host/a/path/to/project')
yield case('query string param', 'https://host/a/path/to/project?a=b')
yield case('plus', 'https://host/path/to/project/+/master')

0 comments on commit f215ae6

Please sign in to comment.