Files

122 lines
3.1 KiB
Go
Raw Permalink Normal View History

2020-04-14 15:53:34 +02:00
// Copyright 2020 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT
2020-04-14 15:53:34 +02:00
2025-06-27 07:59:55 +02:00
package v1_12
2020-04-14 15:53:34 +02:00
import (
"fmt"
2020-05-29 23:18:24 +01:00
"math"
"time"
2020-04-14 15:53:34 +02:00
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/gitrepo"
"code.gitea.io/gitea/modules/graceful"
2020-04-14 15:53:34 +02:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
"xorm.io/xorm"
)
2022-11-02 16:54:36 +08:00
func AddCommitDivergenceToPulls(x *xorm.Engine) error {
2020-05-29 23:18:24 +01:00
type Repository struct {
ID int64 `xorm:"pk autoincr"`
OwnerID int64 `xorm:"UNIQUE(s) index"`
OwnerName string
LowerName string `xorm:"UNIQUE(s) INDEX NOT NULL"`
Name string `xorm:"INDEX NOT NULL"`
}
type PullRequest struct {
ID int64 `xorm:"pk autoincr"`
IssueID int64 `xorm:"INDEX"`
Index int64
2020-05-29 23:18:24 +01:00
CommitsAhead int
CommitsBehind int
BaseRepoID int64 `xorm:"INDEX"`
BaseBranch string
HasMerged bool `xorm:"INDEX"`
MergedCommitID string `xorm:"VARCHAR(40)"`
}
2020-04-14 15:53:34 +02:00
2023-08-13 21:17:21 +02:00
if err := x.Sync(new(PullRequest)); err != nil {
return fmt.Errorf("Sync: %w", err)
2020-04-14 15:53:34 +02:00
}
2020-05-29 23:18:24 +01:00
last := 0
migrated := 0
2020-04-14 15:53:34 +02:00
batchSize := setting.Database.IterateBufferSize
sess := x.NewSession()
defer sess.Close()
2020-05-29 23:18:24 +01:00
ticker := time.NewTicker(5 * time.Second)
defer ticker.Stop()
count, err := sess.Where("has_merged = ?", false).Count(new(PullRequest))
if err != nil {
return err
}
log.Info("%d Unmerged Pull Request(s) to migrate ...", count)
2020-04-14 15:53:34 +02:00
for {
if err := sess.Begin(); err != nil {
return err
}
results := make([]*PullRequest, 0, batchSize)
2020-04-14 15:53:34 +02:00
err := sess.Where("has_merged = ?", false).OrderBy("id").Limit(batchSize, last).Find(&results)
if err != nil {
return err
}
if len(results) == 0 {
break
}
2020-05-29 23:18:24 +01:00
last += batchSize
2020-04-14 15:53:34 +02:00
for _, pr := range results {
2020-05-29 23:18:24 +01:00
baseRepo := &Repository{ID: pr.BaseRepoID}
has, err := x.Table("repository").Get(baseRepo)
if err != nil {
return fmt.Errorf("Unable to get base repo %d %w", pr.BaseRepoID, err)
2020-05-29 23:18:24 +01:00
}
if !has {
log.Error("Missing base repo with id %d for PR ID %d", pr.BaseRepoID, pr.ID)
continue
}
repoStore := repo_model.StorageRepo(repo_model.RelativePath(baseRepo.OwnerName, baseRepo.Name))
2020-05-29 23:18:24 +01:00
gitRefName := fmt.Sprintf("refs/pull/%d/head", pr.Index)
divergence, err := gitrepo.GetDivergingCommits(graceful.GetManager().HammerContext(), repoStore, pr.BaseBranch, gitRefName)
2020-04-14 15:53:34 +02:00
if err != nil {
log.Warn("Could not recalculate Divergence for pull: %d", pr.ID)
pr.CommitsAhead = 0
pr.CommitsBehind = 0
}
2020-05-29 23:18:24 +01:00
pr.CommitsAhead = divergence.Ahead
pr.CommitsBehind = divergence.Behind
2020-04-14 15:53:34 +02:00
if _, err = sess.ID(pr.ID).Cols("commits_ahead", "commits_behind").Update(pr); err != nil {
return fmt.Errorf("Update Cols: %w", err)
2020-04-14 15:53:34 +02:00
}
2020-05-29 23:18:24 +01:00
migrated++
2020-04-14 15:53:34 +02:00
}
if err := sess.Commit(); err != nil {
return err
}
2020-05-29 23:18:24 +01:00
select {
case <-ticker.C:
log.Info(
"%d/%d (%2.0f%%) Pull Request(s) migrated in %d batches. %d PRs Remaining ...",
migrated,
count,
float64(migrated)/float64(count)*100,
int(math.Ceil(float64(migrated)/float64(batchSize))),
count-int64(migrated))
default:
}
2020-04-14 15:53:34 +02:00
}
2020-05-29 23:18:24 +01:00
log.Info("Completed migrating %d Pull Request(s) in: %d batches", count, int(math.Ceil(float64(migrated)/float64(batchSize))))
2020-04-14 15:53:34 +02:00
return nil
}