scripts: update_chroot: start moving the tool from src/scripts/

Add a python entry point so we can migrate the src/scripts/ version.

BUG=b:298249751
TEST=CQ passes

Change-Id: I46827e8aec3fb6985048a6cc4c3e40a086089d5b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4831960
Reviewed-by: Cindy Lin <xcl@google.com>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
diff --git a/scripts/update_chroot.py b/scripts/update_chroot.py
new file mode 100644
index 0000000..9f83f35
--- /dev/null
+++ b/scripts/update_chroot.py
@@ -0,0 +1,114 @@
+# Copyright 2023 The ChromiumOS Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Update the SDK.
+
+Performs an update of the chroot. This script is called as part of
+build_packages, so there is typically no need to call this script directly.
+"""
+
+import argparse
+from typing import List, Optional
+
+from chromite.lib import commandline
+from chromite.service import sdk as sdk_service
+from chromite.service import sysroot
+
+
+def get_parser() -> commandline.ArgumentParser:
+    """Build the argument parser."""
+    # TODO(vapier): Remove underscore separated arguments and the deprecated
+    # message after Jun 2024.
+    deprecated = "Argument will be removed Jun 2024. Use %s instead."
+
+    parser = commandline.ArgumentParser(description=__doc__)
+
+    parser.add_bool_argument(
+        "--usepkg",
+        True,
+        "Use binary packages to bootstrap.",
+        "Do not use binary packages to bootstrap.",
+    )
+    parser.add_argument(
+        "--nousepkg",
+        dest="usepkg",
+        action="store_false",
+        deprecated=deprecated % "--no-usepkg",
+        help=argparse.SUPPRESS,
+    )
+
+    # Not really a common argument, but argument_group doesn't have our custom
+    # bool extension yet.
+    parser.add_bool_argument(
+        "--eclean",
+        True,
+        "Clean out old SDK binpkgs.",
+        "Do not clean out SDK binpkgs.",
+    )
+    parser.add_argument(
+        "--noeclean",
+        dest="eclean",
+        action="store_false",
+        deprecated=deprecated % "--no-eclean",
+        help=argparse.SUPPRESS,
+    )
+
+    group = parser.add_argument_group("Advanced Build Modification Options")
+    group.add_argument(
+        "--jobs",
+        type=int,
+        help="Maximum number of packages to build in parallel.",
+    )
+    group.add_argument(
+        "--skip-toolchain-update",
+        dest="update_toolchain",
+        action="store_true",
+        default=False,
+        help="Don't update toolchain automatically.",
+    )
+    group.add_argument(
+        "--skip_toolchain_update",
+        dest="update_toolchain",
+        action="store_true",
+        default=False,
+        deprecated=deprecated % "--skip-toolchain-update",
+        help=argparse.SUPPRESS,
+    )
+    group.add_argument(
+        "--toolchain-boards",
+        default="",
+        help="Extra toolchains to setup for the specified boards.",
+    )
+    group.add_argument(
+        "--toolchain_boards",
+        deprecated=deprecated % "--toolchain-boards",
+        help=argparse.SUPPRESS,
+    )
+    group.add_argument(
+        "--backtrack",
+        type=int,
+        default=sysroot.BACKTRACK_DEFAULT,
+        help="See emerge --backtrack.",
+    )
+
+    return parser
+
+
+def main(argv: Optional[List[str]] = None) -> Optional[int]:
+    commandline.RunInsideChroot()
+
+    parser = get_parser()
+    opts = parser.parse_args(argv)
+    opts.Freeze()
+
+    update_args = sdk_service.UpdateArguments(
+        build_source=not opts.usepkg,
+        toolchain_targets=opts.toolchain_boards,
+        jobs=opts.jobs,
+        backtrack=opts.backtrack,
+        update_toolchain=opts.update_toolchain,
+        eclean=opts.eclean,
+    )
+    result = sdk_service.Update(update_args)
+    return result.return_code