Use 'Tizen:<target>.sr.<timestamp>' as repo name
authorHasan Wan <hasan.wan@intel.com>
Mon, 12 Nov 2012 05:42:09 +0000 (13:42 +0800)
committerLin Yang <lin.a.yang@intel.com>
Thu, 28 Feb 2013 07:44:18 +0000 (15:44 +0800)
Keep git info in obs project meta desciption

Change-Id: If06c46eee3b4d1e891a28c69288eb5f79d1d3f3e
Signed-off-by: Hasan Wan <hasan.wan@intel.com>
common/buildservice.py
job_pre_release.py
job_repomaker.py
job_reviewrepo_cleanup.py
repomaker/__init__.py

index 64377fe..ee62d92 100644 (file)
@@ -1267,7 +1267,7 @@ class BuildService(object):
 
 PRJ_TEMPLATE = """<project name="%(target)s">
   <title></title>
-  <description></description>
+  <description>%(desp)s</description>
   <person role="maintainer" userid="%(user)s"/>
   <person role="bugowner" userid="%(user)s"/>
   <link project="%(src)s"/>
@@ -1355,10 +1355,11 @@ class TempBuildService():
         sys.stdout.flush()
         os.unlink(filename)
         
-    def link_project(self, src, user):
+    def link_project(self, src, user, desp = ''):
         targetmeta = PRJ_TEMPLATE % {'target': self.project, 'src': src,
-                                     'user': user, 'build': 'enable'}
-        print targetmeta
+                                     'user': user, 'build': 'enable',
+                                     'desp': desp}
+
         fileh, filename = tempfile.mkstemp(prefix="osc_metafile.",
                                            suffix=".xml", text=True)
         os.write(fileh, targetmeta)
index be67d17..75823f7 100755 (executable)
@@ -56,16 +56,23 @@ if __name__ == '__main__':
     packagingdir = utils.parse_link('%s/%s' % (prjdir, 'packaging'))
 
     # Create temp project
-    temp_prj = "%s:prerelease:%s:%s" %(OBS_REQ_PRJ, OBS_REQ_ID, OBS_REQ_PKG)
+    temp_prj = "%s:prerelease:%s" %(OBS_REQ_PRJ, os.path.basename(GIT_TAG))
+
     os.system("gbs rb -B %s -T %s %s" %(OBS_REQ_PRJ, temp_prj, prjdir))
 
     bs = buildservice.TempBuildService(temp_prj, OBS_API_URL, OBS_OSCRC_PATH)
-    print 'temp_prj', temp_prj
-    print type(temp_prj)
+
+    print "Temporary review project created on OBS: %s" %(temp_prj)
+
+    project_info = "OBS_REQ_ID: %s\n\
+OBS_REQ_PRJ: %s\n\
+GIT_PROJECT: %s\n\
+GIT_TAG: %s\n"%(OBS_REQ_ID, OBS_REQ_PRJ, GIT_PROJECT, GIT_TAG)
+    
     temp_prj = str(temp_prj)
-    bs.link_project(OBS_REQ_PRJ, OBS_REQ_WHO)
+    bs.link_project(OBS_REQ_PRJ, OBS_REQ_WHO, desp = project_info)
+    time.sleep(2)
 
-    time.sleep(20)
     try:
         status = bs.get_repostatus()
         print status
index 9e7bd57..9eb3191 100755 (executable)
@@ -105,33 +105,33 @@ def temp_repo_define(event_files, repos_conf):
     REPOCONF_TEMPLATE="""
       Name: %(name)s
       PartOf: "review"
-      TopLevel: /srv/builds/temp/%(partof)s/%(package)s
-      Location: /srv/builds/temp/%(partof)s/%(package)s/repos/%(sandbox_repo)s/
+      TopLevel: %(partof)s/%(package)s
+      Location: %(partof)s/%(package)s/repos/%(sandbox_repo)s/
       Project: %(project)s
       AddRepos: %(addrepos)s
       Target: %(target)s
       SandboxOf: %(sandboxof)s
-      SnapshotDir: /srv/snapshots/pre-release/%(package)s
+      SnapshotDir: /srv/snapshots/pre-release/
       Release: "%(release)s"
       Architectures: %(arch)s
 """
     project = event_files["project"]
     repo = event_files["repo"]
-    match = re.match("(.*):prerelease:(\d*):([\.\w-]*)", project)
+    match = re.match("(.*):prerelease:([\.\w-]*)", project)
     if not match:
         raise Exception, "Ivalid project name found"
 
-    target_prj, sr_id, package = match.groups()
+    target_prj, timestamp = match.groups()
 
     REPO_CONF_STR = REPOCONF_TEMPLATE %{
         "name": project.replace(":","-"),
-        "partof": "review",
-        "package": package,
+        "partof": WORKSPACE,
+        "package": timestamp,
         "sandboxof": target_prj,
         "sandbox_repo": os.path.basename(repos_conf.get_repo(target_prj)['Location']),
         "project": project,
         "target": repo,
-        "release": "sr.%s" %sr_id,
+        "release": timestamp,
         "arch":["ia32"],
         "addrepos": ["Tizen:Base"]       #FIXME
         }
@@ -176,59 +176,31 @@ if __name__ == "__main__":
         temp_repo_define_dict = temp_repo_define(event_fields, repos_conf)
         # Generate the temp repos.yaml
         repos_conf.save_to_file(temp_conf_fn, ext = temp_repo_define_dict)
-        
+
         server_conf.repos_conf = temp_conf_fn
-        # Disable the project build to save resource
-        tempbuild=TempBuildService(temp_repo_define_dict['Project'], OBS_API_URL, PATH_OSCRC)
-
-    builds_dir = server_conf.builds
-    if not os.path.exists(builds_dir):
-        os.makedirs(builds_dir)
-        # the owner will be root, with 0777 permission
-        os.chmod(builds_dir, 0777)
-
-
-    # check the toplevel dirs in repos.yaml
-    dirs = repomaker.get_toplevel_dirs_from_repoconf(server_conf.repos_conf)
-    for d in dirs:
-        if not os.path.exists(d):
-            os.makedirs(d)
-            # the owner will be root, with 0777 permission
-            os.chmod(d, 0777)
-
-    # UGLY code need to be removed
-    tmpdir = '/srv/tmp'
-    if not os.path.exists(tmpdir):
-        os.makedirs(tmpdir)
-        # the owner will be root, with 0777 permission
-        os.chmod(tmpdir, 0777)
-    project = event_fields["project"]
-    match = re.match("(.*):prerelease:(\d*):(\w*)", project)
 
-    if not match:
+        project = event_fields["project"]
+        match = re.match("(.*):prerelease:([\.\w-]*)", project)
+
+        bs = BuildService(apiurl=server_conf.apiurl, oscrc=server_conf.oscrc)
+        review_repo = repomaker.ReviewRepo(project, server_conf, bs)
+
+        review_repo.create()
+        repoinfo = review_repo.get_info()
+
+        os.unlink(temp_conf_fn)
+    else:
         #repoinfo = create_repo(server_conf, event_fields)
         print "Disable creating repo for project: %s" %(project)
         sys.exit(0)
 
-    else:
-        target_prj, sr_id, package = match.groups()
-    
-        bs = BuildService(apiurl=server_conf.apiurl, oscrc=server_conf.oscrc)
-        a=repomaker.ReviewRepo(project, server_conf, bs)
-    
-        a.create()
-        repoinfo = a.get_info()
-    
+    print "====LOG:REPO_MAKER:REPOINFO===="
     import pprint
     pp = pprint.PrettyPrinter(indent=4)
     print pp.pprint(repoinfo)
+    print "====LOG:REPO_MAKER:REPOINFO======================END===="
     if repoinfo:
         image_info = image_dispatch(repoinfo)
         if image_info:
             for index, imagerinfo in enumerate(image_info):
                 trigger_next('image_trigger_%s' %(index), imagerinfo)
-
-    # remove temp repo configuration file
-    if repo_conf_fn:
-        os.unlink(repo_conf_fn)
-
index 890bda2..1b128c5 100755 (executable)
@@ -23,12 +23,12 @@ envparas = ['JENKINS_HOME',
 
 export(envparas, locals())
 
-def search_published_repo(repo_path_base, project,  sr_id):
+def search_published_repo(repo_path_base, sr_id):
     """ Search publised repository, which releated with this sr
     return is a list.
     """
     ret_list = []
-    reviewrepo_base = os.path.join(repo_path_base,'pre-release', project)
+    reviewrepo_base = os.path.join(repo_path_base,'pre-release')
     if os.path.isdir(reviewrepo_base):
         for dir_name in os.listdir(reviewrepo_base):
             if dir_name.endswith("sr.%s" %sr_id):
@@ -42,23 +42,18 @@ if __name__ == '__main__':
     sys.stdout.flush()
     
     locals().update(trigger_info(TRIGGER_INFO))
+    obs_project = "%s:prerelease:%s" %(OBS_REQ_PRJ, os.path.basename(GIT_TAG))
 
-    obs_project = "%s:prerelease:%s:%s" %( OBS_REQ_PRJ, OBS_REQ_ID, OBS_REQ_PKG)
     bs = TempBuildService(obs_project, OBS_API_URL, PATH_OSCRC)
     bs.cleanup()
     print "OBS Project %s  deleted" %obs_project
     # Try again # FIX ME
     os.system("osc -d -c /etc/repos/oscrc rdelete %s -m 'deleted'" %obs_project)
 
-    reviewrepo_paths = search_published_repo(PATH_BUILDS, OBS_REQ_PKG, OBS_REQ_ID)
+    reviewrepo_paths = search_published_repo(PATH_BUILDS, os.path.basename(GIT_TAG))
     if reviewrepo_paths:
         for repodir in reviewrepo_paths:
             print "Removing temporary repo: %s" %repodir
             os.system("rm -rf %s" %repodir)
-        # Remove the parent dir if empty
-        parent_dir = os.path.abspath('%s/../../%s' %(reviewrepo_paths[0], OBS_REQ_PKG))
-        if not os.listdir(parent_dir):
-            os.system("rm -r %s" %parent_dir)
-            print "Removing temporary repo parent: %s" %parent_dir
     else:
         print "WARN: Temporary repo doesn't exist!"
index a908c98..4bc02fc 100644 (file)
@@ -53,10 +53,12 @@ def get_toplevel_dirs_from_repoconf(confp):
 
 class BuildData:
     def __init__(self):
-        self.data = {}
         self.__dict__['archs'] = []
         self.__dict__['repos'] = []
 
+    def __setitem__(self, key, value):
+        return setattr(self, key, value)
+
     def save_to_file(self, path_to_file):
 
         impl = minidom.getDOMImplementation()
@@ -80,9 +82,13 @@ class BuildData:
             ele.appendChild(dom.createTextNode(arch))
             repos.appendChild(ele)
 
-        for attr in ['id', 'buildconf']:
+        other_keys = self.__dict__.keys()
+        other_keys.remove('archs')
+        other_keys.remove('repos')
+
+        for attr in other_keys:
             if hasattr(self, attr):
-                ele = dom.createElement(attr)
+                ele = dom.createElement(attr.lower())
                 ele.appendChild(dom.createTextNode(getattr(self,attr)))
                 root.appendChild(ele)
 
@@ -742,8 +748,9 @@ class ReviewRepo(RepoManager):
         if 'ADDREPOS' in self.info.keys():
             # Known issue: required repos only can refer to the snapshots under same release_id
             # FIXME: hard code here: depends on path 'latest'
-            self.info['RELEASEID'] = os.path.basename(
-                os.path.realpath("%s/latest" %(self.info['ADDREPOS'][0]['SnapshotDir'])))
+            self.info['RELEASEID'] = "%s.sr.%s" %(
+                os.path.basename(os.path.realpath("%s/latest" %(self.info['ADDREPOS'][0]['SnapshotDir']))),
+                self.reviewrepo['Release'])
         else:
             from release import BuildID
             bid = BuildID()
@@ -753,9 +760,27 @@ class ReviewRepo(RepoManager):
     def release_project_conf(self):
         pass
 
+    def get_gitinfo(self):
+        ret_dict = {}
+
+        stdin, stdout = os.popen2("osc meta prj %s" %self.project)
+
+        root = ET.parse(stdout)
+        if root:
+            try:
+                for line in root.find('description').text.split('\n'):
+                    try:
+                        key, value = line.split(':', 1)
+                    except:
+                        pass
+                    ret_dict[key.strip()] = value.strip()
+                return ret_dict
+            except:
+                return {}
+
     def get_info(self):
-        self.info['release_build_id'] = self.builddata.id
 
+        self.info['release_build_id'] = self.builddata.id
         # if 'SnapshotDir' use for repo, need to send relative URI to image-dispatcher
         # FIX ME
         if 'SnapshotDir' in self.reviewrepo:
@@ -821,10 +846,12 @@ class ReviewRepo(RepoManager):
             relative_dir = req_repo['Location'].replace(req_repo['TopLevel'], '')
             if relative_dir.startswith('/'):
                 relative_dir = relative_dir[1:]
-            print "cp -al %s %s" %(os.path.join(req_repo['SnapshotDir'], self.info['RELEASEID'], relative_dir),
-                                   os.path.join(target_dir, os.path.basename(req_repo['Location'])))
-            os.system("cp -al %s %s" %(os.path.join(req_repo['SnapshotDir'], self.info['RELEASEID'], relative_dir),
-                                   os.path.join(target_dir, os.path.basename(req_repo['Location']))))
+
+                source_dir = os.path.realpath("%s/latest" %(req_repo['SnapshotDir']))
+                print "cp -al %s %s" %(os.path.join(source_dir, relative_dir),
+                                       os.path.join(target_dir, os.path.basename(req_repo['Location'])))
+            os.system("cp -al %s %s" %(os.path.join(source_dir, relative_dir),
+                                       os.path.join(target_dir, os.path.basename(req_repo['Location']))))
 
     def save_prj_conf(self):
         """ save project config to PATH_DATA_BASE, return the prjconf name """
@@ -935,9 +962,17 @@ class ReviewRepo(RepoManager):
 
         # Save project configuration
         self.builddata.buildconf = self.save_prj_conf()
+
         self.builddata.archs.extend(self.info['ARCHS'])
+
+        self.builddata.repos.extend(os.listdir(self.info['PATH_REPOS']))
         # Copy tempory location to relase path
         self.builddata.id = self.info['RELEASEID']
+
+        # Add Git info into build info
+        gitinfo = self.get_gitinfo()
+        for key in gitinfo.keys():
+            self.builddata[key] = gitinfo[key]
         self.builddata.save_to_file("%s/build.xml" %(self.info['PATH_DATA_BASE']))
 
         print "========================================"
@@ -945,8 +980,12 @@ class ReviewRepo(RepoManager):
         sys.stdout.flush()
         # Move the public path
         path_public_target = os.path.join(self.info['PATH_PUBLIC_BASE'], self.info['RELEASEID'])
-        if not os.path.isdir(path_public_target):
-            os.system("mkdir -p %s" %path_public_target)
+
+        # Clean up the old repos
+        if os.path.isdir(path_public_target):
+            os.system("rm -r %s" %path_public_target)
+
+        os.system("mkdir -p %s" %path_public_target)
 
         print "Moving %s to %s" %(self.info['TOPLEVEL'], path_public_target)