-
-
Notifications
You must be signed in to change notification settings - Fork 122
Add "print-config" subcommand #698
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
Just wanted to let you know I will need some more time in order to do a proper review here. I'm very happy the PR is here in any case. |
|
No worries, frohe Weihnachten! btw I’m not too happy with the flag parsing, I think my implementation could be improved |
18db772 to
13e54e1
Compare
m90
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good, I left some comments inline, let me know what you think.
There's one bigger question left for me in this: should there also be an option that "resolves" configuration values as deeply as possible, i.e. reads Docker secrets, expands shell variables, and renders config options that are templates? Or should this be the default even?
I was under the false impression that I'll have a go to see if I can resolve without adding too much complexity. |
I would think it'd be a good thing to at least evaluate how much effort modeling things like this would be. |
I added some simple logic to resolve env vars when This is an AI analysis of what it would take to resolve all env variables:
|
| func runPrintConfig() error { | ||
| configurations, err := sourceConfiguration(configStrategyConfd) | ||
| if err != nil { | ||
| fmt.Printf("error sourcing configuration: %v\n", err) // print error to stdout for debugging |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure this is needed as I would expect the returned error to be printed as well on exit? Or is that not happening and the mechanism is broken?
Also applies below.
| ) | ||
|
|
||
| func runPrintConfig() error { | ||
| configurations, err := sourceConfiguration(configStrategyConfd) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What happens when no configuration directory is present and configuration is provided via env vars only? Does it fall back to env? Sorry, it's been a while since I have written this 😅
| config.BackupFilename = os.ExpandEnv(config.BackupFilename) | ||
| config.BackupLatestSymlink = os.ExpandEnv(config.BackupLatestSymlink) | ||
| config.BackupPruningPrefix = os.ExpandEnv(config.BackupPruningPrefix) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is great, but I feel it might be worth it doing this properly (going the "High" complexity route) while we're at it.
Would you feel comfortable implementing this? In case not, I can also do this and we'll rebase this PR off the updated revision.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Started working on this in #705
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This seems to work as intended, maybe you can have a quick look and a sanity check before I merge? The only thing I did not hoist into the resolve method is replacing the time formatting tokens in the backup filename, I found that happening at resolution time to be unexpected, so this still lives in init. I would also not expect this to be shown in the ouptut of print-config.
Another thing that connects this PR: the resolve method now returns a list of warnings which would be nice to print out here as well I believe?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately, I’ll be on vacation for the coming days.
but I took a quick look at the code at my phone and really like the approach!
If you want you can merge and I’ll base this PR on the new resolve mechanism.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and for code review, have you taken a look at coding agents like Claude code and Coderabbit for automatic PR reviews? I’ve seen some quite impressive reviews from AI that caught a bunch of easy to miss bugs.
If you want, you could take a look at some PRs on “dozzle” and “pocket-id”. These projects use AI for automatic code review and it seems to be quite useful
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I merged the PR, so feel free to rebase whenever you're back and have the time. In the meantime, enjoy the vacation!
|
I had another look at the original issue: #628 which made me think we should check how the output handles trailing newlines here. Just writing this down so we don't forget. |
Addresses #628
Approach
I looked into how shouterrr pretty-prints its verify function and tried to find the best poor-mans approach to it.
I wanted to add a little bit of formatting, because without any formatting, the output is pretty hard to read. So I landed on a basic regex based formatter.
I played around with coloring the output as well, but I ended up with a lot of code for a nice-to-have, so I removed it again.