jesseduffield.lazygit/pkg/integration/tests/custom_commands/conditional_prompt_false_string.go
Martin T. 4cb6fafb08 Add condition field to custom command prompts
When building multi-step custom command forms, some prompts are only
relevant depending on earlier answers. Without conditional logic,
users must dismiss irrelevant prompts manually.

Prompts now accept a `condition` field with a template expression
evaluated against prior form values. Skipped prompts default to
an empty string.

The template expression is a string pre- and suffixed with double curly
braces - {{}}.

Form keys can be reused, a guard ensures that skipped prompts do not
reset already set form keys with an empty string. This allows the
conditional flow to remind a user to set a key that was left empty
because additional conditions want that key to be set. This removes the
need to have additional if checks in the command that uses the form
keys.
2026-04-06 19:14:51 +02:00

72 lines
1.7 KiB
Go

package custom_commands
import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)
var ConditionalPromptFalseString = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Conditional prompt is skipped when condition is bare false or template false",
ExtraCmdArgs: []string{},
Skip: false,
SetupRepo: func(shell *Shell) {
shell.EmptyCommit("blah")
},
SetupConfig: func(cfg *config.AppConfig) {
cfg.GetUserConfig().CustomCommands = []config.CustomCommand{
{
Key: "a",
Context: "files",
Command: `echo "{{.Form.Choice}}" > result.txt`,
Prompts: []config.CustomCommandPrompt{
{
Key: "Choice",
Type: "menu",
Title: "Pick one",
Options: []config.CustomCommandMenuOption{
{
Name: "foo",
Description: "Foo",
Value: "FOO",
},
{
Name: "bar",
Description: "Bar",
Value: "BAR",
},
},
},
{
Key: "Skipped1",
Type: "input",
Title: "This is always skipped (false)",
Condition: `false`,
},
{
Key: "Skipped2",
Type: "input",
Title: "This is always skipped (template false)",
Condition: `{{ eq "a" "b" }}`,
},
},
},
}
},
Run: func(t *TestDriver, keys config.KeybindingConfig) {
t.Views().Files().
IsFocused().
Press("a")
t.ExpectPopup().Menu().Title(Equals("Pick one")).Select(Contains("foo")).Confirm()
// Both conditional prompts skipped, file created directly
t.Views().Files().
Focus().
Lines(
Contains("result.txt").IsSelected(),
)
t.FileSystem().FileContent("result.txt", Equals("FOO\n"))
},
})