diff options
Diffstat (limited to 'bitbake/lib/bb/progress.py')
-rw-r--r-- | bitbake/lib/bb/progress.py | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/bitbake/lib/bb/progress.py b/bitbake/lib/bb/progress.py index 8cddefaebe..d051ba0198 100644 --- a/bitbake/lib/bb/progress.py +++ b/bitbake/lib/bb/progress.py | |||
@@ -15,6 +15,25 @@ import bb.build | |||
15 | from bb.build import StdoutNoopContextManager | 15 | from bb.build import StdoutNoopContextManager |
16 | 16 | ||
17 | 17 | ||
18 | # from https://stackoverflow.com/a/14693789/221061 | ||
19 | ANSI_ESCAPE_REGEX = re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]') | ||
20 | |||
21 | |||
22 | def filter_color(string): | ||
23 | """ | ||
24 | Filter ANSI escape codes out of |string|, return new string | ||
25 | """ | ||
26 | return ANSI_ESCAPE_REGEX.sub('', string) | ||
27 | |||
28 | |||
29 | def filter_color_n(string): | ||
30 | """ | ||
31 | Filter ANSI escape codes out of |string|, returns tuple of | ||
32 | (new string, # of ANSI codes removed) | ||
33 | """ | ||
34 | return ANSI_ESCAPE_REGEX.subn('', string) | ||
35 | |||
36 | |||
18 | class ProgressHandler: | 37 | class ProgressHandler: |
19 | """ | 38 | """ |
20 | Base class that can pretend to be a file object well enough to be | 39 | Base class that can pretend to be a file object well enough to be |
@@ -82,7 +101,7 @@ class LineFilterProgressHandler(ProgressHandler): | |||
82 | lbreakpos = line.rfind('\r') + 1 | 101 | lbreakpos = line.rfind('\r') + 1 |
83 | if lbreakpos: | 102 | if lbreakpos: |
84 | line = line[lbreakpos:] | 103 | line = line[lbreakpos:] |
85 | if self.writeline(line): | 104 | if self.writeline(filter_color(line)): |
86 | super().write(line) | 105 | super().write(line) |
87 | 106 | ||
88 | def writeline(self, line): | 107 | def writeline(self, line): |
@@ -97,7 +116,7 @@ class BasicProgressHandler(ProgressHandler): | |||
97 | self._fire_progress(0) | 116 | self._fire_progress(0) |
98 | 117 | ||
99 | def write(self, string): | 118 | def write(self, string): |
100 | percs = self._regex.findall(string) | 119 | percs = self._regex.findall(filter_color(string)) |
101 | if percs: | 120 | if percs: |
102 | progress = int(percs[-1]) | 121 | progress = int(percs[-1]) |
103 | self.update(progress) | 122 | self.update(progress) |
@@ -112,7 +131,7 @@ class OutOfProgressHandler(ProgressHandler): | |||
112 | self._fire_progress(0) | 131 | self._fire_progress(0) |
113 | 132 | ||
114 | def write(self, string): | 133 | def write(self, string): |
115 | nums = self._regex.findall(string) | 134 | nums = self._regex.findall(filter_color(string)) |
116 | if nums: | 135 | if nums: |
117 | progress = (float(nums[-1][0]) / float(nums[-1][1])) * 100 | 136 | progress = (float(nums[-1][0]) / float(nums[-1][1])) * 100 |
118 | self.update(progress) | 137 | self.update(progress) |