buildframework/helium/sf/python/pythoncore/lib/ccm/__init__.py
changeset 645 b8d81fa19e7d
parent 628 7c4a911dc066
--- a/buildframework/helium/sf/python/pythoncore/lib/ccm/__init__.py	Wed Sep 29 17:48:06 2010 +0100
+++ b/buildframework/helium/sf/python/pythoncore/lib/ccm/__init__.py	Sun Oct 10 15:22:15 2010 +0300
@@ -202,10 +202,11 @@
             if mresult != None:
                 project = self._session.create(mresult.group(1))
                 self._output[project] = []
-            mresult = re.match(r"^(.*)\s+(\w+#\d+)\s+(.+)$", line)
+            mresult = re.match(r"^(.*?)\s+(\w+#\d+(?:,\s+\w+#\d+)*)\s+(.+)$", line)
             if mresult != None and project != None:
-                self._output[project].append({'object': self._session.create(mresult.group(1)),
-                                              'task': self._session.create("Task %s" % mresult.group(2)),
+                for task in mresult.group(2).split(','):
+                    self._output[project].append({'object': self._session.create(mresult.group(1)),
+                                              'task': self._session.create("Task %s" % task),
                                               'comment': mresult.group(3)})
             mresult = re.match(r"^(\w+#\d+)\s+(.+)$", line)
             if mresult != None and project != None:
@@ -340,7 +341,6 @@
         match_warning = re.compile(r"^Warning:(.*)")
         match_failed = re.compile(r"(Update failed)")
         
-        # TODO: cleanup the parsing to do that in a more efficient way.
         for line in output.splitlines():
             _logger.info(line)
             res = match_object_update.match(line)
@@ -723,9 +723,6 @@
         
     def __repr__(self):
         return self.__str__()
-    
-    def __del__(self):
-        self.close()
 
     def purposes(self, role=None):
         """ Returns available purposes. """
@@ -922,7 +919,7 @@
             
         try:
             for session in self._free_sessions:
-                session.role = session._set_role(role)
+                session.role = role
         finally:                
             self._lock_pool = False
             self._pool_lock.notifyAll()
@@ -1349,11 +1346,13 @@
         
     def _getrelease(self):
         """ Get the release of the current object. Returns a Releasedef object. """
-        self._release = Releasedef(self._session, self['release'])
+        if self._release == None and (self['release'] != None and self['release'] != ''):
+            self._release = Releasedef(self._session, self['release'])
         return self._release
 
     def _setrelease(self, release):
         """ Set the release of the current object. """
+        self._release = release
         self['release'] = release['displayname']
     
     def refresh(self):
@@ -1381,7 +1380,7 @@
         if result.status != None and result.status != 0:
             raise CCMException("Error setting basline of project '%s'\n%s" % (self.objectname, result.output))
 
-    def set_update_method(self, name, recurse = False):
+    def set_update_method(self, name, recurse=False):
         """ Set the update method for the project (and subproject if recurse is True). """
         assert name != None, "name must not be None."
         assert len(name) > 0, "name must not be an empty string."
@@ -1392,7 +1391,7 @@
         if result.status != None and result.status != 0:
             raise CCMException("Error setting reconfigure properties to %s for project '%s'\nStatus: %s\n%s" % (name, self.objectname, result.status, result.output))
    
-    def apply_update_properties(self, baseline = True, tasks_and_folders = True, recurse=True):
+    def apply_update_properties(self, baseline=True, tasks_and_folders=True, recurse=True):
         """ Apply update properties to subprojects. """
         args = ""
         if not baseline:
@@ -1423,7 +1422,7 @@
                 return result.output
         raise CCMException("Error creation snapshot of %s,\n%s" % (self.objectname, result.output), result)
     
-    def checkout(self, release, version=None, purpose=None, subprojects=True):
+    def checkout(self, release, version=None, purpose=None, subprojects=True, path=None):
         """ Create a checkout of this project. 
         
         This will only checkout the project in Synergy. It does not create a work area.
@@ -1448,6 +1447,9 @@
             self._session.role = get_role_for_purpose(self._session, purpose)
             
             args += " -purpose \"%s\"" % purpose
+        if path:
+            args += " -path \"%s\"" % path
+            
         if subprojects:
             args += " -subprojects"
         result = self._session.execute("checkout -project \"%s\" -release \"%s\" -no_wa %s" \
@@ -1456,47 +1458,7 @@
             self._session.role = role
         if result.project == None:
             raise CCMException("Error checking out project %s,\n%s" % (self.objectname, result.output), result)
-        return result
-    
-    def create_release_tag(self, release, new_tag):
-        """ creates new release tag """
-        role = self._session.role
-        
-        if role is None:
-            self._session.role = "developer"
-            role = self._session.role
-
-        args = "release -create %s -from %s -bl %s -active -allow_parallel_check_out" % (new_tag, release, release)
-        self._session.role = "build_mgr"
-
-        result = self._session.execute(" %s" \
-                                  % (args), Result(self._session))
-        self._session.role = role
-
-        return result.output
-
-    def delete_release_tag(self, release, new_tag):
-        """ deletes new release tag """
-
-        role = self._session.role
-        if role is None:
-            self._session.role = "developer"
-            role = self._session.role
-        
-
-        self._session.role = "build_mgr"
-
-        result = self._session.execute("pg -l -r %s -u" \
-                                  % (new_tag), Result(self._session))
-        result = self._session.execute("pg -d \"%s\" -m" \
-                                  % (result.output), Result(self._session))
-        result = self._session.execute("release -d %s -force" \
-                                  % (new_tag), Result(self._session))
-
-        self._session.role = role
-
-        return result.output
-        
+        return result        
         
     def work_area(self, maintain, recursive=None, relative=None, path=None, pst=None, wat=False):
         """ Configure the work area. This allow to enable it or disable it, set the path, recursion... """
@@ -1629,6 +1591,44 @@
         return self.name
             
     component = property(_getcomponent)
+    
+    def create_tag(self, new_tag):
+        """ creates new release tag """
+        role = self._session.role
+        
+        if role is None:
+            self._session.role = "developer"
+            role = self._session.role
+
+        args = "release -create %s -from %s -bl %s -active -allow_parallel_check_out" % (new_tag, self.objectname, self.objectname)
+        self._session.role = "build_mgr"
+
+        result = self._session.execute(" %s" \
+                                  % (args), Result(self._session))
+        self._session.role = role
+
+        return result.output
+
+    def delete_tag(self, new_tag):
+        """ deletes new release tag """
+
+        role = self._session.role
+        if role is None:
+            self._session.role = "developer"
+            role = self._session.role
+        
+        self._session.role = "build_mgr"
+
+        result = self._session.execute("pg -l -r %s -u" \
+                                  % (new_tag), Result(self._session))
+        result = self._session.execute("pg -d \"%s\" -m" \
+                                  % (result.output), Result(self._session))
+        result = self._session.execute("release -d \"%s\" -force" \
+                                  % (new_tag), Result(self._session))
+
+        self._session.role = role
+
+        return result.output
 
 
 class Folder(CCMObject):
@@ -1751,7 +1751,6 @@
     objects = property(_getobjects)
     
     def __unicode__(self):
-        # TODO: use optimised query that makes only 1 ccm query with suitable format
         if self.__unicode_str_text == None:
             self.__unicode_str_text = u'%s: %s' % (self['displayname'], self['task_synopsis'])
         return self.__unicode_str_text
@@ -1771,6 +1770,7 @@
 
     release = property(get_release_tag, set_release_tag)
 
+
 class UpdateTemplate:
     """ Allow to access Update Template property using Release and Purpose. """
     def __init__(self, releasedef, purpose):