diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 84aaf23..8c168b6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,8 @@ jobs: - name: Test run: make ci + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Run codecov run: codecov diff --git a/.gitignore b/.gitignore index 16d2bc0..3c0cbd6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ .go-version dist/ -coverage.txt +coverage.out /ghput \ No newline at end of file diff --git a/Makefile b/Makefile index fab13a7..12bc853 100644 --- a/Makefile +++ b/Makefile @@ -16,7 +16,7 @@ default: test ci: depsdev test sec test: - go test ./... -coverprofile=coverage.txt -covermode=count + go test ./... -coverprofile=coverage.out -covermode=count sec: gosec ./... diff --git a/gh/gh.go b/gh/gh.go index 016f79d..2c8082b 100644 --- a/gh/gh.go +++ b/gh/gh.go @@ -6,23 +6,18 @@ import ( "fmt" "io" "io/ioutil" - "net" - "net/http" - "net/url" "os" "path" "path/filepath" "strconv" "strings" - "time" "github.com/google/go-github/v39/github" + "github.com/k1LoW/go-github-client/v39/factory" ) const ( - defaultBaseURL = "https://api.github.com/" - uploadBaseURL = "https://uploads.github.com/" - footerFormat = "" + footerFormat = "" ) type Gh struct { @@ -34,35 +29,12 @@ type Gh struct { // New return Gh func New(owner, repo, key string) (*Gh, error) { - c := github.NewClient(httpClient()) - baseURL := os.Getenv("GITHUB_BASE_URL") - if baseURL == "" { - baseURL = os.Getenv("GITHUB_API_URL") - } else { - _, _ = fmt.Fprintf(os.Stderr, "%s\n", "env GITHUB_BASE_URL is deprecated. Use GITHUB_API_URL") - } - if baseURL != "" { - baseEndpoint, err := url.Parse(baseURL) - if err != nil { - return nil, err - } - if !strings.HasSuffix(baseEndpoint.Path, "/") { - baseEndpoint.Path += "/" - } - c.BaseURL = baseEndpoint - } - if uploadURL := os.Getenv("GITHUB_UPLOAD_URL"); uploadURL != "" { - uploadEndpoint, err := url.Parse(uploadURL) - if err != nil { - return nil, err - } - if !strings.HasSuffix(uploadEndpoint.Path, "/") { - uploadEndpoint.Path += "/" - } - c.UploadURL = uploadEndpoint + client, err := factory.NewGithubClient() + if err != nil { + return nil, err } return &Gh{ - client: c, + client: client, owner: owner, repo: repo, key: key, @@ -392,41 +364,14 @@ func (g *Gh) CreateRelease(ctx context.Context, tag, title, body string) error { return nil } -type roundTripper struct { - transport *http.Transport - accessToken string -} - -func (rt roundTripper) RoundTrip(r *http.Request) (*http.Response, error) { - r.Header.Set("Authorization", fmt.Sprintf("token %s", rt.accessToken)) - return rt.transport.RoundTrip(r) -} - -func httpClient() *http.Client { - t := &http.Transport{ - Dial: (&net.Dialer{ - Timeout: 5 * time.Second, - }).Dial, - TLSHandshakeTimeout: 5 * time.Second, - } - rt := roundTripper{ - transport: t, - accessToken: os.Getenv("GITHUB_TOKEN"), - } - return &http.Client{ - Timeout: time.Second * 10, - Transport: rt, - } -} - func unique(in []string) []string { m := map[string]struct{}{} + u := []string{} for _, s := range in { + if _, ok := m[s]; !ok { + u = append(u, s) + } m[s] = struct{}{} } - u := []string{} - for s := range m { - u = append(u, s) - } return u } diff --git a/gh/gh_test.go b/gh/gh_test.go index 506dc24..1e9e5f8 100644 --- a/gh/gh_test.go +++ b/gh/gh_test.go @@ -1,9 +1,39 @@ package gh import ( + "context" "testing" + + "github.com/google/go-cmp/cmp" ) +func TestMakeComment(t *testing.T) { + ctx := context.Background() + tests := []struct { + body string + header string + footer string + want string + }{ + {"", "", "", "\n"}, + {"body", "header", "footer", "header\nbody\nfooter\n\n"}, + {"body\n", "header\n", "footer\n", "header\nbody\nfooter\n\n"}, + } + for _, tt := range tests { + gh, err := New("o", "r", "") + if err != nil { + t.Fatal(err) + } + got, err := gh.MakeComment(ctx, tt.body, tt.header, tt.footer) + if err != nil { + t.Fatal(err) + } + if got != tt.want { + t.Errorf("got\n%v\nwant\n%v", got, tt.want) + } + } +} + func TestCommentFooter(t *testing.T) { tests := []struct { key string @@ -30,3 +60,21 @@ func TestCommentFooter(t *testing.T) { } } } + +func TestUnique(t *testing.T) { + tests := []struct { + in []string + want []string + }{ + {[]string{}, []string{}}, + {[]string{"a", "c", "b"}, []string{"a", "c", "b"}}, + {[]string{"b", "c", "b"}, []string{"b", "c"}}, + {[]string{"a", "a", "b"}, []string{"a", "b"}}, + } + for _, tt := range tests { + got := unique(tt.in) + if diff := cmp.Diff(got, tt.want, nil); diff != "" { + t.Errorf("%s", diff) + } + } +} diff --git a/go.mod b/go.mod index 615fda9..04b9d29 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,10 @@ module github.com/k1LoW/ghput go 1.17 require ( - github.com/google/go-github/v39 v39.1.0 + github.com/google/go-cmp v0.5.6 + github.com/google/go-github/v39 v39.2.0 github.com/itchyny/timefmt-go v0.1.3 + github.com/k1LoW/go-github-client/v39 v39.2.2 github.com/mattn/go-colorable v0.1.11 github.com/spf13/cobra v1.2.1 ) diff --git a/go.sum b/go.sum index 57693e5..a36a031 100644 --- a/go.sum +++ b/go.sum @@ -45,6 +45,7 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -71,6 +72,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -117,8 +120,11 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-github/v39 v39.1.0 h1:1vf4gM0D1e+Df2HMxaYC3+o9+Huj3ywGTtWc3VVYaDA= -github.com/google/go-github/v39 v39.1.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-github/v37 v37.0.0 h1:rCspN8/6kB1BAJWZfuafvHhyfIo5fkAulaP/3bOQ/tM= +github.com/google/go-github/v37 v37.0.0/go.mod h1:LM7in3NmXDrX58GbEHy7FtNLbI2JijX93RnMKvWG3m4= +github.com/google/go-github/v39 v39.2.0 h1:rNNM311XtPOz5rDdsJXAp2o8F67X9FnROXTvto3aSnQ= +github.com/google/go-github/v39 v39.2.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE= +github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -141,6 +147,8 @@ github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -172,6 +180,8 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/k1LoW/go-github-client/v39 v39.2.2 h1:BML9eBIvMnlM+u2awm8hugeaT//dd8ilR3sM5i/FzG8= +github.com/k1LoW/go-github-client/v39 v39.2.2/go.mod h1:fb0+5/ZUFspjDNIOqmzCb1s2KVI1UIOrDAQprhfhecY= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -186,6 +196,8 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/migueleliasweb/go-github-mock v0.0.5 h1:oCUwIPIknszT0DkjGT3VfILe1FgUDaNgEnj4w8mTZZA= +github.com/migueleliasweb/go-github-mock v0.0.5/go.mod h1:gTpcHVcrBxK35OOQP3aGrgQypxvEoFTvtR0VGaEs2VM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= @@ -459,6 +471,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=