No hard code default base project, #539
authorZhang Qiang <qiang.z.zhang@intel.com>
Wed, 21 Nov 2012 06:47:34 +0000 (14:47 +0800)
committerZhang Qiang <qiang.z.zhang@intel.com>
Thu, 22 Nov 2012 09:07:49 +0000 (17:07 +0800)
* If you realy want to to use default base project, you can set
  base_prj in obs section of .gbs.conf
* If no base project, and no target project specified, the default
  target project is home:<user>:gbs
* If base_project specified, then target project will be:
  home:<user>:gbs:<target_project>
* If no base project, and target project need to be created, then
  gbs will give warning to ask user to set repos for new target
  project manually.

Change-Id: Ib65e90f076f186e3486837199c2098dd723f67d5

gitbuildsys/cmd_remotebuild.py
gitbuildsys/oscapi.py
tools/gbs

index d8d18fcbe2274fc283677da842d6a52cb7ca9211..0a4f7911174d2176500af98b3bc58de21a9bd0ca 100644 (file)
@@ -115,11 +115,19 @@ def main(args):
         msger.error('can\'t get correct name.')
     package = spec.name
 
-    base_prj = args.base_obsprj
+    base_prj = None
+    if args.base_obsprj:
+        base_prj = args.base_obsprj
+    elif obsconf.base:
+        base_prj = obsconf.base
 
     if args.target_obsprj is None:
-        target_prj = obsconf.target or \
-            "home:%s:gbs:%s" % (apiurl.user, base_prj)
+        if obsconf.target:
+            target_prj = obsconf.target
+        else:
+            target_prj = "home:%s:gbs" % apiurl.user
+            if base_prj:
+                target_prj += ":%s" % base_prj
     else:
         target_prj = args.target_obsprj
 
@@ -191,8 +199,16 @@ def main(args):
         msger.error('failed to get commit info: %s' % exc)
 
     files = glob.glob("%s/*" % exportdir)
+    build_repos = None
     try:
         msger.info('checking status of obs project: %s ...' % target_prj)
+        if not api.exists(target_prj):
+            msger.info('creating new project %s' % (target_prj))
+            api.create_project(target_prj, base_prj)
+        else:
+            build_repos = api.get_repos_of_project(target_prj)
+            if not build_repos:
+                msger.warning("no available build repos for %s" % target_prj)
         if api.exists(target_prj, package):
             old, _not_changed, changed, new = api.diff_files(target_prj,
                                                              package, files)
@@ -201,8 +217,6 @@ def main(args):
                 api.remove_files(target_prj, package, old)
             commit_files = changed + new
         else:
-            msger.info('copying settings of %s to %s' % (base_prj, target_prj))
-            api.copy_project(base_prj, target_prj)
             msger.info('creating new package %s/%s' % (target_prj, package))
             api.create_package(target_prj, package)
             # new project - submitting all local files
@@ -211,8 +225,13 @@ def main(args):
         msger.error(str(err))
 
     if not commit_files:
-        msger.warning("No local changes found. Triggering rebuild")
-        api.rebuild(target_prj, package, obs_arch)
+        if build_repos:
+            msger.warning("no local changes found. Triggering rebuild")
+            api.rebuild(target_prj, package, obs_arch)
+        else:
+            msger.warning("no local changes found. can't trigger rebuild "
+                          "as no available build repos found")
+            return 0
     else:
         msger.info('commit packaging files to build server ...')
         commit_files = [(fpath, fpath in commit_files) for fpath in files]
index 831772747e4fee4c10c73eafd16363de90a8b69f..dc145d73166e49e6015c31112bb04742fa490bed 100644 (file)
@@ -84,13 +84,20 @@ class OSC(object):
         raise OSCError('Got empty response from %s %s' % \
                        (method.func_name.split('_')[-1], url))
 
-    def copy_project(self, src, target, rewrite=False):
+    def get_repos_of_project(self, project):
+        repos = defaultdict(list)
+        for repo in core.get_repos_of_project(self.apiurl, project):
+            repos[repo.name].append(repo.arch)
+        return repos
+
+    def create_project(self, target, src=None, rewrite=False):
         """
         Create new OBS project based on existing project.
         Copy config and repositories from src project to target
+        if src exists.
         """
 
-        if not self.exists(src):
+        if src and not self.exists(src):
             raise ObsError('base project: %s not exists' % src)
 
         if self.exists(target):
@@ -105,18 +112,21 @@ class OSC(object):
                '<person role="maintainer" userid="%s"/>' % \
                (target, conf.get_apiurl_usr(self.apiurl))
 
-        # Collect source repos
-        repos = defaultdict(list)
-        for repo in core.get_repos_of_project(self.apiurl, src):
-            repos[repo.name].append(repo.arch)
-
-        # Copy repos to target
-        for name in repos:
-            meta += '<repository name="%s">' % name
-            meta += '<path project="%s" repository="%s" />' % (src, name)
-            for arch in repos[name]:
-                meta += "<arch>%s</arch>\n" % arch
-            meta += "</repository>\n"
+        # Collect source repos if src project exist
+        if src:
+            # Copy repos to target
+            repos = self.get_repos_of_project(src)
+            for name in repos:
+                meta += '<repository name="%s">' % name
+                meta += '<path project="%s" repository="%s" />' % (src, name)
+                for arch in repos[name]:
+                    meta += "<arch>%s</arch>\n" % arch
+                meta += "</repository>\n"
+        else:
+            msger.warning('no project repos in target project, please add '
+                'repos from OBS webUI manually, or specify base project '
+                'with -B <base_prj>, then gbs can help to set repos '
+                'using the settings of the specified base project.')
         meta += "</project>\n"
 
         try:
@@ -126,6 +136,10 @@ class OSC(object):
                 M2Crypto.SSL.SSLError), err:
             raise ObsError("Can't set meta for %s: %s" % (target, str(err)))
 
+        # don't need set project config if no src project
+        if not src:
+            return
+
         # copy project config
         try:
             config = core.show_project_conf(self.apiurl, src)
index 3ac2de93e6098d9615bfc8e1d016106e3b2a330f..5c9d60801ccba3926d16fe594e1415e6620e185f 100755 (executable)
--- a/tools/gbs
+++ b/tools/gbs
@@ -232,10 +232,12 @@ def remotebuild_parser(parser):
                         help='path to git repository')
 
     parser.add_argument('-T', '--target-obsprj',
-                        help='OBS project where package will be checked in '
-                        '(default is home:<userid>:gbs:Tizen:Main)')
-    parser.add_argument('-B', '--base-obsprj', default="Tizen:Main",
-                        help='OBS project to branch from')
+                        help='OBS project where package will be checked in. '
+                        'Default is home:<userid>:gbs:<base_prj>, you can '
+                        'set default target_prj in .gbs.conf')
+    parser.add_argument('-B', '--base-obsprj',
+                        help='OBS project being used to branch from, you can '
+                        'set default base_prj in .gbs.conf')
     parser.add_argument('-P', '--profile',
                         help='profile to be used for building, can be given '
                              'without the "profile." prefix')