2019-03-11 06:44:58 +03:00
// Copyright 2019 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2019-03-11 06:44:58 +03:00
2022-12-08 11:21:37 +03:00
package v1_9 //nolint
2019-03-11 06:44:58 +03:00
import (
2019-03-20 19:37:50 +03:00
"fmt"
2020-07-22 17:27:22 +03:00
"path/filepath"
"strings"
2019-03-20 19:37:50 +03:00
2019-03-27 12:33:00 +03:00
"code.gitea.io/gitea/modules/git"
2020-07-22 17:27:22 +03:00
"code.gitea.io/gitea/modules/setting"
2019-03-20 19:37:50 +03:00
2019-10-17 12:26:49 +03:00
"xorm.io/xorm"
2019-03-11 06:44:58 +03:00
)
2022-11-02 11:54:36 +03:00
func FixReleaseSha1OnReleaseTable ( x * xorm . Engine ) error {
2019-03-11 06:44:58 +03:00
type Release struct {
ID int64
RepoID int64
Sha1 string
TagName string
}
2019-03-20 19:37:50 +03:00
type Repository struct {
ID int64
OwnerID int64
Name string
}
type User struct {
ID int64
Name string
}
2020-07-22 17:27:22 +03:00
// UserPath returns the path absolute path of user repositories.
UserPath := func ( userName string ) string {
return filepath . Join ( setting . RepoRootPath , strings . ToLower ( userName ) )
}
// RepoPath returns repository path by given user and repository name.
RepoPath := func ( userName , repoName string ) string {
return filepath . Join ( UserPath ( userName ) , strings . ToLower ( repoName ) + ".git" )
}
2019-03-11 06:44:58 +03:00
// Update release sha1
const batchSize = 100
sess := x . NewSession ( )
defer sess . Close ( )
var (
err error
count int
gitRepoCache = make ( map [ int64 ] * git . Repository )
2019-03-20 19:37:50 +03:00
repoCache = make ( map [ int64 ] * Repository )
userCache = make ( map [ int64 ] * User )
2019-03-11 06:44:58 +03:00
)
if err = sess . Begin ( ) ; err != nil {
return err
}
for start := 0 ; ; start += batchSize {
releases := make ( [ ] * Release , 0 , batchSize )
if err = sess . Limit ( batchSize , start ) . Asc ( "id" ) . Where ( "is_tag=?" , false ) . Find ( & releases ) ; err != nil {
return err
}
if len ( releases ) == 0 {
break
}
for _ , release := range releases {
gitRepo , ok := gitRepoCache [ release . RepoID ]
if ! ok {
repo , ok := repoCache [ release . RepoID ]
if ! ok {
2019-03-20 19:37:50 +03:00
repo = new ( Repository )
has , err := sess . ID ( release . RepoID ) . Get ( repo )
2019-03-11 06:44:58 +03:00
if err != nil {
return err
2019-03-20 19:37:50 +03:00
} else if ! has {
return fmt . Errorf ( "Repository %d is not exist" , release . RepoID )
2019-03-11 06:44:58 +03:00
}
2019-03-20 19:37:50 +03:00
2019-03-11 06:44:58 +03:00
repoCache [ release . RepoID ] = repo
}
2019-03-20 19:37:50 +03:00
user , ok := userCache [ repo . OwnerID ]
if ! ok {
user = new ( User )
has , err := sess . ID ( repo . OwnerID ) . Get ( user )
if err != nil {
return err
} else if ! has {
return fmt . Errorf ( "User %d is not exist" , repo . OwnerID )
}
userCache [ repo . OwnerID ] = user
}
2022-03-29 22:13:41 +03:00
gitRepo , err = git . OpenRepository ( git . DefaultContext , RepoPath ( user . Name , repo . Name ) )
2019-03-11 06:44:58 +03:00
if err != nil {
return err
}
2019-11-13 10:01:19 +03:00
defer gitRepo . Close ( )
2019-03-11 06:44:58 +03:00
gitRepoCache [ release . RepoID ] = gitRepo
}
release . Sha1 , err = gitRepo . GetTagCommitID ( release . TagName )
2019-03-20 19:37:50 +03:00
if err != nil && ! git . IsErrNotExist ( err ) {
2019-03-11 06:44:58 +03:00
return err
}
2019-03-20 19:37:50 +03:00
if err == nil {
if _ , err = sess . ID ( release . ID ) . Cols ( "sha1" ) . Update ( release ) ; err != nil {
return err
}
2019-03-11 06:44:58 +03:00
}
count ++
if count >= 1000 {
if err = sess . Commit ( ) ; err != nil {
return err
}
if err = sess . Begin ( ) ; err != nil {
return err
}
count = 0
}
}
}
return sess . Commit ( )
}