Commit fb86c94
mz: don't require write access to load an existing config file (#37566)
### Motivation
`mz` fails on read-only commands (e.g. `mz sql`) when `mz.toml` sits on
a read-only mount, such as a sandbox that bind-mounts the config file
read-only. The command never intends to write anything, so this is an
unnecessary failure.
### Description
`ConfigFile::load` always opened `mz.toml` with
`write(true).create(true)`, even though every mutation (`add_profile`,
`remove_profile`, `set_param`, `set_profile_param`) writes the file
independently afterward via `fs::write`. The write-mode open at load
time was only ever needed to create the file when missing.
`load` no longer writes to the file system at all. A missing file loads
as an empty configuration, and the first mutation creates whatever is
missing. Since `fs::write` creates the file but not its parent
directory, all mutations now go through a private `ConfigFile::write`
helper that calls `create_dir_all` first, taking over the directory
creation that `load` used to perform. Read-only commands therefore work
both when `mz.toml` sits on a read-only mount and when it does not exist
yet.
Dropping the write-mode open changes when an unwritable configuration is
reported. `mz profile init` creates a remote app password, and on macOS
a keychain entry, before `add_profile` reaches its write. Failing only
at that write would leave a credential behind that no profile records,
so `ConfigFile::ensure_writable` establishes write access and `init`
calls it before logging in. The check creates the parent directory and
opens the file with `create(true)`, because whether a missing file can
be written depends on the parent hierarchy and no probe settles that as
reliably as performing the creation the later write needs anyway.
Unit tests cover loading a missing file, loading a read-only file, a
missing file inside a read-only directory, and the parent directory
creation that moved out of `load`. The permission-dependent assertions
skip themselves when the file system does not enforce the permission
bits for the process, as is the case under root.
---------
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>1 parent 24f2613 commit fb86c94
5 files changed
Lines changed: 173 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
| 47 | + | |
47 | 48 | | |
48 | 49 | | |
49 | 50 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
170 | 170 | | |
171 | 171 | | |
172 | 172 | | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
173 | 177 | | |
174 | 178 | | |
175 | 179 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
19 | | - | |
20 | 18 | | |
21 | 19 | | |
22 | 20 | | |
| |||
84 | 82 | | |
85 | 83 | | |
86 | 84 | | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
87 | 90 | | |
88 | | - | |
89 | | - | |
90 | | - | |
91 | | - | |
92 | | - | |
93 | | - | |
94 | | - | |
95 | | - | |
96 | | - | |
97 | | - | |
98 | | - | |
99 | | - | |
100 | | - | |
101 | | - | |
102 | | - | |
103 | | - | |
104 | | - | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
105 | 96 | | |
106 | 97 | | |
107 | 98 | | |
| |||
113 | 104 | | |
114 | 105 | | |
115 | 106 | | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
116 | 151 | | |
117 | 152 | | |
118 | 153 | | |
| |||
161 | 196 | | |
162 | 197 | | |
163 | 198 | | |
164 | | - | |
| 199 | + | |
165 | 200 | | |
166 | 201 | | |
167 | 202 | | |
| |||
209 | 244 | | |
210 | 245 | | |
211 | 246 | | |
212 | | - | |
| 247 | + | |
213 | 248 | | |
214 | 249 | | |
215 | 250 | | |
| |||
290 | 325 | | |
291 | 326 | | |
292 | 327 | | |
293 | | - | |
| 328 | + | |
294 | 329 | | |
295 | 330 | | |
296 | 331 | | |
| |||
324 | 359 | | |
325 | 360 | | |
326 | 361 | | |
327 | | - | |
| 362 | + | |
328 | 363 | | |
329 | 364 | | |
330 | 365 | | |
| |||
530 | 565 | | |
531 | 566 | | |
532 | 567 | | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
| 20 | + | |
19 | 21 | | |
20 | 22 | | |
21 | 23 | | |
| |||
88 | 90 | | |
89 | 91 | | |
90 | 92 | | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
91 | 96 | | |
92 | 97 | | |
93 | 98 | | |
| |||
0 commit comments