diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2016-07-06 16:26:10 +1200 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-07-19 15:04:37 +0100 |
commit | 45baa90c8cb0f5e92e6a2847d84312b52b0582a2 (patch) | |
tree | 1264d6664a4d8fc710838237c3e842ff54fd1c76 /bitbake/lib/bb/fetch2/wget.py | |
parent | 843f7ae4108ad862b02ae84eef4f8cf7f6a3c950 (diff) | |
download | poky-45baa90c8cb0f5e92e6a2847d84312b52b0582a2.tar.gz |
bitbake: fetch2: implement progress support
Implement progress reporting support specifically for the fetchers. For
fetch tasks we don't necessarily know which fetcher will be used (we
might initially be fetching a git:// URI, but if we instead download a
mirror tarball we may fetch that over http using wget). These programs
also have different abilities as far as reporting progress goes (e.g.
wget gives us percentage complete and rate, git gives this some of the
time depending on what stage it's at). Additionally we filter out the
progress output before it makes it to the logs, in order to prevent the
logs filling up with junk.
At the moment this is only implemented for the wget and git fetchers
since they are the most commonly used (and svn doesn't seem to support
any kind of progress output, at least not without doing a relatively
expensive remote file listing first).
Line changes such as the ones you get in git's output as it progresses
don't make it to the log files, you only get the final state of the line
so the logs aren't filled with progress information that's useless after
the fact.
Part of the implementation for [YOCTO #5383].
(Bitbake rev: 4027649f422ee64b1c4e1ad8d48ac295050afbff)
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib/bb/fetch2/wget.py')
-rw-r--r-- | bitbake/lib/bb/fetch2/wget.py | 28 |
1 files changed, 26 insertions, 2 deletions
diff --git a/bitbake/lib/bb/fetch2/wget.py b/bitbake/lib/bb/fetch2/wget.py index 6cb22aeee9..6b60d9b16b 100644 --- a/bitbake/lib/bb/fetch2/wget.py +++ b/bitbake/lib/bb/fetch2/wget.py | |||
@@ -31,6 +31,7 @@ import subprocess | |||
31 | import os | 31 | import os |
32 | import logging | 32 | import logging |
33 | import bb | 33 | import bb |
34 | import bb.progress | ||
34 | import urllib.request, urllib.parse, urllib.error | 35 | import urllib.request, urllib.parse, urllib.error |
35 | from bb import data | 36 | from bb import data |
36 | from bb.fetch2 import FetchMethod | 37 | from bb.fetch2 import FetchMethod |
@@ -41,6 +42,27 @@ from bb.utils import export_proxies | |||
41 | from bs4 import BeautifulSoup | 42 | from bs4 import BeautifulSoup |
42 | from bs4 import SoupStrainer | 43 | from bs4 import SoupStrainer |
43 | 44 | ||
45 | class WgetProgressHandler(bb.progress.LineFilterProgressHandler): | ||
46 | """ | ||
47 | Extract progress information from wget output. | ||
48 | Note: relies on --progress=dot (with -v or without -q/-nv) being | ||
49 | specified on the wget command line. | ||
50 | """ | ||
51 | def __init__(self, d): | ||
52 | super(WgetProgressHandler, self).__init__(d) | ||
53 | # Send an initial progress event so the bar gets shown | ||
54 | self._fire_progress(0) | ||
55 | |||
56 | def writeline(self, line): | ||
57 | percs = re.findall(r'(\d+)%\s+([\d.]+[A-Z])', line) | ||
58 | if percs: | ||
59 | progress = int(percs[-1][0]) | ||
60 | rate = percs[-1][1] + '/s' | ||
61 | self.update(progress, rate) | ||
62 | return False | ||
63 | return True | ||
64 | |||
65 | |||
44 | class Wget(FetchMethod): | 66 | class Wget(FetchMethod): |
45 | """Class to fetch urls via 'wget'""" | 67 | """Class to fetch urls via 'wget'""" |
46 | def supports(self, ud, d): | 68 | def supports(self, ud, d): |
@@ -66,13 +88,15 @@ class Wget(FetchMethod): | |||
66 | if not ud.localfile: | 88 | if not ud.localfile: |
67 | ud.localfile = data.expand(urllib.parse.unquote(ud.host + ud.path).replace("/", "."), d) | 89 | ud.localfile = data.expand(urllib.parse.unquote(ud.host + ud.path).replace("/", "."), d) |
68 | 90 | ||
69 | self.basecmd = d.getVar("FETCHCMD_wget", True) or "/usr/bin/env wget -t 2 -T 30 -nv --passive-ftp --no-check-certificate" | 91 | self.basecmd = d.getVar("FETCHCMD_wget", True) or "/usr/bin/env wget -t 2 -T 30 --passive-ftp --no-check-certificate" |
70 | 92 | ||
71 | def _runwget(self, ud, d, command, quiet): | 93 | def _runwget(self, ud, d, command, quiet): |
72 | 94 | ||
95 | progresshandler = WgetProgressHandler(d) | ||
96 | |||
73 | logger.debug(2, "Fetching %s using command '%s'" % (ud.url, command)) | 97 | logger.debug(2, "Fetching %s using command '%s'" % (ud.url, command)) |
74 | bb.fetch2.check_network_access(d, command) | 98 | bb.fetch2.check_network_access(d, command) |
75 | runfetchcmd(command, d, quiet) | 99 | runfetchcmd(command + ' --progress=dot -v', d, quiet, log=progresshandler) |
76 | 100 | ||
77 | def download(self, ud, d): | 101 | def download(self, ud, d): |
78 | """Fetch urls""" | 102 | """Fetch urls""" |