aboutsummaryrefslogtreecommitdiff
path: root/internal/db/migrations/v16.go
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2019-10-24 01:51:46 -0700
committerGitHub <noreply@github.com>2019-10-24 01:51:46 -0700
commit01c8df01ec0608f1f25b2f1444adabb98fa5ee8a (patch)
treef8a7e5dd8d2a8c51e1ce2cabb9d33571a93314dd /internal/db/migrations/v16.go
parent613139e7bef81d3573e7988a47eb6765f3de347a (diff)
internal: move packages under this directory (#5836)
* Rename pkg -> internal * Rename routes -> route * Move route -> internal/route * Rename models -> db * Move db -> internal/db * Fix route2 -> route * Move cmd -> internal/cmd * Bump version
Diffstat (limited to 'internal/db/migrations/v16.go')
-rw-r--r--internal/db/migrations/v16.go77
1 files changed, 77 insertions, 0 deletions
diff --git a/internal/db/migrations/v16.go b/internal/db/migrations/v16.go
new file mode 100644
index 00000000..b374be39
--- /dev/null
+++ b/internal/db/migrations/v16.go
@@ -0,0 +1,77 @@
+// Copyright 2017 The Gogs 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 (
+ "fmt"
+ "path/filepath"
+ "strings"
+
+ "xorm.io/xorm"
+ log "gopkg.in/clog.v1"
+
+ "github.com/gogs/git-module"
+
+ "gogs.io/gogs/internal/setting"
+)
+
+func updateRepositorySizes(x *xorm.Engine) (err error) {
+ log.Info("This migration could take up to minutes, please be patient.")
+ type Repository struct {
+ ID int64
+ OwnerID int64
+ Name string
+ Size int64
+ }
+ type User struct {
+ ID int64
+ Name string
+ }
+ if err = x.Sync2(new(Repository)); err != nil {
+ return fmt.Errorf("Sync2: %v", err)
+ }
+
+ // For the sake of SQLite3, we can't use x.Iterate here.
+ offset := 0
+ for {
+ repos := make([]*Repository, 0, 10)
+ if err = x.Sql(fmt.Sprintf("SELECT * FROM `repository` ORDER BY id ASC LIMIT 10 OFFSET %d", offset)).
+ Find(&repos); err != nil {
+ return fmt.Errorf("select repos [offset: %d]: %v", offset, err)
+ }
+ log.Trace("Select [offset: %d, repos: %d]", offset, len(repos))
+ if len(repos) == 0 {
+ break
+ }
+ offset += 10
+
+ for _, repo := range repos {
+ if repo.Name == "." || repo.Name == ".." {
+ continue
+ }
+
+ user := new(User)
+ has, err := x.Where("id = ?", repo.OwnerID).Get(user)
+ if err != nil {
+ return fmt.Errorf("query owner of repository [repo_id: %d, owner_id: %d]: %v", repo.ID, repo.OwnerID, err)
+ } else if !has {
+ continue
+ }
+
+ repoPath := filepath.Join(setting.RepoRootPath, strings.ToLower(user.Name), strings.ToLower(repo.Name)) + ".git"
+ countObject, err := git.GetRepoSize(repoPath)
+ if err != nil {
+ log.Warn("GetRepoSize: %v", err)
+ continue
+ }
+
+ repo.Size = countObject.Size + countObject.SizePack
+ if _, err = x.Id(repo.ID).Cols("size").Update(repo); err != nil {
+ return fmt.Errorf("update size: %v", err)
+ }
+ }
+ }
+ return nil
+}