2021-06-14 20:20:43 +03:00
// Copyright 2021 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.
2021-12-10 04:27:50 +03:00
package repo
2021-06-14 20:20:43 +03:00
import (
"errors"
"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-01-20 20:46:10 +03:00
// ErrPushMirrorNotExist mirror does not exist error
var ErrPushMirrorNotExist = errors . New ( "PushMirror does not exist" )
2021-06-14 20:20:43 +03:00
// PushMirror represents mirror information of a repository.
type PushMirror struct {
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX" `
Repo * Repository ` xorm:"-" `
RemoteName string
Interval time . Duration
CreatedUnix timeutil . TimeStamp ` xorm:"created" `
LastUpdateUnix timeutil . TimeStamp ` xorm:"INDEX last_update" `
LastError string ` xorm:"text" `
}
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.
func ( m * PushMirror ) GetRepository ( ) * Repository {
if m . Repo != nil {
return m . Repo
2021-06-14 20:20:43 +03:00
}
var err error
2022-05-20 17:08:52 +03:00
m . Repo , err = GetRepositoryByIDCtx ( db . DefaultContext , 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
}
// InsertPushMirror inserts a push-mirror to database
func InsertPushMirror ( m * PushMirror ) error {
2021-09-23 18:45:36 +03:00
_ , err := db . GetEngine ( db . DefaultContext ) . Insert ( m )
2021-06-14 20:20:43 +03:00
return err
}
// UpdatePushMirror updates the push-mirror
func UpdatePushMirror ( m * PushMirror ) error {
2021-09-23 18:45:36 +03:00
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( m . ID ) . AllCols ( ) . Update ( m )
2021-06-14 20:20:43 +03:00
return err
}
// DeletePushMirrorByID deletes a push-mirrors by ID
func DeletePushMirrorByID ( ID int64 ) error {
2021-09-23 18:45:36 +03:00
_ , err := db . GetEngine ( db . DefaultContext ) . ID ( ID ) . Delete ( & PushMirror { } )
2021-06-14 20:20:43 +03:00
return err
}
// DeletePushMirrorsByRepoID deletes all push-mirrors by repoID
func DeletePushMirrorsByRepoID ( repoID int64 ) error {
2021-09-23 18:45:36 +03:00
_ , err := db . GetEngine ( db . DefaultContext ) . Delete ( & PushMirror { RepoID : repoID } )
2021-06-14 20:20:43 +03:00
return err
}
// GetPushMirrorByID returns push-mirror information.
func GetPushMirrorByID ( ID int64 ) ( * PushMirror , error ) {
m := & PushMirror { }
2021-09-23 18:45:36 +03:00
has , err := db . GetEngine ( db . DefaultContext ) . ID ( ID ) . Get ( m )
2021-06-14 20:20:43 +03:00
if err != nil {
return nil , err
} else if ! has {
return nil , ErrPushMirrorNotExist
}
return m , nil
}
2021-07-08 14:38:13 +03:00
// GetPushMirrorsByRepoID returns push-mirror information of a repository.
2021-06-14 20:20:43 +03:00
func GetPushMirrorsByRepoID ( repoID int64 ) ( [ ] * PushMirror , error ) {
mirrors := make ( [ ] * PushMirror , 0 , 10 )
2021-09-23 18:45:36 +03:00
return mirrors , db . GetEngine ( db . DefaultContext ) . Where ( "repo_id=?" , repoID ) . Find ( & mirrors )
2021-06-14 20:20:43 +03:00
}
// PushMirrorsIterate iterates all push-mirror repositories.
2022-02-28 22:41:06 +03:00
func PushMirrorsIterate ( limit int , f func ( idx int , bean interface { } ) error ) error {
2021-09-23 18:45:36 +03:00
return db . GetEngine ( db . DefaultContext ) .
2021-06-14 20:20:43 +03:00
Where ( "last_update + (`interval` / ?) <= ?" , time . Second , time . Now ( ) . Unix ( ) ) .
And ( "`interval` != 0" ) .
2021-11-23 06:09:35 +03:00
OrderBy ( "last_update ASC" ) .
2022-02-28 22:41:06 +03:00
Limit ( limit ) .
2021-06-14 20:20:43 +03:00
Iterate ( new ( PushMirror ) , f )
}