From 0f31f5e73d93df80ae221331689d1ab10990a13f Mon Sep 17 00:00:00 2001 From: Markus Lehtonen Date: Mon, 3 Jun 2013 11:17:20 +0300 Subject: [PATCH] Utilize the GBS export API Use the export API instead of calling the gbs command. This dramatically decreases the number of (indirect) package dependencies of obs-service-gbs as only the export functionality of GBS is required. Change-Id: Iad2b7bd4c7397a2145d40f98441369ea93135d57 Signed-off-by: Markus Lehtonen --- obs_service_gbs/command.py | 93 ++++++++++++++++++++++++++---------------- packaging/obs-service-gbs.spec | 4 +- tests/test_obs_service_gbs.py | 17 +++++++- 3 files changed, 75 insertions(+), 39 deletions(-) diff --git a/obs_service_gbs/command.py b/obs_service_gbs/command.py index 72e6de1..e90d0e3 100644 --- a/obs_service_gbs/command.py +++ b/obs_service_gbs/command.py @@ -21,26 +21,38 @@ import argparse import os import shutil -import subprocess import tempfile - +import traceback from ConfigParser import SafeConfigParser -from obs_service_gbp import LOGGER, gbplog, CachedRepo, CachedRepoError, gbplog +from gitbuildsys.cmd_export import main as cmd_export +from gitbuildsys import log as gbs_log +from gitbuildsys.errors import CmdError + +from obs_service_gbp import LOGGER, gbplog, CachedRepo, CachedRepoError class ServiceError(Exception): """Source service errors""" pass -def construct_gbs_args(args, outdir): +def construct_gbs_args(args, outdir, gitdir): """Construct args list for GBS""" - global_argv = [] - cmd_argv = ['--outdir=%s' % outdir] - if args.verbose == 'yes': - global_argv.append('--verbose') + # Replicate gbs export command line arguments + gbs_args = {'outdir': outdir, + 'gitdir': gitdir, + 'spec': None, + 'commit': None, + 'include_all': None, + 'source_rpm': None, + 'no_patch_export': None, + 'upstream_branch': None, + 'upstream_tag': None, + 'squash_patches_until': None, + 'packaging_dir': None, + 'debug': None} if args.revision: - cmd_argv.append('--commit=%s' % args.revision) - return global_argv + ['export'] + cmd_argv + gbs_args['commit'] = args.revision + return argparse.Namespace(**gbs_args) def read_config(filenames): '''Read configuration file(s)''' @@ -65,6 +77,36 @@ def read_config(filenames): # We only use keys from one section, for now return dict(parser.items('general')) +def gbs_export(repo, args): + '''Export packaging files with GBS''' + # Create temporary directory + try: + tmpdir = tempfile.mkdtemp(dir=args.outdir) + except OSError as err: + raise ServiceError('Failed to create tmpdir: %s' % err, 1) + + # Do export + try: + gbs_args = construct_gbs_args(args, tmpdir, repo.repodir) + LOGGER.info('Exporting packaging files with GBS') + LOGGER.debug('gbs args: %s' % gbs_args) + try: + cmd_export(gbs_args) + except CmdError as err: + raise ServiceError('GBS export failed: %s' % err, 2) + except Exception as err: + LOGGER.debug(traceback.format_exc()) + raise ServiceError('Encatched exception in GBS, export failed', 2) + + # Move packaging files from tmpdir to actual outdir + exportdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) + for fname in os.listdir(exportdir): + shutil.move(os.path.join(exportdir, fname), + os.path.join(args.outdir, fname)) + LOGGER.info('Packaging files successfully exported') + finally: + shutil.rmtree(tmpdir) + def parse_args(argv): """Argument parser""" default_configs = ['/etc/obs/services/gbs', @@ -86,8 +128,6 @@ def main(argv=None): """Main function""" ret = 0 - tmpdir = None - try: args = parse_args(argv) args.outdir = os.path.abspath(args.outdir) @@ -95,6 +135,10 @@ def main(argv=None): if args.verbose == 'yes': gbplog.setup(color='auto', verbose=True) LOGGER.setLevel(gbplog.DEBUG) + gbs_log.setup(verbose=True) + else: + gbplog.setup(color='auto', verbose=False) + gbs_log.setup(verbose=False) LOGGER.info('Starting GBS source service') @@ -103,33 +147,15 @@ def main(argv=None): repo = CachedRepo(config['repo-cache-dir'], args.url) args.revision = repo.update_working_copy(args.revision, submodules=False) - - # Create outdir and a temporary directory + # Create outdir try: os.makedirs(args.outdir) except OSError as err: if err.errno != os.errno.EEXIST: raise ServiceError('Failed to create outdir: %s' % err, 1) - try: - tmpdir = tempfile.mkdtemp(dir=args.outdir) - except OSError as err: - raise ServiceError('Failed to create tmpdir: %s' % err, 1) # Export sources with GBS - cmd = ['gbs'] + construct_gbs_args(args, tmpdir) - LOGGER.info('Exporting packaging files with GBS') - popen = subprocess.Popen(cmd, cwd=repo.repodir) - popen.communicate() - if popen.returncode: - raise ServiceError('GBS failed, unable to export packaging files', - 2) - # Move packaging files from tmpdir to actual outdir - exportdir = os.path.join(tmpdir, os.listdir(tmpdir)[0]) - for fname in os.listdir(exportdir): - shutil.move(os.path.join(exportdir, fname), - os.path.join(args.outdir, fname)) - - LOGGER.info('Packaging files successfully exported') + gbs_export(repo, args) except ServiceError as err: LOGGER.error(err[0]) @@ -137,8 +163,5 @@ def main(argv=None): except CachedRepoError as err: LOGGER.error('RepoCache: %s' % err) ret = 1 - finally: - if tmpdir: - shutil.rmtree(tmpdir) return ret diff --git a/packaging/obs-service-gbs.spec b/packaging/obs-service-gbs.spec index 519c3b5..5873748 100644 --- a/packaging/obs-service-gbs.spec +++ b/packaging/obs-service-gbs.spec @@ -13,14 +13,14 @@ Release: %{pre_release} %endif URL: http://www.tizen.org Source: %{name}-%{version}.tar.bz2 -Requires: gbs +Requires: gbs-export Requires: obs-service-git-buildpackage >= 0.2 BuildRequires: python BuildRequires: python-setuptools %if 0%{?do_unittests} BuildRequires: python-coverage BuildRequires: python-nose -BuildRequires: gbs +BuildRequires: gbs-export BuildRequires: obs-service-git-buildpackage >= 0.2 %endif BuildArch: noarch diff --git a/tests/test_obs_service_gbs.py b/tests/test_obs_service_gbs.py index ef32115..e08bb37 100644 --- a/tests/test_obs_service_gbs.py +++ b/tests/test_obs_service_gbs.py @@ -39,8 +39,15 @@ class UnitTestsBase(object): def create_orig_repo(cls, name): """Create test repo""" orig_repo = GitRepository.create(os.path.join(cls.workdir, name)) - orig_repo.commit_dir(TEST_DATA_DIR, 'Initial version', 'master', - create_missing_branch=True) + # First, add everything else except for packaging + files = os.listdir(TEST_DATA_DIR) + files.remove('packaging') + orig_repo.add_files(files, work_tree=TEST_DATA_DIR) + orig_repo.commit_staged('Initial version') + # Then, add packaging files + orig_repo.add_files('packaging', work_tree=TEST_DATA_DIR) + orig_repo.commit_staged('Add packaging files') + orig_repo.create_tag('v0.1', msg='Version 0.1') orig_repo.force_head('master', hard=True) # Make new commit cls.update_repository_file(orig_repo, 'foo.txt', 'new data\n') @@ -129,6 +136,12 @@ class TestGbsService(UnitTestsBase): assert service(['--url', self.orig_repo.path, '--outdir=foo/bar']) == 1 os.chmod('foo/bar', stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC) + def test_gbs_error(self): + """Test GBS export failure""" + assert service(['--url', self.orig_repo.path, '--revision', + 'v0.1~1']) == 2 + assert os.listdir('.') == [] + def test_options_outdir(self): """Test the --outdir option""" outdir = os.path.join(self.tmpdir, 'outdir') -- 2.7.4