From: Med Ismail Bennani Date: Mon, 28 Jun 2021 17:41:26 +0000 (+0000) Subject: [lldb/Interpreter] Add setting to set session transcript save directory X-Git-Tag: llvmorg-14-init~2750 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=fe1874dd2dd99c9811db515a2957e2a42f9f6868;p=platform%2Fupstream%2Fllvm.git [lldb/Interpreter] Add setting to set session transcript save directory This patch introduces a new interpreter setting `interpreter.save-session-directory` so the user can specify a directory where the session transcripts will be saved. If not set, the session transcript are saved on a temporary file. rdar://72902842 Differential Revision: https://reviews.llvm.org/D105030 Signed-off-by: Med Ismail Bennani --- diff --git a/lldb/include/lldb/Interpreter/CommandInterpreter.h b/lldb/include/lldb/Interpreter/CommandInterpreter.h index a8475ca..6430773 100644 --- a/lldb/include/lldb/Interpreter/CommandInterpreter.h +++ b/lldb/include/lldb/Interpreter/CommandInterpreter.h @@ -493,6 +493,9 @@ public: bool GetSaveSessionOnQuit() const; void SetSaveSessionOnQuit(bool enable); + FileSpec GetSaveSessionDirectory() const; + void SetSaveSessionDirectory(llvm::StringRef path); + bool GetEchoCommands() const; void SetEchoCommands(bool enable); diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 2e07ff5..68e8edf 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -160,6 +160,16 @@ void CommandInterpreter::SetSaveSessionOnQuit(bool enable) { m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, enable); } +FileSpec CommandInterpreter::GetSaveSessionDirectory() const { + const uint32_t idx = ePropertySaveSessionDirectory; + return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); +} + +void CommandInterpreter::SetSaveSessionDirectory(llvm::StringRef path) { + const uint32_t idx = ePropertySaveSessionDirectory; + m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); +} + bool CommandInterpreter::GetEchoCommands() const { const uint32_t idx = ePropertyEchoCommands; return m_collection_sp->GetPropertyAtIndexAsBoolean( @@ -2925,9 +2935,15 @@ bool CommandInterpreter::SaveTranscript( std::string now = llvm::to_string(std::chrono::system_clock::now()); std::replace(now.begin(), now.end(), ' ', '_'); const std::string file_name = "lldb_session_" + now + ".log"; - FileSpec tmp = HostInfo::GetGlobalTempDir(); - tmp.AppendPathComponent(file_name); - output_file = tmp.GetPath(); + + FileSpec save_location = GetSaveSessionDirectory(); + + if (!save_location) + save_location = HostInfo::GetGlobalTempDir(); + + FileSystem::Instance().Resolve(save_location); + save_location.AppendPathComponent(file_name); + output_file = save_location.GetPath(); } auto error_out = [&](llvm::StringRef error_message, std::string description) { diff --git a/lldb/source/Interpreter/InterpreterProperties.td b/lldb/source/Interpreter/InterpreterProperties.td index 1148c1b..1c6f020 100644 --- a/lldb/source/Interpreter/InterpreterProperties.td +++ b/lldb/source/Interpreter/InterpreterProperties.td @@ -13,6 +13,9 @@ let Definition = "interpreter" in { Global, DefaultFalse, Desc<"If true, LLDB will save the session's transcripts before quitting.">; + def SaveSessionDirectory: Property<"save-session-directory", "FileSpec">, + DefaultStringValue<"">, + Desc<"A path where LLDB will save the session's transcripts. This is particularly useful when you can't set the session file, for example when using `save-session-on-quit`.">; def StopCmdSourceOnError: Property<"stop-command-source-on-error", "Boolean">, Global, DefaultTrue, diff --git a/lldb/test/API/commands/session/save/TestSessionSave.py b/lldb/test/API/commands/session/save/TestSessionSave.py index ec244a4..e144ed1 100644 --- a/lldb/test/API/commands/session/save/TestSessionSave.py +++ b/lldb/test/API/commands/session/save/TestSessionSave.py @@ -1,7 +1,7 @@ """ Test the session save feature """ - +import os import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * @@ -72,3 +72,20 @@ class SessionSaveTestCase(TestBase): lines = raw.splitlines()[:-1] for line in lines: self.assertIn(line, content) + + td = tempfile.TemporaryDirectory() + res = lldb.SBCommandReturnObject() + interpreter.HandleCommand('settings set interpreter.save-session-directory ' + td.name, res) + self.assertTrue(res.Succeeded()) + + res = lldb.SBCommandReturnObject() + interpreter.HandleCommand('session save', res) + self.assertTrue(res.Succeeded()) + raw += self.raw_transcript_builder(cmd, res) + + with open(os.path.join(td.name, os.listdir(td.name)[0]), "r") as file: + content = file.read() + # Exclude last line, since session won't record it's own output + lines = raw.splitlines()[:-1] + for line in lines: + self.assertIn(line, content)