diff --git a/internal/services/gateway/common/run.go b/internal/services/gateway/common/run.go new file mode 100644 index 0000000..d2c3939 --- /dev/null +++ b/internal/services/gateway/common/run.go @@ -0,0 +1,58 @@ +// Copyright 2019 Sorint.lab +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied +// See the License for the specific language governing permissions and +// limitations under the License. + +package common + +import ( + "fmt" + "net/url" + "path" + + "github.com/pkg/errors" + "github.com/sorintlab/agola/internal/services/types" + "github.com/sorintlab/agola/internal/util" +) + +type GroupType string + +const ( + GroupTypeProject GroupType = "project" + GroupTypeUser GroupType = "user" + GroupTypeBranch GroupType = "branch" + GroupTypeTag GroupType = "tag" + GroupTypePullRequest GroupType = "pr" +) + +func GenRunGroup(baseGroupType GroupType, baseGroupID string, webhookData *types.WebhookData) string { + // we pathescape the branch name to handle branches with slashes and make the + // branch a single path entry + switch webhookData.Event { + case types.WebhookEventPush: + return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypeBranch), url.PathEscape(webhookData.Branch)) + case types.WebhookEventTag: + return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypeTag), url.PathEscape(webhookData.Tag)) + case types.WebhookEventPullRequest: + return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypePullRequest), url.PathEscape(webhookData.PullRequestID)) + } + + panic(fmt.Errorf("invalid webhook event type: %q", webhookData.Event)) +} + +func ProjectIDFromRunGroup(group string) (string, error) { + pl := util.PathList(group) + if len(pl) < 2 { + return "", errors.Errorf("cannot determine group project id, wrong group path %q", group) + } + return pl[1], nil +} diff --git a/internal/services/gateway/webhook.go b/internal/services/gateway/webhook.go index b86d4ba..226433f 100644 --- a/internal/services/gateway/webhook.go +++ b/internal/services/gateway/webhook.go @@ -18,7 +18,6 @@ import ( "context" "fmt" "net/http" - "net/url" "path" "github.com/sorintlab/agola/internal/config" @@ -68,16 +67,6 @@ const ( AnnotationPullRequestLink = "pull_request_link" ) -type GroupType string - -const ( - GroupTypeProject GroupType = "project" - GroupTypeUser GroupType = "user" - GroupTypeBranch GroupType = "branch" - GroupTypeTag GroupType = "tag" - GroupTypePullRequest GroupType = "pr" -) - func genAnnotationVirtualBranch(webhookData *types.WebhookData) string { switch webhookData.Event { case types.WebhookEventPush: @@ -91,21 +80,6 @@ func genAnnotationVirtualBranch(webhookData *types.WebhookData) string { panic(fmt.Errorf("invalid webhook event type: %q", webhookData.Event)) } -func genGroup(baseGroupType GroupType, baseGroupID string, webhookData *types.WebhookData) string { - // we pathescape the branch name to handle branches with slashes and make the - // branch a single path entry - switch webhookData.Event { - case types.WebhookEventPush: - return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypeBranch), url.PathEscape(webhookData.Branch)) - case types.WebhookEventTag: - return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypeTag), url.PathEscape(webhookData.Tag)) - case types.WebhookEventPullRequest: - return path.Join("/", string(baseGroupType), baseGroupID, string(GroupTypePullRequest), url.PathEscape(webhookData.PullRequestID)) - } - - panic(fmt.Errorf("invalid webhook event type: %q", webhookData.Event)) -} - type webhooksHandler struct { log *zap.SugaredLogger ah *action.ActionHandler @@ -321,9 +295,9 @@ func (h *webhooksHandler) handleWebhook(r *http.Request) (int, string, error) { var group string if !isUserBuild { - group = genGroup(GroupTypeProject, webhookData.ProjectID, webhookData) + group = common.GenRunGroup(common.GroupTypeProject, webhookData.ProjectID, webhookData) } else { - group = genGroup(GroupTypeUser, userID, webhookData) + group = common.GenRunGroup(common.GroupTypeUser, userID, webhookData) } if err := h.createRuns(ctx, filename, data, group, annotations, env, variables, webhookData); err != nil {