update_crate_tests.py: don't use sys.exit()

If the TEST_MAPPING cannot be generated, print the reason, but
exit without error. It's not uncommon for the output of cargo2android
to fail to build e.g. if a new depencency is not satisfied, so we can
fall back to the previous TEST_MAPPING, or run update_crate_tests
locally once all dependencies are present.

Bug: 179132533
Test: tools/external_updater/updater.sh update rust/crates/textwrap
Test: tools/external_updater/updater.sh update rust/crates/libc
Change-Id: I4802c77332d1ab1d6604d48c47365f40bdbd1122
diff --git a/scripts/update_crate_tests.py b/scripts/update_crate_tests.py
index 09d7096..b70e9fa 100755
--- a/scripts/update_crate_tests.py
+++ b/scripts/update_crate_tests.py
@@ -44,8 +44,10 @@
             self.cwd = path
         try:
             self.cwd_relative = self.cwd.split(self.ANDROID_BUILD_TOP)[1]
+            self.setup = True
         except:
-            sys.exit("Exit if we're not being run from a Rust dir.")
+            # Mark setup as failed if a path to a rust crate is not provided.
+            self.setup = False
 
 class Bazel(object):
     # set up the Bazel queryview
@@ -55,9 +57,12 @@
         cmd = "./build/soong/soong_ui.bash --build-mode --all-modules --dir=. queryview"
         try:
             out = subprocess.check_output(cmd, shell=True, stderr=subprocess.STDOUT)
+            self.setup = True
         except subprocess.CalledProcessError as e:
             print("Error: Unable to update TEST_MAPPING due to the following build error:")
-            sys.exit(e.output)
+            print(e.output)
+            # Mark setup as failed if the Bazel queryview fails to build.
+            self.setup = False
         os.chdir(env.cwd)
 
     def path(self):
@@ -123,6 +128,8 @@
         self.bazel = Bazel(self.env)
 
     def create_test_mapping(self, path):
+        if self.env.setup == False or self.bazel.setup == False:
+            return
         tests = self.get_tests(path)
         if not bool(tests):
             return