Skip to content

Commit d547e80

Browse files
committed
add github vendor
1 parent 52c8b76 commit d547e80

File tree

4 files changed

+71
-14
lines changed

4 files changed

+71
-14
lines changed

github/github.go

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,24 @@ package github
22

33
import (
44
"context"
5-
"os"
65

7-
"github.com/google/go-github/github"
86
"github.com/google/go-github/v53/github"
9-
"github.com/gov4git/lib4git/must"
107
"github.com/gov4git/vendor4git"
118
"golang.org/x/oauth2"
129
)
1310

14-
type GitHubVendor struct{}
11+
type gitHubVendor struct {
12+
accessToken string
13+
}
14+
15+
func NewGitHubVendor(accessToken string) vendor4git.Vendor {
16+
return &gitHubVendor{accessToken: accessToken}
17+
}
1518

16-
func (GitHubVendor) CreateRepo(ctx context.Context, name string, org string, private bool) (*Repository, error) {
19+
func (x *gitHubVendor) CreateRepo(ctx context.Context, name string, owner string, private bool) (*vendor4git.Repository, error) {
1720

1821
ts := oauth2.StaticTokenSource(
19-
&oauth2.Token{AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN")}, //XXX
22+
&oauth2.Token{AccessToken: x.accessToken},
2023
)
2124
tc := oauth2.NewClient(ctx, ts)
2225
client := github.NewClient(tc)
@@ -25,15 +28,34 @@ func (GitHubVendor) CreateRepo(ctx context.Context, name string, org string, pri
2528
Name: github.String(name),
2629
Private: github.Bool(private),
2730
}
28-
repo, _, err := client.Repositories.Create(ctx, org, repo)
29-
must.NoError(ctx, err) //XXX
31+
repo, _, err := client.Repositories.Create(ctx, owner, repo)
32+
errResp, ok := err.(*github.ErrorResponse)
33+
if ok && errResp.Response.StatusCode == 422 {
34+
return nil, vendor4git.ErrRepoExists
35+
}
36+
if err != nil {
37+
return nil, err
38+
}
3039

3140
return &vendor4git.Repository{
3241
HTTPSURL: repo.GetCloneURL(),
3342
SSHURL: repo.GetSSHURL(),
3443
}, nil
3544
}
3645

37-
func (GitHubVendor) RemoveRepo(name string, org string) error {
38-
panic("XXX")
46+
func (x *gitHubVendor) RemoveRepo(ctx context.Context, name string, owner string) error {
47+
48+
ts := oauth2.StaticTokenSource(
49+
&oauth2.Token{AccessToken: x.accessToken},
50+
)
51+
tc := oauth2.NewClient(ctx, ts)
52+
client := github.NewClient(tc)
53+
54+
_, err := client.Repositories.Delete(ctx, owner, name)
55+
ghErr, ok := err.(*github.ErrorResponse)
56+
if ghErr != nil && ok && ghErr.Response.StatusCode == 404 {
57+
return vendor4git.ErrRepoNotFound
58+
}
59+
60+
return err
3961
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func main() {
2424
Private: github.Bool(true),
2525
}
2626
repo, _, err := client.Repositories.Create(ctx, "", repo)
27+
fmt.Printf("err=%v | type=%T", err, err)
2728
must.NoError(ctx, err)
2829

2930
fmt.Printf("HTMLURL: %v\n", repo.GetHTMLURL())

github/test_remove/remove.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"os"
7+
8+
"github.com/google/go-github/v53/github"
9+
"golang.org/x/oauth2"
10+
)
11+
12+
func main() {
13+
ctx := context.Background()
14+
15+
ts := oauth2.StaticTokenSource(
16+
&oauth2.Token{AccessToken: os.Getenv("GITHUB_ACCESS_TOKEN")},
17+
)
18+
tc := oauth2.NewClient(ctx, ts)
19+
client := github.NewClient(tc)
20+
21+
_, err := client.Repositories.Delete(ctx, "petar", "xxx1")
22+
ghErr, ok := err.(*github.ErrorResponse)
23+
if ghErr != nil && ok && ghErr.Response.StatusCode == 404 {
24+
fmt.Println("repo not found")
25+
return
26+
}
27+
fmt.Printf("err: %v | type: %T\n", err, err)
28+
}

vendor.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,21 @@ package vendor4git
22

33
import (
44
"context"
5+
"fmt"
56
)
67

78
// Vendor creates and administers git repositories.
89
type Vendor interface {
9-
CreateRepo(ctx context.Context, name string, org string, private bool) (*Repository, error)
10-
RemoveRepo(ctx context.Context, name string, org string) error
10+
CreateRepo(ctx context.Context, name string, owner string, private bool) (*Repository, error)
11+
RemoveRepo(ctx context.Context, name string, owner string) error
1112
}
1213

1314
type Repository struct {
14-
HTTPSURL *string `json:"https_url,omitempty"` // e.g. https://github.com/user/repo.git
15-
SSHURL *string `json:"ssh_url,omitempty"` // e.g. git@github.com:user/repo.git
15+
HTTPSURL string `json:"https_url,omitempty"` // e.g. https://github.com/user/repo.git
16+
SSHURL string `json:"ssh_url,omitempty"` // e.g. git@github.com:user/repo.git
1617
}
18+
19+
var (
20+
ErrRepoExists = fmt.Errorf("repo already exists")
21+
ErrRepoNotFound = fmt.Errorf("repo not found")
22+
)

0 commit comments

Comments
 (0)