2014-06-04 21:25:38 +00:00
|
|
|
package handler
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"net/http"
|
|
|
|
|
2015-01-26 23:32:42 +00:00
|
|
|
"github.com/drone/drone/plugin/remote"
|
2014-09-29 01:36:24 +00:00
|
|
|
"github.com/drone/drone/server/datastore"
|
2014-09-29 03:21:02 +00:00
|
|
|
"github.com/drone/drone/server/worker"
|
|
|
|
"github.com/drone/drone/shared/httputil"
|
|
|
|
"github.com/drone/drone/shared/model"
|
2014-09-29 01:36:24 +00:00
|
|
|
"github.com/goji/context"
|
|
|
|
"github.com/zenazn/goji/web"
|
2014-06-04 21:25:38 +00:00
|
|
|
)
|
|
|
|
|
2014-09-29 01:36:24 +00:00
|
|
|
// GetCommitList accepts a request to retrieve a list
|
|
|
|
// of recent commits by Repo, and retur in JSON format.
|
|
|
|
//
|
2015-02-13 20:37:21 +00:00
|
|
|
// GET /api/repos/:host/:owner/:name/commits?limit=:limit&offset=:offset
|
2014-09-29 01:36:24 +00:00
|
|
|
//
|
|
|
|
func GetCommitList(c web.C, w http.ResponseWriter, r *http.Request) {
|
|
|
|
var ctx = context.FromC(c)
|
|
|
|
var repo = ToRepo(c)
|
2015-02-13 20:37:21 +00:00
|
|
|
var limit = ToLimit(r)
|
|
|
|
var offset = ToOffset(r)
|
2014-06-04 21:25:38 +00:00
|
|
|
|
2015-02-13 20:37:21 +00:00
|
|
|
commits, err := datastore.GetCommitList(ctx, repo, limit, offset)
|
2014-06-04 21:25:38 +00:00
|
|
|
if err != nil {
|
2014-09-29 01:36:24 +00:00
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
return
|
2014-06-04 21:25:38 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 01:36:24 +00:00
|
|
|
json.NewEncoder(w).Encode(commits)
|
2014-06-04 21:25:38 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 01:36:24 +00:00
|
|
|
// GetCommit accepts a request to retrieve a commit
|
|
|
|
// from the datastore for the given repository, branch and
|
|
|
|
// commit hash.
|
|
|
|
//
|
|
|
|
// GET /api/repos/:host/:owner/:name/branches/:branch/commits/:commit
|
|
|
|
//
|
|
|
|
func GetCommit(c web.C, w http.ResponseWriter, r *http.Request) {
|
|
|
|
var ctx = context.FromC(c)
|
|
|
|
var (
|
|
|
|
branch = c.URLParams["branch"]
|
|
|
|
hash = c.URLParams["commit"]
|
|
|
|
repo = ToRepo(c)
|
|
|
|
)
|
|
|
|
|
|
|
|
commit, err := datastore.GetCommitSha(ctx, repo, branch, hash)
|
2014-06-04 21:25:38 +00:00
|
|
|
if err != nil {
|
2014-09-29 01:36:24 +00:00
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
return
|
2014-06-04 21:25:38 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 01:36:24 +00:00
|
|
|
json.NewEncoder(w).Encode(commit)
|
2014-06-04 21:25:38 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 03:21:02 +00:00
|
|
|
// PostHook accepts a post-commit hook and parses the payload
|
|
|
|
// in order to trigger a build. The payload is specified to the
|
|
|
|
// remote system (ie GitHub) and will therefore get parsed by
|
|
|
|
// the appropriate remote plugin.
|
|
|
|
//
|
|
|
|
// POST /api/repos/{host}/{owner}/{name}/branches/{branch}/commits/{commit}
|
|
|
|
//
|
|
|
|
func PostCommit(c web.C, w http.ResponseWriter, r *http.Request) {
|
|
|
|
var ctx = context.FromC(c)
|
|
|
|
var (
|
|
|
|
branch = c.URLParams["branch"]
|
|
|
|
hash = c.URLParams["commit"]
|
2015-01-26 23:32:42 +00:00
|
|
|
host = c.URLParams["host"]
|
2014-09-29 03:21:02 +00:00
|
|
|
repo = ToRepo(c)
|
2015-01-26 23:32:42 +00:00
|
|
|
remote = remote.Lookup(host)
|
2014-09-29 03:21:02 +00:00
|
|
|
)
|
2014-06-12 00:42:49 +00:00
|
|
|
|
2014-09-29 03:21:02 +00:00
|
|
|
commit, err := datastore.GetCommitSha(ctx, repo, branch, hash)
|
2014-06-12 00:42:49 +00:00
|
|
|
if err != nil {
|
2014-09-29 03:21:02 +00:00
|
|
|
w.WriteHeader(http.StatusNotFound)
|
|
|
|
return
|
2014-06-12 00:42:49 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 03:21:02 +00:00
|
|
|
if commit.Status == model.StatusStarted ||
|
|
|
|
commit.Status == model.StatusEnqueue {
|
|
|
|
w.WriteHeader(http.StatusConflict)
|
|
|
|
return
|
2014-06-12 00:42:49 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 03:21:02 +00:00
|
|
|
commit.Status = model.StatusEnqueue
|
|
|
|
commit.Started = 0
|
|
|
|
commit.Finished = 0
|
|
|
|
commit.Duration = 0
|
|
|
|
if err := datastore.PutCommit(ctx, commit); err != nil {
|
|
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
|
|
return
|
2014-06-12 00:42:49 +00:00
|
|
|
}
|
|
|
|
|
2014-09-29 03:21:02 +00:00
|
|
|
owner, err := datastore.GetUser(ctx, repo.UserID)
|
2014-08-14 19:44:36 +00:00
|
|
|
if err != nil {
|
2014-09-29 03:21:02 +00:00
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
|
|
return
|
2014-08-14 19:44:36 +00:00
|
|
|
}
|
|
|
|
|
2015-01-26 23:32:42 +00:00
|
|
|
// Request a new token and update
|
|
|
|
user_token, err := remote.GetToken(owner)
|
|
|
|
if user_token != nil {
|
|
|
|
owner.Access = user_token.AccessToken
|
|
|
|
owner.Secret = user_token.RefreshToken
|
2015-01-27 22:42:20 +00:00
|
|
|
owner.TokenExpiry = user_token.Expiry
|
2015-01-26 23:32:42 +00:00
|
|
|
datastore.PutUser(ctx, owner)
|
|
|
|
} else if err != nil {
|
|
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2014-06-12 00:42:49 +00:00
|
|
|
// drop the items on the queue
|
2014-09-29 03:21:02 +00:00
|
|
|
go worker.Do(ctx, &worker.Work{
|
|
|
|
User: owner,
|
|
|
|
Repo: repo,
|
|
|
|
Commit: commit,
|
|
|
|
Host: httputil.GetURL(r),
|
|
|
|
})
|
2014-07-16 07:33:55 +00:00
|
|
|
|
|
|
|
w.WriteHeader(http.StatusOK)
|
2014-06-04 21:25:38 +00:00
|
|
|
}
|