refactor: improve code quality and efficiency in various files (#548)
- Replace loadConfig() with _ = loadConfig() - Update file permissions from 0660 to 0o660 - Simplify variable declarations - Replace golang.org/x/crypto/ssh/terminal with golang.org/x/term - Remove unused getCertPrincipals function - Replace time.Now().Sub() with time.Since() - Add test for ArgToIndex function Signed-off-by: appleboy <appleboy.tw@gmail.com> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Reviewed-on: https://gitea.com/gitea/tea/pulls/548 Reviewed-by: Lunny Xiao <xiaolunwen@gmail.com> Reviewed-by: techknowlogick <techknowlogick@noreply.gitea.io> Co-authored-by: appleboy <appleboy.tw@gmail.com> Co-committed-by: appleboy <appleboy.tw@gmail.com>
This commit is contained in:
parent
4915862b95
commit
b02263adb0
2
go.mod
2
go.mod
|
@ -18,6 +18,7 @@ require (
|
|||
github.com/stretchr/testify v1.7.0
|
||||
github.com/urfave/cli/v2 v2.16.3
|
||||
golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be
|
||||
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035
|
||||
gopkg.in/yaml.v2 v2.4.0
|
||||
)
|
||||
|
||||
|
@ -60,7 +61,6 @@ require (
|
|||
github.com/yuin/goldmark-emoji v1.0.1 // indirect
|
||||
golang.org/x/net v0.0.0-20220909164309-bea034e7d591 // indirect
|
||||
golang.org/x/sys v0.0.0-20220926163933-8cfa568d3c25 // indirect
|
||||
golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect
|
||||
golang.org/x/text v0.3.7 // indirect
|
||||
golang.org/x/tools v0.1.12 // indirect
|
||||
gopkg.in/warnings.v0 v0.1.2 // indirect
|
||||
|
|
|
@ -74,7 +74,7 @@ func GetConfigPath() string {
|
|||
|
||||
// GetPreferences returns preferences based on the config file
|
||||
func GetPreferences() Preferences {
|
||||
loadConfig()
|
||||
_ = loadConfig()
|
||||
return config.Prefs
|
||||
}
|
||||
|
||||
|
@ -105,5 +105,5 @@ func saveConfig() error {
|
|||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return ioutil.WriteFile(ymlPath, bs, 0660)
|
||||
return ioutil.WriteFile(ymlPath, bs, 0o660)
|
||||
}
|
||||
|
|
|
@ -10,13 +10,10 @@ import (
|
|||
"strings"
|
||||
)
|
||||
|
||||
var (
|
||||
protocolRe = regexp.MustCompile("^[a-zA-Z_+-]+://")
|
||||
)
|
||||
var protocolRe = regexp.MustCompile("^[a-zA-Z_+-]+://")
|
||||
|
||||
// URLParser represents a git URL parser
|
||||
type URLParser struct {
|
||||
}
|
||||
type URLParser struct{}
|
||||
|
||||
// Parse parses the git URL
|
||||
func (p *URLParser) Parse(rawURL string) (u *url.URL, err error) {
|
||||
|
@ -50,9 +47,7 @@ func (p *URLParser) Parse(rawURL string) (u *url.URL, err error) {
|
|||
}
|
||||
|
||||
// .git suffix is optional and breaks normalization
|
||||
if strings.HasSuffix(u.Path, ".git") {
|
||||
u.Path = strings.TrimSuffix(u.Path, ".git")
|
||||
}
|
||||
u.Path = strings.TrimSuffix(u.Path, ".git")
|
||||
|
||||
return
|
||||
}
|
||||
|
|
|
@ -13,7 +13,7 @@ import (
|
|||
"code.gitea.io/tea/modules/print"
|
||||
|
||||
"github.com/AlecAivazis/survey/v2"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
// ShowCommentsMaybeInteractive fetches & prints comments, depending on the --comments flag.
|
||||
|
@ -72,5 +72,5 @@ func ShowCommentsPaginated(ctx *context.TeaContext, idx int64, totalComments int
|
|||
|
||||
// IsStdinPiped checks if stdin is piped
|
||||
func IsStdinPiped() bool {
|
||||
return !terminal.IsTerminal(int(os.Stdin.Fd()))
|
||||
return !term.IsTerminal(int(os.Stdin.Fd()))
|
||||
}
|
||||
|
|
|
@ -18,12 +18,12 @@ func Comments(comments []*gitea.Comment) {
|
|||
baseURL = getRepoURL(comments[0].HTMLURL)
|
||||
}
|
||||
|
||||
var out = make([]string, len(comments))
|
||||
out := make([]string, len(comments))
|
||||
for i, c := range comments {
|
||||
out[i] = formatComment(c)
|
||||
}
|
||||
|
||||
outputMarkdown(fmt.Sprintf(
|
||||
_ = outputMarkdown(fmt.Sprintf(
|
||||
// this will become a heading by means of the first --- from a comment
|
||||
"Comments\n%s",
|
||||
strings.Join(out, "\n"),
|
||||
|
@ -32,7 +32,7 @@ func Comments(comments []*gitea.Comment) {
|
|||
|
||||
// Comment renders a comment to stdout
|
||||
func Comment(c *gitea.Comment) {
|
||||
outputMarkdown(formatComment(c), getRepoURL(c.HTMLURL))
|
||||
_ = outputMarkdown(formatComment(c), getRepoURL(c.HTMLURL))
|
||||
}
|
||||
|
||||
func formatComment(c *gitea.Comment) string {
|
||||
|
|
|
@ -12,12 +12,12 @@ import (
|
|||
|
||||
"code.gitea.io/sdk/gitea"
|
||||
"github.com/muesli/termenv"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
// IsInteractive checks if the output is piped, but NOT if the session is run interactively..
|
||||
func IsInteractive() bool {
|
||||
return terminal.IsTerminal(int(os.Stdout.Fd()))
|
||||
return term.IsTerminal(int(os.Stdout.Fd()))
|
||||
}
|
||||
|
||||
// captures the repo URL part <host>/<owner>/<repo> of an url
|
||||
|
|
|
@ -28,7 +28,7 @@ func IssueDetails(issue *gitea.Issue, reactions []*gitea.Reaction) {
|
|||
out += fmt.Sprintf("\n---\n\n%s\n", formatReactions(reactions))
|
||||
}
|
||||
|
||||
outputMarkdown(out, getRepoURL(issue.HTMLURL))
|
||||
_ = outputMarkdown(out, getRepoURL(issue.HTMLURL))
|
||||
}
|
||||
|
||||
func formatReactions(reactions []*gitea.Reaction) string {
|
||||
|
@ -74,7 +74,7 @@ var IssueFields = []string{
|
|||
|
||||
func printIssues(issues []*gitea.Issue, output string, fields []string) {
|
||||
labelMap := map[int64]string{}
|
||||
var printables = make([]printable, len(issues))
|
||||
printables := make([]printable, len(issues))
|
||||
machineReadable := isMachineReadable(output)
|
||||
|
||||
for i, x := range issues {
|
||||
|
@ -133,13 +133,13 @@ func (x printableIssue) FormatField(field string, machineReadable bool) string {
|
|||
}
|
||||
return ""
|
||||
case "labels":
|
||||
var labels = make([]string, len(x.Labels))
|
||||
labels := make([]string, len(x.Labels))
|
||||
for i, l := range x.Labels {
|
||||
labels[i] = (*x.formattedLabels)[l.ID]
|
||||
}
|
||||
return strings.Join(labels, " ")
|
||||
case "assignees":
|
||||
var assignees = make([]string, len(x.Assignees))
|
||||
assignees := make([]string, len(x.Assignees))
|
||||
for i, a := range x.Assignees {
|
||||
assignees[i] = formatUserName(a)
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ func LoginDetails(login *config.Login) {
|
|||
}
|
||||
in += fmt.Sprintf("\nCreated: %s", time.Unix(login.Created, 0).Format(time.RFC822))
|
||||
|
||||
outputMarkdown(in, "")
|
||||
_ = outputMarkdown(in, "")
|
||||
}
|
||||
|
||||
// LoginsList prints a listing of logins
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
"os"
|
||||
|
||||
"github.com/charmbracelet/glamour"
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
// outputMarkdown prints markdown to stdout, formatted for terminals.
|
||||
|
@ -47,8 +47,8 @@ func outputMarkdown(markdown string, baseURL string) error {
|
|||
func getWordWrap() int {
|
||||
fd := int(os.Stdout.Fd())
|
||||
width := 80
|
||||
if terminal.IsTerminal(fd) {
|
||||
if w, _, err := terminal.GetSize(fd); err == nil {
|
||||
if term.IsTerminal(fd) {
|
||||
if w, _, err := term.GetSize(fd); err == nil {
|
||||
width = w
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,7 +12,7 @@ import (
|
|||
|
||||
// OrganizationDetails prints details of an org with formatting
|
||||
func OrganizationDetails(org *gitea.Organization) {
|
||||
outputMarkdown(fmt.Sprintf(
|
||||
_ = outputMarkdown(fmt.Sprintf(
|
||||
"# %s\n%s\n\n- Visibility: %s\n- Location: %s\n- Website: %s\n",
|
||||
org.UserName,
|
||||
org.Description,
|
||||
|
|
|
@ -14,7 +14,7 @@ import (
|
|||
|
||||
// ReposList prints a listing of the repos
|
||||
func ReposList(repos []*gitea.Repository, output string, fields []string) {
|
||||
var printables = make([]printable, len(repos))
|
||||
printables := make([]printable, len(repos))
|
||||
for i, r := range repos {
|
||||
printables[i] = &printableRepo{r}
|
||||
}
|
||||
|
@ -56,7 +56,7 @@ func RepoDetails(repo *gitea.Repository, topics []string) {
|
|||
updated := fmt.Sprintf(
|
||||
"Updated: %s (%s ago)\n",
|
||||
repo.Updated.Format("2006-01-02 15:04"),
|
||||
time.Now().Sub(repo.Updated).Truncate(time.Minute),
|
||||
time.Since(repo.Updated).Truncate(time.Minute),
|
||||
)
|
||||
|
||||
urls := fmt.Sprintf(
|
||||
|
|
|
@ -66,7 +66,6 @@ func (t *table) sort(column uint, desc bool) {
|
|||
func (t table) Len() int { return len(t.values) }
|
||||
func (t table) Swap(i, j int) { t.values[i], t.values[j] = t.values[j], t.values[i] }
|
||||
func (t table) Less(i, j int) bool {
|
||||
const column = 0
|
||||
if t.sortDesc {
|
||||
i, j = j, i
|
||||
}
|
||||
|
|
|
@ -91,15 +91,3 @@ func parseKeys(pkinput []byte, sshPath string) string {
|
|||
|
||||
return ssh.FingerprintSHA256(pkey) + " " + pkey.Type() + " " + comment + " (" + sshPath + ")"
|
||||
}
|
||||
|
||||
func getCertPrincipals(pkey ssh.PublicKey) []string {
|
||||
var principals []string
|
||||
|
||||
if cert, ok := pkey.(*ssh.Certificate); ok {
|
||||
for _, principal := range cert.ValidPrincipals {
|
||||
principals = append(principals, principal)
|
||||
}
|
||||
}
|
||||
|
||||
return principals
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@ func RepoClone(
|
|||
callback func(string) (string, error),
|
||||
depth int,
|
||||
) (*local_git.TeaRepo, error) {
|
||||
|
||||
repoMeta, _, err := login.Client().GetRepo(repoOwner, repoName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
@ -64,10 +63,14 @@ func RepoClone(
|
|||
return nil, err
|
||||
}
|
||||
upstreamBranch := repoMeta.Parent.DefaultBranch
|
||||
repo.CreateRemote(&git_config.RemoteConfig{
|
||||
_, err = repo.CreateRemote(&git_config.RemoteConfig{
|
||||
Name: "upstream",
|
||||
URLs: []string{upstreamURL.String()},
|
||||
})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
repoConf, err := repo.Config()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
@ -24,10 +24,7 @@ func ArgsToIndices(args []string) ([]int64, error) {
|
|||
|
||||
// ArgToIndex take issue/pull index as string and return int64
|
||||
func ArgToIndex(arg string) (int64, error) {
|
||||
if strings.HasPrefix(arg, "#") {
|
||||
arg = arg[1:]
|
||||
}
|
||||
return strconv.ParseInt(arg, 10, 64)
|
||||
return strconv.ParseInt(strings.TrimPrefix(arg, "#"), 10, 64)
|
||||
}
|
||||
|
||||
// NormalizeURL normalizes the input with a protocol
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
// Copyright 2023 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 utils
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestArgToIndex(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
arg string
|
||||
want int64
|
||||
wantErr bool
|
||||
}{
|
||||
{
|
||||
name: "Valid argument",
|
||||
arg: "#123",
|
||||
want: 123,
|
||||
wantErr: false,
|
||||
},
|
||||
{
|
||||
name: "Invalid argument",
|
||||
arg: "abc",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
{
|
||||
name: "Empty argument",
|
||||
arg: "",
|
||||
want: 0,
|
||||
wantErr: true,
|
||||
},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := ArgToIndex(tt.arg)
|
||||
if (err != nil) != tt.wantErr {
|
||||
t.Errorf("ArgToIndex() error = %v, wantErr %v", err, tt.wantErr)
|
||||
return
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Errorf("ArgToIndex() = %v, want %v", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue