diff options
author | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-11-18 17:17:16 +0000 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-11-18 17:19:11 +0000 |
commit | 2354250a95eab484459f41f8715ae112295c2174 (patch) | |
tree | be3af4936a8aa43d6afcd97bc95a7d4448146a14 /bitbake/lib | |
parent | e45d7355f1b0d3336f92683add5753fda54579de (diff) | |
download | poky-2354250a95eab484459f41f8715ae112295c2174.tar.gz |
bitbake: git: Use merge-base instead of log for testing if a commit is present
The current use of git log to check if a given revision is present can be
a little fragile.
For example if revision X was on branch A, and then later added to branch
B, the update checks would not notice this since they just check for X
being in the repository.
We also had some autobuilder corruption where an older packed-refs file
was copied over a new repository containing newer pack files. There
was no update to the refs file since the revision was present but
not accessible in any branch.
The correct fix is to check that the required revisions are present
on the specific branches. This patch does this using merge-base.
(Bitbake rev: 89abfbc1953e3711d6c90aff793ee622c22609b1)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake/lib')
-rw-r--r-- | bitbake/lib/bb/fetch2/git.py | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py index 6175e4c7c9..99230c170a 100644 --- a/bitbake/lib/bb/fetch2/git.py +++ b/bitbake/lib/bb/fetch2/git.py | |||
@@ -150,7 +150,7 @@ class Git(FetchMethod): | |||
150 | return True | 150 | return True |
151 | os.chdir(ud.clonedir) | 151 | os.chdir(ud.clonedir) |
152 | for name in ud.names: | 152 | for name in ud.names: |
153 | if not self._contains_ref(ud.revisions[name], d): | 153 | if not self._contains_ref(ud.revisions[name], ud.branches[name], d): |
154 | return True | 154 | return True |
155 | if ud.write_tarballs and not os.path.exists(ud.fullmirror): | 155 | if ud.write_tarballs and not os.path.exists(ud.fullmirror): |
156 | return True | 156 | return True |
@@ -197,7 +197,7 @@ class Git(FetchMethod): | |||
197 | # Update the checkout if needed | 197 | # Update the checkout if needed |
198 | needupdate = False | 198 | needupdate = False |
199 | for name in ud.names: | 199 | for name in ud.names: |
200 | if not self._contains_ref(ud.revisions[name], d): | 200 | if not self._contains_ref(ud.revisions[name], ud.branches[name], d): |
201 | needupdate = True | 201 | needupdate = True |
202 | if needupdate: | 202 | if needupdate: |
203 | try: | 203 | try: |
@@ -281,13 +281,14 @@ class Git(FetchMethod): | |||
281 | def supports_srcrev(self): | 281 | def supports_srcrev(self): |
282 | return True | 282 | return True |
283 | 283 | ||
284 | def _contains_ref(self, tag, d): | 284 | def _contains_ref(self, tag, branch, d): |
285 | basecmd = data.getVar("FETCHCMD_git", d, True) or "git" | 285 | basecmd = data.getVar("FETCHCMD_git", d, True) or "git" |
286 | cmd = "%s log --pretty=oneline -n 1 %s -- 2> /dev/null | wc -l" % (basecmd, tag) | 286 | cmd = "%s merge-base --is-ancestorlog %s %s" % (basecmd, tag, branch) |
287 | output = runfetchcmd(cmd, d, quiet=True) | 287 | try: |
288 | if len(output.split()) > 1: | 288 | output = runfetchcmd(cmd, d, quiet=True) |
289 | raise bb.fetch2.FetchError("The command '%s' gave output with more then 1 line unexpectedly, output: '%s'" % (cmd, output)) | 289 | except bb.fetch2.FetchError: |
290 | return output.split()[0] != "0" | 290 | return False |
291 | return True | ||
291 | 292 | ||
292 | def _revision_key(self, url, ud, d, name): | 293 | def _revision_key(self, url, ud, d, name): |
293 | """ | 294 | """ |