bitbake: fetch2/git: prevent recursion on getting latest revision
We call git ls-remote to get the latest revision from a git repository, however by calling runfetchcmd() we can end up recursively running git ls-remote a number of times with OE e.g. if ${SRCPV} is in PV, ${PV} is in WORKDIR, and ${WORKDIR} is in PATH (as a result of recipe-specific sysroots), our call to runfetchcmd() exports PATH so _lsremote() will get called again - with the end result that we run git ls-remote 30 times in quick succession (!). Prevent that from happening by using a guard variable and returning a dummy value if it's called recursively. Fixes [YOCTO #11185]. (Bitbake rev: ff1ccd1db5d70b3fc9ad0d3e8f3d7b804c22bf36) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
parent
58a02e73d0
commit
f41740ee8e
|
@ -379,14 +379,26 @@ class Git(FetchMethod):
|
||||||
"""
|
"""
|
||||||
Run git ls-remote with the specified search string
|
Run git ls-remote with the specified search string
|
||||||
"""
|
"""
|
||||||
repourl = self._get_repo_url(ud)
|
# Prevent recursion e.g. in OE if SRCPV is in PV, PV is in WORKDIR,
|
||||||
cmd = "%s ls-remote %s %s" % \
|
# and WORKDIR is in PATH (as a result of RSS), our call to
|
||||||
(ud.basecmd, repourl, search)
|
# runfetchcmd() exports PATH so this function will get called again (!)
|
||||||
if ud.proto.lower() != 'file':
|
# In this scenario the return call of the function isn't actually
|
||||||
bb.fetch2.check_network_access(d, cmd, repourl)
|
# important - WORKDIR isn't needed in PATH to call git ls-remote
|
||||||
output = runfetchcmd(cmd, d, True)
|
# anyway.
|
||||||
if not output:
|
if d.getVar('_BB_GIT_IN_LSREMOTE', False):
|
||||||
raise bb.fetch2.FetchError("The command %s gave empty output unexpectedly" % cmd, ud.url)
|
return ''
|
||||||
|
d.setVar('_BB_GIT_IN_LSREMOTE', '1')
|
||||||
|
try:
|
||||||
|
repourl = self._get_repo_url(ud)
|
||||||
|
cmd = "%s ls-remote %s %s" % \
|
||||||
|
(ud.basecmd, repourl, search)
|
||||||
|
if ud.proto.lower() != 'file':
|
||||||
|
bb.fetch2.check_network_access(d, cmd, repourl)
|
||||||
|
output = runfetchcmd(cmd, d, True)
|
||||||
|
if not output:
|
||||||
|
raise bb.fetch2.FetchError("The command %s gave empty output unexpectedly" % cmd, ud.url)
|
||||||
|
finally:
|
||||||
|
d.delVar('_BB_GIT_IN_LSREMOTE')
|
||||||
return output
|
return output
|
||||||
|
|
||||||
def _latest_revision(self, ud, d, name):
|
def _latest_revision(self, ud, d, name):
|
||||||
|
|
Loading…
Reference in New Issue