diff options
author | Joshua Watt <JPEWhacker@gmail.com> | 2023-09-13 13:04:25 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-09-14 15:08:21 +0100 |
commit | e12e6d94ecbea6e0dafc080f2f196e12228730eb (patch) | |
tree | 5cc61e27d4b7f6234372dcef0cc087a5c21fe8e2 /bitbake | |
parent | b2ab9bd4a394a60bfb2b21f5cc31b6f3185fc7e5 (diff) | |
download | poky-e12e6d94ecbea6e0dafc080f2f196e12228730eb.tar.gz |
bitbake: 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.
(Bitbake rev: b4d7a0546630620480b7fee159b84c3506e941a2)
Signed-off-by: Joshua Watt <JPEWhacker@gmail.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'bitbake')
-rw-r--r-- | bitbake/lib/bb/fetch2/git.py | 15 |
1 files changed, 6 insertions, 9 deletions
diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py index e11271b757..4385d0b37a 100644 --- a/bitbake/lib/bb/fetch2/git.py +++ b/bitbake/lib/bb/fetch2/git.py | |||
@@ -373,20 +373,17 @@ class Git(FetchMethod): | |||
373 | try: | 373 | try: |
374 | # Since clones can be bare, use --absolute-git-dir instead of --show-toplevel | 374 | # Since clones can be bare, use --absolute-git-dir instead of --show-toplevel |
375 | output = runfetchcmd("LANG=C %s rev-parse --absolute-git-dir" % ud.basecmd, d, workdir=ud.clonedir) | 375 | output = runfetchcmd("LANG=C %s rev-parse --absolute-git-dir" % ud.basecmd, d, workdir=ud.clonedir) |
376 | toplevel = output.rstrip() | ||
376 | 377 | ||
377 | toplevel = os.path.abspath(output.rstrip()) | 378 | if not bb.utils.path_is_descendant(toplevel, ud.clonedir): |
378 | abs_clonedir = os.path.abspath(ud.clonedir).rstrip('/') | 379 | logger.warning("Top level directory '%s' is not a descendant of '%s'. Re-cloning", toplevel, ud.clonedir) |
379 | # The top level Git directory must either be the clone directory | ||
380 | # or a child of the clone directory. Any ancestor directory of | ||
381 | # the clone directory is not valid as the Git directory (and | ||
382 | # probably belongs to some other unrelated repository), so a | ||
383 | # clone is required | ||
384 | if os.path.commonprefix([abs_clonedir, toplevel]) != abs_clonedir: | ||
385 | logger.warning("Top level directory '%s' doesn't match expected '%s'. Re-cloning", toplevel, ud.clonedir) | ||
386 | needs_clone = True | 380 | needs_clone = True |
387 | except bb.fetch2.FetchError as e: | 381 | except bb.fetch2.FetchError as e: |
388 | logger.warning("Unable to get top level for %s (not a git directory?): %s", ud.clonedir, e) | 382 | logger.warning("Unable to get top level for %s (not a git directory?): %s", ud.clonedir, e) |
389 | needs_clone = True | 383 | needs_clone = True |
384 | except FileNotFoundError as e: | ||
385 | logger.warning("%s", e) | ||
386 | needs_clone = True | ||
390 | 387 | ||
391 | if needs_clone: | 388 | if needs_clone: |
392 | shutil.rmtree(ud.clonedir) | 389 | shutil.rmtree(ud.clonedir) |