mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 00:20:25 +08:00 
			
		
		
		
	Implement sync push mirror on commit (#19411)
Support synchronizing with the push mirrors whenever new commits are pushed or synced from pull mirror. Related Issues: #18220 Co-authored-by: delvh <dev.lh@web.de> Co-authored-by: zeripath <art27@cantab.net> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
This commit is contained in:
		
							
								
								
									
										69
									
								
								modules/mirror/mirror.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								modules/mirror/mirror.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,69 @@
 | 
			
		||||
// Copyright 2022 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 (
 | 
			
		||||
	"code.gitea.io/gitea/modules/graceful"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	"code.gitea.io/gitea/modules/queue"
 | 
			
		||||
	"code.gitea.io/gitea/modules/setting"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var mirrorQueue queue.UniqueQueue
 | 
			
		||||
 | 
			
		||||
// SyncType type of sync request
 | 
			
		||||
type SyncType int
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	// PullMirrorType for pull mirrors
 | 
			
		||||
	PullMirrorType SyncType = iota
 | 
			
		||||
	// PushMirrorType for push mirrors
 | 
			
		||||
	PushMirrorType
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// SyncRequest for the mirror queue
 | 
			
		||||
type SyncRequest struct {
 | 
			
		||||
	Type        SyncType
 | 
			
		||||
	ReferenceID int64 // RepoID for pull mirror, MirrorID for push mirror
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// StartSyncMirrors starts a go routine to sync the mirrors
 | 
			
		||||
func StartSyncMirrors(queueHandle func(data ...queue.Data) []queue.Data) {
 | 
			
		||||
	if !setting.Mirror.Enabled {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	mirrorQueue = queue.CreateUniqueQueue("mirror", queueHandle, new(SyncRequest))
 | 
			
		||||
 | 
			
		||||
	go graceful.GetManager().RunWithShutdownFns(mirrorQueue.Run)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddPullMirrorToQueue adds repoID to mirror queue
 | 
			
		||||
func AddPullMirrorToQueue(repoID int64) {
 | 
			
		||||
	addMirrorToQueue(PullMirrorType, repoID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AddPushMirrorToQueue adds the push mirror to the queue
 | 
			
		||||
func AddPushMirrorToQueue(mirrorID int64) {
 | 
			
		||||
	addMirrorToQueue(PushMirrorType, mirrorID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func addMirrorToQueue(syncType SyncType, referenceID int64) {
 | 
			
		||||
	if !setting.Mirror.Enabled {
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	go func() {
 | 
			
		||||
		if err := PushToQueue(syncType, referenceID); err != nil {
 | 
			
		||||
			log.Error("Unable to push sync request for to the queue for pull mirror repo[%d]. Error: %v", referenceID, err)
 | 
			
		||||
		}
 | 
			
		||||
	}()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// PushToQueue adds the sync request to the queue
 | 
			
		||||
func PushToQueue(mirrorType SyncType, referenceID int64) error {
 | 
			
		||||
	return mirrorQueue.Push(&SyncRequest{
 | 
			
		||||
		Type:        mirrorType,
 | 
			
		||||
		ReferenceID: referenceID,
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										45
									
								
								modules/notification/mirror/mirror.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								modules/notification/mirror/mirror.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
// Copyright 2022 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 (
 | 
			
		||||
	repo_model "code.gitea.io/gitea/models/repo"
 | 
			
		||||
	user_model "code.gitea.io/gitea/models/user"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
	mirror_module "code.gitea.io/gitea/modules/mirror"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/repository"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type mirrorNotifier struct {
 | 
			
		||||
	base.NullNotifier
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var _ base.Notifier = &mirrorNotifier{}
 | 
			
		||||
 | 
			
		||||
// NewNotifier create a new mirrorNotifier notifier
 | 
			
		||||
func NewNotifier() base.Notifier {
 | 
			
		||||
	return &mirrorNotifier{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *mirrorNotifier) NotifyPushCommits(_ *user_model.User, repo *repo_model.Repository, _ *repository.PushUpdateOptions, _ *repository.PushCommits) {
 | 
			
		||||
	syncPushMirrorWithSyncOnCommit(repo.ID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (m *mirrorNotifier) NotifySyncPushCommits(_ *user_model.User, repo *repo_model.Repository, _ *repository.PushUpdateOptions, _ *repository.PushCommits) {
 | 
			
		||||
	syncPushMirrorWithSyncOnCommit(repo.ID)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func syncPushMirrorWithSyncOnCommit(repoID int64) {
 | 
			
		||||
	pushMirrors, err := repo_model.GetPushMirrorsSyncedOnCommit(repoID)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("repo_model.GetPushMirrorsSyncedOnCommit failed: %v", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, mirror := range pushMirrors {
 | 
			
		||||
		mirror_module.AddPushMirrorToQueue(mirror.ID)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
@@ -14,6 +14,7 @@ import (
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/base"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/indexer"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/mail"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/mirror"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/ui"
 | 
			
		||||
	"code.gitea.io/gitea/modules/notification/webhook"
 | 
			
		||||
	"code.gitea.io/gitea/modules/repository"
 | 
			
		||||
@@ -37,6 +38,7 @@ func NewContext() {
 | 
			
		||||
	RegisterNotifier(indexer.NewNotifier())
 | 
			
		||||
	RegisterNotifier(webhook.NewNotifier())
 | 
			
		||||
	RegisterNotifier(action.NewNotifier())
 | 
			
		||||
	RegisterNotifier(mirror.NewNotifier())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NotifyCreateIssueComment notifies issue comment related message to notifiers
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user