summaryrefslogtreecommitdiffstats
path: root/models/migrations
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2023-06-29 18:03:20 +0800
committerGitHub <noreply@github.com>2023-06-29 10:03:20 +0000
commit6e19484f4d3bf372212f2da462110a1a8c10cbf2 (patch)
treee8f1b4920b286241e4ad59151b4f00d9941a27aa /models/migrations
parent5a871932f0efc19a731ee5c1202679653d3cefff (diff)
downloadgitea-6e19484f4d3bf372212f2da462110a1a8c10cbf2.tar.gz
gitea-6e19484f4d3bf372212f2da462110a1a8c10cbf2.zip
Sync branches into databases (#22743)
Related #14180 Related #25233 Related #22639 Close #19786 Related #12763 This PR will change all the branches retrieve method from reading git data to read database to reduce git read operations. - [x] Sync git branches information into database when push git data - [x] Create a new table `Branch`, merge some columns of `DeletedBranch` into `Branch` table and drop the table `DeletedBranch`. - [x] Read `Branch` table when visit `code` -> `branch` page - [x] Read `Branch` table when list branch names in `code` page dropdown - [x] Read `Branch` table when list git ref compare page - [x] Provide a button in admin page to manually sync all branches. - [x] Sync branches if repository is not empty but database branches are empty when visiting pages with branches list - [x] Use `commit_time desc` as the default FindBranch order by to keep consistent as before and deleted branches will be always at the end. --------- Co-authored-by: Jason Song <i@wolfogre.com>
Diffstat (limited to 'models/migrations')
-rw-r--r--models/migrations/migrations.go2
-rw-r--r--models/migrations/v1_21/v264.go93
2 files changed, 95 insertions, 0 deletions
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index 3e9b348e63..a15b6e4eec 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -509,6 +509,8 @@ var migrations = []Migration{
NewMigration("Add TriggerEvent to action_run table", v1_21.AddTriggerEventToActionRun),
// v263 -> v264
NewMigration("Add git_size and lfs_size columns to repository table", v1_21.AddGitSizeAndLFSSizeToRepositoryTable),
+ // v264 -> v265
+ NewMigration("Add branch table", v1_21.AddBranchTable),
}
// GetCurrentDBVersion returns the current db version
diff --git a/models/migrations/v1_21/v264.go b/models/migrations/v1_21/v264.go
new file mode 100644
index 0000000000..60b7a7acf7
--- /dev/null
+++ b/models/migrations/v1_21/v264.go
@@ -0,0 +1,93 @@
+// Copyright 2023 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package v1_21 //nolint
+
+import (
+ "context"
+ "fmt"
+
+ "code.gitea.io/gitea/models/db"
+ "code.gitea.io/gitea/modules/timeutil"
+
+ "xorm.io/xorm"
+)
+
+func AddBranchTable(x *xorm.Engine) error {
+ type Branch struct {
+ ID int64
+ RepoID int64 `xorm:"UNIQUE(s)"`
+ Name string `xorm:"UNIQUE(s) NOT NULL"`
+ CommitID string
+ CommitMessage string `xorm:"TEXT"`
+ PusherID int64
+ IsDeleted bool `xorm:"index"`
+ DeletedByID int64
+ DeletedUnix timeutil.TimeStamp `xorm:"index"`
+ CommitTime timeutil.TimeStamp // The commit
+ CreatedUnix timeutil.TimeStamp `xorm:"created"`
+ UpdatedUnix timeutil.TimeStamp `xorm:"updated"`
+ }
+
+ if err := x.Sync(new(Branch)); err != nil {
+ return err
+ }
+
+ if exist, err := x.IsTableExist("deleted_branches"); err != nil {
+ return err
+ } else if !exist {
+ return nil
+ }
+
+ type DeletedBranch struct {
+ ID int64
+ RepoID int64 `xorm:"index UNIQUE(s)"`
+ Name string `xorm:"UNIQUE(s) NOT NULL"`
+ Commit string
+ DeletedByID int64
+ DeletedUnix timeutil.TimeStamp
+ }
+
+ var adminUserID int64
+ has, err := x.Table("user").
+ Select("id").
+ Where("is_admin=?", true).
+ Asc("id"). // Reliably get the admin with the lowest ID.
+ Get(&adminUserID)
+ if err != nil {
+ return err
+ } else if !has {
+ return fmt.Errorf("no admin user found")
+ }
+
+ branches := make([]Branch, 0, 100)
+ if err := db.Iterate(context.Background(), nil, func(ctx context.Context, deletedBranch *DeletedBranch) error {
+ branches = append(branches, Branch{
+ RepoID: deletedBranch.RepoID,
+ Name: deletedBranch.Name,
+ CommitID: deletedBranch.Commit,
+ PusherID: adminUserID,
+ IsDeleted: true,
+ DeletedByID: deletedBranch.DeletedByID,
+ DeletedUnix: deletedBranch.DeletedUnix,
+ })
+ if len(branches) >= 100 {
+ _, err := x.Insert(&branches)
+ if err != nil {
+ return err
+ }
+ branches = branches[:0]
+ }
+ return nil
+ }); err != nil {
+ return err
+ }
+
+ if len(branches) > 0 {
+ if _, err := x.Insert(&branches); err != nil {
+ return err
+ }
+ }
+
+ return x.DropTables("deleted_branches")
+}