aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bb/fetch2/git.py
diff options
context:
space:
mode:
authorJoshua Watt <JPEWhacker@gmail.com>2023-09-13 13:04:25 -0600
committerRichard Purdie <richard.purdie@linuxfoundation.org>2023-09-14 15:08:19 +0100
commitb4d7a0546630620480b7fee159b84c3506e941a2 (patch)
treee4f61d52828b534164ab75501bcd90f6ffbf5337 /lib/bb/fetch2/git.py
parentc3ae45946886ee2049939dd5a205790657a7de32 (diff)
downloadbitbake-b4d7a0546630620480b7fee159b84c3506e941a2.tar.gz
fetch2: git: Use path_is_descendant() instead of path for repo check
Using path prefixes to check if the git directory is a descendant of the clone directory can be easily confused with symlinkes and bind mounts, causing directories to be deleted unnecessarily. Instead, use bb.utils.path_is_descendant() which is immune to the these sorts of problems. Signed-off-by: Joshua Watt <JPEWhacker@gmail.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Diffstat (limited to 'lib/bb/fetch2/git.py')
-rw-r--r--lib/bb/fetch2/git.py15
1 files changed, 6 insertions, 9 deletions
diff --git a/lib/bb/fetch2/git.py b/lib/bb/fetch2/git.py
index e11271b75..4385d0b37 100644
--- a/lib/bb/fetch2/git.py
+++ b/lib/bb/fetch2/git.py
@@ -373,20 +373,17 @@ class Git(FetchMethod):
try:
# Since clones can be bare, use --absolute-git-dir instead of --show-toplevel
output = runfetchcmd("LANG=C %s rev-parse --absolute-git-dir" % ud.basecmd, d, workdir=ud.clonedir)
+ toplevel = output.rstrip()
- toplevel = os.path.abspath(output.rstrip())
- abs_clonedir = os.path.abspath(ud.clonedir).rstrip('/')
- # The top level Git directory must either be the clone directory
- # or a child of the clone directory. Any ancestor directory of
- # the clone directory is not valid as the Git directory (and
- # probably belongs to some other unrelated repository), so a
- # clone is required
- if os.path.commonprefix([abs_clonedir, toplevel]) != abs_clonedir:
- logger.warning("Top level directory '%s' doesn't match expected '%s'. Re-cloning", toplevel, ud.clonedir)
+ if not bb.utils.path_is_descendant(toplevel, ud.clonedir):
+ logger.warning("Top level directory '%s' is not a descendant of '%s'. Re-cloning", toplevel, ud.clonedir)
needs_clone = True
except bb.fetch2.FetchError as e:
logger.warning("Unable to get top level for %s (not a git directory?): %s", ud.clonedir, e)
needs_clone = True
+ except FileNotFoundError as e:
+ logger.warning("%s", e)
+ needs_clone = True
if needs_clone:
shutil.rmtree(ud.clonedir)