diff options
author | Joshua Lock <josh@linux.intel.com> | 2010-02-01 16:56:16 +0000 |
---|---|---|
committer | Joshua Lock <josh@linux.intel.com> | 2010-02-04 00:18:29 +0000 |
commit | 0737552c1de18c64db8a5a52248a3e7b217f30aa (patch) | |
tree | d556e058c5e3b85dde0b3c13f5e9e25e472a5ed8 /bitbake | |
parent | 0b52537f5ce39a6025a2a8de381792accc333b8e (diff) | |
download | poky-0737552c1de18c64db8a5a52248a3e7b217f30aa.tar.gz |
bitbake: unify mirror support and make it independant of the fetcher
This patch serves two purposes. Firstly it unifies the concept of mirrors into
PREMIRRORS and MIRRORS. PREMIRRORS are tried before the SRC_URI defined in the
recipe whereas MIRRORS are tried only if that fails.
The tarball stash was conceptually inline with a PREMIRROR only with special
handling within the wget fetcher and therefore only worked with certain
fetch types.
Secondly the patch removes the need for individual fetch implementations to
worry about mirror handling.
With this patch, the base fetch implementation will first try to use a
PREMIRROR to fetch the desired object, if this fails the native fetch method
for the object will be tried and if this fails will try to fetch a copy from
one of the MIRRORS.
Signed-off-by: Joshua Lock <josh@linux.intel.com>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/fetch/__init__.py | 94 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/bzr.py | 5 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/cvs.py | 5 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/git.py | 9 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/hg.py | 5 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/osc.py | 5 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/perforce.py | 5 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/svk.py | 3 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/svn.py | 5 | ||||
-rw-r--r-- | bitbake/lib/bb/fetch/wget.py | 16 |
10 files changed, 53 insertions, 99 deletions
diff --git a/bitbake/lib/bb/fetch/__init__.py b/bitbake/lib/bb/fetch/__init__.py index ab4658bc3b..ccb60de59c 100644 --- a/bitbake/lib/bb/fetch/__init__.py +++ b/bitbake/lib/bb/fetch/__init__.py | |||
@@ -185,7 +185,18 @@ def go(d, urls = None): | |||
185 | pass | 185 | pass |
186 | bb.utils.unlockfile(lf) | 186 | bb.utils.unlockfile(lf) |
187 | continue | 187 | continue |
188 | m.go(u, ud, d) | 188 | |
189 | # First try fetching uri, u, from PREMIRRORS | ||
190 | mirrors = [ i.split() for i in (bb.data.getVar('PREMIRRORS', d, 1) or "").split('\n') if i ] | ||
191 | if not try_mirrors(d, u, mirrors): | ||
192 | # Next try fetching from the original uri, u | ||
193 | try: | ||
194 | m.go(u, ud, d) | ||
195 | except: | ||
196 | # Finally, try fetching uri, u, from MIRRORS | ||
197 | mirrors = [ i.split() for i in (bb.data.getVar('MIRRORS', d, 1) or "").split('\n') if i ] | ||
198 | try_mirrors (d, u, mirrors) | ||
199 | |||
189 | if ud.localfile: | 200 | if ud.localfile: |
190 | if not m.forcefetch(u, ud, d): | 201 | if not m.forcefetch(u, ud, d): |
191 | Fetch.write_md5sum(u, ud, d) | 202 | Fetch.write_md5sum(u, ud, d) |
@@ -332,6 +343,44 @@ def runfetchcmd(cmd, d, quiet = False): | |||
332 | 343 | ||
333 | return output | 344 | return output |
334 | 345 | ||
346 | def try_mirrors(d, uri, mirrors): | ||
347 | """ | ||
348 | Try to use a mirrored version of the sources. | ||
349 | This method will be automatically called before the fetchers go. | ||
350 | |||
351 | d Is a bb.data instance | ||
352 | uri is the original uri we're trying to download | ||
353 | mirrors is the list of mirrors we're going to try | ||
354 | """ | ||
355 | fpath = os.path.join(data.getVar("DL_DIR", d, 1), os.path.basename(uri)) | ||
356 | if os.access(fpath, os.R_OK): | ||
357 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists, skipping checkout." % fpath) | ||
358 | return True | ||
359 | |||
360 | ld = d.createCopy() | ||
361 | for (find, replace) in mirrors: | ||
362 | newuri = uri_replace(uri, find, replace, ld) | ||
363 | if newuri != uri: | ||
364 | try: | ||
365 | ud = FetchData(newuri, ld) | ||
366 | except bb.fetch.NoMethodError: | ||
367 | bb.msg.debug(1, bb.msg.domain.Fetcher, "No method for %s" % url) | ||
368 | continue | ||
369 | |||
370 | ud.setup_localpath(ld) | ||
371 | |||
372 | try: | ||
373 | ud.method.go(newuri, ud, ld) | ||
374 | return True | ||
375 | except (bb.fetch.MissingParameterError, | ||
376 | bb.fetch.FetchError, | ||
377 | bb.fetch.MD5SumError): | ||
378 | import sys | ||
379 | (type, value, traceback) = sys.exc_info() | ||
380 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Mirror fetch failure: %s" % value) | ||
381 | return False | ||
382 | |||
383 | |||
335 | class FetchData(object): | 384 | class FetchData(object): |
336 | """ | 385 | """ |
337 | A class which represents the fetcher state for a given URI. | 386 | A class which represents the fetcher state for a given URI. |
@@ -489,49 +538,6 @@ class Fetch(object): | |||
489 | 538 | ||
490 | localcount_internal_helper = staticmethod(localcount_internal_helper) | 539 | localcount_internal_helper = staticmethod(localcount_internal_helper) |
491 | 540 | ||
492 | def try_mirror(d, tarfn): | ||
493 | """ | ||
494 | Try to use a mirrored version of the sources. We do this | ||
495 | to avoid massive loads on foreign cvs and svn servers. | ||
496 | This method will be used by the different fetcher | ||
497 | implementations. | ||
498 | |||
499 | d Is a bb.data instance | ||
500 | tarfn is the name of the tarball | ||
501 | """ | ||
502 | tarpath = os.path.join(data.getVar("DL_DIR", d, 1), tarfn) | ||
503 | if os.access(tarpath, os.R_OK): | ||
504 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists, skipping checkout." % tarfn) | ||
505 | return True | ||
506 | |||
507 | pn = data.getVar('PN', d, True) | ||
508 | src_tarball_stash = None | ||
509 | if pn: | ||
510 | src_tarball_stash = (data.getVar('SRC_TARBALL_STASH_%s' % pn, d, True) or data.getVar('CVS_TARBALL_STASH_%s' % pn, d, True) or data.getVar('SRC_TARBALL_STASH', d, True) or data.getVar('CVS_TARBALL_STASH', d, True) or "").split() | ||
511 | |||
512 | ld = d.createCopy() | ||
513 | for stash in src_tarball_stash: | ||
514 | url = stash + tarfn | ||
515 | try: | ||
516 | ud = FetchData(url, ld) | ||
517 | except bb.fetch.NoMethodError: | ||
518 | bb.msg.debug(1, bb.msg.domain.Fetcher, "No method for %s" % url) | ||
519 | continue | ||
520 | |||
521 | ud.setup_localpath(ld) | ||
522 | |||
523 | try: | ||
524 | ud.method.go(url, ud, ld) | ||
525 | return True | ||
526 | except (bb.fetch.MissingParameterError, | ||
527 | bb.fetch.FetchError, | ||
528 | bb.fetch.MD5SumError): | ||
529 | import sys | ||
530 | (type, value, traceback) = sys.exc_info() | ||
531 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Tarball stash fetch failure: %s" % value) | ||
532 | return False | ||
533 | try_mirror = staticmethod(try_mirror) | ||
534 | |||
535 | def verify_md5sum(ud, got_sum): | 541 | def verify_md5sum(ud, got_sum): |
536 | """ | 542 | """ |
537 | Verify the md5sum we wanted with the one we got | 543 | Verify the md5sum we wanted with the one we got |
diff --git a/bitbake/lib/bb/fetch/bzr.py b/bitbake/lib/bb/fetch/bzr.py index b27fb63d07..c6e33c3343 100644 --- a/bitbake/lib/bb/fetch/bzr.py +++ b/bitbake/lib/bb/fetch/bzr.py | |||
@@ -91,11 +91,6 @@ class Bzr(Fetch): | |||
91 | def go(self, loc, ud, d): | 91 | def go(self, loc, ud, d): |
92 | """Fetch url""" | 92 | """Fetch url""" |
93 | 93 | ||
94 | # try to use the tarball stash | ||
95 | if Fetch.try_mirror(d, ud.localfile): | ||
96 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping bzr checkout." % ud.localpath) | ||
97 | return | ||
98 | |||
99 | if os.access(os.path.join(ud.pkgdir, os.path.basename(ud.pkgdir), '.bzr'), os.R_OK): | 94 | if os.access(os.path.join(ud.pkgdir, os.path.basename(ud.pkgdir), '.bzr'), os.R_OK): |
100 | bzrcmd = self._buildbzrcommand(ud, d, "update") | 95 | bzrcmd = self._buildbzrcommand(ud, d, "update") |
101 | bb.msg.debug(1, bb.msg.domain.Fetcher, "BZR Update %s" % loc) | 96 | bb.msg.debug(1, bb.msg.domain.Fetcher, "BZR Update %s" % loc) |
diff --git a/bitbake/lib/bb/fetch/cvs.py b/bitbake/lib/bb/fetch/cvs.py index 90a006500e..443f521317 100644 --- a/bitbake/lib/bb/fetch/cvs.py +++ b/bitbake/lib/bb/fetch/cvs.py | |||
@@ -77,11 +77,6 @@ class Cvs(Fetch): | |||
77 | 77 | ||
78 | def go(self, loc, ud, d): | 78 | def go(self, loc, ud, d): |
79 | 79 | ||
80 | # try to use the tarball stash | ||
81 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): | ||
82 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping cvs checkout." % ud.localpath) | ||
83 | return | ||
84 | |||
85 | method = "pserver" | 80 | method = "pserver" |
86 | if "method" in ud.parm: | 81 | if "method" in ud.parm: |
87 | method = ud.parm["method"] | 82 | method = ud.parm["method"] |
diff --git a/bitbake/lib/bb/fetch/git.py b/bitbake/lib/bb/fetch/git.py index 9430582d55..10b396bb00 100644 --- a/bitbake/lib/bb/fetch/git.py +++ b/bitbake/lib/bb/fetch/git.py | |||
@@ -82,10 +82,6 @@ class Git(Fetch): | |||
82 | def go(self, loc, ud, d): | 82 | def go(self, loc, ud, d): |
83 | """Fetch url""" | 83 | """Fetch url""" |
84 | 84 | ||
85 | if Fetch.try_mirror(d, ud.localfile): | ||
86 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists (or was stashed). Skipping git checkout." % ud.localpath) | ||
87 | return | ||
88 | |||
89 | if ud.user: | 85 | if ud.user: |
90 | username = ud.user + '@' | 86 | username = ud.user + '@' |
91 | else: | 87 | else: |
@@ -97,11 +93,12 @@ class Git(Fetch): | |||
97 | codir = os.path.join(ud.clonedir, coname) | 93 | codir = os.path.join(ud.clonedir, coname) |
98 | 94 | ||
99 | if not os.path.exists(ud.clonedir): | 95 | if not os.path.exists(ud.clonedir): |
100 | if Fetch.try_mirror(d, ud.mirrortarball): | 96 | try: |
97 | Fetch.try_mirrors(ud.mirrortarball) | ||
101 | bb.mkdirhier(ud.clonedir) | 98 | bb.mkdirhier(ud.clonedir) |
102 | os.chdir(ud.clonedir) | 99 | os.chdir(ud.clonedir) |
103 | runfetchcmd("tar -xzf %s" % (repofile), d) | 100 | runfetchcmd("tar -xzf %s" % (repofile), d) |
104 | else: | 101 | except: |
105 | runfetchcmd("git clone -n %s://%s%s%s %s" % (ud.proto, username, ud.host, ud.path, ud.clonedir), d) | 102 | runfetchcmd("git clone -n %s://%s%s%s %s" % (ud.proto, username, ud.host, ud.path, ud.clonedir), d) |
106 | 103 | ||
107 | os.chdir(ud.clonedir) | 104 | os.chdir(ud.clonedir) |
diff --git a/bitbake/lib/bb/fetch/hg.py b/bitbake/lib/bb/fetch/hg.py index 08cb61fc28..d0756382f8 100644 --- a/bitbake/lib/bb/fetch/hg.py +++ b/bitbake/lib/bb/fetch/hg.py | |||
@@ -116,11 +116,6 @@ class Hg(Fetch): | |||
116 | def go(self, loc, ud, d): | 116 | def go(self, loc, ud, d): |
117 | """Fetch url""" | 117 | """Fetch url""" |
118 | 118 | ||
119 | # try to use the tarball stash | ||
120 | if Fetch.try_mirror(d, ud.localfile): | ||
121 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping hg checkout." % ud.localpath) | ||
122 | return | ||
123 | |||
124 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") | 119 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") |
125 | 120 | ||
126 | if os.access(os.path.join(ud.moddir, '.hg'), os.R_OK): | 121 | if os.access(os.path.join(ud.moddir, '.hg'), os.R_OK): |
diff --git a/bitbake/lib/bb/fetch/osc.py b/bitbake/lib/bb/fetch/osc.py index 2c34caf6c9..548dd9d074 100644 --- a/bitbake/lib/bb/fetch/osc.py +++ b/bitbake/lib/bb/fetch/osc.py | |||
@@ -91,11 +91,6 @@ class Osc(Fetch): | |||
91 | Fetch url | 91 | Fetch url |
92 | """ | 92 | """ |
93 | 93 | ||
94 | # Try to use the tarball stash | ||
95 | if Fetch.try_mirror(d, ud.localfile): | ||
96 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping osc checkout." % ud.localpath) | ||
97 | return | ||
98 | |||
99 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") | 94 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") |
100 | 95 | ||
101 | if os.access(os.path.join(data.expand('${OSCDIR}', d), ud.path, ud.module), os.R_OK): | 96 | if os.access(os.path.join(data.expand('${OSCDIR}', d), ud.path, ud.module), os.R_OK): |
diff --git a/bitbake/lib/bb/fetch/perforce.py b/bitbake/lib/bb/fetch/perforce.py index 394f5a2253..e2c3421089 100644 --- a/bitbake/lib/bb/fetch/perforce.py +++ b/bitbake/lib/bb/fetch/perforce.py | |||
@@ -124,11 +124,6 @@ class Perforce(Fetch): | |||
124 | Fetch urls | 124 | Fetch urls |
125 | """ | 125 | """ |
126 | 126 | ||
127 | # try to use the tarball stash | ||
128 | if Fetch.try_mirror(d, ud.localfile): | ||
129 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping perforce checkout." % ud.localpath) | ||
130 | return | ||
131 | |||
132 | (host,depot,user,pswd,parm) = Perforce.doparse(loc, d) | 127 | (host,depot,user,pswd,parm) = Perforce.doparse(loc, d) |
133 | 128 | ||
134 | if depot.find('/...') != -1: | 129 | if depot.find('/...') != -1: |
diff --git a/bitbake/lib/bb/fetch/svk.py b/bitbake/lib/bb/fetch/svk.py index 120dad9d4e..a17ac04d21 100644 --- a/bitbake/lib/bb/fetch/svk.py +++ b/bitbake/lib/bb/fetch/svk.py | |||
@@ -62,9 +62,6 @@ class Svk(Fetch): | |||
62 | def go(self, loc, ud, d): | 62 | def go(self, loc, ud, d): |
63 | """Fetch urls""" | 63 | """Fetch urls""" |
64 | 64 | ||
65 | if not self.forcefetch(loc, ud, d) and Fetch.try_mirror(d, ud.localfile): | ||
66 | return | ||
67 | |||
68 | svkroot = ud.host + ud.path | 65 | svkroot = ud.host + ud.path |
69 | 66 | ||
70 | svkcmd = "svk co -r {%s} %s/%s" % (ud.date, svkroot, ud.module) | 67 | svkcmd = "svk co -r {%s} %s/%s" % (ud.date, svkroot, ud.module) |
diff --git a/bitbake/lib/bb/fetch/svn.py b/bitbake/lib/bb/fetch/svn.py index eef9862a84..ba9f6ab109 100644 --- a/bitbake/lib/bb/fetch/svn.py +++ b/bitbake/lib/bb/fetch/svn.py | |||
@@ -136,11 +136,6 @@ class Svn(Fetch): | |||
136 | def go(self, loc, ud, d): | 136 | def go(self, loc, ud, d): |
137 | """Fetch url""" | 137 | """Fetch url""" |
138 | 138 | ||
139 | # try to use the tarball stash | ||
140 | if Fetch.try_mirror(d, ud.localfile): | ||
141 | bb.msg.debug(1, bb.msg.domain.Fetcher, "%s already exists or was mirrored, skipping svn checkout." % ud.localpath) | ||
142 | return | ||
143 | |||
144 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") | 139 | bb.msg.debug(2, bb.msg.domain.Fetcher, "Fetch: checking for module directory '" + ud.moddir + "'") |
145 | 140 | ||
146 | if os.access(os.path.join(ud.moddir, '.svn'), os.R_OK): | 141 | if os.access(os.path.join(ud.moddir, '.svn'), os.R_OK): |
diff --git a/bitbake/lib/bb/fetch/wget.py b/bitbake/lib/bb/fetch/wget.py index fd93c7ec46..ae1c6ad136 100644 --- a/bitbake/lib/bb/fetch/wget.py +++ b/bitbake/lib/bb/fetch/wget.py | |||
@@ -30,7 +30,6 @@ import bb | |||
30 | from bb import data | 30 | from bb import data |
31 | from bb.fetch import Fetch | 31 | from bb.fetch import Fetch |
32 | from bb.fetch import FetchError | 32 | from bb.fetch import FetchError |
33 | from bb.fetch import uri_replace | ||
34 | 33 | ||
35 | class Wget(Fetch): | 34 | class Wget(Fetch): |
36 | """Class to fetch urls via 'wget'""" | 35 | """Class to fetch urls via 'wget'""" |
@@ -105,24 +104,9 @@ class Wget(Fetch): | |||
105 | data.setVar('OVERRIDES', "wget:" + data.getVar('OVERRIDES', localdata), localdata) | 104 | data.setVar('OVERRIDES', "wget:" + data.getVar('OVERRIDES', localdata), localdata) |
106 | data.update_data(localdata) | 105 | data.update_data(localdata) |
107 | 106 | ||
108 | premirrors = [ i.split() for i in (data.getVar('PREMIRRORS', localdata, 1) or "").split('\n') if i ] | ||
109 | for (find, replace) in premirrors: | ||
110 | newuri = uri_replace(uri, find, replace, d) | ||
111 | if newuri != uri: | ||
112 | if fetch_uri(newuri, ud, localdata): | ||
113 | return True | ||
114 | |||
115 | if fetch_uri(uri, ud, localdata): | 107 | if fetch_uri(uri, ud, localdata): |
116 | return True | 108 | return True |
117 | 109 | ||
118 | # try mirrors | ||
119 | mirrors = [ i.split() for i in (data.getVar('MIRRORS', localdata, 1) or "").split('\n') if i ] | ||
120 | for (find, replace) in mirrors: | ||
121 | newuri = uri_replace(uri, find, replace, d) | ||
122 | if newuri != uri: | ||
123 | if fetch_uri(newuri, ud, localdata): | ||
124 | return True | ||
125 | |||
126 | raise FetchError(uri) | 110 | raise FetchError(uri) |
127 | 111 | ||
128 | 112 | ||