| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 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 import collections | 4 import collections |
| 5 import fnmatch | 5 import fnmatch |
| 6 import logging | 6 import logging |
| 7 import os | 7 import os |
| 8 import subprocess | 8 import subprocess |
| 9 import sys | 9 import sys |
| 10 import tempfile | 10 import tempfile |
| 11 import urlparse | 11 import urlparse |
| 12 | 12 |
| 13 from infra.services.gnumbd.support.util import ( | 13 from infra.libs.decorators import cached_property |
| 14 cached_property, CalledProcessError) | |
| 15 | 14 |
| 16 from infra.services.gnumbd.support.data import CommitData | 15 from infra.libs.git2.util import CalledProcessError |
| 16 from infra.libs.git2.util import INVALID |
| 17 from infra.libs.git2.data import CommitData |
| 18 |
| 17 | 19 |
| 18 LOGGER = logging.getLogger(__name__) | 20 LOGGER = logging.getLogger(__name__) |
| 19 | 21 |
| 20 | 22 |
| 21 class _Invalid(object): | |
| 22 def __call__(self, *_args, **_kwargs): | |
| 23 return self | |
| 24 | |
| 25 def __getattr__(self, _key): | |
| 26 return self | |
| 27 | |
| 28 def __eq__(self, _other): | |
| 29 return False | |
| 30 | |
| 31 def __ne__(self, _other): # pylint: disable=R0201 | |
| 32 return True | |
| 33 | |
| 34 INVALID = _Invalid() | |
| 35 | |
| 36 | |
| 37 class Repo(object): | 23 class Repo(object): |
| 38 """Represents a remote git repo. | 24 """Represents a remote git repo. |
| 39 | 25 |
| 40 Manages the (bare) on-disk mirror of the remote repo. | 26 Manages the (bare) on-disk mirror of the remote repo. |
| 41 """ | 27 """ |
| 42 MAX_CACHE_SIZE = 1024 | 28 MAX_CACHE_SIZE = 1024 |
| 43 | 29 |
| 44 def __init__(self, url): | 30 def __init__(self, url): |
| 45 self.dry_run = False | 31 self.dry_run = False |
| 46 self.repos_dir = None | 32 self.repos_dir = None |
| 47 | 33 |
| 48 self._url = url | 34 self._url = url |
| 49 self._repo_path = None | 35 self._repo_path = None |
| 50 self._commit_cache = collections.OrderedDict() | 36 self._commit_cache = collections.OrderedDict() |
| 51 self._log = LOGGER.getChild('Repo') | 37 self._log = LOGGER.getChild('Repo') |
| 52 | 38 |
| 39 def __getitem__(self, ref): |
| 40 """Get a Ref attached to this Repo.""" |
| 41 return Ref(self, ref) |
| 42 |
| 53 def reify(self): | 43 def reify(self): |
| 54 """Ensures the local mirror of this Repo exists.""" | 44 """Ensures the local mirror of this Repo exists.""" |
| 55 assert self.repos_dir is not None | 45 assert self.repos_dir is not None |
| 56 parsed = urlparse.urlparse(self._url) | 46 parsed = urlparse.urlparse(self._url) |
| 57 norm_url = parsed.netloc + parsed.path | 47 norm_url = parsed.netloc + parsed.path |
| 58 if norm_url.endswith('.git'): | 48 if norm_url.endswith('.git'): |
| 59 norm_url = norm_url[:-len('.git')] | 49 norm_url = norm_url[:-len('.git')] |
| 60 folder = norm_url.replace('-', '--').replace('/', '-').lower() | 50 folder = norm_url.replace('-', '--').replace('/', '-').lower() |
| 61 | 51 |
| 62 rpath = os.path.abspath(os.path.join(self.repos_dir, folder)) | 52 rpath = os.path.abspath(os.path.join(self.repos_dir, folder)) |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 | 251 |
| 262 def fast_forward_push(self, commit): | 252 def fast_forward_push(self, commit): |
| 263 """Push |commit| to this ref on the remote, and update the local copy of the | 253 """Push |commit| to this ref on the remote, and update the local copy of the |
| 264 ref to |commit|.""" | 254 ref to |commit|.""" |
| 265 self.repo.run('push', 'origin', '%s:%s' % (commit.hsh, self.ref)) | 255 self.repo.run('push', 'origin', '%s:%s' % (commit.hsh, self.ref)) |
| 266 self.update_to(commit) | 256 self.update_to(commit) |
| 267 | 257 |
| 268 def update_to(self, commit): | 258 def update_to(self, commit): |
| 269 """Update the local copy of the ref to |commit|.""" | 259 """Update the local copy of the ref to |commit|.""" |
| 270 self.repo.run('update-ref', self.ref, commit.hsh) | 260 self.repo.run('update-ref', self.ref, commit.hsh) |
| OLD | NEW |