Oops sorry I sent this to the wrong mailing list. Should be
bitbake-devel not openembedded-core

Anyway, this should fix your problem Mikko and Martin

On Wed, Sep 13, 2023 at 9:46 AM Joshua Watt <jpewhac...@gmail.com> wrote:
>
> 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
> os.path.samestat() which is immune to the these sorts of problems. The
> code needs manually check all parent directories until it has recursed
> up to the root to make sure, but in the common case where the
> directories do actually contain the correct git repository, this will
> only run a single iteration.
>
> Signed-off-by: Joshua Watt <jpewhac...@gmail.com>
> ---
>  bitbake/lib/bb/fetch2/git.py | 24 +++++++++++++++---------
>  1 file changed, 15 insertions(+), 9 deletions(-)
>
> diff --git a/bitbake/lib/bb/fetch2/git.py b/bitbake/lib/bb/fetch2/git.py
> index e11271b757a..5703ba335e0 100644
> --- a/bitbake/lib/bb/fetch2/git.py
> +++ b/bitbake/lib/bb/fetch2/git.py
> @@ -374,19 +374,25 @@ class Git(FetchMethod):
>                  # 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 = 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)
> +                clonedir_stat = os.stat(ud.clonedir)
> +                toplevel = os.path.abspath(output.rstrip()).rstrip("/")
> +                check_dir = toplevel
> +
> +                while check_dir:
> +                    check_stat = os.stat(check_dir)
> +                    if os.path.samestat(check_stat, clonedir_stat):
> +                        break
> +                    check_dir = os.path.dirname(check_dir).rstrip("/")
> +
> +                if not check_dir:
> +                    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)
> --
> 2.34.1
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#187609): 
https://lists.openembedded.org/g/openembedded-core/message/187609
Mute This Topic: https://lists.openembedded.org/mt/101339809/21656
Group Owner: openembedded-core+ow...@lists.openembedded.org
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to