105 lines
1.9 KiB
Go
105 lines
1.9 KiB
Go
package ext
|
|
|
|
import (
|
|
"log"
|
|
"regexp"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/imroc/req/v3"
|
|
)
|
|
|
|
type gitbucket struct {
|
|
*req.Client
|
|
}
|
|
|
|
func NewGitBucket(base, token string) *gitbucket {
|
|
headers := map[string]string{
|
|
"Accept": "application/vnd.github+json",
|
|
"Authorization": "Token " + token,
|
|
"X-GitHub-Api-Version": "2022-11-28",
|
|
"Content-Type": "application/json",
|
|
}
|
|
|
|
client := NewClient().
|
|
SetTimeout(5 * time.Second).
|
|
SetCommonHeaders(headers).
|
|
SetBaseURL(base)
|
|
return &gitbucket{
|
|
client,
|
|
}
|
|
}
|
|
|
|
type Repo struct {
|
|
Name string `json:"name"`
|
|
FullName string `json:"full_name"`
|
|
Private bool `json:"private"`
|
|
Url string `json:"url"`
|
|
CloneUrl string `json:"clone_url"`
|
|
HtmlUrl string `json:"Html_url"`
|
|
SshUrl string `json:"ssh_url"`
|
|
}
|
|
|
|
func gitHubLikeNaming(input string) string {
|
|
// Remove leading and trailing whitespace
|
|
input = strings.TrimSpace(input)
|
|
|
|
// Replace non-Latin letters with spaces
|
|
reg := regexp.MustCompile("[^a-zA-Z]+")
|
|
input = reg.ReplaceAllString(input, " ")
|
|
|
|
// Split into words and capitalize first letter of each
|
|
words := strings.Fields(input)
|
|
for i, word := range words {
|
|
words[i] = strings.ToLower(word)
|
|
}
|
|
|
|
// Join words and return
|
|
return strings.Join(words, "-")
|
|
}
|
|
|
|
func (gb *gitbucket) NewRepo(name string) (*Repo, error) {
|
|
name = gitHubLikeNaming(name)
|
|
|
|
type request struct {
|
|
Name string `json:"name"`
|
|
Private bool `json:"private"`
|
|
}
|
|
|
|
payload := request{
|
|
Name: name,
|
|
Private: false,
|
|
}
|
|
|
|
var git Repo
|
|
|
|
resp, err := gb.R().
|
|
SetBody(&payload).
|
|
SetSuccessResult(&git).
|
|
Post("/user/repos")
|
|
|
|
if err != nil {
|
|
log.Print(resp)
|
|
return nil, err
|
|
}
|
|
|
|
type permissionRequest struct {
|
|
Perm string `json:"permission"`
|
|
}
|
|
|
|
payloadPermission := permissionRequest{
|
|
Perm: "admin",
|
|
}
|
|
|
|
resp, err = gb.R().
|
|
SetBody(&payloadPermission).
|
|
Put("/repos/naudachu/" + name + "/collaborators/apps")
|
|
|
|
if err != nil {
|
|
log.Print(resp)
|
|
return nil, err
|
|
}
|
|
|
|
return &git, err
|
|
}
|