All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/14] Bitbake fetcher mirror handling overhaul
@ 2012-06-20 14:12 Richard Purdie
  2012-06-20 14:12 ` [PATCH 01/14] fetch2/__init__: Make it clearer when uri_replace doesn't return a match Richard Purdie
                   ` (13 more replies)
  0 siblings, 14 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

The following commits overhaul bitbake's mirror handling in the fetcher
bring various correctness fixes and improvements.

Richard Purdie (14):
  fetch2/__init__: Make it clearer when uri_replace doesn't return a
    match
  fetch2: Fix error handling in uri_replace()
  fetch2: Only cache data if fn is set, its pointless caching it
    against a None value
  fetch2: Ensure when downloading we are consistently in the same
    directory
  fetch2: Split try_mirrors into two parts
  fetch2: Explicitly check for mirror tarballs in mirror handling code
  fetch2: Improve mirror looping to consider more cases
  fetch2: Simplify some looping constructs in uri_replace()
  fetch2: Remove basestring test and simplify uri_replace
  fetch2: Add parameter handling to uri_replace()
  fetch2: uri_replace() remove what amounts to a null operation and add
    some comments
  fetch2: uri_replace() improve mirrortarball handling
  fetch2: uri_replace() only consider ud.localpath where its a file
  test/fetch: Add in unit tests for uri_replace() and git premirrors

 bitbake/lib/bb/fetch2/__init__.py |  203 ++++++++++++++++++++++---------------
 bitbake/lib/bb/tests/fetch.py     |   55 ++++++++++-
 2 files changed, 175 insertions(+), 83 deletions(-)

-- 
1.7.5.4




^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH 01/14] fetch2/__init__: Make it clearer when uri_replace doesn't return a match
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 02/14] fetch2: Fix error handling in uri_replace() Richard Purdie
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 324eef2..73ac73a 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -210,8 +210,10 @@ def uri_replace(ud, uri_find, uri_replace, d):
                     if basename and not result_decoded[loc].endswith(basename):
                         result_decoded[loc] = os.path.join(result_decoded[loc], basename)
             else:
-                return ud.url
+                return None
     result = encodeurl(result_decoded)
+    if result == ud.url:
+        return None
     logger.debug(2, "For url %s returning %s" % (ud.url, result))
     return result
 
@@ -477,7 +479,7 @@ def try_mirrors(d, origud, mirrors, check = False):
         except ValueError:
             continue
         newuri = uri_replace(origud, find, replace, ld)
-        if newuri == origud.url:
+        if not newuri:
             continue
         try:
             ud = FetchData(newuri, ld)
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 02/14] fetch2: Fix error handling in uri_replace()
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
  2012-06-20 14:12 ` [PATCH 01/14] fetch2/__init__: Make it clearer when uri_replace doesn't return a match Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 03/14] fetch2: Only cache data if fn is set, its pointless caching it against a None value Richard Purdie
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 73ac73a..067d60c 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -184,7 +184,8 @@ def encodeurl(decoded):
 
 def uri_replace(ud, uri_find, uri_replace, d):
     if not ud.url or not uri_find or not uri_replace:
-        logger.debug(1, "uri_replace: passed an undefined value, not replacing")
+        logger.error("uri_replace: passed an undefined value, not replacing")
+        return None
     uri_decoded = list(decodeurl(ud.url))
     uri_find_decoded = list(decodeurl(uri_find))
     uri_replace_decoded = list(decodeurl(uri_replace))
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 03/14] fetch2: Only cache data if fn is set, its pointless caching it against a None value
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
  2012-06-20 14:12 ` [PATCH 01/14] fetch2/__init__: Make it clearer when uri_replace doesn't return a match Richard Purdie
  2012-06-20 14:12 ` [PATCH 02/14] fetch2: Fix error handling in uri_replace() Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 04/14] fetch2: Ensure when downloading we are consistently in the same directory Richard Purdie
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 067d60c..2eeec3d 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -1028,7 +1028,7 @@ class Fetch(object):
         self.ud = {}
 
         fn = d.getVar('FILE', True)
-        if cache and fn in urldata_cache:
+        if cache and fn and fn in urldata_cache:
             self.ud = urldata_cache[fn]
 
         for url in urls:
@@ -1040,7 +1040,7 @@ class Fetch(object):
                         self.ud[url] = None
                         pass
 
-        if cache:
+        if fn and cache:
             urldata_cache[fn] = self.ud
 
     def localpath(self, url):
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 04/14] fetch2: Ensure when downloading we are consistently in the same directory
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (2 preceding siblings ...)
  2012-06-20 14:12 ` [PATCH 03/14] fetch2: Only cache data if fn is set, its pointless caching it against a None value Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 05/14] fetch2: Split try_mirrors into two parts Richard Purdie
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

This assists with build reproducuility. It also avoids errors if cwd
happens not to exist when we call into the fetcher. That situation
would be unusual but I hit it with the unit tests.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 2eeec3d..b09753f 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -486,6 +486,8 @@ def try_mirrors(d, origud, mirrors, check = False):
             ud = FetchData(newuri, ld)
             ud.setup_localpath(ld)
 
+            os.chdir(ld.getVar("DL_DIR", True))
+
             if check:
                 found = ud.method.checkstatus(newuri, ud, ld)
                 if found:
@@ -1094,6 +1096,8 @@ class Fetch(object):
                 if premirroronly:
                     self.d.setVar("BB_NO_NETWORK", "1")
 
+                os.chdir(self.d.getVar("DL_DIR", True))
+
                 firsterr = None
                 if not localpath and ((not os.path.exists(ud.donestamp)) or m.need_update(u, ud, self.d)):
                     try:
@@ -1155,7 +1159,7 @@ class Fetch(object):
                 except:
                     # Finally, try checking uri, u, from MIRRORS
                     mirrors = mirror_from_string(self.d.getVar('MIRRORS', True))
-                    ret = try_mirrors (self.d, ud, mirrors, True)
+                    ret = try_mirrors(self.d, ud, mirrors, True)
 
             if not ret:
                 raise FetchError("URL %s doesn't work" % u, u)
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 05/14] fetch2: Split try_mirrors into two parts
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (3 preceding siblings ...)
  2012-06-20 14:12 ` [PATCH 04/14] fetch2: Ensure when downloading we are consistently in the same directory Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 06/14] fetch2: Explicitly check for mirror tarballs in mirror handling code Richard Purdie
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

There are no functionality changes in this change

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |  111 +++++++++++++++++++-----------------
 1 files changed, 59 insertions(+), 52 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index b09753f..e4af951 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -464,6 +464,60 @@ def check_network_access(d, info = "", url = None):
     else:
         logger.debug(1, "Fetcher accessed the network with the command %s" % info)
 
+def try_mirror_url(newuri, origud, ud, ld, check = False):
+    # Return of None or a value means we're finished
+    # False means try another url
+    try:
+        if check:
+            found = ud.method.checkstatus(newuri, ud, ld)
+            if found:
+                return found
+            return False
+
+        os.chdir(ld.getVar("DL_DIR", True))
+
+        if not os.path.exists(ud.donestamp) or ud.method.need_update(newuri, ud, ld):
+            ud.method.download(newuri, ud, ld)
+            if hasattr(ud.method,"build_mirror_data"):
+                ud.method.build_mirror_data(newuri, ud, ld)
+
+        if not ud.localpath or not os.path.exists(ud.localpath):
+            return False
+
+        if ud.localpath == origud.localpath:
+            return ud.localpath
+
+        # We may be obtaining a mirror tarball which needs further processing by the real fetcher
+        # If that tarball is a local file:// we need to provide a symlink to it
+        dldir = ld.getVar("DL_DIR", True)
+        if os.path.basename(ud.localpath) != os.path.basename(origud.localpath):
+            open(ud.donestamp, 'w').close()
+            dest = os.path.join(dldir, os.path.basename(ud.localpath))
+            if not os.path.exists(dest):
+                os.symlink(ud.localpath, dest)
+            return None
+        # Otherwise the result is a local file:// and we symlink to it
+        if not os.path.exists(origud.localpath):
+             os.symlink(ud.localpath, origud.localpath)
+        update_stamp(newuri, origud, ld)
+        return ud.localpath
+
+    except bb.fetch2.NetworkAccess:
+        raise
+
+    except bb.fetch2.BBFetchException as e:
+        if isinstance(e, ChecksumError):
+            logger.warn("Mirror checksum failure for url %s (original url: %s)\nCleaning and trying again." % (newuri, origud.url))
+            logger.warn(str(e))
+        else:
+            logger.debug(1, "Mirror fetch failure for url %s (original url: %s)" % (newuri, origud.url))
+            logger.debug(1, str(e))
+        try:
+            ud.method.clean(ud, ld)
+        except UnboundLocalError:
+            pass
+        return False
+
 def try_mirrors(d, origud, mirrors, check = False):
     """
     Try to use a mirrored version of the sources.
@@ -482,59 +536,12 @@ def try_mirrors(d, origud, mirrors, check = False):
         newuri = uri_replace(origud, find, replace, ld)
         if not newuri:
             continue
-        try:
-            ud = FetchData(newuri, ld)
-            ud.setup_localpath(ld)
-
-            os.chdir(ld.getVar("DL_DIR", True))
-
-            if check:
-                found = ud.method.checkstatus(newuri, ud, ld)
-                if found:
-                    return found
-                continue
+        ud = FetchData(newuri, ld)
+        ud.setup_localpath(ld)
 
-            if not os.path.exists(ud.donestamp) or ud.method.need_update(newuri, ud, ld):
-                ud.method.download(newuri, ud, ld)
-                if hasattr(ud.method,"build_mirror_data"):
-                    ud.method.build_mirror_data(newuri, ud, ld)
-
-            if not ud.localpath or not os.path.exists(ud.localpath):
-                continue
-
-            if ud.localpath == origud.localpath:
-                return ud.localpath
-
-            # We may be obtaining a mirror tarball which needs further processing by the real fetcher
-            # If that tarball is a local file:// we need to provide a symlink to it
-            dldir = ld.getVar("DL_DIR", True)
-            if os.path.basename(ud.localpath) != os.path.basename(origud.localpath):
-                open(ud.donestamp, 'w').close()
-                dest = os.path.join(dldir, os.path.basename(ud.localpath))
-                if not os.path.exists(dest):
-                    os.symlink(ud.localpath, dest)
-                return None
-            # Otherwise the result is a local file:// and we symlink to it
-            if not os.path.exists(origud.localpath):
-                 os.symlink(ud.localpath, origud.localpath)
-            update_stamp(newuri, origud, ld)
-            return ud.localpath
-
-        except bb.fetch2.NetworkAccess:
-            raise
-
-        except bb.fetch2.BBFetchException as e:
-            if isinstance(e, ChecksumError):
-                logger.warn("Mirror checksum failure for url %s (original url: %s)\nCleaning and trying again." % (newuri, origud.url))
-                logger.warn(str(e))
-            else:
-                logger.debug(1, "Mirror fetch failure for url %s (original url: %s)" % (newuri, origud.url))
-                logger.debug(1, str(e))
-            try:
-                ud.method.clean(ud, ld)
-            except UnboundLocalError:
-                pass
-            continue
+        ret = try_mirror_url(newuri, origud, ud, ld, check)
+        if ret != False:
+            return ret
     return None
 
 def srcrev_internal_helper(ud, d, name):
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 06/14] fetch2: Explicitly check for mirror tarballs in mirror handling code
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (4 preceding siblings ...)
  2012-06-20 14:12 ` [PATCH 05/14] fetch2: Split try_mirrors into two parts Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 07/14] fetch2: Improve mirror looping to consider more cases Richard Purdie
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

With support for things like git:// -> git:// urls, we need to be
more explicity about the mirrortarball check since we need to fall
through to the following code in other cases.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index e4af951..a2e0beb 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -490,7 +490,8 @@ def try_mirror_url(newuri, origud, ud, ld, check = False):
         # We may be obtaining a mirror tarball which needs further processing by the real fetcher
         # If that tarball is a local file:// we need to provide a symlink to it
         dldir = ld.getVar("DL_DIR", True)
-        if os.path.basename(ud.localpath) != os.path.basename(origud.localpath):
+        if os.path.basename(ud.localpath) == os.path.basename(origud.mirrortarball) \
+                and os.path.basename(ud.localpath) != os.path.basename(origud.localpath):
             open(ud.donestamp, 'w').close()
             dest = os.path.join(dldir, os.path.basename(ud.localpath))
             if not os.path.exists(dest):
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 07/14] fetch2: Improve mirror looping to consider more cases
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (5 preceding siblings ...)
  2012-06-20 14:12 ` [PATCH 06/14] fetch2: Explicitly check for mirror tarballs in mirror handling code Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:12 ` [PATCH 08/14] fetch2: Simplify some looping constructs in uri_replace() Richard Purdie
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

Currently we only consider one pass through the mirror list. This doesn't
catch cases where for example you might want to setup a mirror of a mirror
and allow multiple redirection. There is no reason we can't support this
and the patch loops through the list recursively now.

As a safeguard, it will stop if any duplicate urls are found, hence
avoiding circular dependency looping.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |   41 ++++++++++++++++++++++++++----------
 1 files changed, 29 insertions(+), 12 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index a2e0beb..5838436 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -464,6 +464,30 @@ def check_network_access(d, info = "", url = None):
     else:
         logger.debug(1, "Fetcher accessed the network with the command %s" % info)
 
+def build_mirroruris(origud, mirrors, ld):
+    uris = []
+    uds = []
+
+    def adduri(uri, ud, uris, uds):
+        for line in mirrors:
+            try:
+                (find, replace) = line
+            except ValueError:
+                continue
+            newuri = uri_replace(ud, find, replace, ld)
+            if not newuri or newuri in uris or uri == origud.url:
+                continue
+            uris.append(newuri)
+            ud = FetchData(newuri, ld)
+            ud.setup_localpath(ld)
+            uds.append(ud)
+
+            adduri(newuri, ud, uris, uds)
+
+    adduri(None, origud, uris, uds)
+
+    return uris, uds
+
 def try_mirror_url(newuri, origud, ud, ld, check = False):
     # Return of None or a value means we're finished
     # False means try another url
@@ -529,18 +553,11 @@ def try_mirrors(d, origud, mirrors, check = False):
     mirrors is the list of mirrors we're going to try
     """
     ld = d.createCopy()
-    for line in mirrors:
-        try:
-            (find, replace) = line
-        except ValueError:
-            continue
-        newuri = uri_replace(origud, find, replace, ld)
-        if not newuri:
-            continue
-        ud = FetchData(newuri, ld)
-        ud.setup_localpath(ld)
-
-        ret = try_mirror_url(newuri, origud, ud, ld, check)
+
+    uris, uds = build_mirroruris(origud, mirrors, ld)
+
+    for index, uri in enumerate(uris):
+        ret = try_mirror_url(uri, origud, uds[index], ld, check)
         if ret != False:
             return ret
     return None
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 08/14] fetch2: Simplify some looping constructs in uri_replace()
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (6 preceding siblings ...)
  2012-06-20 14:12 ` [PATCH 07/14] fetch2: Improve mirror looping to consider more cases Richard Purdie
@ 2012-06-20 14:12 ` Richard Purdie
  2012-06-20 14:13 ` [PATCH 09/14] fetch2: Remove basestring test and simplify uri_replace Richard Purdie
                   ` (5 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:12 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 5838436..fe0c6a7 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -191,8 +191,7 @@ def uri_replace(ud, uri_find, uri_replace, d):
     uri_replace_decoded = list(decodeurl(uri_replace))
     logger.debug(2, "For url %s comparing %s to %s" % (uri_decoded, uri_find_decoded, uri_replace_decoded))
     result_decoded = ['', '', '', '', '', {}]
-    for i in uri_find_decoded:
-        loc = uri_find_decoded.index(i)
+    for loc, i in enumerate(uri_find_decoded):
         result_decoded[loc] = uri_decoded[loc]
         if isinstance(i, basestring):
             if (re.match(i, uri_decoded[loc])):
@@ -200,7 +199,7 @@ def uri_replace(ud, uri_find, uri_replace, d):
                     result_decoded[loc] = ""    
                 else:
                     result_decoded[loc] = re.sub(i, uri_replace_decoded[loc], uri_decoded[loc])
-                if uri_find_decoded.index(i) == 2:
+                if loc == 2:
                     basename = None
                     if ud.mirrortarball:
                         basename = os.path.basename(ud.mirrortarball)
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 09/14] fetch2: Remove basestring test and simplify uri_replace
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (7 preceding siblings ...)
  2012-06-20 14:12 ` [PATCH 08/14] fetch2: Simplify some looping constructs in uri_replace() Richard Purdie
@ 2012-06-20 14:13 ` Richard Purdie
  2012-06-20 14:13 ` [PATCH 10/14] fetch2: Add parameter handling to uri_replace() Richard Purdie
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:13 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |   35 ++++++++++++++++++-----------------
 1 files changed, 18 insertions(+), 17 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index fe0c6a7..7045e1b 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -193,24 +193,25 @@ def uri_replace(ud, uri_find, uri_replace, d):
     result_decoded = ['', '', '', '', '', {}]
     for loc, i in enumerate(uri_find_decoded):
         result_decoded[loc] = uri_decoded[loc]
-        if isinstance(i, basestring):
-            if (re.match(i, uri_decoded[loc])):
-                if not uri_replace_decoded[loc]:
-                    result_decoded[loc] = ""    
-                else:
-                    result_decoded[loc] = re.sub(i, uri_replace_decoded[loc], uri_decoded[loc])
-                if loc == 2:
-                    basename = None
-                    if ud.mirrortarball:
-                        basename = os.path.basename(ud.mirrortarball)
-                    elif ud.localpath:
-                        basename = os.path.basename(ud.localpath)
-                    if basename and result_decoded[loc].endswith("/"):
-                        result_decoded[loc] = os.path.dirname(result_decoded[loc])
-                    if basename and not result_decoded[loc].endswith(basename):
-                        result_decoded[loc] = os.path.join(result_decoded[loc], basename)
+        if loc == 5:
+            continue
+        elif (re.match(i, uri_decoded[loc])):
+            if not uri_replace_decoded[loc]:
+                result_decoded[loc] = ""    
             else:
-                return None
+                result_decoded[loc] = re.sub(i, uri_replace_decoded[loc], uri_decoded[loc])
+            if loc == 2:
+                basename = None
+                if ud.mirrortarball:
+                    basename = os.path.basename(ud.mirrortarball)
+                elif ud.localpath:
+                    basename = os.path.basename(ud.localpath)
+                if basename and result_decoded[loc].endswith("/"):
+                    result_decoded[loc] = os.path.dirname(result_decoded[loc])
+                if basename and not result_decoded[loc].endswith(basename):
+                    result_decoded[loc] = os.path.join(result_decoded[loc], basename)
+        else:
+            return None
     result = encodeurl(result_decoded)
     if result == ud.url:
         return None
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 10/14] fetch2: Add parameter handling to uri_replace()
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (8 preceding siblings ...)
  2012-06-20 14:13 ` [PATCH 09/14] fetch2: Remove basestring test and simplify uri_replace Richard Purdie
@ 2012-06-20 14:13 ` Richard Purdie
  2012-06-20 14:13 ` [PATCH 11/14] fetch2: uri_replace() remove what amounts to a null operation and add some comments Richard Purdie
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:13 UTC (permalink / raw)
  To: bitbake-devel

This means that parameters in the source expression are used as part of the
match. Parameters in the destination are used explicitly in the final
url.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 7045e1b..37f13e2 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -194,7 +194,15 @@ def uri_replace(ud, uri_find, uri_replace, d):
     for loc, i in enumerate(uri_find_decoded):
         result_decoded[loc] = uri_decoded[loc]
         if loc == 5:
-            continue
+            # Handle URL parameters
+            if i:
+                # Any specified URL parameters must match
+                for k in uri_replace_decoded[loc]:
+                    if uri_decoded[loc][k] != uri_replace_decoded[loc][k]:
+                        return None
+            # Overwrite any specified replacement parameters
+            for k in uri_replace_decoded[loc]:
+                result_decoded[loc][k] = uri_replace_decoded[loc][k]
         elif (re.match(i, uri_decoded[loc])):
             if not uri_replace_decoded[loc]:
                 result_decoded[loc] = ""    
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 11/14] fetch2: uri_replace() remove what amounts to a null operation and add some comments
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (9 preceding siblings ...)
  2012-06-20 14:13 ` [PATCH 10/14] fetch2: Add parameter handling to uri_replace() Richard Purdie
@ 2012-06-20 14:13 ` Richard Purdie
  2012-06-20 14:13 ` [PATCH 12/14] fetch2: uri_replace() improve mirrortarball handling Richard Purdie
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:13 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 37f13e2..945db7b 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -207,15 +207,15 @@ def uri_replace(ud, uri_find, uri_replace, d):
             if not uri_replace_decoded[loc]:
                 result_decoded[loc] = ""    
             else:
+                #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])
             if loc == 2:
+                # Handle path manipulations
                 basename = None
                 if ud.mirrortarball:
                     basename = os.path.basename(ud.mirrortarball)
                 elif ud.localpath:
                     basename = os.path.basename(ud.localpath)
-                if basename and result_decoded[loc].endswith("/"):
-                    result_decoded[loc] = os.path.dirname(result_decoded[loc])
                 if basename and not result_decoded[loc].endswith(basename):
                     result_decoded[loc] = os.path.join(result_decoded[loc], basename)
         else:
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 12/14] fetch2: uri_replace() improve mirrortarball handling
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (10 preceding siblings ...)
  2012-06-20 14:13 ` [PATCH 11/14] fetch2: uri_replace() remove what amounts to a null operation and add some comments Richard Purdie
@ 2012-06-20 14:13 ` Richard Purdie
  2012-06-20 14:13 ` [PATCH 13/14] fetch2: uri_replace() only consider ud.localpath where its a file Richard Purdie
  2012-06-20 14:13 ` [PATCH 14/14] test/fetch: Add in unit tests for uri_replace() and git premirrors Richard Purdie
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:13 UTC (permalink / raw)
  To: bitbake-devel

We only consider mirror tarballs when the source and target urls are of
differing types. We also should clear all url paramters when handling
mirror tarballs.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 945db7b..63e2e48 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -212,8 +212,11 @@ def uri_replace(ud, uri_find, uri_replace, d):
             if loc == 2:
                 # Handle path manipulations
                 basename = None
-                if ud.mirrortarball:
+                if uri_decoded[0] != uri_replace_decoded[0] and ud.mirrortarball:
+                    # If the source and destination url types differ, must be a mirrortarball mapping
                     basename = os.path.basename(ud.mirrortarball)
+                    # Kill parameters, they make no sense for mirror tarballs
+                    uri_decoded[5] = {}
                 elif ud.localpath:
                     basename = os.path.basename(ud.localpath)
                 if basename and not result_decoded[loc].endswith(basename):
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 13/14] fetch2: uri_replace() only consider ud.localpath where its a file
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (11 preceding siblings ...)
  2012-06-20 14:13 ` [PATCH 12/14] fetch2: uri_replace() improve mirrortarball handling Richard Purdie
@ 2012-06-20 14:13 ` Richard Purdie
  2012-06-20 14:13 ` [PATCH 14/14] test/fetch: Add in unit tests for uri_replace() and git premirrors Richard Purdie
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:13 UTC (permalink / raw)
  To: bitbake-devel

Using ud.localpath as a basename when it points at a directory causes
problems. The supports_checksum() method gives a good indication of whether
ud.localpath can be used in the way we need.

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/fetch2/__init__.py |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 63e2e48..e222fdb 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -217,7 +217,7 @@ def uri_replace(ud, uri_find, uri_replace, d):
                     basename = os.path.basename(ud.mirrortarball)
                     # Kill parameters, they make no sense for mirror tarballs
                     uri_decoded[5] = {}
-                elif ud.localpath:
+                elif ud.localpath and ud.method.supports_checksum(ud):
                     basename = os.path.basename(ud.localpath)
                 if basename and not result_decoded[loc].endswith(basename):
                     result_decoded[loc] = os.path.join(result_decoded[loc], basename)
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH 14/14] test/fetch: Add in unit tests for uri_replace() and git premirrors
  2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
                   ` (12 preceding siblings ...)
  2012-06-20 14:13 ` [PATCH 13/14] fetch2: uri_replace() only consider ud.localpath where its a file Richard Purdie
@ 2012-06-20 14:13 ` Richard Purdie
  13 siblings, 0 replies; 15+ messages in thread
From: Richard Purdie @ 2012-06-20 14:13 UTC (permalink / raw)
  To: bitbake-devel

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
---
 bitbake/lib/bb/tests/fetch.py |   55 ++++++++++++++++++++++++++++++++++++++--
 1 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/bitbake/lib/bb/tests/fetch.py b/bitbake/lib/bb/tests/fetch.py
index 42af883..d890ec9 100644
--- a/bitbake/lib/bb/tests/fetch.py
+++ b/bitbake/lib/bb/tests/fetch.py
@@ -26,6 +26,32 @@ import bb
 
 class FetcherTest(unittest.TestCase):
 
+    replaceuris = {
+        ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/.*", "http://somewhere.org/somedir/") 
+            : "http://somewhere.org/somedir/git2_git.invalid.infradead.org.mtd-utils.git.tar.gz",
+        ("git://git.invalid.infradead.org/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http") 
+            : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", 
+        ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/somedir/\\2;protocol=http") 
+            : "git://somewhere.org/somedir/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", 
+        ("git://git.invalid.infradead.org/foo/mtd-utils.git;tag=1234567890123456789012345678901234567890", "git://.*/([^/]+/)*([^/]*)", "git://somewhere.org/\\2;protocol=http") 
+            : "git://somewhere.org/mtd-utils.git;tag=1234567890123456789012345678901234567890;protocol=http", 
+        ("git://someserver.org/bitbake;tag=1234567890123456789012345678901234567890", "git://someserver.org/bitbake", "git://git.openembedded.org/bitbake")
+            : "git://git.openembedded.org/bitbake;tag=1234567890123456789012345678901234567890",
+        ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache") 
+            : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
+        ("file://sstate-xyz.tgz", "file://.*", "file:///somewhere/1234/sstate-cache/") 
+            : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
+        ("http://somewhere.org/somedir1/somedir2/somefile_1.2.3.tar.gz", "http://.*/.*", "http://somewhere2.org/somedir3") 
+            : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
+        ("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz") 
+            : "http://somewhere2.org/somedir3/somefile_1.2.3.tar.gz",
+        ("http://www.apache.org/dist/subversion/subversion-1.7.1.tar.bz2", "http://www.apache.org/dist", "http://archive.apache.org/dist")
+            : "http://archive.apache.org/dist/subversion/subversion-1.7.1.tar.bz2"
+        #Renaming files doesn't work
+        #("http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere.org/somedir1/somefile_1.2.3.tar.gz", "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz") : "http://somewhere2.org/somedir3/somefile_2.3.4.tar.gz"
+        #("file://sstate-xyz.tgz", "file://.*/.*", "file:///somewhere/1234/sstate-cache") : "file:///somewhere/1234/sstate-cache/sstate-xyz.tgz",
+    }
+
     def setUp(self):
         self.d = bb.data.init()
         self.tempdir = tempfile.mkdtemp()
@@ -64,7 +90,7 @@ class FetcherTest(unittest.TestCase):
         fetcher.download()
         self.assertEqual(os.path.getsize(self.dldir + "/bitbake-1.0.tar.gz"), 57749)
 
-    def test_gitfetch(self):
+    def gitfetcher(self, url1, url2):
         def checkrevision(self, fetcher):
             fetcher.unpack(self.unpackdir)
             revision = subprocess.check_output("git rev-parse HEAD", shell=True, cwd=self.unpackdir + "/git").strip()
@@ -72,17 +98,40 @@ class FetcherTest(unittest.TestCase):
 
         self.d.setVar("BB_GENERATE_MIRROR_TARBALLS", "1")
         self.d.setVar("SRCREV", "270a05b0b4ba0959fe0624d2a4885d7b70426da5")
-        fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake"], self.d)
+        fetcher = bb.fetch.Fetch([url1], self.d)
         fetcher.download()
         checkrevision(self, fetcher)
         # Wipe out the dldir clone and the unpacked source, turn off the network and check mirror tarball works
         bb.utils.prunedir(self.dldir + "/git2/")
         bb.utils.prunedir(self.unpackdir)
         self.d.setVar("BB_NO_NETWORK", "1")
-        fetcher = bb.fetch.Fetch(["git://git.openembedded.org/bitbake"], self.d)
+        fetcher = bb.fetch.Fetch([url2], self.d)
         fetcher.download()
         checkrevision(self, fetcher)
 
+    def test_gitfetch(self):
+        url1 = url2 = "git://git.openembedded.org/bitbake"
+        self.gitfetcher(url1, url2)
+
+    def test_gitfetch_premirror(self):
+        url1 = "git://git.openembedded.org/bitbake"
+        url2 = "git://someserver.org/bitbake"
+        self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n")
+        self.gitfetcher(url1, url2)
+
+    def test_gitfetch_premirror2(self):
+        url1 = url2 = "git://someserver.org/bitbake"
+        self.d.setVar("PREMIRRORS", "git://someserver.org/bitbake git://git.openembedded.org/bitbake \n")
+        self.gitfetcher(url1, url2)
+
+    def test_urireplace(self):
+        for k, v in self.replaceuris.items():
+            ud = bb.fetch.FetchData(k[0], self.d)
+            ud.setup_localpath(self.d)
+            newuris = bb.fetch2.uri_replace(ud, k[1], k[2], self.d)
+            self.assertEqual(newuris, v)
+
+
 class URLHandle(unittest.TestCase):
 
     datatable = {
-- 
1.7.5.4




^ permalink raw reply related	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2012-06-20 14:25 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-06-20 14:12 [PATCH 00/14] Bitbake fetcher mirror handling overhaul Richard Purdie
2012-06-20 14:12 ` [PATCH 01/14] fetch2/__init__: Make it clearer when uri_replace doesn't return a match Richard Purdie
2012-06-20 14:12 ` [PATCH 02/14] fetch2: Fix error handling in uri_replace() Richard Purdie
2012-06-20 14:12 ` [PATCH 03/14] fetch2: Only cache data if fn is set, its pointless caching it against a None value Richard Purdie
2012-06-20 14:12 ` [PATCH 04/14] fetch2: Ensure when downloading we are consistently in the same directory Richard Purdie
2012-06-20 14:12 ` [PATCH 05/14] fetch2: Split try_mirrors into two parts Richard Purdie
2012-06-20 14:12 ` [PATCH 06/14] fetch2: Explicitly check for mirror tarballs in mirror handling code Richard Purdie
2012-06-20 14:12 ` [PATCH 07/14] fetch2: Improve mirror looping to consider more cases Richard Purdie
2012-06-20 14:12 ` [PATCH 08/14] fetch2: Simplify some looping constructs in uri_replace() Richard Purdie
2012-06-20 14:13 ` [PATCH 09/14] fetch2: Remove basestring test and simplify uri_replace Richard Purdie
2012-06-20 14:13 ` [PATCH 10/14] fetch2: Add parameter handling to uri_replace() Richard Purdie
2012-06-20 14:13 ` [PATCH 11/14] fetch2: uri_replace() remove what amounts to a null operation and add some comments Richard Purdie
2012-06-20 14:13 ` [PATCH 12/14] fetch2: uri_replace() improve mirrortarball handling Richard Purdie
2012-06-20 14:13 ` [PATCH 13/14] fetch2: uri_replace() only consider ud.localpath where its a file Richard Purdie
2012-06-20 14:13 ` [PATCH 14/14] test/fetch: Add in unit tests for uri_replace() and git premirrors Richard Purdie

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.