@@ -28,10 +28,12 @@ type ListOptions struct {
2828 Nested bool
2929 Long bool
3030 Tree bool
31+ Filter string
32+ SortMode string
3133}
3234
3335// NewListOptions creates a new ListOptions instance
34- func NewListOptions (list , listAll , listAsJson , noStatus , nested , long , tree bool ) ListOptions {
36+ func NewListOptions (list , listAll , listAsJson , noStatus , nested , long , tree bool , filter , sortMode string ) ListOptions {
3537 return ListOptions {
3638 ListOnlyTasksWithDescriptions : list ,
3739 ListAllTasks : listAll ,
@@ -40,6 +42,8 @@ func NewListOptions(list, listAll, listAsJson, noStatus, nested, long, tree bool
4042 Nested : nested ,
4143 Long : long ,
4244 Tree : tree ,
45+ Filter : filter ,
46+ SortMode : sortMode ,
4347 }
4448}
4549
@@ -69,6 +73,9 @@ func (e *Executor) ListTasks(o ListOptions) (bool, error) {
6973 if err != nil {
7074 return false , err
7175 }
76+ if o .Filter != "" {
77+ tasks = listing .FilterTasks (tasks , o .Filter )
78+ }
7279 if o .FormatTaskListAsJSON {
7380 output , err := e .ToEditorOutput (tasks , o .NoStatus , o .Nested , o .Long )
7481 if err != nil {
@@ -84,7 +91,9 @@ func (e *Executor) ListTasks(o ListOptions) (bool, error) {
8491 return len (tasks ) > 0 , nil
8592 }
8693 if len (tasks ) == 0 {
87- if o .ListOnlyTasksWithDescriptions {
94+ if o .Filter != "" {
95+ e .Logger .Outf (logger .Yellow , "task: No tasks matching %q\n " , o .Filter )
96+ } else if o .ListOnlyTasksWithDescriptions {
8897 e .Logger .Outf (logger .Yellow , "task: No tasks with description available. Try --list-all to list all tasks\n " )
8998 } else if o .ListAllTasks {
9099 e .Logger .Outf (logger .Yellow , "task: No tasks available\n " )
@@ -100,7 +109,7 @@ func (e *Executor) ListTasks(o ListOptions) (bool, error) {
100109 w := tabwriter .NewWriter (e .Stdout , 0 , 8 , 6 , ' ' , 0 )
101110 for _ , task := range tasks {
102111 e .Logger .FOutf (w , logger .Yellow , "* " )
103- e .Logger . FOutf (w , logger .Green , task .Task )
112+ e .writeHighlighted (w , logger .Green , task .Task , o . Filter )
104113 desc := strings .ReplaceAll (task .Desc , "\n " , " " )
105114 e .Logger .FOutf (w , logger .Default , ": \t %s" , desc )
106115 if len (task .Aliases ) > 0 {
@@ -115,6 +124,21 @@ func (e *Executor) ListTasks(o ListOptions) (bool, error) {
115124 return true , nil
116125}
117126
127+ func (e * Executor ) writeHighlighted (w io.Writer , baseColor logger.Color , text , filter string ) {
128+ if filter == "" || listing .IsGlobPattern (filter ) {
129+ e .Logger .FOutf (w , baseColor , "%s" , text )
130+ return
131+ }
132+ idx := strings .Index (strings .ToLower (text ), strings .ToLower (filter ))
133+ if idx == - 1 {
134+ e .Logger .FOutf (w , baseColor , "%s" , text )
135+ return
136+ }
137+ e .Logger .FOutf (w , baseColor , "%s" , text [:idx ])
138+ e .Logger .FOutf (w , logger .Bold , "%s" , text [idx :idx + len (filter )])
139+ e .Logger .FOutf (w , baseColor , "%s" , text [idx + len (filter ):])
140+ }
141+
118142func (e * Executor ) writeTaskDetails (w io.Writer , task * ast.Task , indent string , long bool ) {
119143 if listing .HasRequires (task ) {
120144 e .Logger .FOutf (w , logger .Default , indent )
@@ -173,7 +197,7 @@ func (e *Executor) listTasksTree(tasks []*ast.Task, o ListOptions) (bool, error)
173197 groups := listing .GroupByNamespace (tasks )
174198 hasNamespaced := listing .HasNamespacedGroups (groups )
175199 hasRoot := listing .HasRootGroup (groups )
176- showSeparator := hasNamespaced && hasRoot
200+ showSeparator := hasNamespaced && hasRoot && ( o . SortMode == "" || o . SortMode == "default" )
177201
178202 // Move root group to end so namespaced groups appear first
179203 if showSeparator {
@@ -212,7 +236,8 @@ func (e *Executor) listTasksTree(tasks []*ast.Task, o ListOptions) (bool, error)
212236 if task .Internal {
213237 nameColor = logger .Dim
214238 }
215- e .Logger .FOutf (w , nameColor , "%s%s" , indent , name )
239+ e .Logger .FOutf (w , nameColor , "%s" , indent )
240+ e .writeHighlighted (w , nameColor , name , o .Filter )
216241 e .Logger .FOutf (w , logger .Default , ":\t %s" , desc )
217242 if len (task .Aliases ) > 0 {
218243 e .Logger .FOutf (w , logger .Cyan , "\t (aliases: %s)" , strings .Join (task .Aliases , ", " ))
0 commit comments