|
|
|
@ -3,6 +3,7 @@ package gitea
|
|
|
|
|
import ( |
|
|
|
|
"code.gitea.io/gitea/modules/structs" |
|
|
|
|
"code.gitea.io/sdk/gitea" |
|
|
|
|
"fmt" |
|
|
|
|
"log" |
|
|
|
|
"net/url" // to check URL init vars
|
|
|
|
|
"reflect" // to compare structs
|
|
|
|
@ -10,21 +11,31 @@ import (
|
|
|
|
|
|
|
|
|
|
// Gitea holds the gitea functionality config vars
|
|
|
|
|
type Gitea struct { |
|
|
|
|
GiteaURL, Token, CloneAddr, WebhookRepoURL, WebhookRepoSecret, WebhookURL, WebhookSecret, Repo string |
|
|
|
|
giteaURL string |
|
|
|
|
token string |
|
|
|
|
cloneAddr string |
|
|
|
|
webhookRepoURL string |
|
|
|
|
webhookRepoSecret string |
|
|
|
|
webhookURL string |
|
|
|
|
webhookSecret string |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type Repo struct { |
|
|
|
|
user string |
|
|
|
|
repo string |
|
|
|
|
cloneAddr string |
|
|
|
|
webhookRepoURL string |
|
|
|
|
webhookRepoSecret string |
|
|
|
|
client *gitea.Client |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func isValidURL(toTest string) bool { |
|
|
|
|
_, err := url.ParseRequestURI(toTest) |
|
|
|
|
if err != nil { |
|
|
|
|
return false |
|
|
|
|
} else { |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
return err == nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Init gitea config vars
|
|
|
|
|
func Init(giteaURL, token, cloneAddr, webhookRepoURL, webhookRepoSecret, webhookURL, webhookSecret string) *Gitea { |
|
|
|
|
|
|
|
|
|
// check URL values
|
|
|
|
|
if !isValidURL(giteaURL) || !isValidURL(cloneAddr) || !isValidURL(webhookRepoURL) || !isValidURL(webhookURL) { |
|
|
|
|
giteaURL = "" // to avoid process
|
|
|
|
@ -32,26 +43,34 @@ func Init(giteaURL, token, cloneAddr, webhookRepoURL, webhookRepoSecret, webhook
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return &Gitea{ |
|
|
|
|
GiteaURL: giteaURL, |
|
|
|
|
Token: token, |
|
|
|
|
CloneAddr: cloneAddr, |
|
|
|
|
WebhookRepoURL: webhookRepoURL, |
|
|
|
|
WebhookRepoSecret: webhookRepoSecret, |
|
|
|
|
WebhookURL: webhookURL, |
|
|
|
|
WebhookSecret: webhookSecret, |
|
|
|
|
giteaURL: giteaURL, |
|
|
|
|
token: token, |
|
|
|
|
cloneAddr: cloneAddr, |
|
|
|
|
webhookRepoURL: webhookRepoURL, |
|
|
|
|
webhookRepoSecret: webhookRepoSecret, |
|
|
|
|
webhookURL: webhookURL, |
|
|
|
|
webhookSecret: webhookSecret, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func GiteaNewClient(giteaURL, token string) *gitea.Client { |
|
|
|
|
client := gitea.NewClient(giteaURL, token) |
|
|
|
|
return client |
|
|
|
|
|
|
|
|
|
func (g *Gitea) Repo(user string, repo string) (*Repo, error) { |
|
|
|
|
if g.giteaURL == "" || g.token == "" || g.webhookRepoSecret == "" || g.webhookSecret == "" { |
|
|
|
|
return nil, fmt.Errorf("Gitea config isn't right, some fields are empty.") |
|
|
|
|
} |
|
|
|
|
return &Repo{ |
|
|
|
|
user: user, |
|
|
|
|
repo: repo, |
|
|
|
|
cloneAddr: g.cloneAddr, |
|
|
|
|
webhookRepoURL: g.webhookRepoURL, |
|
|
|
|
webhookRepoSecret: g.webhookRepoSecret, |
|
|
|
|
client: gitea.NewClient(g.giteaURL, g.token), |
|
|
|
|
}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func GiteaUserID(user string, client *gitea.Client) (int, error) { |
|
|
|
|
// check users exists and return user id
|
|
|
|
|
userexist, err := client.SearchUsers(user, 1) |
|
|
|
|
// userID check users exists and return user id
|
|
|
|
|
func (r *Repo) userID() (int, error) { |
|
|
|
|
userexist, err := r.client.SearchUsers(r.user, 1) |
|
|
|
|
if err != nil { |
|
|
|
|
return -1, err |
|
|
|
|
} |
|
|
|
@ -64,70 +83,64 @@ func GiteaUserID(user string, client *gitea.Client) (int, error) {
|
|
|
|
|
return uid, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func RepoExists(user string, repo string, client *gitea.Client) bool { |
|
|
|
|
// check repo exists.
|
|
|
|
|
repoexists, err := client.GetRepo(user, repo) |
|
|
|
|
// Exists checks if the repo exists.
|
|
|
|
|
func (r *Repo) Exists() bool { |
|
|
|
|
repoexists, err := r.client.GetRepo(r.user, r.repo) |
|
|
|
|
if err != nil && err.Error() != "404 Not Found" { |
|
|
|
|
return false |
|
|
|
|
} |
|
|
|
|
// (API responses with empty repo if doesn't exist.)
|
|
|
|
|
emptyrepo := &gitea.Repository{} |
|
|
|
|
if reflect.DeepEqual(repoexists, emptyrepo) == true { |
|
|
|
|
return false |
|
|
|
|
} else { |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
return !reflect.DeepEqual(repoexists, emptyrepo) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Delete the repo
|
|
|
|
|
func (r *Repo) Delete() error { |
|
|
|
|
return r.client.DeleteRepo(r.user, r.repo) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func RepoDelete(user string, repo string, client *gitea.Client) error { |
|
|
|
|
// delete repo
|
|
|
|
|
err := client.DeleteRepo(user, repo) |
|
|
|
|
// Migrate template repo to new user repo
|
|
|
|
|
func (r *Repo) Migrate() error { |
|
|
|
|
uid, err := r.userID() |
|
|
|
|
if err != nil { |
|
|
|
|
log.Printf("Error on delete repo.") |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func RepoMigrate(cloneAddr string, uid int, repo string, client *gitea.Client) error { |
|
|
|
|
// migrate template repo to new user repo
|
|
|
|
|
migrateRepoOption := structs.MigrateRepoOption{CloneAddr: cloneAddr, |
|
|
|
|
migrateRepoOption := structs.MigrateRepoOption{ |
|
|
|
|
CloneAddr: r.cloneAddr, |
|
|
|
|
Description: "Basic hugo site repo", |
|
|
|
|
UID: uid, |
|
|
|
|
RepoName: repo, |
|
|
|
|
RepoName: r.repo, |
|
|
|
|
Private: true} |
|
|
|
|
|
|
|
|
|
_, err := client.MigrateRepo(migrateRepoOption) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
_, err = r.client.MigrateRepo(migrateRepoOption) |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func RepoDeployKey(keypub, user, repo string, client *gitea.Client) error { |
|
|
|
|
// put a deploy key on user repo
|
|
|
|
|
// DeployKey put a deploy key on the user repo
|
|
|
|
|
func (r *Repo) DeployKey(keypub string) error { |
|
|
|
|
deployKeyOption := structs.CreateKeyOption{ |
|
|
|
|
Key: keypub, |
|
|
|
|
ReadOnly: true, |
|
|
|
|
Title: "Web deploy key"} |
|
|
|
|
_, err := client.CreateDeployKey(user, repo, deployKeyOption) |
|
|
|
|
_, err := r.client.CreateDeployKey(r.user, r.repo, deployKeyOption) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func RepoCreateWebhook(webhookRepoURL, webhookRepoSecret, user, repo string, client *gitea.Client) error { |
|
|
|
|
// create a webhook on user repo
|
|
|
|
|
// CreateWebhook create a webhook on the user repo
|
|
|
|
|
func (r *Repo) CreateWebhook() error { |
|
|
|
|
webHookOption := structs.CreateHookOption{ |
|
|
|
|
Active: true, |
|
|
|
|
Config: map[string]string{"content_type": "json", |
|
|
|
|
"url": webhookRepoURL, |
|
|
|
|
"secret": webhookRepoSecret}, |
|
|
|
|
"url": r.webhookRepoURL, |
|
|
|
|
"secret": r.webhookRepoSecret}, |
|
|
|
|
Events: []string{"push"}, |
|
|
|
|
Type: "gitea"} |
|
|
|
|
|
|
|
|
|
_, err := client.CreateRepoHook(user, repo, webHookOption) |
|
|
|
|
_, err := r.client.CreateRepoHook(r.user, r.repo, webHookOption) |
|
|
|
|
// TODO: <nil> no vale pa na
|
|
|
|
|
if err != nil && err.Error() != "<nil>" { |
|
|
|
|
log.Printf("API Error on migrate.") |
|
|
|
|