scripts/build_linters: set cross_workon by flag

This CL implements a method of setting cros_workon start for packages
before linting them with a flag, and then resetting them to their prior
state.

BUG=b:229143726
TEST=manually tested

Change-Id: I3a441089339ac0936e477cc664f48e58d547188a
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/3615563
Reviewed-by: Alex Klein <saklein@chromium.org>
Commit-Queue: Ryan Beltran <ryanbeltran@chromium.org>
Tested-by: Ryan Beltran <ryanbeltran@chromium.org>
diff --git a/scripts/lint_package.py b/scripts/lint_package.py
index c63bbc2..86f69b6 100644
--- a/scripts/lint_package.py
+++ b/scripts/lint_package.py
@@ -16,17 +16,18 @@
 from chromite.lib import commandline
 from chromite.lib import cros_build_lib
 from chromite.lib import portage_util
+from chromite.lib import workon_helper
 from chromite.lib.parser import package_info
 from chromite.service import toolchain
 from chromite.utils import file_util
 
 
-def parse_packages(board: str,
+def parse_packages(build_target: build_target_lib.BuildTarget,
                    packages: List[str]) -> List[package_info.PackageInfo]:
   """Parse packages and insert the category if none is given.
 
   Args:
-    board: board for sysroot (used with equery to detect categories if needed)
+    build_target: build_target to find ebuild for
     packages: user input package names to parse
 
   Returns:
@@ -37,7 +38,8 @@
     parsed = package_info.parse(package)
     if not parsed.category:
       # If a category is not specified, we can get it from the ebuild path.
-      ebuild_path = portage_util.FindEbuildForBoardPackage(package, board)
+      ebuild_path = portage_util.FindEbuildForBoardPackage(
+          package, build_target.name, build_target.root)
       ebuild_data = portage_util.EBuild(ebuild_path)
       parsed = package_info.parse(ebuild_data.package)
     package_infos.append(parsed)
@@ -92,12 +94,15 @@
   cros_build_lib.AssertInsideChroot()
   opts = parse_args(argv)
 
-  packages = parse_packages(opts.board, opts.packages)
-  sysroot = build_target_lib.get_default_sysroot_path(opts.board)
+  build_target = build_target_lib.BuildTarget(opts.board)
+  packages = parse_packages(build_target, opts.packages)
+  package_atoms = [x.atom for x in packages]
 
-  build_linter = toolchain.BuildLinter(packages, sysroot, opts.differential)
-  lints = build_linter.emerge_with_linting(
-      use_clippy=opts.clippy, use_tidy=opts.tidy)
+  with workon_helper.WorkonScope(build_target, package_atoms):
+    build_linter = toolchain.BuildLinter(packages, build_target.root,
+                                         opts.differential)
+    lints = build_linter.emerge_with_linting(
+        use_clippy=opts.clippy, use_tidy=opts.tidy)
 
   with file_util.Open(opts.output, 'w') as output_file:
     json.dump(lints, output_file)