Skip to content

Commit 8a0fa4d

Browse files
committed
[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
1 parent 04fff54 commit 8a0fa4d

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

lldb/source/Commands/CommandObjectSettings.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ insert-before or insert-after.");
102102
case 'g':
103103
m_global = true;
104104
break;
105+
case 'e':
106+
m_exists = true;
107+
break;
105108
default:
106109
llvm_unreachable("Unimplemented option");
107110
}
@@ -112,6 +115,7 @@ insert-before or insert-after.");
112115
void OptionParsingStarting(ExecutionContext *execution_context) override {
113116
m_global = false;
114117
m_force = false;
118+
m_exists = false;
115119
}
116120

117121
llvm::ArrayRef<OptionDefinition> GetDefinitions() override {
@@ -120,7 +124,8 @@ insert-before or insert-after.");
120124

121125
// Instance variables to hold the values for command options.
122126
bool m_global = false;
123-
bool m_force;
127+
bool m_force = false;
128+
bool m_exists = false;
124129
};
125130

126131
void
@@ -219,13 +224,12 @@ insert-before or insert-after.");
219224
var_name, var_value);
220225
}
221226

222-
if (error.Fail()) {
227+
if (error.Fail() && !m_options.m_exists) {
223228
result.AppendError(error.AsCString());
224229
return false;
225-
} else {
226-
result.SetStatus(eReturnStatusSuccessFinishResult);
227230
}
228231

232+
result.SetStatus(eReturnStatusSuccessFinishResult);
229233
return result.Succeeded();
230234
}
231235

lldb/source/Commands/Options.td

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ let Command = "settings set" in {
2222
Desc<"Apply the new value to the global default value.">;
2323
def setset_force : Option<"force", "f">,
2424
Desc<"Force an empty value to be accepted as the default.">;
25+
def setset_exists : Option<"exists", "e">,
26+
Desc<"Set the setting if it exists, but do not cause the command to raise "
27+
"an error if it does not exist.">;
2528
}
2629

2730
let Command = "settings write" in {
@@ -957,7 +960,7 @@ let Command = "target modules lookup" in {
957960
def target_modules_lookup_type : Option<"type", "t">, Group<6>, Arg<"Name">,
958961
Required, Desc<"Lookup a type by name in the debug symbols in one or more "
959962
"target modules.">;
960-
def target_modules_lookup_variables_ranges : Option<"show-variable-ranges",
963+
def target_modules_lookup_variables_ranges : Option<"show-variable-ranges",
961964
"\\x01">, GroupRange<1, 6>, Desc<"Dump valid ranges of variables (must be "
962965
"used in conjunction with --verbose">;
963966
def target_modules_lookup_verbose : Option<"verbose", "v">,

lldb/test/API/commands/settings/TestSettings.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -779,3 +779,13 @@ def test_experimental_settings(self):
779779
# finally, confirm that trying to set a setting that does not exist still fails.
780780
# (SHOWING a setting that does not exist does not currently yield an error.)
781781
self.expect('settings set target.setting-which-does-not-exist true', error=True)
782+
783+
def test_settings_set_exists(self):
784+
cmdinterp = self.dbg.GetCommandInterpreter()
785+
786+
# An unknown option should succeed.
787+
self.expect('settings set -e foo bar')
788+
self.expect('settings set --exists foo bar')
789+
790+
# A known option should fail if its argument is invalid.
791+
self.expect("settings set auto-confirm bogus", error=True)

0 commit comments

Comments
 (0)