bitbake: fetch2: Check for git-lfs existence before using it

So far, existence of `git-lfs` was only checked during unpacking. As the
binary is also used in earlier steps also check for its existence there.

Additionally, factor out the LFS existence check into a dedicated
function and call it wherever git-lfs is used for the first time.

(Bitbake rev: 5818367db9b261b7e07c347d38044e6cba8f9727)

Signed-off-by: Philip Lorenz <philip.lorenz@bmw.de>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Philip Lorenz
2025-04-29 10:11:19 +02:00
committed by Richard Purdie
parent 6d0cb00c68
commit 7642477dc8
2 changed files with 68 additions and 31 deletions

View File

@@ -324,6 +324,9 @@ class Git(FetchMethod):
return False
def lfs_need_update(self, ud, d):
if not self._need_lfs(ud):
return False
if self.clonedir_need_update(ud, d):
return True
@@ -507,7 +510,9 @@ class Git(FetchMethod):
def lfs_fetch(self, ud, d, clonedir, revision, fetchall=False, progresshandler=None):
"""Helper method for fetching Git LFS data"""
try:
if self._need_lfs(ud) and self._contains_lfs(ud, d, clonedir) and self._find_git_lfs(d) and len(revision):
if self._need_lfs(ud) and self._contains_lfs(ud, d, clonedir) and len(revision):
self._ensure_git_lfs(d, ud)
# Using worktree with the revision because .lfsconfig may exists
worktree_add_cmd = "%s worktree add wt %s" % (ud.basecmd, revision)
runfetchcmd(worktree_add_cmd, d, log=progresshandler, workdir=clonedir)
@@ -740,11 +745,11 @@ class Git(FetchMethod):
runfetchcmd("%s remote set-url origin %s" % (ud.basecmd, shlex.quote(repourl)), d, workdir=destdir)
if self._contains_lfs(ud, d, destdir):
if need_lfs and not self._find_git_lfs(d):
raise bb.fetch2.FetchError("Repository %s has LFS content, install git-lfs on host to download (or set lfs=0 to ignore it)" % (repourl))
elif not need_lfs:
if not need_lfs:
bb.note("Repository %s has LFS content but it is not being fetched" % (repourl))
else:
self._ensure_git_lfs(d, ud)
runfetchcmd("%s lfs install --local" % ud.basecmd, d, workdir=destdir)
if not ud.nocheckout:
@@ -807,9 +812,11 @@ class Git(FetchMethod):
Verifies whether the LFS objects for requested revisions have already been downloaded
"""
# Bail out early if this repository doesn't use LFS
if not self._need_lfs(ud) or not self._contains_lfs(ud, d, wd):
if not self._contains_lfs(ud, d, wd):
return True
self._ensure_git_lfs(d, ud)
# The Git LFS specification specifies ([1]) the LFS folder layout so it should be safe to check for file
# existence.
# [1] https://github.com/git-lfs/git-lfs/blob/main/docs/spec.md#intercepting-git
@@ -859,11 +866,14 @@ class Git(FetchMethod):
pass
return False
def _find_git_lfs(self, d):
def _ensure_git_lfs(self, d, ud):
"""
Return True if git-lfs can be found, False otherwise.
Ensures that git-lfs is available, raising a FetchError if it isn't.
"""
return shutil.which("git-lfs", path=d.getVar('PATH')) is not None
if shutil.which("git-lfs", path=d.getVar('PATH')) is None:
raise bb.fetch2.FetchError(
"Repository %s has LFS content, install git-lfs on host to download (or set lfs=0 "
"to ignore it)" % self._get_repo_url(ud))
def _get_repo_url(self, ud):
"""