@@ -324,6 +324,11 @@ class Git(FetchMethod):
return False
def lfs_need_update(self, ud, d):
+ if not self._need_lfs(ud):
+ return False
+
+ self._ensure_git_lfs(d, ud)
+
if self.clonedir_need_update(ud, d):
return True
@@ -507,7 +512,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 +747,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,7 +814,7 @@ 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
# The Git LFS specification specifies ([1]) the LFS folder layout so it should be safe to check for file
@@ -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):
"""
@@ -9,6 +9,7 @@
import contextlib
import shutil
import unittest
+import unittest.mock
import urllib.parse
import hashlib
import tempfile
@@ -2413,18 +2414,17 @@ class GitLfsTest(FetcherTest):
# Careful: suppress initial attempt at downloading
fetcher, ud = self.fetch(uri=None, download=False)
- # Artificially assert that git-lfs is not installed, so
- # we can verify a failure to unpack in it's absence.
- old_find_git_lfs = ud.method._find_git_lfs
- try:
- # If git-lfs cannot be found, the unpack should throw an error
+ # If git-lfs cannot be found, the download should throw an error
+ with unittest.mock.patch("shutil.which", return_value=None):
with self.assertRaises(bb.fetch2.FetchError):
fetcher.download()
- ud.method._find_git_lfs = lambda d: False
+
+ fetcher.download()
+ # If git-lfs cannot be found, the unpack should throw an error
+ with self.assertRaises(bb.fetch2.FetchError):
+ with unittest.mock.patch("shutil.which", return_value=None):
shutil.rmtree(self.gitdir, ignore_errors=True)
fetcher.unpack(self.d.getVar('WORKDIR'))
- finally:
- ud.method._find_git_lfs = old_find_git_lfs
def test_lfs_disabled_not_installed(self):
uri = 'git://%s;protocol=file;lfs=0;branch=master' % self.srcdir
@@ -2433,17 +2433,11 @@ class GitLfsTest(FetcherTest):
# Careful: suppress initial attempt at downloading
fetcher, ud = self.fetch(uri=None, download=False)
- # Artificially assert that git-lfs is not installed, so
- # we can verify a failure to unpack in it's absence.
- old_find_git_lfs = ud.method._find_git_lfs
- try:
- # Even if git-lfs cannot be found, the unpack should be successful
+ # Even if git-lfs cannot be found, the download / unpack should be successful
+ with unittest.mock.patch("shutil.which", return_value=None):
fetcher.download()
- ud.method._find_git_lfs = lambda d: False
shutil.rmtree(self.gitdir, ignore_errors=True)
fetcher.unpack(self.d.getVar('WORKDIR'))
- finally:
- ud.method._find_git_lfs = old_find_git_lfs
class GitURLWithSpacesTest(FetcherTest):
test_git_urls = {
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. Signed-off-by: Philip Lorenz <philip.lorenz@bmw.de> --- lib/bb/fetch2/git.py | 26 ++++++++++++++++++-------- lib/bb/tests/fetch.py | 26 ++++++++++---------------- 2 files changed, 28 insertions(+), 24 deletions(-)