Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2017 The Chromium Authors. All rights reserved. | 1 # Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 from dashboard.common import namespaced_stored_object | 5 from dashboard.common import namespaced_stored_object |
| 6 | 6 |
| 7 | 7 |
| 8 _REPOSITORIES_KEY = 'repositories' | 8 _REPOSITORIES_KEY = 'repositories' |
| 9 _URLS_TO_NAMES_KEY = 'repository_urls_to_names' | 9 _URLS_TO_NAMES_KEY = 'repository_urls_to_names' |
| 10 | 10 |
| 11 | 11 |
| 12 def RepositoryUrl(name): | 12 def RepositoryUrl(name): |
| 13 """Returns the URL of a repository, given its short name. | |
| 14 | |
| 15 If a repository moved locations or has multiple locations, a repository can | |
| 16 have multiple URLs. The returned URL should be the most canonical one. | |
|
perezju
2017/09/25 09:28:43
nit: "most canonical" -> "current canonical" ? (no
dtu
2017/09/25 20:35:10
Done.
| |
| 17 | |
| 18 Args: | |
| 19 name: The short name of the repository. | |
| 20 | |
| 21 Returns: | |
| 22 A URL string, not including '.git'. | |
| 23 """ | |
| 13 repositories = namespaced_stored_object.Get(_REPOSITORIES_KEY) | 24 repositories = namespaced_stored_object.Get(_REPOSITORIES_KEY) |
| 25 # We have the 'repository_url' key in case we want to add more fields later. | |
| 14 return repositories[name]['repository_url'] | 26 return repositories[name]['repository_url'] |
| 15 | 27 |
| 16 | 28 |
| 17 def Repository(url, add_if_missing=False): | 29 def Repository(url, add_if_missing=False): |
| 30 """Returns the short repository name, given its URL. | |
| 31 | |
| 32 By default, the short repository name is the last part of the URL. | |
| 33 E.g. "https://chromium.googlesource.com/v8/v8": "v8" | |
| 34 In some cases this is ambiguous, so the names can be manually adjusted. | |
| 35 E.g. "../chromium/src": "chromium" and "../breakpad/breakpad/src": "breakpad" | |
| 36 | |
| 37 If a repository moved locations or has multiple locations, multiple URLs can | |
| 38 map to the same name. This should only be done if they are exact mirrors and | |
| 39 have the same git hashes. | |
| 40 "https://webrtc.googlesource.com/src": "webrtc" | |
| 41 "https://webrtc.googlesource.com/src/webrtc": "old_webrtc" | |
| 42 "https://chromium.googlesource.com/external/webrtc/trunk/webrtc": "old_webrtc" | |
| 43 | |
| 44 Internally, all repositories are stored by short name, which always maps to | |
| 45 the most canonical URL, so old URLs are automatically "upconverted". | |
|
perezju
2017/09/25 09:28:43
ditto
dtu
2017/09/25 20:35:09
Done.
| |
| 46 | |
| 47 Args: | |
| 48 url: The repository URL. | |
| 49 add_if_missing: If True, also attempts to add the URL to the database with | |
| 50 the default name mapping. Throws an exception if there's a name collision. | |
| 51 | |
| 52 Returns: | |
| 53 The short name as a string. | |
| 54 | |
| 55 Raises: | |
| 56 AssertionError: add_if_missing is True and there's a name collision. | |
| 57 """ | |
| 18 if url.endswith('.git'): | 58 if url.endswith('.git'): |
| 19 url = url[:-4] | 59 url = url[:-4] |
| 20 | 60 |
| 21 urls_to_names = namespaced_stored_object.Get(_URLS_TO_NAMES_KEY) | 61 urls_to_names = namespaced_stored_object.Get(_URLS_TO_NAMES_KEY) |
| 22 try: | 62 try: |
| 23 return urls_to_names[url] | 63 return urls_to_names[url] |
| 24 except KeyError: | 64 except KeyError: |
| 25 if add_if_missing: | 65 if add_if_missing: |
| 26 return _AddRepository(url) | 66 return _AddRepository(url) |
| 27 raise | 67 raise |
| 28 | 68 |
| 29 | 69 |
| 30 def _AddRepository(url): | 70 def _AddRepository(url): |
| 71 """Add a repository URL to the database with the default name mapping. | |
| 72 | |
| 73 The default short repository name is the last part of the URL. | |
| 74 | |
| 75 Returns: | |
| 76 The short repository name. | |
| 77 | |
| 78 Raises: | |
| 79 AssertionError: The default name is already in the database. | |
| 80 """ | |
| 31 name = url.split('/')[-1] | 81 name = url.split('/')[-1] |
| 32 | 82 |
| 33 # Add to main repositories dict. | 83 # Add to main repositories dict. |
| 34 repositories = namespaced_stored_object.Get(_REPOSITORIES_KEY) | 84 repositories = namespaced_stored_object.Get(_REPOSITORIES_KEY) |
| 35 if name in repositories: | 85 if name in repositories: |
| 36 raise AssertionError("Attempted to add a repository that's already in the " | 86 raise AssertionError("Attempted to add a repository that's already in the " |
| 37 'Datastore: %s: %s' % (name, url)) | 87 'Datastore: %s: %s' % (name, url)) |
| 38 repositories[name] = {'repository_url': url} | 88 repositories[name] = {'repository_url': url} |
| 39 namespaced_stored_object.Set(_REPOSITORIES_KEY, repositories) | 89 namespaced_stored_object.Set(_REPOSITORIES_KEY, repositories) |
| 40 | 90 |
| 41 # Add to URL -> name mapping dict. | 91 # Add to URL -> name mapping dict. |
| 42 urls_to_names = namespaced_stored_object.Get(_URLS_TO_NAMES_KEY) | 92 urls_to_names = namespaced_stored_object.Get(_URLS_TO_NAMES_KEY) |
| 43 urls_to_names[url] = name | 93 urls_to_names[url] = name |
| 44 namespaced_stored_object.Set(_URLS_TO_NAMES_KEY, urls_to_names) | 94 namespaced_stored_object.Set(_URLS_TO_NAMES_KEY, urls_to_names) |
| 45 | 95 |
| 46 return name | 96 return name |
| OLD | NEW |