2023-09-16 18:03:02 +02:00
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
2025-06-27 07:59:55 +02:00
package v1_21
2023-09-16 18:03:02 +02:00
import (
"context"
2025-12-29 10:49:54 -08:00
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/gitrepo"
2023-09-16 18:03:02 +02:00
"code.gitea.io/gitea/modules/setting"
"xorm.io/xorm"
)
func AddRemoteAddressToMirrors ( x * xorm . Engine ) error {
type Mirror struct {
RemoteAddress string ` xorm:"VARCHAR(2048)" `
}
type PushMirror struct {
RemoteAddress string ` xorm:"VARCHAR(2048)" `
}
if err := x . Sync ( new ( Mirror ) , new ( PushMirror ) ) ; err != nil {
return err
}
if err := migratePullMirrors ( x ) ; err != nil {
return err
}
return migratePushMirrors ( x )
}
func migratePullMirrors ( x * xorm . Engine ) error {
type Mirror struct {
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX" `
RemoteAddress string ` xorm:"VARCHAR(2048)" `
2023-09-19 03:59:19 +08:00
RepoOwner string
RepoName string
2023-09-16 18:03:02 +02:00
}
sess := x . NewSession ( )
defer sess . Close ( )
if err := sess . Begin ( ) ; err != nil {
return err
}
2023-09-17 11:15:04 +08:00
limit := setting . Database . IterateBufferSize
if limit <= 0 {
limit = 50
}
start := 0
for {
var mirrors [ ] Mirror
2023-09-19 03:59:19 +08:00
if err := sess . Select ( "mirror.id, mirror.repo_id, mirror.remote_address, repository.owner_name as repo_owner, repository.name as repo_name" ) .
Join ( "INNER" , "repository" , "repository.id = mirror.repo_id" ) .
Limit ( limit , start ) . Find ( & mirrors ) ; err != nil {
2023-09-16 18:03:02 +02:00
return err
}
2023-09-17 11:15:04 +08:00
if len ( mirrors ) == 0 {
break
}
start += len ( mirrors )
2023-09-16 18:03:02 +02:00
2023-09-17 11:15:04 +08:00
for _ , m := range mirrors {
2023-09-19 03:59:19 +08:00
remoteAddress , err := getRemoteAddress ( m . RepoOwner , m . RepoName , "origin" )
2023-09-17 11:15:04 +08:00
if err != nil {
return err
}
m . RemoteAddress = remoteAddress
if _ , err = sess . ID ( m . ID ) . Cols ( "remote_address" ) . Update ( m ) ; err != nil {
return err
}
}
if start % 1000 == 0 { // avoid a too big transaction
if err := sess . Commit ( ) ; err != nil {
return err
}
if err := sess . Begin ( ) ; err != nil {
return err
}
}
2023-09-16 18:03:02 +02:00
}
return sess . Commit ( )
}
func migratePushMirrors ( x * xorm . Engine ) error {
type PushMirror struct {
ID int64 ` xorm:"pk autoincr" `
RepoID int64 ` xorm:"INDEX" `
RemoteName string
RemoteAddress string ` xorm:"VARCHAR(2048)" `
2023-09-19 03:59:19 +08:00
RepoOwner string
RepoName string
2023-09-16 18:03:02 +02:00
}
sess := x . NewSession ( )
defer sess . Close ( )
if err := sess . Begin ( ) ; err != nil {
return err
}
2023-09-17 11:15:04 +08:00
limit := setting . Database . IterateBufferSize
if limit <= 0 {
limit = 50
}
start := 0
for {
var mirrors [ ] PushMirror
2023-09-19 03:59:19 +08:00
if err := sess . Select ( "push_mirror.id, push_mirror.repo_id, push_mirror.remote_name, push_mirror.remote_address, repository.owner_name as repo_owner, repository.name as repo_name" ) .
Join ( "INNER" , "repository" , "repository.id = push_mirror.repo_id" ) .
Limit ( limit , start ) . Find ( & mirrors ) ; err != nil {
2023-09-16 18:03:02 +02:00
return err
}
2023-09-17 11:15:04 +08:00
if len ( mirrors ) == 0 {
break
}
start += len ( mirrors )
2023-09-16 18:03:02 +02:00
2023-09-17 11:15:04 +08:00
for _ , m := range mirrors {
2023-09-19 03:59:19 +08:00
remoteAddress , err := getRemoteAddress ( m . RepoOwner , m . RepoName , m . RemoteName )
2023-09-17 11:15:04 +08:00
if err != nil {
return err
}
m . RemoteAddress = remoteAddress
if _ , err = sess . ID ( m . ID ) . Cols ( "remote_address" ) . Update ( m ) ; err != nil {
return err
}
}
if start % 1000 == 0 { // avoid a too big transaction
if err := sess . Commit ( ) ; err != nil {
return err
}
if err := sess . Begin ( ) ; err != nil {
return err
}
}
2023-09-16 18:03:02 +02:00
}
return sess . Commit ( )
}
2023-09-19 03:59:19 +08:00
func getRemoteAddress ( ownerName , repoName , remoteName string ) ( string , error ) {
2025-12-29 10:49:54 -08:00
ctx := context . Background ( )
relativePath := repo_model . RelativePath ( ownerName , repoName )
if exist , _ := gitrepo . IsRepositoryExist ( ctx , repo_model . StorageRepo ( relativePath ) ) ; ! exist {
2024-11-12 10:38:22 +08:00
return "" , nil
}
2023-09-16 18:03:02 +02:00
2025-12-29 10:49:54 -08:00
u , err := gitrepo . GitRemoteGetURL ( ctx , repo_model . StorageRepo ( relativePath ) , remoteName )
2023-09-16 18:03:02 +02:00
if err != nil {
return "" , err
}
u . User = nil
return u . String ( ) , nil
}