aboutsummaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorChongyi Zheng <harryzheng25@gmail.com>2022-07-08 15:45:12 -0400
committerGitHub <noreply@github.com>2022-07-08 20:45:12 +0100
commit49f9d43afefd446287b1b2475d7127d405b7a873 (patch)
tree70f659343c5ed2ce174cb2a5aacb6a66a5084c23 /services
parent496b8e39900842c8253250d3eaddf587be35dfa3 (diff)
downloadgitea-49f9d43afefd446287b1b2475d7127d405b7a873.tar.gz
gitea-49f9d43afefd446287b1b2475d7127d405b7a873.zip
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>
Diffstat (limited to 'services')
-rw-r--r--services/forms/repo_form.go35
-rw-r--r--services/mirror/mirror.go87
2 files changed, 33 insertions, 89 deletions
diff --git a/services/forms/repo_form.go b/services/forms/repo_form.go
index c9327bbd9b..afecc205f3 100644
--- a/services/forms/repo_form.go
+++ b/services/forms/repo_form.go
@@ -115,23 +115,24 @@ func ParseRemoteAddr(remoteAddr, authUsername, authPassword string) (string, err
// RepoSettingForm form for changing repository settings
type RepoSettingForm struct {
- RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
- Description string `binding:"MaxSize(255)"`
- Website string `binding:"ValidUrl;MaxSize(255)"`
- Interval string
- MirrorAddress string
- MirrorUsername string
- MirrorPassword string
- LFS bool `form:"mirror_lfs"`
- LFSEndpoint string `form:"mirror_lfs_endpoint"`
- PushMirrorID string
- PushMirrorAddress string
- PushMirrorUsername string
- PushMirrorPassword string
- PushMirrorInterval string
- Private bool
- Template bool
- EnablePrune bool
+ RepoName string `binding:"Required;AlphaDashDot;MaxSize(100)"`
+ Description string `binding:"MaxSize(255)"`
+ Website string `binding:"ValidUrl;MaxSize(255)"`
+ Interval string
+ MirrorAddress string
+ MirrorUsername string
+ MirrorPassword string
+ LFS bool `form:"mirror_lfs"`
+ LFSEndpoint string `form:"mirror_lfs_endpoint"`
+ PushMirrorID string
+ PushMirrorAddress string
+ PushMirrorUsername string
+ PushMirrorPassword string
+ PushMirrorSyncOnCommit bool
+ PushMirrorInterval string
+ Private bool
+ Template bool
+ EnablePrune bool
// Advanced settings
EnableWiki bool
diff --git a/services/mirror/mirror.go b/services/mirror/mirror.go
index 013adac0f4..8321829ad2 100644
--- a/services/mirror/mirror.go
+++ b/services/mirror/mirror.go
@@ -11,38 +11,21 @@ import (
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/graceful"
"code.gitea.io/gitea/modules/log"
+ mirror_module "code.gitea.io/gitea/modules/mirror"
"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 fro push mirror
-}
-
// doMirrorSync causes this request to mirror itself
-func doMirrorSync(ctx context.Context, req *SyncRequest) {
+func doMirrorSync(ctx context.Context, req *mirror_module.SyncRequest) {
if req.ReferenceID == 0 {
log.Warn("Skipping mirror sync request, no mirror ID was specified")
return
}
switch req.Type {
- case PushMirrorType:
+ case mirror_module.PushMirrorType:
_ = SyncPushMirror(ctx, req.ReferenceID)
- case PullMirrorType:
+ case mirror_module.PullMirrorType:
_ = SyncPullMirror(ctx, req.ReferenceID)
default:
log.Error("Unknown Request type in queue: %v for MirrorID[%d]", req.Type, req.ReferenceID)
@@ -60,28 +43,26 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error {
log.Trace("Doing: Update")
handler := func(idx int, bean interface{}) error {
- var item SyncRequest
var repo *repo_model.Repository
+ var mirrorType mirror_module.SyncType
+ var referenceID int64
+
if m, ok := bean.(*repo_model.Mirror); ok {
if m.GetRepository() == nil {
log.Error("Disconnected mirror found: %d", m.ID)
return nil
}
repo = m.Repo
- item = SyncRequest{
- Type: PullMirrorType,
- ReferenceID: m.RepoID,
- }
+ mirrorType = mirror_module.PullMirrorType
+ referenceID = m.RepoID
} else if m, ok := bean.(*repo_model.PushMirror); ok {
if m.GetRepository() == nil {
log.Error("Disconnected push-mirror found: %d", m.ID)
return nil
}
repo = m.Repo
- item = SyncRequest{
- Type: PushMirrorType,
- ReferenceID: m.ID,
- }
+ mirrorType = mirror_module.PushMirrorType
+ referenceID = m.ID
} else {
log.Error("Unknown bean: %v", bean)
return nil
@@ -95,9 +76,9 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error {
}
// Push to the Queue
- if err := mirrorQueue.Push(&item); err != nil {
+ if err := mirror_module.PushToQueue(mirrorType, referenceID); err != nil {
if err == queue.ErrAlreadyInQueue {
- if item.Type == PushMirrorType {
+ if mirrorType == mirror_module.PushMirrorType {
log.Trace("PushMirrors for %-v already queued for sync", repo)
} else {
log.Trace("PullMirrors for %-v already queued for sync", repo)
@@ -142,7 +123,7 @@ func Update(ctx context.Context, pullLimit, pushLimit int) error {
func queueHandle(data ...queue.Data) []queue.Data {
for _, datum := range data {
- req := datum.(*SyncRequest)
+ req := datum.(*mirror_module.SyncRequest)
doMirrorSync(graceful.GetManager().ShutdownContext(), req)
}
return nil
@@ -150,43 +131,5 @@ func queueHandle(data ...queue.Data) []queue.Data {
// InitSyncMirrors initializes a go routine to sync the mirrors
func InitSyncMirrors() {
- if !setting.Mirror.Enabled {
- return
- }
- mirrorQueue = queue.CreateUniqueQueue("mirror", queueHandle, new(SyncRequest))
-
- go graceful.GetManager().RunWithShutdownFns(mirrorQueue.Run)
-}
-
-// StartToMirror adds repoID to mirror queue
-func StartToMirror(repoID int64) {
- if !setting.Mirror.Enabled {
- return
- }
- go func() {
- err := mirrorQueue.Push(&SyncRequest{
- Type: PullMirrorType,
- ReferenceID: repoID,
- })
- if err != nil {
- log.Error("Unable to push sync request for to the queue for pull mirror repo[%d]: Error: %v", repoID, err)
- return
- }
- }()
-}
-
-// AddPushMirrorToQueue adds the push mirror to the queue
-func AddPushMirrorToQueue(mirrorID int64) {
- if !setting.Mirror.Enabled {
- return
- }
- go func() {
- err := mirrorQueue.Push(&SyncRequest{
- Type: PushMirrorType,
- ReferenceID: mirrorID,
- })
- if err != nil {
- log.Error("Unable to push sync request to the queue for pull mirror repo[%d]: Error: %v", mirrorID, err)
- }
- }()
+ mirror_module.StartSyncMirrors(queueHandle)
}