Automated rollback of commit 03914cc6d6fbc8351d7960b6a0dd239bc2b541f9.

*** Reason for rollback ***

Does not create the ~/.lldbinit or ~/.lldbinit-Xcode if it hasn't
already been created.

Will resolve that case in a follow up CL, after new release cuts.

PiperOrigin-RevId: 191765048
diff --git a/src/Tulsi.xcodeproj/project.pbxproj b/src/Tulsi.xcodeproj/project.pbxproj
index 5f44e6b..9665e33 100644
--- a/src/Tulsi.xcodeproj/project.pbxproj
+++ b/src/Tulsi.xcodeproj/project.pbxproj
@@ -143,7 +143,6 @@
 		D3F78C681F391E9700AE0571 /* bazel_options.py in Resources */ = {isa = PBXBuildFile; fileRef = D3F78C671F391E9700AE0571 /* bazel_options.py */; };
 		E11AFAB02052655500C97875 /* bazel_cache_reader in Copy Utilty resources */ = {isa = PBXBuildFile; fileRef = E1D770EA20523E790026802A /* bazel_cache_reader */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
 		E135A781205880720082E4D0 /* apfs_clone_copy.py in Resources */ = {isa = PBXBuildFile; fileRef = E135A780205880720082E4D0 /* apfs_clone_copy.py */; };
-		E1542A0E206ED51900D3D339 /* bootstrap_lldbinit.py in Resources */ = {isa = PBXBuildFile; fileRef = E1542A0D206ED51900D3D339 /* bootstrap_lldbinit.py */; };
 		E155E20C1FCE47DA002B16BB /* BazelBuildSettingsFeatures.swift in Sources */ = {isa = PBXBuildFile; fileRef = E155E20B1FCE47D9002B16BB /* BazelBuildSettingsFeatures.swift */; };
 		E19C1C571F5886A000D6E38A /* QueuedLogging.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19C1C561F5886A000D6E38A /* QueuedLogging.swift */; };
 		E1C0186D2051B65D000580CC /* clean_symbol_cache.py in Resources */ = {isa = PBXBuildFile; fileRef = E1C018692051B65B000580CC /* clean_symbol_cache.py */; };
@@ -359,7 +358,6 @@
 		D3F78C671F391E9700AE0571 /* bazel_options.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = bazel_options.py; sourceTree = "<group>"; };
 		E132B8B51F86FA3400DF7F9A /* tulsi_aspects_paths.bzl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = tulsi_aspects_paths.bzl; path = tulsi/tulsi_aspects_paths.bzl; sourceTree = "<group>"; };
 		E135A780205880720082E4D0 /* apfs_clone_copy.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = apfs_clone_copy.py; sourceTree = "<group>"; };
-		E1542A0D206ED51900D3D339 /* bootstrap_lldbinit.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = bootstrap_lldbinit.py; sourceTree = "<group>"; };
 		E155E20B1FCE47D9002B16BB /* BazelBuildSettingsFeatures.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BazelBuildSettingsFeatures.swift; sourceTree = "<group>"; };
 		E19C1C561F5886A000D6E38A /* QueuedLogging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QueuedLogging.swift; sourceTree = "<group>"; };
 		E1C018692051B65B000580CC /* clean_symbol_cache.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = clean_symbol_cache.py; sourceTree = "<group>"; };
@@ -529,7 +527,6 @@
 		3DAC27671C3AD2510040F42C /* Scripts */ = {
 			isa = PBXGroup;
 			children = (
-				E1542A0D206ED51900D3D339 /* bootstrap_lldbinit.py */,
 				5442049B2064156D00EBF343 /* install_genfiles.py */,
 				E135A780205880720082E4D0 /* apfs_clone_copy.py */,
 				54EF32091F3E0804009E9C7F /* bazel_build_events.py */,
@@ -880,7 +877,6 @@
 				5442049C2064156D00EBF343 /* install_genfiles.py in Resources */,
 				E1C018722051B66C000580CC /* update_symbol_cache.py in Resources */,
 				3DCFE5D51C80A64600D7F31B /* WORKSPACE in Resources */,
-				E1542A0E206ED51900D3D339 /* bootstrap_lldbinit.py in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
diff --git a/src/TulsiGenerator/Base.lproj/Localizable.strings b/src/TulsiGenerator/Base.lproj/Localizable.strings
index 7be9732..9e4113d 100644
--- a/src/TulsiGenerator/Base.lproj/Localizable.strings
+++ b/src/TulsiGenerator/Base.lproj/Localizable.strings
@@ -44,11 +44,8 @@
 /* Error when parsing a Bazel Build Event for BEP when running Bazel. */
 "BazelParseBuildEventFailed" = "Failed to parse a Bazel Build Event. This may be a Tulsi bug, please report. Additional Context: %1$@";
 
-/* Warning when a failure occurred while attempting to bootstrap the user's LLDBInit file. */
-"BootstrapLLDBInitFailed" = "Failed to bootstrap LLDBInit file, bootstrapping script returned error code %1$d, %2$@.";
-
 /* Warning when a failure occurred while cleaning dSYMs in the SQLite store used by the DBGShellCommands script. */
-"CleanCachedDsymsFailed" = "Failed to clean cache of dSYMs, clean script returned error code %1$d, %2$@.";
+"CleanCachedDsymsFailed" = "Failed to clean cache of dSYMs, clean script returned %1$@.";
 
 /* Failed to copy an important file resource, the resulting project will most likely be broken. A bug should be reported. */
 "CopyingResourceFailed" = "Failed to copy project resource '%1$@' to '%2$@'. The generated project will probably malfunction, please report. Error: %3$@";
diff --git a/src/TulsiGenerator/Scripts/bazel_build.py b/src/TulsiGenerator/Scripts/bazel_build.py
index 29c514e..dcd2e89 100755
--- a/src/TulsiGenerator/Scripts/bazel_build.py
+++ b/src/TulsiGenerator/Scripts/bazel_build.py
@@ -29,6 +29,7 @@
 import re
 import shutil
 import signal
+import StringIO
 import subprocess
 import sys
 import textwrap
@@ -38,8 +39,6 @@
 from apfs_clone_copy import CopyOnWrite
 import bazel_build_events
 import bazel_options
-from bootstrap_lldbinit import BootstrapLLDBInit
-from bootstrap_lldbinit import TULSI_LLDBINIT_FILE
 from execroot_path import BAZEL_EXECUTION_ROOT
 import tulsi_logging
 from update_symbol_cache import UpdateSymbolCache
@@ -1446,24 +1445,69 @@
     self.codesign_attributes[signed_bundle] = bundle_attributes
     return bundle_attributes.Get(attribute)
 
-  # File for custom lldbinit changes.
-  # WARNING: This file will override any dSYM based source remappings AND
-  # ~/.lldbinit-tulsiproj remappings. Use of this file is strongly discouraged.
+  _TULSI_LLDBINIT_BLOCK_START = '# <TULSI> LLDB bridge [:\n'
+  _TULSI_LLDBINIT_BLOCK_END = '# ]: <TULSI> LLDB bridge\n'
+  _TULSI_LLDBINIT_FILE = os.path.expanduser('~/.lldbinit-tulsiproj')
   _TULSI_LLDBINIT_EPILOGUE_FILE = (
       os.path.expanduser('~/.lldbinit-tulsiproj-epilogue'))
 
+  def _ExtractLLDBInitContent(self, lldbinit_path):
+    """Extracts the non-Tulsi content of the given lldbinit file."""
+    if not os.path.isfile(lldbinit_path):
+      return []
+    content = []
+    with open(lldbinit_path) as f:
+      ignoring = False
+      for line in f:
+        if ignoring:
+          if line == self._TULSI_LLDBINIT_BLOCK_END:
+            ignoring = False
+          continue
+        if line == self._TULSI_LLDBINIT_BLOCK_START:
+          ignoring = True
+          continue
+        content.append(line)
+    return content
+
+  def _LinkTulsiLLDBInit(self):
+    """Adds a reference to ~/.lldbinit-tulsi to the primary lldbinit file.
+
+    Xcode 8+ caches the contents of ~/.lldbinit-Xcode on startup. To get around
+    this, an external reference to ~/.lldbinit-tulsi is added, causing LLDB
+    itself to load the possibly modified contents on each session.
+    """
+
+    lldbinit_path = os.path.expanduser('~/.lldbinit-Xcode')
+    if not os.path.isfile(lldbinit_path):
+      lldbinit_path = os.path.expanduser('~/.lldbinit')
+
+    content = self._ExtractLLDBInitContent(lldbinit_path)
+    out = StringIO.StringIO()
+    for line in content:
+      out.write(line)
+
+    out.write(self._TULSI_LLDBINIT_BLOCK_START)
+    out.write('# This was autogenerated by Tulsi in order to influence LLDB '
+              'source-maps at build time.\n')
+    out.write('command source %s\n' % self._TULSI_LLDBINIT_FILE)
+    out.write(self._TULSI_LLDBINIT_BLOCK_END)
+
+    with open(lldbinit_path, 'w') as outfile:
+      out.seek(0)
+      # Negative length to make copyfileobj write the whole file at once.
+      shutil.copyfileobj(out, outfile, -1)
+
   def _LinkTulsiLLDBInitEpilogue(self, outfile):
     """Adds a reference to ~/.lldbinit-tulsi-epilogue if it exists.
 
     This file can be used to append more LLDB commands right after
-    ~/.lldbinit-tulsiproj is loaded.
+    .lldbinit-tulsi is sourced.
 
-    Use of this file is strongly discouraged; it will override any other
-    changes made by ~/.lldbinit, ~/.lldbinit-tulsiproj and dSYM bundle path
-    mappings.
+    Useful for extending or resetting LLDB settings that Tulsi may have set
+    automatically
 
     Args:
-      outfile: a file-type object, expected to be ~/.lldbinit-tulsiproj.
+      outfile: a file-type object.
 
     Returns:
       None
@@ -1478,12 +1522,9 @@
     if self.product_type == 'com.apple.product-type.application.watchapp2':
       return 0
 
-    # Make sure a reference to ~/.lldbinit-tulsiproj exists in ~/.lldbinit or
-    # ~/.lldbinit-Xcode. Priority is given to ~/.lldbinit-Xcode if it exists,
-    # otherwise the bootstrapping will be written to ~/.lldbinit.
-    BootstrapLLDBInit()
+    self._LinkTulsiLLDBInit()
 
-    with open(TULSI_LLDBINIT_FILE, 'w') as out:
+    with open(self._TULSI_LLDBINIT_FILE, 'w') as out:
       out.write('# This file is autogenerated by Tulsi and should not be '
                 'edited.\n')
 
diff --git a/src/TulsiGenerator/Scripts/bootstrap_lldbinit.py b/src/TulsiGenerator/Scripts/bootstrap_lldbinit.py
deleted file mode 100755
index c0c7178..0000000
--- a/src/TulsiGenerator/Scripts/bootstrap_lldbinit.py
+++ /dev/null
@@ -1,149 +0,0 @@
-#!/usr/bin/python
-# Copyright 2018 The Tulsi Authors. All rights reserved.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Bootstraps the presence and setup of ~/.lldbinit-tulsiproj."""
-
-import os
-import shutil
-import StringIO
-import sys
-
-
-TULSI_LLDBINIT_FILE = os.path.expanduser('~/.lldbinit-tulsiproj')
-
-
-class BootstrapLLDBInit(object):
-  """Bootstrap Xcode's preferred lldbinit for Bazel debugging."""
-
-  def _ExtractLLDBInitContent(self, lldbinit_path, source_string):
-    """Extracts non-Tulsi content in a given lldbinit if needed.
-
-    Args:
-      lldbinit_path: Absolute path to the lldbinit we are writing to.
-      source_string: String that we wish to write to lldbinit.
-
-    Returns:
-      (int, [string]): A tuple featuring the status code along with the list
-                       of strings representing content to write to lldbinit
-                       that does not account for the Tulsi-generated strings.
-                       Status code will be 0 if Tulsi-generated strings are
-                       not all there. Status code will be 1 if all Tulsi
-                       strings were accounted for. Status code will be 2 if
-                       the lldbinit file could not be found.
-    """
-    if not os.path.isfile(lldbinit_path):
-      return (2, [])
-    content = []
-    with open(lldbinit_path) as f:
-      ignoring = False
-
-      # Split on the newline. This works as long as the last string isn't
-      # suffixed with \n.
-      source_lines = source_string.split('\n')
-
-      source_idx = 0
-
-      # If the last line was suffixed with \n, last elements would be length
-      # minus 2, accounting for the extra \n.
-      source_last = len(source_lines) - 1
-
-      for line in f:
-
-        # For each line found matching source_string, increment the iterator
-        # and do not append that line to the list.
-        if source_lines[source_idx] in line:
-
-          # If all lines were found, return an error code with empty content.
-          if source_idx == source_last:
-            return (1, [])
-
-          # Increment for each matching line found.
-          source_idx += 1
-          ignoring = True
-          continue
-
-        if ignoring:
-
-          # If the last line was found...
-          if source_lines[source_last] in line:
-            # Stop ignoring lines and continue appending to content.
-            ignoring = False
-          continue
-
-        # If the line could not be found within source_string, append to the
-        # content array.
-        content.append(line)
-
-    return (0, content)
-
-  def _LinkTulsiLLDBInit(self):
-    """Adds a reference to ~/.lldbinit-tulsiproj to the primary lldbinit file.
-
-    Xcode 8+ executes the contents of the first available lldbinit on startup.
-    To help work around this, an external reference to ~/.lldbinit-tulsiproj is
-    added to that lldbinit. This causes Xcode's lldb-rpc-server to load the
-    possibly modified contents between Debug runs of any given app. Note that
-    this only happens after a Debug session terminates; the cache is only fully
-    invalidated after Xcode is relaunched.
-    """
-
-    # ~/.lldbinit-Xcode is the only lldbinit file that Xcode will read if it is
-    # present, therefore it has priority.
-    lldbinit_path = os.path.expanduser('~/.lldbinit-Xcode')
-    if not os.path.isfile(lldbinit_path):
-      # If ~/.lldbinit-Xcode does not exist, write the reference to
-      # ~/.lldbinit-tulsiproj to ~/.lldbinit, the second lldbinit file that
-      # Xcode will attempt to read if ~/.lldbinit-Xcode isn't present.
-      lldbinit_path = os.path.expanduser('~/.lldbinit')
-
-    # String that we plan to inject into this lldbinit.
-    source_string = ('# <TULSI> LLDB bridge [:\n'
-                     '# This was autogenerated by Tulsi in order to modify '
-                     'LLDB source-maps at build time.\n'
-                     'command source %s\n' % TULSI_LLDBINIT_FILE +
-                     '# ]: <TULSI> LLDB bridge')
-
-    # Retrieve the contents of lldbinit if applicable along with a return code.
-    return_code, content = self._ExtractLLDBInitContent(lldbinit_path,
-                                                        source_string)
-
-    # If we should ignore the contents of this lldbinit, and it has the
-    # association with ~/.lldbinit-tulsiproj that we want, do not modify it.
-    if return_code != 0:
-      return
-
-    # Otherwise, print the existing contents of this ~/.lldbinit out without
-    # any malformed tulsi lldbinit block, and add the correct tulsi lldbinit
-    # block to the end of it.
-    out = StringIO.StringIO()
-    for line in content:
-      out.write(line)
-
-    # Add a newline after the source_string for protection from other elements
-    # within the lldbinit file.
-    out.write(source_string + '\n')
-
-    with open(lldbinit_path, 'w') as outfile:
-      out.seek(0)
-      # Negative length to make copyfileobj write the whole file at once.
-      shutil.copyfileobj(out, outfile, -1)
-
-  def __init__(self):
-    self._LinkTulsiLLDBInit()
-
-
-if __name__ == '__main__':
-  BootstrapLLDBInit()
-  sys.exit(0)
diff --git a/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift b/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift
index de2f28a..263dd8b 100644
--- a/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift
+++ b/src/TulsiGenerator/TulsiXcodeProjectGenerator.swift
@@ -53,7 +53,6 @@
                             bundle.url(forResource: "bazel_options", withExtension: "py")!,
                             bundle.url(forResource: "apfs_clone_copy", withExtension: "py")!,
                             bundle.url(forResource: "bazel_build_events", withExtension: "py")!,
-                            bundle.url(forResource: "bootstrap_lldbinit", withExtension: "py")!,
                             bundle.url(forResource: "symbol_cache_schema", withExtension: "py")!,
                             bundle.url(forResource: "update_symbol_cache", withExtension: "py")!,
                             bundle.url(forResource: "install_genfiles", withExtension: "py")!],
diff --git a/src/TulsiGenerator/XcodeProjectGenerator.swift b/src/TulsiGenerator/XcodeProjectGenerator.swift
index e5f870b..6f7ad9d 100644
--- a/src/TulsiGenerator/XcodeProjectGenerator.swift
+++ b/src/TulsiGenerator/XcodeProjectGenerator.swift
@@ -70,7 +70,6 @@
   private static let CleanScript = "bazel_clean.sh"
   private static let ShellCommandsUtil = "bazel_cache_reader"
   private static let ShellCommandsCleanScript = "clean_symbol_cache"
-  private static let LLDBInitBootstrapScript = "bootstrap_lldbinit"
   private static let WorkspaceFile = "WORKSPACE"
   private static let IOSUIRunnerEntitlements = "iOSXCTRunner.entitlements"
   private static let MacOSUIRunnerEntitlements = "macOSXCTRunner.entitlements"
@@ -551,9 +550,6 @@
         cleanCachedDsymPaths()
       }
     }
-    profileAction("bootstrapping_lldbinit") {
-      bootstrapLLDBInit()
-    }
     return GeneratedProjectInfo(project: xcodeProject,
                                 buildRuleEntries: targetRules,
                                 testSuiteRuleEntries: testSuiteRules,
@@ -1120,48 +1116,30 @@
     }
   }
 
-  private func executePythonProcess(_ scriptFileName: String, onError: @escaping (Int32, String) -> Void) {
+  private func cleanCachedDsymPaths() {
+    // Execute the script to clean up missing dSYM bundles asynchronously.
     let bundle = Bundle(for: type(of: self))
-    let cleanSymbolsSourceURL = bundle.url(forResource: scriptFileName, withExtension: "py")!
+    let cleanSymbolsSourceURL = bundle.url(forResource: XcodeProjectGenerator.ShellCommandsCleanScript, withExtension: "py")!
 
     let process = ProcessRunner.createProcess(cleanSymbolsSourceURL.path,
                                               arguments: [String]()) {
       completionInfo in
-      if completionInfo.terminationStatus != 0 {
-        if let stderr = NSString(data: completionInfo.stderr,
-                                 encoding: String.Encoding.utf8.rawValue) {
-          guard !stderr.trimmingCharacters(in: .whitespaces).isEmpty else {
-            return
-          }
-          onError(completionInfo.terminationStatus, stderr as String)
+      if let stderr = NSString(data: completionInfo.stderr,
+                               encoding: String.Encoding.utf8.rawValue) {
+        guard !stderr.trimmingCharacters(in: .whitespaces).isEmpty else {
+          return
+        }
+        Thread.doOnMainQueue {
+          self.localizedMessageLogger.warning("CleanCachedDsymsFailed",
+                                              comment: LocalizedMessageLogger.bugWorthyComment("Failed to clean cached references to existing dSYM bundles."),
+                                              context: self.config.projectName,
+                                              values: stderr)
         }
       }
     }
     process.launch()
   }
 
-  private func cleanCachedDsymPaths() {
-    // Execute the script to clean up missing dSYM bundles asynchronously.
-    self.executePythonProcess(XcodeProjectGenerator.ShellCommandsCleanScript) { (returncode, stderr) in
-      self.localizedMessageLogger.warning("CleanCachedDsymsFailed",
-                                          comment: LocalizedMessageLogger.bugWorthyComment("Failed to clean cached references to existing dSYM bundles."),
-                                          context: self.config.projectName,
-                                          values: returncode, stderr)
-    }
-  }
-
-  private func bootstrapLLDBInit() {
-    // Execute the script to bootstrap LLDBInit for path remapping. This needs to be read by Xcode
-    // before Xcode.app launches so that its instance of LLDB can find the file where we do the path
-    // remappings when dSYM bundles aren't present, which is ~/.lldbinit-tulsiproj.
-    self.executePythonProcess(XcodeProjectGenerator.LLDBInitBootstrapScript) { (returncode, stderr) in
-      self.localizedMessageLogger.warning("BootstrapLLDBInitFailed",
-                                          comment: LocalizedMessageLogger.bugWorthyComment("Failed to bootstrap LLDBInit for debug symbol remapping."),
-                                          context: self.config.projectName,
-                                          values: returncode, stderr)
-    }
-  }
-
   private func installTulsiScripts(_ projectURL: URL) {
 
     let scriptDirectoryURL = projectURL.appendingPathComponent(XcodeProjectGenerator.ScriptDirectorySubpath,