cros_workon_make: migrate the script to python

Migrate the cros_workon_make script to Python.

BUG=b:294242818
TEST=./run_tests

Change-Id: Ie4731679d7d473ce437ca3591d5d1bb62109fd9d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/4742704
Reviewed-by: Mike Frysinger <vapier@chromium.org>
Tested-by: Anuj Jamwal <anujjamwal@google.com>
Commit-Queue: Anuj Jamwal <anujjamwal@google.com>
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Auto-Submit: Anuj Jamwal <anujjamwal@google.com>
diff --git a/scripts/cros_workon_make.py b/scripts/cros_workon_make.py
new file mode 100644
index 0000000..9e0edb1
--- /dev/null
+++ b/scripts/cros_workon_make.py
@@ -0,0 +1,89 @@
+# 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.
+
+"""Build cros_workon package incrementally.
+
+Simple wrapper script to build a cros_workon package incrementally. You
+must already be cros_workon'ing the package in question. This had been
+migrated to python from chromiumos/src/scripts/cros_workon_make.
+"""
+
+import logging
+from typing import List, Optional
+
+from chromite.lib import build_target_lib
+from chromite.lib import commandline
+from chromite.lib import cros_build_lib
+from chromite.lib import workon_helper
+
+
+def GetParser() -> commandline.ArgumentParser:
+    """Get a CLI parser."""
+    parser = commandline.ArgumentParser(description=__doc__)
+    parser.add_argument(
+        "-b",
+        "--board",
+        "--build-target",
+        default=cros_build_lib.GetDefaultBoard(),
+        required=True,
+        help="The board to set package keywords for.",
+    )
+    parser.add_argument(
+        "--test",
+        default=False,
+        action="store_true",
+        help="Compile and run tests as well",
+    )
+    parser.add_argument(
+        "--reconf",
+        default=False,
+        action="store_true",
+        help="Re-run configure and prepare steps",
+    )
+    parser.add_argument(
+        "--install",
+        default=False,
+        action="store_true",
+        help="Incrementally build and install your package",
+    )
+    parser.add_argument(
+        "--scrub",
+        default=False,
+        action="store_true",
+        help="Blow away all in-tree files not managed by git",
+    )
+    parser.add_argument(
+        "package",
+        help="Package to build.",
+    )
+    return parser
+
+
+def main(argv: Optional[List[str]]) -> Optional[int]:
+    commandline.RunInsideChroot()
+
+    parser = GetParser()
+    options = parser.parse_args(argv)
+    options.Freeze()
+
+    board = options.board
+    sysroot = build_target_lib.get_default_sysroot_path(board)
+    helper = workon_helper.WorkonHelper(sysroot, board)
+
+    pkg = options.package
+
+    if options.scrub:
+        logging.warning("--scrub will destroy ALL FILES unknown to git!")
+        if cros_build_lib.BooleanPrompt():
+            helper.ScrubPackage(pkg)
+        else:
+            logging.info("Not scrubbing; exiting gracefully")
+    elif options.install:
+        helper.InstallPackage(pkg)
+    else:
+        helper.BuildPackage(
+            pkg,
+            clean=options.reconf,
+            test=options.test,
+        )