From be6f94d3d8c158f18485ec2447bbd9ceda07f550 Mon Sep 17 00:00:00 2001
From: Ben Couturier <ben.couturier@cern.ch>
Date: Thu, 1 Jun 2017 11:20:45 +0200
Subject: [PATCH] Added possibility to import projects with CMT config from
 gitlab

---
 .../LbRelease/SoftConfDB/AppImporter.py       | 51 +++++++++++++++++--
 1 file changed, 46 insertions(+), 5 deletions(-)

diff --git a/LbRelease/python/LbRelease/SoftConfDB/AppImporter.py b/LbRelease/python/LbRelease/SoftConfDB/AppImporter.py
index 4bf258b3..cb485668 100644
--- a/LbRelease/python/LbRelease/SoftConfDB/AppImporter.py
+++ b/LbRelease/python/LbRelease/SoftConfDB/AppImporter.py
@@ -99,6 +99,19 @@ class GitlabProject:
             raise            
         return data
 
+    def getProjectCMT(self):
+        self.projectcmturl = self.getURL("cmt/project.cmt")
+        self.log.debug("Getting: %s" % self.projectcmturl)
+        try:
+            response = urllib2.urlopen(self.projectcmturl)
+            data = response.read()
+            self.log.debug("Got: %s" % self.projectcmturl)
+        except:
+            self.log.warning("Could not find Project.cmt at: %s" %  self.projectcmturl)
+            raise            
+        return data
+
+
     def getProjectConfig(self):
         """ URL folows pattern:
         https://gitlab.cern.ch/lhcb-dirac/LHCbDIRAC/raw/v8r6p3/dist-tools/projectConfig.json
@@ -122,6 +135,18 @@ class GitlabProject:
             deps.append((l[0], l[1]))
         return deps
 
+    def getDepsFromProjectCMT(self, data):
+        deps = []
+        for l in data.splitlines():
+            m = re.match("\s*use\s+(\w+)\s+([\w\*]+)", l)
+            if m != None:
+                dp = m.group(1)
+                dv = m.group(2)
+                # removing the project name from the version if there
+                dv = dv.replace(dp + "_", "")
+                deps.append((dp, dv))
+        return deps
+
     def getDependencies(self):
         """ Returns the list of project dependencies """
         pupper = self.project.upper()
@@ -136,13 +161,28 @@ class GitlabProject:
             return []
         else:
             # For all other projects use the gaudi_project macro
+            # First we try to find teh CMakeLists
+            # Second we try the projectConfig.json
+            # Third we try the project.cmt for legacy projects
             try:
+                self.log.warning("Looking for CMakeLists.txt")
                 data = self.getCMakeLists()
                 deplist = getGaudiUse(data)
             except:
-                data = self.getProjectConfig()
-                deplist = self.getDepsFromProjectConfig(data)
-            return deplist
+                try:
+                    self.log.warning("Looking for projectConfig.json")
+                    data = self.getProjectConfig()
+                    deplist = self.getDepsFromProjectConfig(data)
+                    return deplist
+                except:
+                    try:
+                        self.log.warning("Looking for legacy CMT project.cmt")
+                        data = self.getProjectCMT()
+                        deplist = self.getDepsFromProjectCMT(data)
+                        return deplist
+                    except:
+                        self.log.error("Could not find project dependency metadata")
+                        raise Exception("Could not find project metadata")
         return []
 
 
@@ -238,7 +278,9 @@ class AppImporter:
         return node_parent
 
 
-
+    ##
+    # Main entry point for the importer
+    #
     def processProjectVersion(self, p, v, alreadyDone = [], recreate=False, sourceuri=None):
         """ Get the dependencies for a single project """
         # Cleanup the project name and version and get the SVN URL
@@ -262,7 +304,6 @@ class AppImporter:
             # we'll use this hack
             self.log.warning("Project %s is in Gitlab URI:%s" % (proj, sourceuri))
             return self.gitlabProcessProjectVersion(p, v, alturi=sourceuri, saveURIinPV=forcedSourceURI)
-
         # Getting the project.cmt file with dependencies
         if proj.upper() == "GANGA":
             projcmt = self.getGangaProjectCMT(ver)
-- 
GitLab