[Lldb-commits] [lldb] 3bf3b96 - Add the --relative-to-command-file to "command source" so you can

Jim Ingham via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 29 19:37:08 PDT 2021


Author: Jim Ingham
Date: 2021-09-29T19:33:41-07:00
New Revision: 3bf3b96629e8dfc55d01ba0cb05ca01a467017fa

URL: https://github.com/llvm/llvm-project/commit/3bf3b96629e8dfc55d01ba0cb05ca01a467017fa
DIFF: https://github.com/llvm/llvm-project/commit/3bf3b96629e8dfc55d01ba0cb05ca01a467017fa.diff

LOG: Add the --relative-to-command-file to "command source" so you can
have linked command files in a source tree and get to them all from
one main command file.

Differential Revision: https://reviews.llvm.org/D110601

Added: 
    lldb/test/API/commands/command/source/commands2.txt
    lldb/test/API/commands/command/source/not-relative.txt
    lldb/test/API/commands/command/source/subdir/subcmds.txt

Modified: 
    lldb/source/Commands/CommandObjectCommands.cpp
    lldb/source/Commands/Options.td
    lldb/test/API/commands/command/source/TestCommandSource.py

Removed: 
    


################################################################################
diff  --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp
index 9a8b81c007ad8..639279875e715 100644
--- a/lldb/source/Commands/CommandObjectCommands.cpp
+++ b/lldb/source/Commands/CommandObjectCommands.cpp
@@ -77,7 +77,7 @@ class CommandObjectCommandsSource : public CommandObjectParsed {
   public:
     CommandOptions()
         : Options(), m_stop_on_error(true), m_silent_run(false),
-          m_stop_on_continue(true) {}
+          m_stop_on_continue(true), m_cmd_relative_to_command_file(false) {}
 
     ~CommandOptions() override = default;
 
@@ -95,6 +95,10 @@ class CommandObjectCommandsSource : public CommandObjectParsed {
         error = m_stop_on_continue.SetValueFromString(option_arg);
         break;
 
+      case 'C':
+        m_cmd_relative_to_command_file = true;
+        break;
+
       case 's':
         error = m_silent_run.SetValueFromString(option_arg);
         break;
@@ -110,6 +114,7 @@ class CommandObjectCommandsSource : public CommandObjectParsed {
       m_stop_on_error.Clear();
       m_silent_run.Clear();
       m_stop_on_continue.Clear();
+      m_cmd_relative_to_command_file.Clear();
     }
 
     llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
@@ -121,6 +126,7 @@ class CommandObjectCommandsSource : public CommandObjectParsed {
     OptionValueBoolean m_stop_on_error;
     OptionValueBoolean m_silent_run;
     OptionValueBoolean m_stop_on_continue;
+    OptionValueBoolean m_cmd_relative_to_command_file;
   };
 
   bool DoExecute(Args &command, CommandReturnObject &result) override {
@@ -131,7 +137,29 @@ class CommandObjectCommandsSource : public CommandObjectParsed {
       return false;
     }
 
+    FileSpec source_dir = {};
+    if (m_options.m_cmd_relative_to_command_file) {
+      source_dir = GetDebugger().GetCommandInterpreter().GetCurrentSourceDir();
+      if (!source_dir) {
+        result.AppendError("command source -C can only be specified "
+                           "from a command file");
+        result.SetStatus(eReturnStatusFailed);
+        return false;
+      }
+    }
+
     FileSpec cmd_file(command[0].ref());
+    if (source_dir) {
+      // Prepend the source_dir to the cmd_file path:
+      if (!cmd_file.IsRelative()) {
+        result.AppendError("command source -C can only be used "
+                           "with a relative path.");
+        result.SetStatus(eReturnStatusFailed);
+        return false;
+      }
+      cmd_file.MakeAbsolute(source_dir);
+    }
+
     FileSystem::Instance().Resolve(cmd_file);
 
     CommandInterpreterRunOptions options;

diff  --git a/lldb/source/Commands/Options.td b/lldb/source/Commands/Options.td
index 83df2ac22c578..3d69bb8ad8d05 100644
--- a/lldb/source/Commands/Options.td
+++ b/lldb/source/Commands/Options.td
@@ -536,6 +536,10 @@ let Command = "source" in {
     Desc<"If true, stop executing commands on continue.">;
   def source_silent_run : Option<"silent-run", "s">, Arg<"Boolean">,
     Desc<"If true don't echo commands while executing.">;
+  def cmd_relative_to_command_file : Option<"relative-to-command-file", "C">,
+    Desc<"Resolve non-absolute paths relative to the location of the "
+    "current command file. This argument can only be used when the command is "
+    "being sourced from a file.">;
 }
 
 let Command = "alias" in {

diff  --git a/lldb/test/API/commands/command/source/TestCommandSource.py b/lldb/test/API/commands/command/source/TestCommandSource.py
index 6d2717b16e2dc..dc32e20ddba0a 100644
--- a/lldb/test/API/commands/command/source/TestCommandSource.py
+++ b/lldb/test/API/commands/command/source/TestCommandSource.py
@@ -21,7 +21,18 @@ def test_command_source(self):
         # Sourcing .lldb in the current working directory, which in turn imports
         # the "my" package that defines the date() function.
         self.runCmd("command source .lldb")
+        self.check_results()
+        
+    @no_debug_info_test
+    def test_command_source_relative(self):
+        """Test that lldb command "command source" works correctly with relative paths."""
 
+        # Sourcing .lldb in the current working directory, which in turn imports
+        # the "my" package that defines the date() function.
+        self.runCmd("command source commands2.txt")
+        self.check_results()
+        
+    def check_results(self, failure=False):
         # Python should evaluate "my.date()" successfully.
         command_interpreter = self.dbg.GetCommandInterpreter()
         self.assertTrue(command_interpreter, VALID_COMMAND_INTERPRETER)
@@ -29,6 +40,18 @@ def test_command_source(self):
         command_interpreter.HandleCommand("script my.date()", result)
 
         import datetime
-        self.expect(result.GetOutput(), "script my.date() runs successfully",
-                    exe=False,
-                    substrs=[str(datetime.date.today())])
+        if failure:
+            self.expect(result.GetOutput(), "script my.date() runs successfully",
+                        exe=False, error=True)
+        else: 
+            self.expect(result.GetOutput(), "script my.date() runs successfully",
+                        exe=False,
+                        substrs=[str(datetime.date.today())])
+        
+    @no_debug_info_test
+    def test_command_source_relative_error(self):
+        """Test that 'command source -C' gives an error for a relative path"""
+        source_dir = self.getSourceDir()
+        result = lldb.SBCommandReturnObject()
+        self.runCmd("command source --stop-on-error 1 not-relative.txt")
+        self.check_results(failure=True)

diff  --git a/lldb/test/API/commands/command/source/commands2.txt b/lldb/test/API/commands/command/source/commands2.txt
new file mode 100644
index 0000000000000..f0850b5d8f172
--- /dev/null
+++ b/lldb/test/API/commands/command/source/commands2.txt
@@ -0,0 +1 @@
+command source -C subdir/subcmds.txt

diff  --git a/lldb/test/API/commands/command/source/not-relative.txt b/lldb/test/API/commands/command/source/not-relative.txt
new file mode 100644
index 0000000000000..ca90def14c9a6
--- /dev/null
+++ b/lldb/test/API/commands/command/source/not-relative.txt
@@ -0,0 +1,2 @@
+command source -C /tmp/somefile.txt
+script import my

diff  --git a/lldb/test/API/commands/command/source/subdir/subcmds.txt b/lldb/test/API/commands/command/source/subdir/subcmds.txt
new file mode 100644
index 0000000000000..c7e5933ea7f08
--- /dev/null
+++ b/lldb/test/API/commands/command/source/subdir/subcmds.txt
@@ -0,0 +1 @@
+command source -C ../commands.txt


        


More information about the lldb-commits mailing list