From 4334fe754e4a338a13073f649707acd26d1f4a12 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Mon, 11 Mar 2019 11:44:58 +0800 Subject: update git vendor to fix wrong release commit id and add migrations (#6224) * update git vendor to fix wrong release commit id and add migrations * fix count * fix migration release * fix tests --- models/migrations/migrations.go | 2 + models/migrations/v82.go | 87 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 models/migrations/v82.go (limited to 'models/migrations') diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go index 1fde096fbe..2807de78b1 100644 --- a/models/migrations/migrations.go +++ b/models/migrations/migrations.go @@ -217,6 +217,8 @@ var migrations = []Migration{ NewMigration("add is locked to issues", addIsLockedToIssues), // v81 -> v82 NewMigration("update U2F counter type", changeU2FCounterType), + // v82 -> v83 + NewMigration("hot fix for wrong release sha1 on release table", fixReleaseSha1OnReleaseTable), } // Migrate database to current version diff --git a/models/migrations/v82.go b/models/migrations/v82.go new file mode 100644 index 0000000000..6c62a8e24a --- /dev/null +++ b/models/migrations/v82.go @@ -0,0 +1,87 @@ +// Copyright 2019 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. + +package migrations + +import ( + "code.gitea.io/git" + "code.gitea.io/gitea/models" + "github.com/go-xorm/xorm" +) + +func fixReleaseSha1OnReleaseTable(x *xorm.Engine) error { + type Release struct { + ID int64 + RepoID int64 + Sha1 string + TagName string + } + + // Update release sha1 + const batchSize = 100 + sess := x.NewSession() + defer sess.Close() + + var ( + err error + count int + gitRepoCache = make(map[int64]*git.Repository) + repoCache = make(map[int64]*models.Repository) + ) + + 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 { + repo, err = models.GetRepositoryByID(release.RepoID) + if err != nil { + return err + } + repoCache[release.RepoID] = repo + } + + gitRepo, err = git.OpenRepository(repo.RepoPath()) + if err != nil { + return err + } + gitRepoCache[release.RepoID] = gitRepo + } + + release.Sha1, err = gitRepo.GetTagCommitID(release.TagName) + if err != nil { + return err + } + + if _, err = sess.ID(release.ID).Cols("sha1").Update(release); err != nil { + return err + } + + 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() +} -- cgit v1.2.3