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.
This commit is contained in:
Chris Johns
2014-08-29 13:14:14 +10:00
parent 183626a1d4
commit d790668e39
3 changed files with 34 additions and 3 deletions

View File

@@ -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
^^^

View File

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

View File

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