From b8d10963b1daa2cb1ce5c3377f0423f32ab91416 Mon Sep 17 00:00:00 2001 From: rsteube Date: Tue, 30 Sep 2025 13:06:38 +0200 Subject: [PATCH] file: update queries --- action.go | 10 ++++++++++ action_test.go | 34 +++++++++++++++++++++++++++------- defaultActions.go | 36 ++++++++++++------------------------ invokedAction.go | 2 +- 4 files changed, 50 insertions(+), 32 deletions(-) diff --git a/action.go b/action.go index e65ae45c8..9ac4dcb8f 100644 --- a/action.go +++ b/action.go @@ -548,6 +548,9 @@ func (a Action) Query(scheme, host, path string, opts ...string) Action { values.Set(opts[i], opts[i+1]) } } + if c.Value != "" { + values.Set("C_VALUE", c.Value) + } query.RawQuery = values.Encode() } a.meta.Queries.Add(query.String()) @@ -562,6 +565,13 @@ func (a Action) QueryF(f func(s string, uc uid.Context) (*url.URL, error)) Actio if err != nil { return ActionMessage(err.Error()) } + + if c.Value != "" { + values := query.Query() + values.Set("C_VALUE", c.Value) + query.RawQuery = values.Encode() + } + a.meta.Queries.Add(query.String()) return a }) diff --git a/action_test.go b/action_test.go index 6971e797d..3c908feac 100644 --- a/action_test.go +++ b/action_test.go @@ -2,6 +2,7 @@ package carapace import ( "fmt" + "net/url" "os" "testing" "time" @@ -99,7 +100,9 @@ func TestActionDirectories(t *testing.T) { "internal/", "file://"+wd("")+"/internal/", "pkg/", "file://"+wd("")+"/pkg/", "third_party/", "file://"+wd("")+"/third_party/", - )).Query(fmt.Sprintf("file://%v/?directories=true", wd(""))), + )).QueryS(fmt.Sprintf("file://directories?C_DIR=%v", + url.QueryEscape(wd("")+"/"), + )), ActionDirectories().Invoke(Context{Value: ""}).Filter("vendor/"), ) @@ -118,7 +121,10 @@ func TestActionDirectories(t *testing.T) { "./internal/", "file://"+wd("")+"/internal/", "./pkg/", "file://"+wd("")+"/pkg/", "./third_party/", "file://"+wd("")+"/third_party/", - )).Query(fmt.Sprintf("file://%v/?directories=true", wd(""))), + )).QueryS(fmt.Sprintf("file://directories?C_DIR=%v&C_VALUE=%v", + url.QueryEscape(wd("")+"/"), + url.QueryEscape("./"), + )), ActionDirectories().Invoke(Context{Value: "./"}).Filter("./vendor/"), ) @@ -127,7 +133,10 @@ func TestActionDirectories(t *testing.T) { "cmd/", style.Of(style.Blue, style.Bold), ).NoSpace('/').Tag("directories").Invoke(Context{}).Prefix("example/").UidF(uid.Map( "example/cmd/", "file://"+wd("")+"/example/cmd/", - )).Query(fmt.Sprintf("file://%v/?directories=true", wd(""))), + )).QueryS(fmt.Sprintf("file://directories?C_DIR=%v&C_VALUE=%v", + url.QueryEscape(wd("")+"/"), + url.QueryEscape("example/"), + )), ActionDirectories().Invoke(Context{Value: "example/"}), ) @@ -136,7 +145,10 @@ func TestActionDirectories(t *testing.T) { "cmd/", style.Of(style.Blue, style.Bold), ).NoSpace('/').Tag("directories").Invoke(Context{}).Prefix("example/").UidF(uid.Map( "example/cmd/", "file://"+wd("")+"/example/cmd/", - )).Query(fmt.Sprintf("file://%v/?directories=true", wd(""))), + )).QueryS(fmt.Sprintf("file://directories?C_DIR=%v&C_VALUE=%v", + url.QueryEscape(wd("")+"/"), + url.QueryEscape("example/cm"), + )), ActionDirectories().Invoke(Context{Value: "example/cm"}), ) } @@ -159,7 +171,9 @@ func TestActionFiles(t *testing.T) { "internal/", "file://"+wd("")+"/internal/", "pkg/", "file://"+wd("")+"/pkg/", "third_party/", "file://"+wd("")+"/third_party/", - )).Query(fmt.Sprintf("file://%v/?suffix=.md", wd(""))), + )).QueryS(fmt.Sprintf("file://files?C_DIR=%v&suffix=.md", + url.QueryEscape(wd("")+"/"), + )), ActionFiles(".md").Invoke(Context{Value: ""}).Filter("vendor/"), ) @@ -174,7 +188,10 @@ func TestActionFiles(t *testing.T) { "example/cmd/", "file://"+wd("example")+"/cmd/", "example/main.go", "file://"+wd("example")+"/main.go", "example/main_test.go", "file://"+wd("example")+"/main_test.go", - )).Query(fmt.Sprintf("file://%v/", wd(""))), + )).QueryS(fmt.Sprintf("file://files?C_DIR=%v&C_VALUE=%v", + url.QueryEscape(wd("")+"/"), + url.QueryEscape("example/"), + )), ActionFiles().Invoke(Context{Value: "example/"}).Filter("example/example"), ) } @@ -199,7 +216,10 @@ func TestActionFilesChdir(t *testing.T) { ).NoSpace('/').Tag("files").Invoke(Context{}).Prefix("elvish/").UidF(uid.Map( "elvish/action.go", "file://"+wd("internal/shell")+"/elvish/action.go", "elvish/snippet.go", "file://"+wd("internal/shell")+"/elvish/snippet.go", - )).Query(fmt.Sprintf("file://%v/internal/shell", wd(""))), // TODO uid shouldn't include internal/shell + )).QueryS(fmt.Sprintf("file://files?C_DIR=%v&C_VALUE=%v", + url.QueryEscape(wd("internal/shell")), + url.QueryEscape("elvish/"), + )), ActionFiles().Chdir("internal/shell").Invoke(Context{Value: "elvish/"}), ) diff --git a/defaultActions.go b/defaultActions.go index 966fdbed0..cb8f0cfc6 100644 --- a/defaultActions.go +++ b/defaultActions.go @@ -135,6 +135,10 @@ func ActionExecute(cmd *cobra.Command) Action { // ActionDirectories completes directories. func ActionDirectories() Action { return ActionCallback(func(c Context) Action { + cDir, err := c.Abs(c.Dir) + if err != nil { + return ActionMessage(err.Error()) + } return actionPath([]string{""}, true). MultiParts("/"). StyleF(style.ForPath). @@ -145,19 +149,17 @@ func ActionDirectories() Action { } return url.Parse("file://" + uid.PathEscape(abs)) }). - QueryF(func(s string, uc uid.Context) (*url.URL, error) { - abs, err := c.Abs(c.Dir) - if err != nil { - return nil, err - } - return url.Parse(fmt.Sprintf("file://%v?directories=true", uid.PathEscape(abs))) - }) + Query("file", "directories", "", "C_DIR", cDir) }).Tag("directories") } // ActionFiles completes files with optional suffix filtering. func ActionFiles(suffix ...string) Action { return ActionCallback(func(c Context) Action { + cDir, err := c.Abs(c.Dir) + if err != nil { + return ActionMessage(err.Error()) + } return actionPath(suffix, false). MultiParts("/"). StyleF(style.ForPath). @@ -168,23 +170,9 @@ func ActionFiles(suffix ...string) Action { } return url.Parse("file://" + uid.PathEscape(abs)) }). - QueryF(func(s string, uc uid.Context) (*url.URL, error) { - abs, err := c.Abs(c.Dir) - if err != nil { - return nil, err - } - query := &url.URL{ - Scheme: "file", - Path: abs, - } - if len(suffix) > 0 { - values := query.Query() - values.Set("suffix", strings.Join(suffix, ",")) - query.RawQuery = values.Encode() - } - return query, nil - }) - // Query("file", "", c.Dir, "suffix", strings.Join(suffix, ",")) + Query("file", "files", "", + "C_DIR", cDir, + "suffix", strings.Join(suffix, ",")) }).Tag("files") } diff --git a/invokedAction.go b/invokedAction.go index c2e1f25c0..b54f8864f 100644 --- a/invokedAction.go +++ b/invokedAction.go @@ -172,7 +172,7 @@ func (ia InvokedAction) ToMultiPartsA(dividers ...string) Action { }) } -func (ia InvokedAction) Query(q string) InvokedAction { +func (ia InvokedAction) QueryS(q string) InvokedAction { ia.action.meta.Queries.Add(q) return ia }