bitbake: fetch2: Revert the regexp removal for the type field and instead anchor...
authorRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 28 Jun 2012 11:34:20 +0000 (11:34 +0000)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 28 Jun 2012 15:32:57 +0000 (16:32 +0100)
People are using regexps in the url type field so we need to preserve
this bitbake behaviour. To address the issues with https:// urls mapping
badly to file:// urls we anchor the regexp if its not already anchored.
There should be no expressions in the wild which would break with this
change.

(Bitbake rev: ce0579dc256251e523c6330641f98b9f5a0e5761)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
bitbake/lib/bb/fetch2/__init__.py

index a38cb8f..52e12a0 100644 (file)
@@ -193,6 +193,11 @@ def uri_replace(ud, uri_find, uri_replace, replacements, d):
     result_decoded = ['', '', '', '', '', {}]
     for loc, i in enumerate(uri_find_decoded):
         result_decoded[loc] = uri_decoded[loc]
+        regexp = i
+        if loc == 0 and regexp and not regexp.endswith("$"):
+            # Leaving the type unanchored can mean "https" matching "file" can become "files"
+            # which is clearly undesirable.
+            regexp += "$"
         if loc == 5:
             # Handle URL parameters
             if i:
@@ -203,20 +208,14 @@ def uri_replace(ud, uri_find, uri_replace, replacements, d):
             # Overwrite any specified replacement parameters
             for k in uri_replace_decoded[loc]:
                 result_decoded[loc][k] = uri_replace_decoded[loc][k]
-        elif loc == 0:
-            # Principle of least surprise. We could end up with https matching against http and 
-            # generating "files://" urls if we use the regexp engine below.
-            if i != uri_decoded[loc]:
-                return None
-            result_decoded[loc] = uri_replace_decoded[loc]
-        elif (re.match(i, uri_decoded[loc])):
+        elif (re.match(regexp, uri_decoded[loc])):
             if not uri_replace_decoded[loc]:
                 result_decoded[loc] = ""    
             else:
                 for k in replacements:
                     uri_replace_decoded[loc] = uri_replace_decoded[loc].replace(k, replacements[k])
-                #bb.note("%s %s %s" % (i, uri_replace_decoded[loc], uri_decoded[loc]))
-                result_decoded[loc] = re.sub(i, uri_replace_decoded[loc], uri_decoded[loc])
+                #bb.note("%s %s %s" % (regexp, uri_replace_decoded[loc], uri_decoded[loc]))
+                result_decoded[loc] = re.sub(regexp, uri_replace_decoded[loc], uri_decoded[loc])
             if loc == 2:
                 # Handle path manipulations
                 basename = None