@@ -429,6 +429,21 @@ def uri_replace(ud, uri_find, uri_replace, replacements, d, mirrortarball=None):
uri_decoded = list(decodeurl(ud.url))
uri_find_decoded = list(decodeurl(uri_find))
uri_replace_decoded = list(decodeurl(uri_replace))
+
+ # Fix mirror lines without PATH, BASENAME or DOWNLOADFILENAME
+ if (uri_find_decoded[0] == "file" and ".*" in uri_find_decoded[2]
+ and all({k not in uri_replace_decoded[2]
+ for k in {"PATH", "BASENAME"}})):
+ uri_replace_decoded[2] = os.path.join(uri_replace_decoded[2], "PATH")
+ elif ((uri_replace_decoded[0].startswith("http")
+ or uri_replace_decoded[0] == "file")
+ and ((uri_decoded[0] != uri_replace_decoded[0] and mirrortarball)
+ or ".*" in uri_find_decoded[2])
+ and all({k not in uri_replace_decoded[2]
+ for k in {"PATH", "BASENAME", "DOWNLOADFILENAME"}})):
+ uri_replace_decoded[2] = os.path.join(uri_replace_decoded[2],
+ "DOWNLOADFILENAME")
+
logger.debug2("For url %s comparing %s to %s" % (uri_decoded, uri_find_decoded, uri_replace_decoded))
result_decoded = ['', '', '', '', '', {}]
# 0 - type, 1 - host, 2 - path, 3 - user, 4- pswd, 5 - params
@@ -441,7 +456,10 @@ def uri_replace(ud, uri_find, uri_replace, replacements, d, mirrortarball=None):
regexp += "$"
if loc == 5:
# Handle URL parameters
- if i:
+ if uri_decoded[0] != uri_replace_decoded[0] and mirrortarball:
+ # Kill parameters, they make no sense for mirror tarballs
+ result_decoded[5] = {}
+ elif i:
# Any specified URL parameters must match
for k in uri_find_decoded[loc]:
if uri_decoded[loc][k] != uri_find_decoded[loc][k]:
@@ -462,26 +480,6 @@ def uri_replace(ud, uri_find, uri_replace, replacements, d, mirrortarball=None):
uri_replace_decoded[loc] = uri_replace_decoded[loc].replace(k, replacements[k])
#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], count=1)
- if loc == 2:
- # Handle path manipulations
- basename = None
- if uri_decoded[0] != uri_replace_decoded[0] and mirrortarball:
- # If the source and destination url types differ, must be a mirrortarball mapping
- basename = os.path.basename(mirrortarball)
- # Kill parameters, they make no sense for mirror tarballs
- uri_decoded[5] = {}
- uri_find_decoded[5] = {}
- elif ud.localpath and ud.method.supports_checksum(ud):
- basename = os.path.basename(ud.localpath)
- if basename:
- uri_basename = os.path.basename(uri_decoded[loc])
- # Prefix with a slash as a sentinel in case
- # result_decoded[loc] does not contain one.
- path = "/" + result_decoded[loc]
- if uri_basename and basename != uri_basename and path.endswith("/" + uri_basename):
- result_decoded[loc] = path[1:-len(uri_basename)] + basename
- elif not path.endswith("/" + basename):
- result_decoded[loc] = os.path.join(path[1:], basename)
else:
return None
result = encodeurl(result_decoded)
@@ -1000,6 +998,7 @@ def build_mirroruris(origud, mirrors, ld):
continue
for tarball in tarballs:
+ replacements["DOWNLOADFILENAME"] = tarball or origud.localfile
newuri = uri_replace(ud, find, replace, replacements, ld, tarball)
if not newuri or newuri in uris or newuri == origud.url:
continue