pw_env_setup: Allow skipping environment check

If PW_ACTIVATE_SKIP_CHECKS is set skip running 'pw doctor' in
activate and bootstrap.

Change-Id: Ic041f36dd3b16ade70fd19b893edc25fcc1daa2f
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/28662
Reviewed-by: Keir Mierle <keir@google.com>
Commit-Queue: Rob Mohr <mohrr@google.com>
diff --git a/pw_cli/py/pw_cli/env.py b/pw_cli/py/pw_cli/env.py
index 021c98e..eef188d 100644
--- a/pw_cli/py/pw_cli/env.py
+++ b/pw_cli/py/pw_cli/env.py
@@ -44,6 +44,9 @@
     parser.add_allowed_suffix('_CIPD_INSTALL_DIR')
 
     parser.add_var('PW_DOCTOR_SKIP_CIPD_CHECKS')
+    parser.add_var('PW_ACTIVATE_SKIP_CHECKS',
+                   type=envparse.strict_bool,
+                   default=False)
 
     # TODO(pwbug/274) Remove after some transition time. These are no longer
     # used but may be set by users or downstream projects, or just in currently
diff --git a/pw_env_setup/docs.rst b/pw_env_setup/docs.rst
index 018424e..c243dc9 100644
--- a/pw_env_setup/docs.rst
+++ b/pw_env_setup/docs.rst
@@ -224,6 +224,13 @@
   --cargo-package-file
   "$PW_ROOT/pw_env_setup/py/pw_env_setup/cargo_setup/packages.txt"
 
+Automated Tools
+***************
+Automated tools should set ``PW_ACTIVATE_SKIP_CHECKS=1`` before running
+``activate.sh`` or ``activate.bat``. This will skip the checks on the
+environment and should complete almost instantaneously. Users should not set
+this variable.
+
 Implementation
 **************
 
diff --git a/pw_env_setup/py/pw_env_setup/env_setup.py b/pw_env_setup/py/pw_env_setup/env_setup.py
index a03fdf4..f0461ff 100755
--- a/pw_env_setup/py/pw_env_setup/env_setup.py
+++ b/pw_env_setup/py/pw_env_setup/env_setup.py
@@ -324,10 +324,7 @@
         self._env.echo(Color.bold('Sanity checking the environment:'))
         self._env.echo()
 
-        log_level = 'warn' if 'PW_ENVSETUP_QUIET' in os.environ else 'info'
-        doctor = ['pw', '--no-banner', '--loglevel', log_level, 'doctor']
-
-        self._env.command(doctor)
+        self._env.doctor()
         self._env.echo()
 
         self._env.echo(
diff --git a/pw_env_setup/py/pw_env_setup/environment.py b/pw_env_setup/py/pw_env_setup/environment.py
index 3e4c9b2..396671b 100644
--- a/pw_env_setup/py/pw_env_setup/environment.py
+++ b/pw_env_setup/py/pw_env_setup/environment.py
@@ -419,6 +419,34 @@
         pass
 
 
+class Doctor(Command):
+    def __init__(self, *args, **kwargs):
+        log_level = 'warn' if 'PW_ENVSETUP_QUIET' in os.environ else 'info'
+        super(Doctor, self).__init__(
+            command=['pw', '--no-banner', '--loglevel', log_level, 'doctor'],
+            *args,
+            **kwargs)
+
+    def write(self, outs, windows=(os.name == 'nt'), replacements=()):
+        super_call = lambda: super(Doctor, self).write(
+            outs, windows=windows, replacements=replacements)
+
+        if windows:
+            outs.write('if "%PW_ACTIVATE_SKIP_CHECKS%"=="" (\n')
+            super_call()
+            outs.write(') else (\n')
+            outs.write('echo Skipping environment check because '
+                       'PW_ACTIVATE_SKIP_CHECKS is set\n')
+            outs.write(')\n')
+        else:
+            outs.write('if [ -z "$PW_ACTIVATE_SKIP_CHECKS" ]; then\n')
+            super_call()
+            outs.write('else\n')
+            outs.write('echo Skipping environment check because '
+                       'PW_ACTIVATE_SKIP_CHECKS is set\n')
+            outs.write('fi\n')
+
+
 class BlankLine(_Action):
     """Write a blank line to the init script."""
     def write(  # pylint: disable=no-self-use
@@ -593,6 +621,10 @@
         self._actions.append(Command(command, exit_on_error=exit_on_error))
         self._blankline()
 
+    def doctor(self):
+        """Run 'pw doctor'."""
+        self._actions.append(Doctor())
+
     def function(self, name, body):
         """Define a function."""
         assert not self._finalized