[lldb] Add --exists flag to `settings set`

Add a --exists/-e flag to `settings set` that sets the setting if it
exists, but doesn't print an error otherwise. This is useful for example
when setting options in your ~/.lldbinit that might not exist in older
versions of lldb.

Differential revision: https://reviews.llvm.org/D121155
This commit is contained in:
Jonas Devlieghere 2022-03-08 20:31:20 -08:00
parent 04fff547e2
commit 8a0fa4db39
No known key found for this signature in database
GPG Key ID: 49CC0BD90FDEED4D
3 changed files with 22 additions and 5 deletions

View File

@ -102,6 +102,9 @@ insert-before or insert-after.");
case 'g':
m_global = true;
break;
case 'e':
m_exists = true;
break;
default:
llvm_unreachable("Unimplemented option");
}
@ -112,6 +115,7 @@ insert-before or insert-after.");
void OptionParsingStarting(ExecutionContext *execution_context) override {
m_global = false;
m_force = false;
m_exists = false;
}
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
@ -120,7 +124,8 @@ insert-before or insert-after.");
// Instance variables to hold the values for command options.
bool m_global = false;
bool m_force;
bool m_force = false;
bool m_exists = false;
};
void
@ -219,13 +224,12 @@ protected:
var_name, var_value);
}
if (error.Fail()) {
if (error.Fail() && !m_options.m_exists) {
result.AppendError(error.AsCString());
return false;
} else {
result.SetStatus(eReturnStatusSuccessFinishResult);
}
result.SetStatus(eReturnStatusSuccessFinishResult);
return result.Succeeded();
}

View File

@ -22,6 +22,9 @@ let Command = "settings set" in {
Desc<"Apply the new value to the global default value.">;
def setset_force : Option<"force", "f">,
Desc<"Force an empty value to be accepted as the default.">;
def setset_exists : Option<"exists", "e">,
Desc<"Set the setting if it exists, but do not cause the command to raise "
"an error if it does not exist.">;
}
let Command = "settings write" in {
@ -957,7 +960,7 @@ let Command = "target modules lookup" in {
def target_modules_lookup_type : Option<"type", "t">, Group<6>, Arg<"Name">,
Required, Desc<"Lookup a type by name in the debug symbols in one or more "
"target modules.">;
def target_modules_lookup_variables_ranges : Option<"show-variable-ranges",
def target_modules_lookup_variables_ranges : Option<"show-variable-ranges",
"\\x01">, GroupRange<1, 6>, Desc<"Dump valid ranges of variables (must be "
"used in conjunction with --verbose">;
def target_modules_lookup_verbose : Option<"verbose", "v">,

View File

@ -779,3 +779,13 @@ class SettingsCommandTestCase(TestBase):
# finally, confirm that trying to set a setting that does not exist still fails.
# (SHOWING a setting that does not exist does not currently yield an error.)
self.expect('settings set target.setting-which-does-not-exist true', error=True)
def test_settings_set_exists(self):
cmdinterp = self.dbg.GetCommandInterpreter()
# An unknown option should succeed.
self.expect('settings set -e foo bar')
self.expect('settings set --exists foo bar')
# A known option should fail if its argument is invalid.
self.expect("settings set auto-confirm bogus", error=True)