mirror of
https://github.com/woodpecker-ci/woodpecker.git
synced 2025-04-26 21:44:44 +00:00
Merge pull request #866 from ulrichSchreiner/delrepo
Delete Repository in Drone DB
This commit is contained in:
commit
baecced414
11 changed files with 204 additions and 8 deletions
30
cli/delete.go
Normal file
30
cli/delete.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
|
"github.com/drone/drone/client"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewDeleteCommand returns the CLI command for "delete".
|
||||||
|
func NewDeleteCommand() cli.Command {
|
||||||
|
return cli.Command{
|
||||||
|
Name: "delete",
|
||||||
|
Usage: "delete a repository",
|
||||||
|
Flags: []cli.Flag{},
|
||||||
|
Action: func(c *cli.Context) {
|
||||||
|
handle(c, deleteCommandFunc)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// deleteCommandFunc executes the "delete" command.
|
||||||
|
func deleteCommandFunc(c *cli.Context, client *client.Client) error {
|
||||||
|
var host, owner, name string
|
||||||
|
var args = c.Args()
|
||||||
|
|
||||||
|
if len(args) != 0 {
|
||||||
|
host, owner, name = parseRepo(args[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
return client.Repos.Delete(host, owner, name)
|
||||||
|
}
|
|
@ -1,8 +1,9 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/codegangsta/cli"
|
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"github.com/codegangsta/cli"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -40,6 +41,7 @@ func main() {
|
||||||
NewRestartCommand(),
|
NewRestartCommand(),
|
||||||
NewWhoamiCommand(),
|
NewWhoamiCommand(),
|
||||||
NewSetKeyCommand(),
|
NewSetKeyCommand(),
|
||||||
|
NewDeleteCommand(),
|
||||||
}
|
}
|
||||||
|
|
||||||
app.Run(os.Args)
|
app.Run(os.Args)
|
||||||
|
|
|
@ -32,8 +32,14 @@ func (s *RepoService) Enable(host, owner, name string) error {
|
||||||
return s.run("POST", path, nil, nil)
|
return s.run("POST", path, nil, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DELETE /api/repos/{host}/{owner}/{name}
|
// POST /api/repos/{host}/{owner}/{name}/deactivate
|
||||||
func (s *RepoService) Disable(host, owner, name string) error {
|
func (s *RepoService) Disable(host, owner, name string) error {
|
||||||
|
var path = fmt.Sprintf("/api/repos/%s/%s/%s/deactivate", host, owner, name)
|
||||||
|
return s.run("POST", path, nil, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DELETE /api/repos/{host}/{owner}/{name}?remove=true
|
||||||
|
func (s *RepoService) Delete(host, owner, name string) error {
|
||||||
var path = fmt.Sprintf("/api/repos/%s/%s/%s", host, owner, name)
|
var path = fmt.Sprintf("/api/repos/%s/%s/%s", host, owner, name)
|
||||||
return s.run("DELETE", path, nil, nil)
|
return s.run("DELETE", path, nil, nil)
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,6 +241,25 @@ func (r *Bitbucket) Activate(user *model.User, repo *model.Repo, link string) er
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deactivate removes a repository by removing all the post-commit hooks
|
||||||
|
// which are equal to link and removing the SSH deploy key.
|
||||||
|
func (r *Bitbucket) Deactivate(user *model.User, repo *model.Repo, link string) error {
|
||||||
|
var client = bitbucket.New(
|
||||||
|
r.Client,
|
||||||
|
r.Secret,
|
||||||
|
user.Access,
|
||||||
|
user.Secret,
|
||||||
|
)
|
||||||
|
title, err := GetKeyTitle(link)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := client.RepoKeys.DeleteName(repo.Owner, repo.Name, title); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return client.Brokers.DeleteUrl(repo.Owner, repo.Name, link, bitbucket.BrokerTypePost)
|
||||||
|
}
|
||||||
|
|
||||||
// ParseHook parses the post-commit hook from the Request body
|
// ParseHook parses the post-commit hook from the Request body
|
||||||
// and returns the required data in a standard format.
|
// and returns the required data in a standard format.
|
||||||
func (r *Bitbucket) ParseHook(req *http.Request) (*model.Hook, error) {
|
func (r *Bitbucket) ParseHook(req *http.Request) (*model.Hook, error) {
|
||||||
|
@ -279,3 +298,13 @@ func (r *Bitbucket) OpenRegistration() bool {
|
||||||
func (r *Bitbucket) GetToken(user *model.User) (*model.Token, error) {
|
func (r *Bitbucket) GetToken(user *model.User) (*model.Token, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetKeyTitle is a helper function that generates a title for the
|
||||||
|
// RSA public key based on the username and domain name.
|
||||||
|
func GetKeyTitle(rawurl string) (string, error) {
|
||||||
|
var uri, err = url.Parse(rawurl)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("drone@%s", uri.Host), nil
|
||||||
|
}
|
||||||
|
|
|
@ -193,6 +193,23 @@ func (r *GitHub) GetScript(user *model.User, repo *model.Repo, hook *model.Hook)
|
||||||
return GetFile(client, repo.Owner, repo.Name, ".drone.yml", hook.Sha)
|
return GetFile(client, repo.Owner, repo.Name, ".drone.yml", hook.Sha)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deactivate removes a repository by removing all the post-commit hooks
|
||||||
|
// which are equal to link and removing the SSH deploy key.
|
||||||
|
func (r *GitHub) Deactivate(user *model.User, repo *model.Repo, link string) error {
|
||||||
|
var client = NewClient(r.API, user.Access, r.SkipVerify)
|
||||||
|
var title, err = GetKeyTitle(link)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove the deploy-key if it is installed remote.
|
||||||
|
if err := DeleteKey(client, repo.Owner, repo.Name, title, repo.PublicKey); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return DeleteHook(client, repo.Owner, repo.Name, link)
|
||||||
|
}
|
||||||
|
|
||||||
// Activate activates a repository by adding a Post-commit hook and
|
// Activate activates a repository by adding a Post-commit hook and
|
||||||
// a Public Deploy key, if applicable.
|
// a Public Deploy key, if applicable.
|
||||||
func (r *GitHub) Activate(user *model.User, repo *model.Repo, link string) error {
|
func (r *GitHub) Activate(user *model.User, repo *model.Repo, link string) error {
|
||||||
|
|
|
@ -173,6 +173,16 @@ func GetHook(client *github.Client, owner, name, url string) (*github.Hook, erro
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeleteHook(client *github.Client, owner, name, url string) error {
|
||||||
|
hook, err := GetHook(client, owner, name, url)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = client.Repositories.DeleteHook(owner, name, *hook.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// CreateHook is a heper function that creates a post-commit hook
|
// CreateHook is a heper function that creates a post-commit hook
|
||||||
// for the specified repository.
|
// for the specified repository.
|
||||||
func CreateHook(client *github.Client, owner, name, url string) (*github.Hook, error) {
|
func CreateHook(client *github.Client, owner, name, url string) (*github.Hook, error) {
|
||||||
|
@ -230,7 +240,18 @@ func GetKeyTitle(rawurl string) (string, error) {
|
||||||
return fmt.Sprintf("drone@%s", uri.Host), nil
|
return fmt.Sprintf("drone@%s", uri.Host), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateKey is a heper function that creates a deploy key
|
// DeleteKey is a helper function that deletes a deploy key
|
||||||
|
// for the specified repository.
|
||||||
|
func DeleteKey(client *github.Client, owner, name, title, key string) error {
|
||||||
|
var k, err = GetKey(client, owner, name, title)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = client.Repositories.DeleteKey(owner, name, *k.ID)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateKey is a helper function that creates a deploy key
|
||||||
// for the specified repository.
|
// for the specified repository.
|
||||||
func CreateKey(client *github.Client, owner, name, title, key string) (*github.Key, error) {
|
func CreateKey(client *github.Client, owner, name, title, key string) (*github.Key, error) {
|
||||||
var k = new(github.Key)
|
var k = new(github.Key)
|
||||||
|
@ -240,7 +261,7 @@ func CreateKey(client *github.Client, owner, name, title, key string) (*github.K
|
||||||
return created, err
|
return created, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// CreateUpdateKey is a heper function that creates a deployment key
|
// CreateUpdateKey is a helper function that creates a deployment key
|
||||||
// for the specified repository if it does not already exist, otherwise
|
// for the specified repository if it does not already exist, otherwise
|
||||||
// it updates the existing key
|
// it updates the existing key
|
||||||
func CreateUpdateKey(client *github.Client, owner, name, title, key string) (*github.Key, error) {
|
func CreateUpdateKey(client *github.Client, owner, name, title, key string) (*github.Key, error) {
|
||||||
|
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.google.com/p/goauth2/oauth"
|
"code.google.com/p/goauth2/oauth"
|
||||||
|
@ -179,6 +180,41 @@ func (r *Gitlab) Activate(user *model.User, repo *model.Repo, link string) error
|
||||||
return client.AddProjectHook(path, link, true, false, true)
|
return client.AddProjectHook(path, link, true, false, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deactivate removes a repository by removing all the post-commit hooks
|
||||||
|
// which are equal to link and removing the SSH deploy key.
|
||||||
|
func (r *Gitlab) Deactivate(user *model.User, repo *model.Repo, link string) error {
|
||||||
|
var client = NewClient(r.url, user.Access, r.SkipVerify)
|
||||||
|
var path = ns(repo.Owner, repo.Name)
|
||||||
|
|
||||||
|
keys, err := client.ProjectDeployKeys(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
var pubkey = strings.TrimSpace(repo.PublicKey)
|
||||||
|
for _, k := range keys {
|
||||||
|
if pubkey == strings.TrimSpace(k.Key) {
|
||||||
|
if err := client.RemoveProjectDeployKey(path, strconv.Itoa(k.Id)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hooks, err := client.ProjectHooks(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
link += "?owner=" + repo.Owner + "&name=" + repo.Name
|
||||||
|
for _, h := range hooks {
|
||||||
|
if link == h.Url {
|
||||||
|
if err := client.RemoveProjectHook(path, strconv.Itoa(h.Id)); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// ParseHook parses the post-commit hook from the Request body
|
// ParseHook parses the post-commit hook from the Request body
|
||||||
// and returns the required data in a standard format.
|
// and returns the required data in a standard format.
|
||||||
func (r *Gitlab) ParseHook(req *http.Request) (*model.Hook, error) {
|
func (r *Gitlab) ParseHook(req *http.Request) (*model.Hook, error) {
|
||||||
|
|
|
@ -153,6 +153,12 @@ func (r *Gogs) Activate(user *model.User, repo *model.Repo, link string) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deactivate removes a repository by removing all the post-commit hooks
|
||||||
|
// which are equal to link and removing the SSH deploy key.
|
||||||
|
func (r *Gogs) Deactivate(user *model.User, repo *model.Repo, link string) error {
|
||||||
|
return fmt.Errorf("Remove %#v in gogs not implemented", *repo)
|
||||||
|
}
|
||||||
|
|
||||||
// ParseHook parses the post-commit hook from the Request body
|
// ParseHook parses the post-commit hook from the Request body
|
||||||
// and returns the required data in a standard format.
|
// and returns the required data in a standard format.
|
||||||
func (r *Gogs) ParseHook(req *http.Request) (*model.Hook, error) {
|
func (r *Gogs) ParseHook(req *http.Request) (*model.Hook, error) {
|
||||||
|
|
|
@ -29,6 +29,10 @@ type Remote interface {
|
||||||
// adding the SSH deploy key, if applicable.
|
// adding the SSH deploy key, if applicable.
|
||||||
Activate(user *model.User, repo *model.Repo, link string) error
|
Activate(user *model.User, repo *model.Repo, link string) error
|
||||||
|
|
||||||
|
// Deactivate removes a repository by removing all the post-commit hooks
|
||||||
|
// which are equal to link and removing the SSH deploy key.
|
||||||
|
Deactivate(user *model.User, repo *model.Repo, link string) error
|
||||||
|
|
||||||
// ParseHook parses the post-commit hook from the Request body
|
// ParseHook parses the post-commit hook from the Request body
|
||||||
// and returns the required data in a standard format.
|
// and returns the required data in a standard format.
|
||||||
ParseHook(r *http.Request) (*model.Hook, error)
|
ParseHook(r *http.Request) (*model.Hook, error)
|
||||||
|
|
|
@ -3,6 +3,7 @@ package handler
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/drone/drone/plugin/remote"
|
"github.com/drone/drone/plugin/remote"
|
||||||
|
@ -42,9 +43,8 @@ func GetRepo(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||||
}{repo, repo.PublicKey, repo.Params, role})
|
}{repo, repo.PublicKey, repo.Params, role})
|
||||||
}
|
}
|
||||||
|
|
||||||
// DelRepo accepts a request to inactivate the named
|
// DelRepo accepts a request to delete the named
|
||||||
// repository. This will disable all builds in the system
|
// repository.
|
||||||
// for this repository.
|
|
||||||
//
|
//
|
||||||
// DEL /api/repos/:host/:owner/:name
|
// DEL /api/repos/:host/:owner/:name
|
||||||
//
|
//
|
||||||
|
@ -52,6 +52,50 @@ func DelRepo(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||||
var ctx = context.FromC(c)
|
var ctx = context.FromC(c)
|
||||||
var repo = ToRepo(c)
|
var repo = ToRepo(c)
|
||||||
|
|
||||||
|
// completely remove the repository from the database
|
||||||
|
var user = ToUser(c)
|
||||||
|
var remote = remote.Lookup(repo.Host)
|
||||||
|
if remote == nil {
|
||||||
|
log.Printf("[ERROR] no remote for host '%s' found", repo.Host)
|
||||||
|
} else {
|
||||||
|
// Request a new token and update
|
||||||
|
user_token, err := remote.GetToken(user)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("[ERROR] no token for user '%s' on remote '%s' ", user.Email, repo.Host)
|
||||||
|
} else {
|
||||||
|
if user_token != nil {
|
||||||
|
user.Access = user_token.AccessToken
|
||||||
|
user.Secret = user_token.RefreshToken
|
||||||
|
user.TokenExpiry = user_token.Expiry
|
||||||
|
datastore.PutUser(ctx, user)
|
||||||
|
}
|
||||||
|
// setup the post-commit hook with the remote system and
|
||||||
|
// and deactiveate this hook/user on the remote system
|
||||||
|
var hook = fmt.Sprintf("%s/api/hook/%s/%s", httputil.GetURL(r), repo.Remote, repo.Token)
|
||||||
|
if err := remote.Deactivate(user, repo, hook); err != nil {
|
||||||
|
log.Printf("[ERROR] deactivate on remote '%s' failed: %s", repo.Host, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// fail through: if any of the actions on the remote failed
|
||||||
|
// we try to delete the repo in our datastore anyway
|
||||||
|
if err := datastore.DelRepo(ctx, repo); err != nil {
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
} else {
|
||||||
|
w.WriteHeader(http.StatusNoContent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeactivateRepo accepts a request to deactivate the named
|
||||||
|
// repository. This will disable all builds in the system
|
||||||
|
// for this repository.
|
||||||
|
//
|
||||||
|
// POST /api/repos/:host/:owner/:name/deactivate
|
||||||
|
//
|
||||||
|
func DeactivateRepo(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||||
|
var ctx = context.FromC(c)
|
||||||
|
var repo = ToRepo(c)
|
||||||
|
|
||||||
// disable everything
|
// disable everything
|
||||||
repo.Active = false
|
repo.Active = false
|
||||||
repo.PullRequest = false
|
repo.PullRequest = false
|
||||||
|
@ -62,7 +106,7 @@ func DelRepo(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||||
w.WriteHeader(http.StatusInternalServerError)
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
w.WriteHeader(http.StatusNoContent)
|
json.NewEncoder(w).Encode(repo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// PostRepo accapets a request to activate the named repository
|
// PostRepo accapets a request to activate the named repository
|
||||||
|
|
|
@ -46,6 +46,7 @@ func New() *web.Mux {
|
||||||
repos.Put("/api/repos/:host/:owner/:name", handler.PutRepo)
|
repos.Put("/api/repos/:host/:owner/:name", handler.PutRepo)
|
||||||
repos.Post("/api/repos/:host/:owner/:name", handler.PostRepo)
|
repos.Post("/api/repos/:host/:owner/:name", handler.PostRepo)
|
||||||
repos.Delete("/api/repos/:host/:owner/:name", handler.DelRepo)
|
repos.Delete("/api/repos/:host/:owner/:name", handler.DelRepo)
|
||||||
|
repos.Post("/api/repos/:host/:owner/:name/deactivate", handler.DeactivateRepo)
|
||||||
mux.Handle("/api/repos/:host/:owner/:name", repos)
|
mux.Handle("/api/repos/:host/:owner/:name", repos)
|
||||||
mux.Handle("/api/repos/:host/:owner/:name/*", repos)
|
mux.Handle("/api/repos/:host/:owner/:name/*", repos)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue