Skip to content

Commit 176e8b0

Browse files
authored
Handle empty runtime variable deletes (#55)
1 parent bb833bf commit 176e8b0

2 files changed

Lines changed: 55 additions & 3 deletions

File tree

scripts/runtime_settings.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,17 @@ class Assignment:
6464
name: str
6565
value: str
6666

67+
@property
68+
def deletes_variable(self) -> bool:
69+
return self.value == ""
70+
6771
def gh_command(self, *, redact_body: bool = False, redact_metadata: bool = False) -> list[str]:
68-
body = redacted_value() if redact_body else self.value
6972
repository = redacted_value() if redact_metadata else self.repository
70-
command = ["gh", "variable", "set", self.name, "--repo", repository, "--body", body]
73+
if self.deletes_variable:
74+
command = ["gh", "variable", "delete", self.name, "--repo", repository]
75+
else:
76+
body = redacted_value() if redact_body else self.value
77+
command = ["gh", "variable", "set", self.name, "--repo", repository, "--body", body]
7178
if self.variable_scope == "environment":
7279
environment = redacted_value() if redact_metadata else (self.environment or "")
7380
command.extend(["--env", environment])
@@ -91,6 +98,7 @@ def assignment_payload(assignment: Assignment, *, redact_values: bool = False) -
9198
"variable_scope": assignment.variable_scope,
9299
"environment": assignment.environment,
93100
"name": assignment.name,
101+
"action": "delete" if assignment.deletes_variable else "set",
94102
"value": redacted_value() if redact_values else assignment.value,
95103
}
96104
if redact_values:
@@ -570,7 +578,24 @@ def command_apply(args: argparse.Namespace) -> int:
570578
return 0
571579

572580
for assignment in all_assignments:
573-
subprocess.run(assignment.gh_command(), check=True)
581+
result = subprocess.run(
582+
assignment.gh_command(),
583+
text=True,
584+
capture_output=assignment.deletes_variable,
585+
check=False,
586+
)
587+
if result.returncode == 0:
588+
continue
589+
if assignment.deletes_variable:
590+
detail = f"{result.stderr}\n{result.stdout}".lower()
591+
if "not found" in detail or "could not find" in detail or "http 404" in detail:
592+
print(f"{assignment.name} was already absent; delete skipped.")
593+
continue
594+
if result.stderr:
595+
print(result.stderr, file=sys.stderr, end="")
596+
if result.stdout:
597+
print(result.stdout, file=sys.stderr, end="")
598+
raise subprocess.CalledProcessError(result.returncode, assignment.gh_command())
574599
return 0
575600

576601

tests/test_runtime_settings.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,33 @@ def test_assignment_shell_command_can_redact_body_and_metadata(self):
101101
self.assertNotIn(assignment.repository, command)
102102
self.assertNotIn(assignment.environment, command)
103103

104+
def test_empty_assignment_deletes_variable_instead_of_setting_empty_body(self):
105+
assignment = runtime_settings.Assignment(
106+
"longbridge/sg",
107+
"QuantStrategyLab/LongBridgePlatform",
108+
"environment",
109+
"longbridge-sg",
110+
"LONGBRIDGE_MIN_RESERVED_CASH_USD",
111+
"",
112+
)
113+
114+
self.assertTrue(assignment.deletes_variable)
115+
self.assertEqual(
116+
assignment.gh_command(),
117+
[
118+
"gh",
119+
"variable",
120+
"delete",
121+
"LONGBRIDGE_MIN_RESERVED_CASH_USD",
122+
"--repo",
123+
"QuantStrategyLab/LongBridgePlatform",
124+
"--env",
125+
"longbridge-sg",
126+
],
127+
)
128+
self.assertNotIn("--body", assignment.shell_command())
129+
self.assertEqual(runtime_settings.assignment_payload(assignment)["action"], "delete")
130+
104131
def test_plugin_mount_schema_version_must_be_non_empty_string(self):
105132
_, target = self.load_target("examples/targets/schwab/live.example.json")
106133
target["plugin_mounts"][0]["expected_schema_version"] = ""

0 commit comments

Comments
 (0)