diff options
author | zeripath <art27@cantab.net> | 2019-06-01 16:00:21 +0100 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2019-06-01 23:00:21 +0800 |
commit | 356854fc5f8d7d1a7e4d68c9e00929e9ce8aa867 (patch) | |
tree | bc250740ffe65de5cd9ce3389e004ca7723d5643 /modules/private/hook.go | |
parent | 8a343dda39b187627db6ffb4c24a6e0ae615867b (diff) | |
download | gitea-356854fc5f8d7d1a7e4d68c9e00929e9ce8aa867.tar.gz gitea-356854fc5f8d7d1a7e4d68c9e00929e9ce8aa867.zip |
Move serv hook functionality & drop GitLogger (#6993)
* Move hook functionality internally
* Internalise serv logic
* Remove old internal paths
* finally remove the gitlogger
* Disallow push on archived repositories
* fix lint error
* Update modules/private/key.go
* Update routers/private/hook.go
* Update routers/private/hook.go
* Update routers/private/hook.go
* Updated routers/private/serv.go
* Fix LFS Locks over SSH
* rev-list needs to be run by the hook process
* fixup
* Improve git test
* Ensure that the lfs files are created with a different prefix
* Reduce the replication in git_test.go
* slight refactor
* Remove unnecessary "/"
* Restore ensureAnonymousClone
* Restore ensureAnonymousClone
* Run rev-list on server side
* Try passing in the alternative directories instead
* Mark test as skipped
* Improve git test
* Ensure that the lfs files are created with a different prefix
* Reduce the replication in git_test.go
* Remove unnecessary "/"
Diffstat (limited to 'modules/private/hook.go')
-rw-r--r-- | modules/private/hook.go | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/modules/private/hook.go b/modules/private/hook.go new file mode 100644 index 0000000000..7e2a475d4b --- /dev/null +++ b/modules/private/hook.go @@ -0,0 +1,84 @@ +// Copyright 2019 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package private + +import ( + "encoding/json" + "fmt" + "net/http" + "net/url" + + "code.gitea.io/gitea/modules/setting" +) + +// Git environment variables +const ( + GitAlternativeObjectDirectories = "GIT_ALTERNATE_OBJECT_DIRECTORIES" + GitObjectDirectory = "GIT_OBJECT_DIRECTORY" + GitQuarantinePath = "GIT_QUARANTINE_PATH" +) + +// HookOptions represents the options for the Hook calls +type HookOptions struct { + OldCommitID string + NewCommitID string + RefFullName string + UserID int64 + UserName string + GitObjectDirectory string + GitAlternativeObjectDirectories string +} + +// HookPreReceive check whether the provided commits are allowed +func HookPreReceive(ownerName, repoName string, opts HookOptions) (int, string) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/hook/pre-receive/%s/%s?old=%s&new=%s&ref=%s&userID=%d&gitObjectDirectory=%s&gitAlternativeObjectDirectories=%s", + url.PathEscape(ownerName), + url.PathEscape(repoName), + url.QueryEscape(opts.OldCommitID), + url.QueryEscape(opts.NewCommitID), + url.QueryEscape(opts.RefFullName), + opts.UserID, + url.QueryEscape(opts.GitObjectDirectory), + url.QueryEscape(opts.GitAlternativeObjectDirectories), + ) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return http.StatusInternalServerError, fmt.Sprintf("Unable to contact gitea: %v", err.Error()) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return resp.StatusCode, decodeJSONError(resp).Err + } + + return http.StatusOK, "" +} + +// HookPostReceive updates services and users +func HookPostReceive(ownerName, repoName string, opts HookOptions) (map[string]interface{}, string) { + reqURL := setting.LocalURL + fmt.Sprintf("api/internal/hook/post-receive/%s/%s?old=%s&new=%s&ref=%s&userID=%d&username=%s", + url.PathEscape(ownerName), + url.PathEscape(repoName), + url.QueryEscape(opts.OldCommitID), + url.QueryEscape(opts.NewCommitID), + url.QueryEscape(opts.RefFullName), + opts.UserID, + url.QueryEscape(opts.UserName)) + + resp, err := newInternalRequest(reqURL, "GET").Response() + if err != nil { + return nil, fmt.Sprintf("Unable to contact gitea: %v", err.Error()) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return nil, decodeJSONError(resp).Err + } + res := map[string]interface{}{} + _ = json.NewDecoder(resp.Body).Decode(&res) + + return res, "" +} |