From d790668e390357c4c5fca82704806b9453151a42 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Fri, 29 Aug 2014 13:14:14 +1000 Subject: sb: Add support for the standard git protocols for the %source command. The source selector 'git://' now supports a protocol option that lets you set the specific protocol git is to use to access a remote repository. --- doc/source-builder.txt | 6 ++++++ source-builder/sb/download.py | 26 ++++++++++++++++++++++++-- source-builder/sb/git.py | 5 ++++- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/doc/source-builder.txt b/doc/source-builder.txt index 3f80503..1d9a474 100644 --- a/doc/source-builder.txt +++ b/doc/source-builder.txt @@ -1413,6 +1413,8 @@ the repository via the URL by appending options and arguments to the GIT path. The options are delimited by `?` and option arguments are delimited from the options with `=`. The options are: +`protocol`:: Use a specific protocol. The supported values are _ssh_, _git_, +_http_, _https_, _ftp_, _ftps_, _rsync_, and _none_. `branch`:: Checkout the specified branch. `pull`:: Perform a pull to update the repository. `fetch`:: Perform a fetch to get any remote updates. @@ -1428,6 +1430,10 @@ a hard reset. You can select specific branches and apply patches. The repository is cleaned up before each build to avoid various version control errors that can arise. +The protocol option lets you set a specific protocol. The 'git://' prefix used +by the RSB to select a git repository can be removed using _none_ or replaced +with one of the standard git protcols. + CVS ^^^ diff --git a/source-builder/sb/download.py b/source-builder/sb/download.py index fdc834a..dc1def6 100644 --- a/source-builder/sb/download.py +++ b/source-builder/sb/download.py @@ -201,7 +201,7 @@ def parse_url(url, pathkey, config, opts): source['url'] = url colon = url.find(':') if url[colon + 1:colon + 3] != '//': - raise error.general('malforned URL: %s' % (url)) + raise error.general('malforned URL (no protocol prefix): %s' % (url)) source['path'] = url[:colon + 3] + path.dirname(url[colon + 3:]) source['file'] = path.basename(url) source['name'], source['ext'] = path.splitext(source['file']) @@ -310,9 +310,27 @@ def _http_downloader(url, local, config, opts): return not failed def _git_downloader(url, local, config, opts): + repo = git.repo(local, opts, config.macros) rlp = os.path.relpath(path.host(local)) us = url.split('?') - repo = git.repo(local, opts, config.macros) + # + # Handle the various git protocols. + # + # remove 'git' from 'git://xxxx/xxxx?protocol=...' + # + url_base = us[0][len('git'):] + for a in us[1:]: + _as = a.split('=') + if _as[0] == 'protocol': + if len(_as) != 2: + raise error.general('invalid git protocol option: %s' % (_as)) + if _as[1] == 'none': + # remove the rest of the protocol header leaving nothing. + us[0] = url_base[len('://'):] + else: + if _as[1] not in ['ssh', 'git', 'http', 'https', 'ftp', 'ftps', 'rsync']: + raise error.general('unknown git protocol: %s' % (_as[1])) + us[0] = _as[1] + url_base if not repo.valid(): log.notice('git: clone: %s -> %s' % (us[0], rlp)) if not opts.dry_run(): @@ -350,6 +368,10 @@ def _git_downloader(url, local, config, opts): log.notice('git: reset: %s' % (us[0])) if not opts.dry_run(): repo.reset(arg) + elif _as[0] == 'protocol': + pass + else: + raise error.general('invalid git option: %s' % (_as)) return True def _cvs_downloader(url, local, config, opts): diff --git a/source-builder/sb/git.py b/source-builder/sb/git.py index 093c443..d115845 100644 --- a/source-builder/sb/git.py +++ b/source-builder/sb/git.py @@ -57,7 +57,10 @@ class repo: self.macros = opts.defaults else: self.macros = macros - self.git = self.macros.expand('%{__git}') + if self.macros is None: + self.git = 'git' + else: + self.git = self.macros.expand('%{__git}') def git_version(self): ec, output = self._run(['--version'], True) -- cgit v1.2.3