2021-06-14 20:20:43 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-06-14 20:20:43 +03:00
2021-12-10 04:27:50 +03:00
package repo
2021-06-14 20:20:43 +03:00
import (
2022-07-30 19:45:59 +03:00
"context"
2021-06-14 20:20:43 +03:00
"time"
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2021-06-14 20:20:43 +03:00
"code.gitea.io/gitea/modules/log"
2024-11-18 08:59:04 +03:00
"code.gitea.io/gitea/modules/optional"
2021-06-14 20:20:43 +03:00
"code.gitea.io/gitea/modules/timeutil"
2022-12-31 14:49:37 +03:00
"code.gitea.io/gitea/modules/util"
2022-07-30 19:45:59 +03:00
"xorm.io/builder"
2021-06-14 20:20:43 +03:00
)
// PushMirror represents mirror information of a repository.
type PushMirror struct {
2023-09-16 19:03:02 +03:00
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX" `
Repo * Repository ` xorm:"-" `
RemoteName string
RemoteAddress string ` xorm:"VARCHAR(2048)" `
2021-06-14 20:20:43 +03:00
2022-07-08 22:45:12 +03:00
SyncOnCommit bool ` xorm:"NOT NULL DEFAULT true" `
2021-06-14 20:20:43 +03:00
Interval time . Duration
CreatedUnix timeutil . TimeStamp ` xorm:"created" `
LastUpdateUnix timeutil . TimeStamp ` xorm:"INDEX last_update" `
LastError string ` xorm:"text" `
}
2023-09-16 19:03:02 +03:00
2022-07-30 19:45:59 +03:00
type PushMirrorOptions struct {
2023-12-25 23:25:29 +03:00
db . ListOptions
2022-07-30 19:45:59 +03:00
ID int64
RepoID int64
RemoteName string
}
2023-12-25 23:25:29 +03:00
func ( opts PushMirrorOptions ) ToConds ( ) builder . Cond {
2022-07-30 19:45:59 +03:00
cond := builder . NewCond ( )
if opts . RepoID > 0 {
cond = cond . And ( builder . Eq { "repo_id" : opts . RepoID } )
}
if opts . RemoteName != "" {
cond = cond . And ( builder . Eq { "remote_name" : opts . RemoteName } )
}
if opts . ID > 0 {
cond = cond . And ( builder . Eq { "id" : opts . ID } )
}
return cond
}
2021-06-14 20:20:43 +03:00
2021-09-19 14:49:59 +03:00
func init ( ) {
db . RegisterModel ( new ( PushMirror ) )
}
2022-05-20 17:08:52 +03:00
// GetRepository returns the path of the repository.
2023-10-03 13:30:41 +03:00
func ( m * PushMirror ) GetRepository ( ctx context . Context ) * Repository {
2022-05-20 17:08:52 +03:00
if m . Repo != nil {
return m . Repo
2021-06-14 20:20:43 +03:00
}
var err error
2023-10-03 13:30:41 +03:00
m . Repo , err = GetRepositoryByID ( ctx , m . RepoID )
2021-06-14 20:20:43 +03:00
if err != nil {
log . Error ( "getRepositoryByID[%d]: %v" , m . ID , err )
}
return m . Repo
}
// GetRemoteName returns the name of the remote.
func ( m * PushMirror ) GetRemoteName ( ) string {
return m . RemoteName
}
// UpdatePushMirror updates the push-mirror
2022-07-30 19:45:59 +03:00
func UpdatePushMirror ( ctx context . Context , m * PushMirror ) error {
_ , err := db . GetEngine ( ctx ) . ID ( m . ID ) . AllCols ( ) . Update ( m )
2021-06-14 20:20:43 +03:00
return err
}
2023-08-01 19:00:59 +03:00
// UpdatePushMirrorInterval updates the push-mirror
func UpdatePushMirrorInterval ( ctx context . Context , m * PushMirror ) error {
_ , err := db . GetEngine ( ctx ) . ID ( m . ID ) . Cols ( "interval" ) . Update ( m )
return err
}
2022-07-30 19:45:59 +03:00
func DeletePushMirrors ( ctx context . Context , opts PushMirrorOptions ) error {
if opts . RepoID > 0 {
2023-12-25 23:25:29 +03:00
_ , err := db . Delete [ PushMirror ] ( ctx , opts )
2022-07-30 19:45:59 +03:00
return err
}
2022-12-31 14:49:37 +03:00
return util . NewInvalidArgumentErrorf ( "repoID required and must be set" )
2021-06-14 20:20:43 +03:00
}
2024-11-18 08:59:04 +03:00
type findPushMirrorOptions struct {
db . ListOptions
RepoID int64
SyncOnCommit optional . Option [ bool ]
}
func ( opts findPushMirrorOptions ) ToConds ( ) builder . Cond {
cond := builder . NewCond ( )
if opts . RepoID > 0 {
cond = cond . And ( builder . Eq { "repo_id" : opts . RepoID } )
}
if opts . SyncOnCommit . Has ( ) {
cond = cond . And ( builder . Eq { "sync_on_commit" : opts . SyncOnCommit . Value ( ) } )
}
return cond
}
2021-07-08 14:38:13 +03:00
// GetPushMirrorsByRepoID returns push-mirror information of a repository.
2022-07-30 19:45:59 +03:00
func GetPushMirrorsByRepoID ( ctx context . Context , repoID int64 , listOptions db . ListOptions ) ( [ ] * PushMirror , int64 , error ) {
2024-11-18 08:59:04 +03:00
return db . FindAndCount [ PushMirror ] ( ctx , findPushMirrorOptions {
ListOptions : listOptions ,
RepoID : repoID ,
} )
}
func GetPushMirrorByIDAndRepoID ( ctx context . Context , id , repoID int64 ) ( * PushMirror , bool , error ) {
var pushMirror PushMirror
has , err := db . GetEngine ( ctx ) . Where ( "id = ?" , id ) . And ( "repo_id = ?" , repoID ) . Get ( & pushMirror )
if ! has || err != nil {
return nil , has , err
2022-07-30 19:45:59 +03:00
}
2024-11-18 08:59:04 +03:00
return & pushMirror , true , nil
2021-06-14 20:20:43 +03:00
}
2022-07-08 22:45:12 +03:00
// GetPushMirrorsSyncedOnCommit returns push-mirrors for this repo that should be updated by new commits
2022-11-19 11:12:33 +03:00
func GetPushMirrorsSyncedOnCommit ( ctx context . Context , repoID int64 ) ( [ ] * PushMirror , error ) {
2024-11-18 08:59:04 +03:00
return db . Find [ PushMirror ] ( ctx , findPushMirrorOptions {
RepoID : repoID ,
SyncOnCommit : optional . Some ( true ) ,
} )
2022-07-08 22:45:12 +03:00
}
2021-06-14 20:20:43 +03:00
// PushMirrorsIterate iterates all push-mirror repositories.
2023-07-04 21:36:08 +03:00
func PushMirrorsIterate ( ctx context . Context , limit int , f func ( idx int , bean any ) error ) error {
2022-08-19 05:12:00 +03:00
sess := db . GetEngine ( ctx ) .
2024-01-24 05:32:57 +03:00
Table ( "push_mirror" ) .
Join ( "INNER" , "`repository`" , "`repository`.id = `push_mirror`.repo_id" ) .
Where ( "`push_mirror`.last_update + (`push_mirror`.`interval` / ?) <= ?" , time . Second , time . Now ( ) . Unix ( ) ) .
And ( "`push_mirror`.`interval` != 0" ) .
And ( "`repository`.is_archived = ?" , false ) .
2022-08-19 05:12:00 +03:00
OrderBy ( "last_update ASC" )
if limit > 0 {
sess = sess . Limit ( limit )
}
return sess . Iterate ( new ( PushMirror ) , f )
2021-06-14 20:20:43 +03:00
}