mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-31 17:25:27 +01:00 
			
		
		
		
	Implement more issue filters (#400)
This adds new filters to `tea issues ls` and `tea pr ls`, made available in SDK 0.15: ``` --state value Filter by state (all|open|closed) (default: open) --keyword value, -k value Filter by search string --labels value, -L value Comma-separated list of labels to match issues against. --milestones value, -m value Comma-separated list of milestones to match issues against. --author value, -A value --assignee value, -a value --mentions value, -M value --from value, -F value Filter by activity after this date --until value, -u value Filter by activity before this date ``` Note: I felt free to change parameter names as exposed by SDK & API, as the names exposed by them are partially bollocks (eg `mentioned_by`) and or inconsistent with usage in other commands (eg `tea times --until`) fixes #376, related #323 Co-authored-by: Norwin <git@nroo.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/400 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Reviewed-by: 6543 <6543@obermui.de> Co-authored-by: Norwin <noerw@noreply.gitea.io> Co-committed-by: Norwin <noerw@noreply.gitea.io>
This commit is contained in:
		
							
								
								
									
										161
									
								
								cmd/flags/issue_pr.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										161
									
								
								cmd/flags/issue_pr.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,161 @@ | ||||
| // Copyright 2019 The Gitea Authors. All rights reserved. | ||||
| // Use of this source code is governed by a MIT-style | ||||
| // license that can be found in the LICENSE file. | ||||
|  | ||||
| package flags | ||||
|  | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| 	"code.gitea.io/sdk/gitea" | ||||
| 	"code.gitea.io/tea/modules/context" | ||||
| 	"code.gitea.io/tea/modules/task" | ||||
|  | ||||
| 	"github.com/araddon/dateparse" | ||||
| 	"github.com/urfave/cli/v2" | ||||
| ) | ||||
|  | ||||
| // StateFlag provides flag to specify issue/pr state, defaulting to "open" | ||||
| var StateFlag = cli.StringFlag{ | ||||
| 	Name:        "state", | ||||
| 	Usage:       "Filter by state (all|open|closed)", | ||||
| 	DefaultText: "open", | ||||
| } | ||||
|  | ||||
| // MilestoneFilterFlag is a CSV flag used to filter issues by milestones | ||||
| var MilestoneFilterFlag = NewCsvFlag( | ||||
| 	"milestones", | ||||
| 	"milestones to match issues against", | ||||
| 	[]string{"m"}, nil, nil) | ||||
|  | ||||
| // LabelFilterFlag is a CSV flag used to filter issues by labels | ||||
| var LabelFilterFlag = NewCsvFlag( | ||||
| 	"labels", | ||||
| 	"labels to match issues against", | ||||
| 	[]string{"L"}, nil, nil) | ||||
|  | ||||
| // PRListingFlags defines flags that should be available on pr listing flags. | ||||
| var PRListingFlags = append([]cli.Flag{ | ||||
| 	&StateFlag, | ||||
| 	&PaginationPageFlag, | ||||
| 	&PaginationLimitFlag, | ||||
| }, AllDefaultFlags...) | ||||
|  | ||||
| // IssueListingFlags defines flags that should be available on issue listing flags. | ||||
| var IssueListingFlags = append([]cli.Flag{ | ||||
| 	&StateFlag, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:        "kind", | ||||
| 		Aliases:     []string{"K"}, | ||||
| 		Usage:       "Wether to return `issues`, `pulls`, or `all` (you can use this to apply advanced search filters to PRs)", | ||||
| 		DefaultText: "issues", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "keyword", | ||||
| 		Aliases: []string{"k"}, | ||||
| 		Usage:   "Filter by search string", | ||||
| 	}, | ||||
| 	LabelFilterFlag, | ||||
| 	MilestoneFilterFlag, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "author", | ||||
| 		Aliases: []string{"A"}, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "assignee", | ||||
| 		Aliases: []string{"a"}, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "mentions", | ||||
| 		Aliases: []string{"M"}, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "from", | ||||
| 		Aliases: []string{"F"}, | ||||
| 		Usage:   "Filter by activity after this date", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "until", | ||||
| 		Aliases: []string{"u"}, | ||||
| 		Usage:   "Filter by activity before this date", | ||||
| 	}, | ||||
| 	&PaginationPageFlag, | ||||
| 	&PaginationLimitFlag, | ||||
| }, AllDefaultFlags...) | ||||
|  | ||||
| // IssuePREditFlags defines flags for properties of issues and PRs | ||||
| var IssuePREditFlags = append([]cli.Flag{ | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "title", | ||||
| 		Aliases: []string{"t"}, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "description", | ||||
| 		Aliases: []string{"d"}, | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "assignees", | ||||
| 		Aliases: []string{"a"}, | ||||
| 		Usage:   "Comma-separated list of usernames to assign", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "labels", | ||||
| 		Aliases: []string{"L"}, | ||||
| 		Usage:   "Comma-separated list of labels to assign", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "deadline", | ||||
| 		Aliases: []string{"D"}, | ||||
| 		Usage:   "Deadline timestamp to assign", | ||||
| 	}, | ||||
| 	&cli.StringFlag{ | ||||
| 		Name:    "milestone", | ||||
| 		Aliases: []string{"m"}, | ||||
| 		Usage:   "Milestone to assign", | ||||
| 	}, | ||||
| }, LoginRepoFlags...) | ||||
|  | ||||
| // GetIssuePREditFlags parses all IssuePREditFlags | ||||
| func GetIssuePREditFlags(ctx *context.TeaContext) (*gitea.CreateIssueOption, error) { | ||||
| 	opts := gitea.CreateIssueOption{ | ||||
| 		Title:     ctx.String("title"), | ||||
| 		Body:      ctx.String("description"), | ||||
| 		Assignees: strings.Split(ctx.String("assignees"), ","), | ||||
| 	} | ||||
| 	var err error | ||||
|  | ||||
| 	date := ctx.String("deadline") | ||||
| 	if date != "" { | ||||
| 		t, err := dateparse.ParseAny(date) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		opts.Deadline = &t | ||||
| 	} | ||||
|  | ||||
| 	client := ctx.Login.Client() | ||||
|  | ||||
| 	labelNames := strings.Split(ctx.String("labels"), ",") | ||||
| 	if len(labelNames) != 0 { | ||||
| 		if client == nil { | ||||
| 			client = ctx.Login.Client() | ||||
| 		} | ||||
| 		if opts.Labels, err = task.ResolveLabelNames(client, ctx.Owner, ctx.Repo, labelNames); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if milestoneName := ctx.String("milestone"); len(milestoneName) != 0 { | ||||
| 		if client == nil { | ||||
| 			client = ctx.Login.Client() | ||||
| 		} | ||||
| 		ms, _, err := client.GetMilestoneByName(ctx.Owner, ctx.Repo, milestoneName) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("Milestone '%s' not found", milestoneName) | ||||
| 		} | ||||
| 		opts.Milestone = ms.ID | ||||
| 	} | ||||
|  | ||||
| 	return &opts, nil | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Norwin
					Norwin