|
- // 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 mirror
-
- import (
- "encoding/json"
- "fmt"
-
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/setting"
- api "code.gitea.io/gitea/modules/structs"
- )
-
- func syncAction(opType models.ActionType, repo *models.Repository, refName string, data []byte) error {
- if err := models.NotifyWatchers(&models.Action{
- ActUserID: repo.OwnerID,
- ActUser: repo.MustOwner(),
- OpType: opType,
- RepoID: repo.ID,
- Repo: repo,
- IsPrivate: repo.IsPrivate,
- RefName: refName,
- Content: string(data),
- }); err != nil {
- return fmt.Errorf("notifyWatchers: %v", err)
- }
-
- defer func() {
- go models.HookQueue.Add(repo.ID)
- }()
-
- return nil
- }
-
- // SyncPushActionOptions mirror synchronization action options.
- type SyncPushActionOptions struct {
- RefName string
- OldCommitID string
- NewCommitID string
- Commits *models.PushCommits
- }
-
- // SyncPushAction adds new action for mirror synchronization of pushed commits.
- func SyncPushAction(repo *models.Repository, opts SyncPushActionOptions) error {
- if len(opts.Commits.Commits) > setting.UI.FeedMaxCommitNum {
- opts.Commits.Commits = opts.Commits.Commits[:setting.UI.FeedMaxCommitNum]
- }
-
- apiCommits, err := opts.Commits.ToAPIPayloadCommits(repo.RepoPath(), repo.HTMLURL())
- if err != nil {
- return err
- }
-
- opts.Commits.CompareURL = repo.ComposeCompareURL(opts.OldCommitID, opts.NewCommitID)
- apiPusher := repo.MustOwner().APIFormat()
- if err := models.PrepareWebhooks(repo, models.HookEventPush, &api.PushPayload{
- Ref: opts.RefName,
- Before: opts.OldCommitID,
- After: opts.NewCommitID,
- CompareURL: setting.AppURL + opts.Commits.CompareURL,
- Commits: apiCommits,
- Repo: repo.APIFormat(models.AccessModeOwner),
- Pusher: apiPusher,
- Sender: apiPusher,
- }); err != nil {
- return fmt.Errorf("PrepareWebhooks: %v", err)
- }
-
- data, err := json.Marshal(opts.Commits)
- if err != nil {
- return err
- }
-
- return syncAction(models.ActionMirrorSyncPush, repo, opts.RefName, data)
- }
-
- // SyncCreateAction adds new action for mirror synchronization of new reference.
- func SyncCreateAction(repo *models.Repository, refName string) error {
- return syncAction(models.ActionMirrorSyncCreate, repo, refName, nil)
- }
-
- // SyncDeleteAction adds new action for mirror synchronization of delete reference.
- func SyncDeleteAction(repo *models.Repository, refName string) error {
- return syncAction(models.ActionMirrorSyncDelete, repo, refName, nil)
- }
|