diff --git a/.drone.yml b/.drone.yml index 6db2aab..98c03dc 100644 --- a/.drone.yml +++ b/.drone.yml @@ -52,22 +52,11 @@ pipeline: when: event: [ tag ] - generate-coverage: - image: golang:1.12 - pull: true - environment: - TAGS: bindata - commands: - - make coverage - when: - event: [ push, pull_request ] - branch: [ master ] - coverage: image: robertstettner/drone-codecov secrets: [ codecov_token ] files: - - coverage.all + - coverage.out when: event: [ push, pull_request ] branch: [ master ] diff --git a/Makefile b/Makefile index 6ec9f86..9280859 100644 --- a/Makefile +++ b/Makefile @@ -70,13 +70,6 @@ fmt: vet: $(GO) vet $(PACKAGES) -.PHONY: errcheck -errcheck: - @hash errcheck > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/kisielk/errcheck; \ - fi - errcheck $(PACKAGES) - .PHONY: lint lint: @hash revive > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ @@ -112,13 +105,6 @@ fmt-check: test: GO111MODULE=on $(GO) test -mod=vendor -tags='sqlite sqlite_unlock_notify' $(PACKAGES) -.PHONY: coverage -coverage: - @hash gocovmerge > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/wadey/gocovmerge; \ - fi - gocovmerge $(shell find . -type f -name "coverage.out") > coverage.all;\ - .PHONY: unit-test-coverage unit-test-coverage: $(GO) test -tags='sqlite sqlite_unlock_notify' -cover -coverprofile coverage.out $(PACKAGES) && echo "\n==>\033[32m Ok\033[m\n" || exit 1 @@ -190,6 +176,13 @@ endif release-copy: cd $(DIST); for file in `find /build -type f -name "*"`; do cp $${file} ./release/; done; +.PHONY: release-compress +release-compress: + @hash gxz > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ + $(GO) get -u github.com/ulikunitz/xz/cmd/gxz; \ + fi + cd $(DIST)/release/; for file in `find . -type f -name "*"`; do echo "compressing $${file}" && gxz -k -9 $${file}; done; + .PHONY: release-check release-check: cd $(DIST)/release/; for file in `find . -type f -name "*"`; do echo "checksumming $${file}" && $(SHASUM) `echo $${file} | sed 's/^..//'` > $${file}.sha256; done; diff --git a/README.md b/README.md index 07fa5df..e0ee105 100644 --- a/README.md +++ b/README.md @@ -4,26 +4,32 @@ This project acts as a command line tool for operating one or multiple Gitea ins the Gitea API implementation. ## Installation + Currently no prebuilt binaries are provided. To install, a Go installation is needed. + ```sh go get code.gitea.io/tea go install code.gitea.io/tea ``` If the `tea` executable is not found, you might need to set up your `$GOPATH` and `$PATH` variables first: + ```sh export PATH=$PATH:$GOROOT/bin:$GOPATH/bin ``` ## Usage + First of all, you have to create a token on your `personal settings -> application` page of your gitea instance. Use this token to login with `tea`: + ```sh tea login add --name=try --url=https://try.gitea.io --token=xxxxxx ``` Now you can use the `tea` commands: + ```sh tea issues tea releases @@ -34,6 +40,7 @@ tea releases ## Compilation To compile the sources yourself run the following: + ```sh go get code.gitea.io/tea cd "${GOPATH}/src/code.gitea.io/tea" diff --git a/cmd/repos.go b/cmd/repos.go new file mode 100644 index 0000000..41ee698 --- /dev/null +++ b/cmd/repos.go @@ -0,0 +1,146 @@ +// 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 cmd + +import ( + "fmt" + "log" + + "code.gitea.io/sdk/gitea" + + "github.com/urfave/cli" +) + +// CmdRepos represents to login a gitea server. +var CmdRepos = cli.Command{ + Name: "repos", + Usage: "Operate with repositories", + Description: `Operate with repositories`, + Action: runReposList, + Subcommands: []cli.Command{ + CmdReposList, + }, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "login, l", + Usage: "Indicate one login, optional when inside a gitea repository", + }, + }, +} + +// CmdReposList represents a sub command of issues to list issues +var CmdReposList = cli.Command{ + Name: "ls", + Usage: "List available repositories", + Description: `List available repositories`, + Action: runReposList, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "login, l", + Usage: "Indicate one login, optional when inside a gitea repository", + }, + cli.StringFlag{ + Name: "mode", + Usage: "Indicate one login, optional when inside a gitea repository", + }, + cli.StringFlag{ + Name: "org", + Usage: "Indicate one login, optional when inside a gitea repository", + }, + cli.StringFlag{ + Name: "user", + Usage: "Indicate one login, optional when inside a gitea repository", + }, + }, +} + +// runReposList list repositories +func runReposList(ctx *cli.Context) error { + login := initCommandLoginOnly(ctx) + + mode := ctx.String("mode") + org := ctx.String("org") + user := ctx.String("user") + + var rps []*gitea.Repository + var err error + + if org != "" { + rps, err = login.Client().ListOrgRepos(org) + } else if user != "" { + rps, err = login.Client().ListUserRepos(user) + } else { + rps, err = login.Client().ListMyRepos() + } + if err != nil { + log.Fatal(err) + } + + var repos []*gitea.Repository + if mode == "" { + repos = rps + } else if mode == "fork" { + for _, rp := range rps { + if rp.Fork == true { + repos = append(repos, rp) + } + } + } else if mode == "mirror" { + for _, rp := range rps { + if rp.Mirror == true { + repos = append(repos, rp) + } + } + } else if mode == "source" { + for _, rp := range rps { + if rp.Mirror != true && rp.Fork != true { + repos = append(repos, rp) + } + } + } else { + fmt.Printf("Unknown mode '%s'\nUse one of the following:\n- fork\n- mirror\n- source\n", mode) + return nil + } + + if len(rps) == 0 { + fmt.Println("No repositories found") + return nil + } + + fmt.Println("Name | Type/Mode | SSH-URL | Owner") + for _, rp := range repos { + var mode = "source" + if rp.Fork { + mode = "fork" + } + if rp.Mirror { + mode = "mirror" + } + fmt.Printf("%s | %s | %s | %s\n", rp.FullName, mode, rp.SSHURL, rp.Owner.UserName) + } + + return nil +} + +func initCommandLoginOnly(ctx *cli.Context) *Login { + err := loadConfig(yamlConfigPath) + if err != nil { + log.Fatal("load config file failed", yamlConfigPath) + } + + var login *Login + if loginFlag := getGlobalFlag(ctx, "login"); loginFlag == "" { + login, err = getActiveLogin() + if err != nil { + log.Fatal(err) + } + } else { + login = getLoginByName(loginFlag) + if login == nil { + log.Fatal("indicated login name", loginFlag, "does not exist") + } + } + return login +} diff --git a/main.go b/main.go index e5b0a42..a67c6f4 100644 --- a/main.go +++ b/main.go @@ -39,6 +39,7 @@ func main() { cmd.CmdIssues, cmd.CmdPulls, cmd.CmdReleases, + cmd.CmdRepos, } err := app.Run(os.Args) if err != nil {