mirror of
https://gitea.com/gitea/tea
synced 2024-11-27 01:27:40 +01:00
9efee7bf99
generalize list printing with dynamic fields refactor print.IssuesList to use tableFromItems() preparatory refactor print.IssuesList: allow printing labels move formatters to formatters.go expose more printable fields on issue add generic flags.FieldsFlag add fields flag to tea issues, tea ms issues validate provided fields add strict username, or formatted user fields change default fields tea issues -> replace updated with labels tea ms issues -> replace author with labels, reorder Validate provided fields Co-authored-by: Norwin Roosen <git@nroo.de> Co-authored-by: 6543 <6543@obermui.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/312 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>
135 lines
3.2 KiB
Go
135 lines
3.2 KiB
Go
// Copyright 2020 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 repos
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"code.gitea.io/tea/cmd/flags"
|
|
"code.gitea.io/tea/modules/context"
|
|
"code.gitea.io/tea/modules/print"
|
|
|
|
"code.gitea.io/sdk/gitea"
|
|
"github.com/urfave/cli/v2"
|
|
)
|
|
|
|
// CmdReposSearch represents a sub command of repos to find them
|
|
var CmdReposSearch = cli.Command{
|
|
Name: "search",
|
|
Aliases: []string{"s"},
|
|
Usage: "Find any repo on an Gitea instance",
|
|
Description: "Find any repo on an Gitea instance",
|
|
ArgsUsage: "[<search term>]",
|
|
Action: runReposSearch,
|
|
Flags: append([]cli.Flag{
|
|
&cli.BoolFlag{
|
|
// TODO: it might be nice to search for topics as an ADDITIONAL filter.
|
|
// for that, we'd probably need to make multiple queries and UNION the results.
|
|
Name: "topic",
|
|
Aliases: []string{"t"},
|
|
Required: false,
|
|
Usage: "Search for term in repo topics instead of name",
|
|
},
|
|
&typeFilterFlag,
|
|
&cli.StringFlag{
|
|
Name: "owner",
|
|
Aliases: []string{"O"},
|
|
Required: false,
|
|
Usage: "Filter by owner",
|
|
},
|
|
&cli.StringFlag{
|
|
Name: "private",
|
|
Required: false,
|
|
Usage: "Filter private repos (true|false)",
|
|
},
|
|
&cli.StringFlag{
|
|
Name: "archived",
|
|
Required: false,
|
|
Usage: "Filter archived repos (true|false)",
|
|
},
|
|
flags.FieldsFlag(print.RepoFields, []string{
|
|
"owner", "name", "type", "ssh",
|
|
}),
|
|
&flags.PaginationPageFlag,
|
|
&flags.PaginationLimitFlag,
|
|
}, flags.LoginOutputFlags...),
|
|
}
|
|
|
|
func runReposSearch(cmd *cli.Context) error {
|
|
ctx := context.InitCommand(cmd)
|
|
client := ctx.Login.Client()
|
|
|
|
var ownerID int64
|
|
if ctx.IsSet("owner") {
|
|
// test if owner is a organisation
|
|
org, _, err := client.GetOrg(ctx.String("owner"))
|
|
if err != nil {
|
|
// HACK: the client does not return a response on 404, so we can't check res.StatusCode
|
|
if err.Error() != "404 Not Found" {
|
|
return fmt.Errorf("Could not find owner: %s", err)
|
|
}
|
|
|
|
// if owner is no org, its a user
|
|
user, _, err := client.GetUserInfo(ctx.String("owner"))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
ownerID = user.ID
|
|
} else {
|
|
ownerID = org.ID
|
|
}
|
|
}
|
|
|
|
var isArchived *bool
|
|
if ctx.IsSet("archived") {
|
|
archived := strings.ToLower(ctx.String("archived"))[:1] == "t"
|
|
isArchived = &archived
|
|
}
|
|
|
|
var isPrivate *bool
|
|
if ctx.IsSet("private") {
|
|
private := strings.ToLower(ctx.String("private"))[:1] == "t"
|
|
isPrivate = &private
|
|
}
|
|
|
|
mode, err := getTypeFilter(cmd)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var keyword string
|
|
if ctx.Args().Present() {
|
|
keyword = strings.Join(ctx.Args().Slice(), " ")
|
|
}
|
|
|
|
user, _, err := client.GetMyUserInfo()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rps, _, err := client.SearchRepos(gitea.SearchRepoOptions{
|
|
ListOptions: ctx.GetListOptions(),
|
|
OwnerID: ownerID,
|
|
IsPrivate: isPrivate,
|
|
IsArchived: isArchived,
|
|
Type: mode,
|
|
Keyword: keyword,
|
|
KeywordInDescription: true,
|
|
KeywordIsTopic: ctx.Bool("topic"),
|
|
PrioritizedByOwnerID: user.ID,
|
|
})
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fields, err := flags.GetFields(cmd, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
print.ReposList(rps, ctx.Output, fields)
|
|
return nil
|
|
}
|