This is really hard to review. You need to split this up: first move
the existing code into its own function (or functoins) in a separate
commit, then add the new logic in a second commit.

Alex

On Thu, 25 Jun 2026 at 11:27, Jaipaul Cheernam via
lists.openembedded.org
<[email protected]> wrote:
>
> When buildtools are fetched externally (e.g. by bitbake-setup using
> bb.fetch with checksum verification), install-buildtools does not need
> to download or verify the file again.
>
> Add --local-file to accept a path to a pre-downloaded installer,
> skipping the download and checksum steps. The existing standalone
> download behaviour is preserved in the else branch.
>
> Signed-off-by: Jaipaul Cheernam <[email protected]>
> Reviewed-by: Daniel Turull <[email protected]>
> ---
>  scripts/install-buildtools | 109 +++++++++++++++++++++----------------
>  1 file changed, 62 insertions(+), 47 deletions(-)
>
> diff --git a/scripts/install-buildtools b/scripts/install-buildtools
> index 723edd793e..943770c84c 100755
> --- a/scripts/install-buildtools
> +++ b/scripts/install-buildtools
> @@ -130,6 +130,10 @@ def main():
>          description="Buildtools installation helper",
>          add_help=False,
>          formatter_class=argparse.RawTextHelpFormatter)
> +    parser.add_argument('--local-file',
> +                        help='path to a pre-downloaded buildtools installer 
> file.\n'
> +                             'Cannot be combined with --url or --filename.',
> +                        action='store')
>      parser.add_argument('-u', '--url',
>                          help='URL from where to fetch buildtools SDK 
> installer, not '
>                               'including filename (optional)\n'
> @@ -243,62 +247,73 @@ def main():
>      os.makedirs(sdk_dir, exist_ok=True)
>      try:
>          # Fetch installer
> -        logger.info("Fetching buildtools installer")
> -        tmpbuildtools = os.path.join(sdk_dir, filename)
> -        with open(os.path.join(sdk_dir, 'buildtools_url'), 'w') as f:
> -            f.write(buildtools_url)
> -        ret = subprocess.call("wget -q -O %s %s" %
> -                              (tmpbuildtools, buildtools_url), shell=True)
> -        if ret != 0:
> -            logger.error("Could not download file from %s" % buildtools_url)
> -            return ret
> -
> -        # Verify checksum
> -        if args.check:
> -            logger.info("Fetching buildtools installer checksum")
> -            checksum_type = "sha256sum"
> -            checksum_url = "{}.{}".format(buildtools_url, checksum_type)
> -            checksum_filename = "{}.{}".format(filename, checksum_type)
> -            tmpbuildtools_checksum = os.path.join(sdk_dir, checksum_filename)
> -            with open(os.path.join(sdk_dir, 'checksum_url'), 'w') as f:
> -                f.write(checksum_url)
> -            ret = subprocess.call("wget -q -O %s %s" %
> -                                    (tmpbuildtools_checksum, checksum_url), 
> shell=True)
> +        if args.local_file:
> +            if args.url or args.filename:
> +                parser.error("--local-file cannot be combined with --url or 
> --filename")
> +            tmpbuildtools = os.path.abspath(args.local_file)
> +            if not os.path.exists(tmpbuildtools):
> +                logger.error("Local file not found: %s" % tmpbuildtools)
> +                return 1
> +            filename = os.path.basename(tmpbuildtools)
> +        else:
> +            logger.info("Fetching buildtools installer")
> +            tmpbuildtools = os.path.join(sdk_dir, filename)
> +            with open(os.path.join(sdk_dir, 'buildtools_url'), 'w') as f:
> +                f.write(buildtools_url)
> +            ret = subprocess.call(["wget", "-q", "-O", tmpbuildtools, 
> buildtools_url])
>              if ret != 0:
> -                logger.error("Could not download file from %s" % 
> checksum_url)
> +                logger.error("Could not download file from %s" % 
> buildtools_url)
>                  return ret
> -            regex = 
> re.compile(r"^(?P<checksum>[0-9a-f]+)\s+(?P<path>.*/)?(?P<filename>.*)$")
> -            with open(tmpbuildtools_checksum, 'rb') as f:
> -                original = f.read()
> -                m = re.search(regex, original.decode("utf-8"))
> -                logger.debug("checksum regex match: %s" % m)
> -                logger.debug("checksum: %s" % m.group('checksum'))
> -                logger.debug("path: %s" % m.group('path'))
> -                logger.debug("filename: %s" % m.group('filename'))
> -                if filename != m.group('filename'):
> -                    logger.error("Filename does not match name in checksum")
> +
> +            # Verify checksum
> +            if args.check:
> +                logger.info("Fetching buildtools installer checksum")
> +                checksum_type = "sha256sum"
> +                checksum_url = "{}.{}".format(buildtools_url, checksum_type)
> +                checksum_filename = "{}.{}".format(filename, checksum_type)
> +                tmpbuildtools_checksum = os.path.join(sdk_dir, 
> checksum_filename)
> +                with open(os.path.join(sdk_dir, 'checksum_url'), 'w') as f:
> +                    f.write(checksum_url)
> +                ret = subprocess.call(["wget", "-q", "-O", 
> tmpbuildtools_checksum, checksum_url])
> +                if ret != 0:
> +                    logger.error("Could not download file from %s" % 
> checksum_url)
> +                    return ret
> +                regex = 
> re.compile(r"^(?P<checksum>[0-9a-f]+)\s+(?P<path>.*/)?(?P<filename>.*)$")
> +                with open(tmpbuildtools_checksum, 'rb') as f:
> +                    original = f.read()
> +                    m = re.search(regex, original.decode("utf-8"))
> +                    logger.debug("checksum regex match: %s" % m)
> +                    logger.debug("checksum: %s" % m.group('checksum'))
> +                    logger.debug("path: %s" % m.group('path'))
> +                    logger.debug("filename: %s" % m.group('filename'))
> +                    if filename != m.group('filename'):
> +                        logger.error("Filename does not match name in 
> checksum")
> +                        return 1
> +                    checksum = m.group('checksum')
> +                checksum_value = sha256_file(tmpbuildtools)
> +                if checksum == checksum_value:
> +                        logger.info("Checksum success")
> +                else:
> +                    logger.error("Checksum %s expected. Actual checksum is 
> %s." %
> +                                 (checksum, checksum_value))
>                      return 1
> -                checksum = m.group('checksum')
> -            checksum_value = sha256_file(tmpbuildtools)
> -            if checksum == checksum_value:
> -                    logger.info("Checksum success")
> -            else:
> -                logger.error("Checksum %s expected. Actual checksum is %s." %
> -                             (checksum, checksum_value))
> -                return 1
>
>          # Make installer executable
> -        logger.info("Making installer executable")
> -        st = os.stat(tmpbuildtools)
> -        os.chmod(tmpbuildtools, st.st_mode | stat.S_IEXEC)
> -        logger.debug(os.stat(tmpbuildtools))
> +        if args.local_file:
> +            # Avoid mutating caller-owned file; invoke via /bin/sh instead
> +            cmd = ["/bin/sh", tmpbuildtools]
> +        else:
> +            logger.info("Making installer executable")
> +            st = os.stat(tmpbuildtools)
> +            os.chmod(tmpbuildtools, st.st_mode | stat.S_IEXEC)
> +            logger.debug(os.stat(tmpbuildtools))
> +            cmd = [tmpbuildtools]
>          if args.directory:
>              install_dir = os.path.abspath(args.directory)
> -            ret = subprocess.call("%s -d %s -y" %
> -                                  (tmpbuildtools, install_dir), shell=True)
> +            ret = subprocess.call(cmd + ["-d", install_dir, "-y"])
>          else:
>              install_dir = "/opt/poky/%s" % args.installer_version
> -            ret = subprocess.call("%s -y" % tmpbuildtools, shell=True)
> +            ret = subprocess.call(cmd + ["-y"])
>          if ret != 0:
>              logger.error("Could not run buildtools installer")
>              return ret
> --
> 2.34.1
>
>
> 
>
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#239576): 
https://lists.openembedded.org/g/openembedded-core/message/239576
Mute This Topic: https://lists.openembedded.org/mt/119970828/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to