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"
"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
)
2022-01-20 20:46:10 +03:00
// ErrPushMirrorNotExist mirror does not exist error
2022-12-31 14:49:37 +03:00
var ErrPushMirrorNotExist = util . NewNotExistErrorf ( "PushMirror does not exist" )
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
}
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 ) {
sess := db . GetEngine ( ctx ) . Where ( "repo_id = ?" , repoID )
if listOptions . Page != 0 {
sess = db . SetSessionPagination ( sess , & listOptions )
mirrors := make ( [ ] * PushMirror , 0 , listOptions . PageSize )
count , err := sess . FindAndCount ( & mirrors )
return mirrors , count , err
}
2021-06-14 20:20:43 +03:00
mirrors := make ( [ ] * PushMirror , 0 , 10 )
2022-07-30 19:45:59 +03:00
count , err := sess . FindAndCount ( & mirrors )
return mirrors , count , err
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 ) {
2022-07-08 22:45:12 +03:00
mirrors := make ( [ ] * PushMirror , 0 , 10 )
2022-11-19 11:12:33 +03:00
return mirrors , db . GetEngine ( ctx ) .
2023-08-27 05:24:45 +03:00
Where ( "repo_id = ? AND sync_on_commit = ?" , repoID , true ) .
2022-07-08 22:45:12 +03:00
Find ( & mirrors )
}
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
}