code.gitea.io/gitea@v1.22.3/models/repo/mirror.go (about) 1 // Copyright 2016 The Gogs Authors. All rights reserved. 2 // Copyright 2018 The Gitea Authors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 5 package repo 6 7 import ( 8 "context" 9 "time" 10 11 "code.gitea.io/gitea/models/db" 12 "code.gitea.io/gitea/modules/log" 13 "code.gitea.io/gitea/modules/timeutil" 14 "code.gitea.io/gitea/modules/util" 15 ) 16 17 // ErrMirrorNotExist mirror does not exist error 18 var ErrMirrorNotExist = util.NewNotExistErrorf("Mirror does not exist") 19 20 // Mirror represents mirror information of a repository. 21 type Mirror struct { 22 ID int64 `xorm:"pk autoincr"` 23 RepoID int64 `xorm:"INDEX"` 24 Repo *Repository `xorm:"-"` 25 Interval time.Duration 26 EnablePrune bool `xorm:"NOT NULL DEFAULT true"` 27 28 UpdatedUnix timeutil.TimeStamp `xorm:"INDEX"` 29 NextUpdateUnix timeutil.TimeStamp `xorm:"INDEX"` 30 31 LFS bool `xorm:"lfs_enabled NOT NULL DEFAULT false"` 32 LFSEndpoint string `xorm:"lfs_endpoint TEXT"` 33 34 RemoteAddress string `xorm:"VARCHAR(2048)"` 35 } 36 37 func init() { 38 db.RegisterModel(new(Mirror)) 39 } 40 41 // BeforeInsert will be invoked by XORM before inserting a record 42 func (m *Mirror) BeforeInsert() { 43 if m != nil { 44 m.UpdatedUnix = timeutil.TimeStampNow() 45 m.NextUpdateUnix = timeutil.TimeStampNow() 46 } 47 } 48 49 // GetRepository returns the repository. 50 func (m *Mirror) GetRepository(ctx context.Context) *Repository { 51 if m.Repo != nil { 52 return m.Repo 53 } 54 var err error 55 m.Repo, err = GetRepositoryByID(ctx, m.RepoID) 56 if err != nil { 57 log.Error("getRepositoryByID[%d]: %v", m.ID, err) 58 } 59 return m.Repo 60 } 61 62 // GetRemoteName returns the name of the remote. 63 func (m *Mirror) GetRemoteName() string { 64 return "origin" 65 } 66 67 // ScheduleNextUpdate calculates and sets next update time. 68 func (m *Mirror) ScheduleNextUpdate() { 69 if m.Interval != 0 { 70 m.NextUpdateUnix = timeutil.TimeStampNow().AddDuration(m.Interval) 71 } else { 72 m.NextUpdateUnix = 0 73 } 74 } 75 76 // GetMirrorByRepoID returns mirror information of a repository. 77 func GetMirrorByRepoID(ctx context.Context, repoID int64) (*Mirror, error) { 78 m := &Mirror{RepoID: repoID} 79 has, err := db.GetEngine(ctx).Get(m) 80 if err != nil { 81 return nil, err 82 } else if !has { 83 return nil, ErrMirrorNotExist 84 } 85 return m, nil 86 } 87 88 // UpdateMirror updates the mirror 89 func UpdateMirror(ctx context.Context, m *Mirror) error { 90 _, err := db.GetEngine(ctx).ID(m.ID).AllCols().Update(m) 91 return err 92 } 93 94 // TouchMirror updates the mirror updatedUnix 95 func TouchMirror(ctx context.Context, m *Mirror) error { 96 m.UpdatedUnix = timeutil.TimeStampNow() 97 _, err := db.GetEngine(ctx).ID(m.ID).Cols("updated_unix").Update(m) 98 return err 99 } 100 101 // DeleteMirrorByRepoID deletes a mirror by repoID 102 func DeleteMirrorByRepoID(ctx context.Context, repoID int64) error { 103 _, err := db.GetEngine(ctx).Delete(&Mirror{RepoID: repoID}) 104 return err 105 } 106 107 // MirrorsIterate iterates all mirror repositories. 108 func MirrorsIterate(ctx context.Context, limit int, f func(idx int, bean any) error) error { 109 sess := db.GetEngine(ctx). 110 Where("next_update_unix<=?", time.Now().Unix()). 111 And("next_update_unix!=0"). 112 OrderBy("updated_unix ASC") 113 if limit > 0 { 114 sess = sess.Limit(limit) 115 } 116 return sess.Iterate(new(Mirror), f) 117 } 118 119 // InsertMirror inserts a mirror to database 120 func InsertMirror(ctx context.Context, mirror *Mirror) error { 121 _, err := db.GetEngine(ctx).Insert(mirror) 122 return err 123 }