From ce800d3aea333919302a490838906983c18fe54d Mon Sep 17 00:00:00 2001
From: Richard Purdie <richard@openedhand.com>
Date: Sun, 12 Aug 2007 23:06:49 +0000
Subject: bitbake: Sync with upstream 1.8 branch for fixes

git-svn-id: https://svn.o-hand.com/repos/poky/trunk@2484 311d38ba-8fff-0310-9ca6-ca027cbcb966
---
 bitbake/lib/bb/__init__.py       | 20 +++++++++++++-------
 bitbake/lib/bb/cooker.py         | 21 +++++++++++++++------
 bitbake/lib/bb/data.py           |  4 ++++
 bitbake/lib/bb/fetch/__init__.py | 17 +++++++++++++++--
 bitbake/lib/bb/fetch/local.py    |  4 +++-
 5 files changed, 50 insertions(+), 16 deletions(-)

(limited to 'bitbake/lib/bb')

diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py
index e601eda46..1bfecc49e 100644
--- a/bitbake/lib/bb/__init__.py
+++ b/bitbake/lib/bb/__init__.py
@@ -345,14 +345,20 @@ def encodeurl(decoded):
 #######################################################################
 
 def which(path, item, direction = 0):
-    """Useful function for locating a file in a PATH"""
-    found = ""
+    """
+    Locate a file in a PATH
+    """
+
+    paths = (path or "").split(':')
+    if direction != 0:
+        paths.reverse()
+
     for p in (path or "").split(':'):
-        if os.path.exists(os.path.join(p, item)):
-            found = os.path.join(p, item)
-            if direction == 0:
-                break
-    return found
+        next = os.path.join(p, item)
+        if os.path.exists(next):
+            return next
+
+    return ""
 
 #######################################################################
 
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index 7db3529bb..955fbb434 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -143,10 +143,11 @@ class BBCooker:
         if self.configuration.buildfile:
             self.cb = None
             self.bb_cache = bb.cache.init(self)
+            bf = self.matchFile(self.configuration.buildfile)
             try:
-                self.configuration.data = self.bb_cache.loadDataFull(self.configuration.buildfile, self.configuration.data)
+                self.configuration.data = self.bb_cache.loadDataFull(bf, self.configuration.data)
             except IOError, e:
-                bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % ( self.configuration.buildfile, e ))
+                bb.msg.fatal(bb.msg.domain.Parsing, "Unable to read %s: %s" % (bf, e))
             except Exception, e:
                 bb.msg.fatal(bb.msg.domain.Parsing, "%s" % e)
         # emit variables and shell functions
@@ -377,14 +378,15 @@ class BBCooker:
             bb.data.setVar("BUILDNAME", os.popen('date +%Y%m%d%H%M').readline().strip(), self.configuration.data)
         bb.data.setVar("BUILDSTART", time.strftime('%m/%d/%Y %H:%M:%S',time.gmtime()),self.configuration.data)
 
-    def buildFile(self, buildfile):
+    def matchFile(self, buildfile):
         """
-        Build the file matching regexp buildfile
+        Convert the fragment buildfile into a real file
+        Error if there are too many matches
         """
-
         bf = os.path.abspath(buildfile)
         try:
             os.stat(bf)
+            return bf
         except OSError:
             (filelist, masked) = self.collect_bbfiles()
             regexp = re.compile(buildfile)
@@ -398,7 +400,14 @@ class BBCooker:
                 for f in matches:
                     bb.msg.error(bb.msg.domain.Parsing, "    %s" % f)
                 sys.exit(1)
-            bf = matches[0]		    
+            return matches[0]		    
+
+    def buildFile(self, buildfile):
+        """
+        Build the file matching regexp buildfile
+        """
+
+        bf = self.matchFile(buildfile)
 
         bbfile_data = bb.parse.handle(bf, self.configuration.data)
 
diff --git a/bitbake/lib/bb/data.py b/bitbake/lib/bb/data.py
index 9782c9f54..b2025f069 100644
--- a/bitbake/lib/bb/data.py
+++ b/bitbake/lib/bb/data.py
@@ -288,6 +288,10 @@ def expandKeys(alterdata, readdata = None):
             src = getVarFlag(key, i, readdata) or []
             dest.extend(src)
             setVarFlag(ekey, i, dest, alterdata)
+            
+            if key in alterdata._special_values[i]:
+                alterdata._special_values[i].remove(key)
+                alterdata._special_values[i].add(ekey)
 
         delVar(key, alterdata)
 
diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py
index f739245bd..229b28c19 100644
--- a/bitbake/lib/bb/fetch/__init__.py
+++ b/bitbake/lib/bb/fetch/__init__.py
@@ -182,8 +182,21 @@ def get_srcrev(d):
     if len(scms) == 1:
         return urldata[scms[0]].method.sortable_revision(scms[0], urldata[scms[0]], d)
 
-    bb.msg.error(bb.msg.domain.Fetcher, "Sorry, support for SRCREV_FORMAT still needs to be written")
-    raise ParameterError
+    #
+    # Mutiple SCMs are in SRC_URI so we resort to SRCREV_FORMAT
+    #
+    format = bb.data.getVar('SRCREV_FORMAT', d, 1)
+    if not format:
+        bb.msg.error(bb.msg.domain.Fetcher, "The SRCREV_FORMAT variable must be set when multiple SCMs are used.")
+        raise ParameterError
+
+    for scm in scms:
+        if 'name' in urldata[scm].parm:
+            name = urldata[scm].parm["name"]
+            rev = urldata[scm].method.sortable_revision(scm, urldata[scm], d)
+            format = format.replace(name, rev)
+
+    return format
 
 def localpath(url, d, cache = True):
     """
diff --git a/bitbake/lib/bb/fetch/local.py b/bitbake/lib/bb/fetch/local.py
index 9be8f1ce4..5e480a208 100644
--- a/bitbake/lib/bb/fetch/local.py
+++ b/bitbake/lib/bb/fetch/local.py
@@ -38,9 +38,11 @@ class Local(Fetch):
         return urldata.type in ['file','patch']
 
     def localpath(self, url, urldata, d):
-        """Return the local filename of a given url assuming a successful fetch.
+        """
+        Return the local filename of a given url assuming a successful fetch.
         """
         path = url.split("://")[1]
+        path = path.split(";")[0]
         newpath = path
         if path[0] != "/":
             filespath = data.getVar('FILESPATH', d, 1)
-- 
cgit v1.2.3