Support --package-list and --package-from-file
authorZhang Qiang <qiang.z.zhang@intel.com>
Thu, 9 Jan 2014 08:24:52 +0000 (16:24 +0800)
committerZhang Qiang <qiang.z.zhang@intel.com>
Mon, 13 Jan 2014 02:20:27 +0000 (10:20 +0800)
The value of --package-* options can be the top dir of packages

Fixes: #1580
Change-Id: Ib14cc9cd3eb5b461a4f452bca46f2acd060e7353
Signed-off-by: Zhang Qiang <qiang.z.zhang@intel.com>
data/gbs.sh
gitbuildsys/cmd_build.py
tools/gbs

index fdac653e528b8912c0820d8db684e4331af3257c..2278f9e6f514f7204811835f8a155cf45d6aa55d 100644 (file)
@@ -107,8 +107,9 @@ __gbs ()
     "
     ch_opts="--message= --since= --packaging-dir="
     chr_opts="--root"
-    lbex_opts="--no-configure --exclude-from-file= --exclude= --binary-list= --threads=\
-        --incremental --overwrite --clean-once --debug --deps --rdeps $lb_opts"
+    lbex_opts="--no-configure --exclude-from-file= --exclude= --binary-list= --binary-from-file=\
+              --threads=  --package-list= --package-from-file= --incremental --overwrite \
+              --clean-once --debug --deps --rdeps $lb_opts"
     cl_opts="--upstream-branch= --all --depth="
     pull_opts="--upstream-branch= --force --depth="
 
index 6ed004de62d2bd7669d691b4b0558c2b0a8c32f2..853c95ac6f8edcc20eb7f237c440c404bc455b2a 100644 (file)
@@ -25,7 +25,8 @@ import pwd
 import re
 import urlparse
 
-from gitbuildsys.utils import Temp, RepoParser, read_localconf
+from gitbuildsys.utils import Temp, RepoParser, read_localconf,\
+                              guess_spec, show_file_from_rev
 from gitbuildsys.errors import GbsError, Usage
 from gitbuildsys.conf import configmgr
 from gitbuildsys.safe_url import SafeURL
@@ -33,6 +34,8 @@ from gitbuildsys.cmd_export import get_packaging_dir
 from gitbuildsys.log import LOGGER as log
 
 from gbp.rpm.git import GitRepositoryError, RpmGitRepository
+from gbp import rpm
+from gbp.errors import GbpError
 
 
 CHANGE_PERSONALITY = {
@@ -68,7 +71,42 @@ def formalize_build_conf(profile):
         profile = 'tizen%s' % profile
 
     # '-' is not allowed, so replace with '_'
-    return profile.replace('-', '_');
+    return profile.replace('-', '_')
+
+def get_binary_name_from_git (args, package_dirs):
+    ''' get binary rpm name from specified git package'''
+
+    binary_list = []
+    packaging_dir = get_packaging_dir(args)
+    if args.commit:
+        commit = args.commit
+    elif args.include_all:
+        commit = 'WC.UNTRACKED'
+    else:
+        commit = 'HEAD'
+
+    for package_dir in package_dirs:
+        main_spec, rest_specs = guess_spec(package_dir, packaging_dir,
+                                                 None, commit)
+        rest_specs.append(main_spec)
+        for spec in rest_specs:
+            if args.include_all:
+                spec_to_parse = os.path.join(package_dir, spec)
+            else:
+                content = show_file_from_rev(package_dir, spec, commit)
+                if content is None:
+                    raise GbsError('failed to checkout %s from commit: %s' %
+                                    (spec, commit))
+                tmp_spec = Temp(content=content)
+                spec_to_parse = tmp_spec.path
+
+            try:
+                spec = rpm.SpecFile(spec_to_parse)
+            except GbpError, err:
+                raise GbsError('%s' % err)
+            binary_list.append(spec.name)
+
+    return binary_list
 
 def prepare_repos_and_build_conf(args, arch, profile):
     '''generate repos and build conf options for depanneur'''
@@ -174,6 +212,19 @@ def prepare_depanneur_opts(args):
     if args.baselibs:
         cmd_opts += ['--baselibs']
 
+    #
+    if args.package_list:
+        package_list = args.package_list.split(',')
+        binary_list = get_binary_name_from_git(args, package_list)
+        args.binary_list += ','+ ','.join(binary_list)
+    if args.package_from_file:
+        if not os.path.exists(args.package_from_file):
+            raise GbsError('specified package list file %s not exists' % \
+                           args.package_from_file)
+        with open(args.package_from_file) as fobj:
+            pkglist = [pkg.strip() for pkg in fobj.readlines() if pkg.strip()]
+            binary_list = get_binary_name_from_git(args, pkglist)
+        args.binary_list += ',' + ','.join(binary_list)
     if args.binary_list:
         blist = [ i.strip() for i in args.binary_list.split(',') ]
         cmd_opts += ['--binary-list=%s' % ','.join(blist)]
index d23cfb2eae9cf4f1dca322775a848ed7adb93423..dbae6cc981348fe9754135b123ee0f82a6a54e21 100755 (executable)
--- a/tools/gbs
+++ b/tools/gbs
@@ -246,7 +246,16 @@ def build_parser(parser):
                         'export-treeish instead of upstream branch')
 
     group = parser.add_argument_group('package selection options')
-    group.add_argument('--binary-list',
+    group.add_argument('--package-list', default='',
+                       help='specify a package list to be built. Multiple '
+                       'packages can be separated by comma(,). Note: packages '
+                       'are package dir name')
+    group.add_argument('--package-from-file',
+                        help='specify a package list file. Packages '
+                       'listed in this file will be selected to be built. '
+                       'The format of file is one package dir for one '
+                       'line')
+    group.add_argument('--binary-list', default='',
                        help='specify a package list to be built. Multiple '
                        'packages can be separated by comma(,). Note: package '
                        'names are from spec files, not the package dir name')