diff options
Diffstat (limited to 'bitbake/lib/bb/fetch2/git.py')
-rw-r--r-- | bitbake/lib/bb/fetch2/git.py | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py index 59827e304f..4e2dcec0d7 100644 --- a/bitbake/lib/bb/fetch2/git.py +++ b/bitbake/lib/bb/fetch2/git.py | |||
@@ -71,11 +71,53 @@ import os | |||
71 | import re | 71 | import re |
72 | import bb | 72 | import bb |
73 | import errno | 73 | import errno |
74 | import bb.progress | ||
74 | from bb import data | 75 | from bb import data |
75 | from bb.fetch2 import FetchMethod | 76 | from bb.fetch2 import FetchMethod |
76 | from bb.fetch2 import runfetchcmd | 77 | from bb.fetch2 import runfetchcmd |
77 | from bb.fetch2 import logger | 78 | from bb.fetch2 import logger |
78 | 79 | ||
80 | |||
81 | class GitProgressHandler(bb.progress.LineFilterProgressHandler): | ||
82 | """Extract progress information from git output""" | ||
83 | def __init__(self, d): | ||
84 | self._buffer = '' | ||
85 | self._count = 0 | ||
86 | super(GitProgressHandler, self).__init__(d) | ||
87 | # Send an initial progress event so the bar gets shown | ||
88 | self._fire_progress(-1) | ||
89 | |||
90 | def write(self, string): | ||
91 | self._buffer += string | ||
92 | stages = ['Counting objects', 'Compressing objects', 'Receiving objects', 'Resolving deltas'] | ||
93 | stage_weights = [0.2, 0.05, 0.5, 0.25] | ||
94 | stagenum = 0 | ||
95 | for i, stage in reversed(list(enumerate(stages))): | ||
96 | if stage in self._buffer: | ||
97 | stagenum = i | ||
98 | self._buffer = '' | ||
99 | break | ||
100 | self._status = stages[stagenum] | ||
101 | percs = re.findall(r'(\d+)%', string) | ||
102 | if percs: | ||
103 | progress = int(round((int(percs[-1]) * stage_weights[stagenum]) + (sum(stage_weights[:stagenum]) * 100))) | ||
104 | rates = re.findall(r'([\d.]+ [a-zA-Z]*/s+)', string) | ||
105 | if rates: | ||
106 | rate = rates[-1] | ||
107 | else: | ||
108 | rate = None | ||
109 | self.update(progress, rate) | ||
110 | else: | ||
111 | if stagenum == 0: | ||
112 | percs = re.findall(r': (\d+)', string) | ||
113 | if percs: | ||
114 | count = int(percs[-1]) | ||
115 | if count > self._count: | ||
116 | self._count = count | ||
117 | self._fire_progress(-count) | ||
118 | super(GitProgressHandler, self).write(string) | ||
119 | |||
120 | |||
79 | class Git(FetchMethod): | 121 | class Git(FetchMethod): |
80 | """Class to fetch a module or modules from git repositories""" | 122 | """Class to fetch a module or modules from git repositories""" |
81 | def init(self, d): | 123 | def init(self, d): |
@@ -196,10 +238,11 @@ class Git(FetchMethod): | |||
196 | # We do this since git will use a "-l" option automatically for local urls where possible | 238 | # We do this since git will use a "-l" option automatically for local urls where possible |
197 | if repourl.startswith("file://"): | 239 | if repourl.startswith("file://"): |
198 | repourl = repourl[7:] | 240 | repourl = repourl[7:] |
199 | clone_cmd = "%s clone --bare --mirror %s %s" % (ud.basecmd, repourl, ud.clonedir) | 241 | clone_cmd = "LANG=C %s clone --bare --mirror %s %s --progress" % (ud.basecmd, repourl, ud.clonedir) |
200 | if ud.proto.lower() != 'file': | 242 | if ud.proto.lower() != 'file': |
201 | bb.fetch2.check_network_access(d, clone_cmd) | 243 | bb.fetch2.check_network_access(d, clone_cmd) |
202 | runfetchcmd(clone_cmd, d) | 244 | progresshandler = GitProgressHandler(d) |
245 | runfetchcmd(clone_cmd, d, log=progresshandler) | ||
203 | 246 | ||
204 | os.chdir(ud.clonedir) | 247 | os.chdir(ud.clonedir) |
205 | # Update the checkout if needed | 248 | # Update the checkout if needed |
@@ -214,10 +257,11 @@ class Git(FetchMethod): | |||
214 | logger.debug(1, "No Origin") | 257 | logger.debug(1, "No Origin") |
215 | 258 | ||
216 | runfetchcmd("%s remote add --mirror=fetch origin %s" % (ud.basecmd, repourl), d) | 259 | runfetchcmd("%s remote add --mirror=fetch origin %s" % (ud.basecmd, repourl), d) |
217 | fetch_cmd = "%s fetch -f --prune %s refs/*:refs/*" % (ud.basecmd, repourl) | 260 | fetch_cmd = "LANG=C %s fetch -f --prune --progress %s refs/*:refs/*" % (ud.basecmd, repourl) |
218 | if ud.proto.lower() != 'file': | 261 | if ud.proto.lower() != 'file': |
219 | bb.fetch2.check_network_access(d, fetch_cmd, ud.url) | 262 | bb.fetch2.check_network_access(d, fetch_cmd, ud.url) |
220 | runfetchcmd(fetch_cmd, d) | 263 | progresshandler = GitProgressHandler(d) |
264 | runfetchcmd(fetch_cmd, d, log=progresshandler) | ||
221 | runfetchcmd("%s prune-packed" % ud.basecmd, d) | 265 | runfetchcmd("%s prune-packed" % ud.basecmd, d) |
222 | runfetchcmd("%s pack-redundant --all | xargs -r rm" % ud.basecmd, d) | 266 | runfetchcmd("%s pack-redundant --all | xargs -r rm" % ud.basecmd, d) |
223 | try: | 267 | try: |