]> source.dussan.org Git - gitea.git/commitdiff
Move user functions into user.go (#17659)
authorLunny Xiao <xiaolunwen@gmail.com>
Thu, 18 Nov 2021 05:58:42 +0000 (13:58 +0800)
committerGitHub <noreply@github.com>
Thu, 18 Nov 2021 05:58:42 +0000 (13:58 +0800)
* Move user functions into user.go

* Fix test

16 files changed:
models/admin.go [deleted file]
models/admin/main_test.go [new file with mode: 0644]
models/admin/notice.go [new file with mode: 0644]
models/admin/notice_test.go [new file with mode: 0644]
models/admin_test.go [deleted file]
models/consistency.go
models/repo.go
models/user.go
modules/repository/check.go
routers/web/admin/notice.go
routers/web/repo/middlewares.go
services/cron/tasks.go
services/migrations/gitea_downloader.go
services/migrations/migrate.go
services/mirror/mirror_pull.go
services/wiki/wiki.go

diff --git a/models/admin.go b/models/admin.go
deleted file mode 100644 (file)
index a003aff..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2014 The Gogs Authors. All rights reserved.
-// Copyright 2020 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 models
-
-import (
-       "fmt"
-
-       "code.gitea.io/gitea/models/db"
-       "code.gitea.io/gitea/modules/log"
-       "code.gitea.io/gitea/modules/storage"
-       "code.gitea.io/gitea/modules/timeutil"
-       "code.gitea.io/gitea/modules/util"
-)
-
-// NoticeType describes the notice type
-type NoticeType int
-
-const (
-       // NoticeRepository type
-       NoticeRepository NoticeType = iota + 1
-       // NoticeTask type
-       NoticeTask
-)
-
-// Notice represents a system notice for admin.
-type Notice struct {
-       ID          int64 `xorm:"pk autoincr"`
-       Type        NoticeType
-       Description string             `xorm:"TEXT"`
-       CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
-}
-
-func init() {
-       db.RegisterModel(new(Notice))
-}
-
-// TrStr returns a translation format string.
-func (n *Notice) TrStr() string {
-       return fmt.Sprintf("admin.notices.type_%d", n.Type)
-}
-
-// CreateNotice creates new system notice.
-func CreateNotice(tp NoticeType, desc string, args ...interface{}) error {
-       return createNotice(db.GetEngine(db.DefaultContext), tp, desc, args...)
-}
-
-func createNotice(e db.Engine, tp NoticeType, desc string, args ...interface{}) error {
-       if len(args) > 0 {
-               desc = fmt.Sprintf(desc, args...)
-       }
-       n := &Notice{
-               Type:        tp,
-               Description: desc,
-       }
-       _, err := e.Insert(n)
-       return err
-}
-
-// CreateRepositoryNotice creates new system notice with type NoticeRepository.
-func CreateRepositoryNotice(desc string, args ...interface{}) error {
-       return createNotice(db.GetEngine(db.DefaultContext), NoticeRepository, desc, args...)
-}
-
-// RemoveAllWithNotice removes all directories in given path and
-// creates a system notice when error occurs.
-func RemoveAllWithNotice(title, path string) {
-       removeAllWithNotice(db.GetEngine(db.DefaultContext), title, path)
-}
-
-// RemoveStorageWithNotice removes a file from the storage and
-// creates a system notice when error occurs.
-func RemoveStorageWithNotice(bucket storage.ObjectStorage, title, path string) {
-       removeStorageWithNotice(db.GetEngine(db.DefaultContext), bucket, title, path)
-}
-
-func removeStorageWithNotice(e db.Engine, bucket storage.ObjectStorage, title, path string) {
-       if err := bucket.Delete(path); err != nil {
-               desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
-               log.Warn(title+" [%s]: %v", path, err)
-               if err = createNotice(e, NoticeRepository, desc); err != nil {
-                       log.Error("CreateRepositoryNotice: %v", err)
-               }
-       }
-}
-
-func removeAllWithNotice(e db.Engine, title, path string) {
-       if err := util.RemoveAll(path); err != nil {
-               desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
-               log.Warn(title+" [%s]: %v", path, err)
-               if err = createNotice(e, NoticeRepository, desc); err != nil {
-                       log.Error("CreateRepositoryNotice: %v", err)
-               }
-       }
-}
-
-// CountNotices returns number of notices.
-func CountNotices() int64 {
-       count, _ := db.GetEngine(db.DefaultContext).Count(new(Notice))
-       return count
-}
-
-// Notices returns notices in given page.
-func Notices(page, pageSize int) ([]*Notice, error) {
-       notices := make([]*Notice, 0, pageSize)
-       return notices, db.GetEngine(db.DefaultContext).
-               Limit(pageSize, (page-1)*pageSize).
-               Desc("created_unix").
-               Find(&notices)
-}
-
-// DeleteNotice deletes a system notice by given ID.
-func DeleteNotice(id int64) error {
-       _, err := db.GetEngine(db.DefaultContext).ID(id).Delete(new(Notice))
-       return err
-}
-
-// DeleteNotices deletes all notices with ID from start to end (inclusive).
-func DeleteNotices(start, end int64) error {
-       if start == 0 && end == 0 {
-               _, err := db.GetEngine(db.DefaultContext).Exec("DELETE FROM notice")
-               return err
-       }
-
-       sess := db.GetEngine(db.DefaultContext).Where("id >= ?", start)
-       if end > 0 {
-               sess.And("id <= ?", end)
-       }
-       _, err := sess.Delete(new(Notice))
-       return err
-}
-
-// DeleteNoticesByIDs deletes notices by given IDs.
-func DeleteNoticesByIDs(ids []int64) error {
-       if len(ids) == 0 {
-               return nil
-       }
-       _, err := db.GetEngine(db.DefaultContext).
-               In("id", ids).
-               Delete(new(Notice))
-       return err
-}
-
-// GetAdminUser returns the first administrator
-func GetAdminUser() (*User, error) {
-       var admin User
-       has, err := db.GetEngine(db.DefaultContext).Where("is_admin=?", true).Get(&admin)
-       if err != nil {
-               return nil, err
-       } else if !has {
-               return nil, ErrUserNotExist{}
-       }
-
-       return &admin, nil
-}
diff --git a/models/admin/main_test.go b/models/admin/main_test.go
new file mode 100644 (file)
index 0000000..f6c9dce
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2020 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 admin
+
+import (
+       "path/filepath"
+       "testing"
+
+       "code.gitea.io/gitea/models/unittest"
+)
+
+func TestMain(m *testing.M) {
+       unittest.MainTest(m, filepath.Join("..", ".."),
+               "notice.yml",
+       )
+}
diff --git a/models/admin/notice.go b/models/admin/notice.go
new file mode 100644 (file)
index 0000000..c41e49e
--- /dev/null
@@ -0,0 +1,146 @@
+// Copyright 2021 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 admin
+
+import (
+       "context"
+       "fmt"
+
+       "code.gitea.io/gitea/models/db"
+       "code.gitea.io/gitea/modules/log"
+       "code.gitea.io/gitea/modules/storage"
+       "code.gitea.io/gitea/modules/timeutil"
+       "code.gitea.io/gitea/modules/util"
+)
+
+// NoticeType describes the notice type
+type NoticeType int
+
+const (
+       // NoticeRepository type
+       NoticeRepository NoticeType = iota + 1
+       // NoticeTask type
+       NoticeTask
+)
+
+// Notice represents a system notice for admin.
+type Notice struct {
+       ID          int64 `xorm:"pk autoincr"`
+       Type        NoticeType
+       Description string             `xorm:"TEXT"`
+       CreatedUnix timeutil.TimeStamp `xorm:"INDEX created"`
+}
+
+func init() {
+       db.RegisterModel(new(Notice))
+}
+
+// TrStr returns a translation format string.
+func (n *Notice) TrStr() string {
+       return fmt.Sprintf("admin.notices.type_%d", n.Type)
+}
+
+// CreateNotice creates new system notice.
+func CreateNotice(tp NoticeType, desc string, args ...interface{}) error {
+       return CreateNoticeCtx(db.DefaultContext, tp, desc, args...)
+}
+
+// CreateNoticeCtx creates new system notice.
+func CreateNoticeCtx(ctx context.Context, tp NoticeType, desc string, args ...interface{}) error {
+       if len(args) > 0 {
+               desc = fmt.Sprintf(desc, args...)
+       }
+       n := &Notice{
+               Type:        tp,
+               Description: desc,
+       }
+       return db.Insert(ctx, n)
+}
+
+// CreateRepositoryNotice creates new system notice with type NoticeRepository.
+func CreateRepositoryNotice(desc string, args ...interface{}) error {
+       return CreateNoticeCtx(db.DefaultContext, NoticeRepository, desc, args...)
+}
+
+// RemoveAllWithNotice removes all directories in given path and
+// creates a system notice when error occurs.
+func RemoveAllWithNotice(title, path string) {
+       RemoveAllWithNoticeCtx(db.DefaultContext, title, path)
+}
+
+// RemoveStorageWithNotice removes a file from the storage and
+// creates a system notice when error occurs.
+func RemoveStorageWithNotice(bucket storage.ObjectStorage, title, path string) {
+       removeStorageWithNotice(db.DefaultContext, bucket, title, path)
+}
+
+func removeStorageWithNotice(ctx context.Context, bucket storage.ObjectStorage, title, path string) {
+       if err := bucket.Delete(path); err != nil {
+               desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
+               log.Warn(title+" [%s]: %v", path, err)
+               if err = CreateNoticeCtx(ctx, NoticeRepository, desc); err != nil {
+                       log.Error("CreateRepositoryNotice: %v", err)
+               }
+       }
+}
+
+// RemoveAllWithNoticeCtx removes all directories in given path and
+// creates a system notice when error occurs.
+func RemoveAllWithNoticeCtx(ctx context.Context, title, path string) {
+       if err := util.RemoveAll(path); err != nil {
+               desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
+               log.Warn(title+" [%s]: %v", path, err)
+               if err = CreateNoticeCtx(ctx, NoticeRepository, desc); err != nil {
+                       log.Error("CreateRepositoryNotice: %v", err)
+               }
+       }
+}
+
+// CountNotices returns number of notices.
+func CountNotices() int64 {
+       count, _ := db.GetEngine(db.DefaultContext).Count(new(Notice))
+       return count
+}
+
+// Notices returns notices in given page.
+func Notices(page, pageSize int) ([]*Notice, error) {
+       notices := make([]*Notice, 0, pageSize)
+       return notices, db.GetEngine(db.DefaultContext).
+               Limit(pageSize, (page-1)*pageSize).
+               Desc("created_unix").
+               Find(&notices)
+}
+
+// DeleteNotice deletes a system notice by given ID.
+func DeleteNotice(id int64) error {
+       _, err := db.GetEngine(db.DefaultContext).ID(id).Delete(new(Notice))
+       return err
+}
+
+// DeleteNotices deletes all notices with ID from start to end (inclusive).
+func DeleteNotices(start, end int64) error {
+       if start == 0 && end == 0 {
+               _, err := db.GetEngine(db.DefaultContext).Exec("DELETE FROM notice")
+               return err
+       }
+
+       sess := db.GetEngine(db.DefaultContext).Where("id >= ?", start)
+       if end > 0 {
+               sess.And("id <= ?", end)
+       }
+       _, err := sess.Delete(new(Notice))
+       return err
+}
+
+// DeleteNoticesByIDs deletes notices by given IDs.
+func DeleteNoticesByIDs(ids []int64) error {
+       if len(ids) == 0 {
+               return nil
+       }
+       _, err := db.GetEngine(db.DefaultContext).
+               In("id", ids).
+               Delete(new(Notice))
+       return err
+}
diff --git a/models/admin/notice_test.go b/models/admin/notice_test.go
new file mode 100644 (file)
index 0000000..7272df4
--- /dev/null
@@ -0,0 +1,115 @@
+// Copyright 2017 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 admin
+
+import (
+       "testing"
+
+       "code.gitea.io/gitea/models/unittest"
+
+       "github.com/stretchr/testify/assert"
+)
+
+func TestNotice_TrStr(t *testing.T) {
+       notice := &Notice{
+               Type:        NoticeRepository,
+               Description: "test description",
+       }
+       assert.Equal(t, "admin.notices.type_1", notice.TrStr())
+}
+
+func TestCreateNotice(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       noticeBean := &Notice{
+               Type:        NoticeRepository,
+               Description: "test description",
+       }
+       unittest.AssertNotExistsBean(t, noticeBean)
+       assert.NoError(t, CreateNotice(noticeBean.Type, noticeBean.Description))
+       unittest.AssertExistsAndLoadBean(t, noticeBean)
+}
+
+func TestCreateRepositoryNotice(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       noticeBean := &Notice{
+               Type:        NoticeRepository,
+               Description: "test description",
+       }
+       unittest.AssertNotExistsBean(t, noticeBean)
+       assert.NoError(t, CreateRepositoryNotice(noticeBean.Description))
+       unittest.AssertExistsAndLoadBean(t, noticeBean)
+}
+
+// TODO TestRemoveAllWithNotice
+
+func TestCountNotices(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+       assert.Equal(t, int64(3), CountNotices())
+}
+
+func TestNotices(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       notices, err := Notices(1, 2)
+       assert.NoError(t, err)
+       if assert.Len(t, notices, 2) {
+               assert.Equal(t, int64(3), notices[0].ID)
+               assert.Equal(t, int64(2), notices[1].ID)
+       }
+
+       notices, err = Notices(2, 2)
+       assert.NoError(t, err)
+       if assert.Len(t, notices, 1) {
+               assert.Equal(t, int64(1), notices[0].ID)
+       }
+}
+
+func TestDeleteNotice(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
+       assert.NoError(t, DeleteNotice(3))
+       unittest.AssertNotExistsBean(t, &Notice{ID: 3})
+}
+
+func TestDeleteNotices(t *testing.T) {
+       // delete a non-empty range
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
+       assert.NoError(t, DeleteNotices(1, 2))
+       unittest.AssertNotExistsBean(t, &Notice{ID: 1})
+       unittest.AssertNotExistsBean(t, &Notice{ID: 2})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
+}
+
+func TestDeleteNotices2(t *testing.T) {
+       // delete an empty range
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
+       assert.NoError(t, DeleteNotices(3, 2))
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
+}
+
+func TestDeleteNoticesByIDs(t *testing.T) {
+       assert.NoError(t, unittest.PrepareTestDatabase())
+
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
+       assert.NoError(t, DeleteNoticesByIDs([]int64{1, 3}))
+       unittest.AssertNotExistsBean(t, &Notice{ID: 1})
+       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
+       unittest.AssertNotExistsBean(t, &Notice{ID: 3})
+}
diff --git a/models/admin_test.go b/models/admin_test.go
deleted file mode 100644 (file)
index 8c1deda..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-// Copyright 2017 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 models
-
-import (
-       "testing"
-
-       "code.gitea.io/gitea/models/unittest"
-
-       "github.com/stretchr/testify/assert"
-)
-
-func TestNotice_TrStr(t *testing.T) {
-       notice := &Notice{
-               Type:        NoticeRepository,
-               Description: "test description",
-       }
-       assert.Equal(t, "admin.notices.type_1", notice.TrStr())
-}
-
-func TestCreateNotice(t *testing.T) {
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       noticeBean := &Notice{
-               Type:        NoticeRepository,
-               Description: "test description",
-       }
-       unittest.AssertNotExistsBean(t, noticeBean)
-       assert.NoError(t, CreateNotice(noticeBean.Type, noticeBean.Description))
-       unittest.AssertExistsAndLoadBean(t, noticeBean)
-}
-
-func TestCreateRepositoryNotice(t *testing.T) {
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       noticeBean := &Notice{
-               Type:        NoticeRepository,
-               Description: "test description",
-       }
-       unittest.AssertNotExistsBean(t, noticeBean)
-       assert.NoError(t, CreateRepositoryNotice(noticeBean.Description))
-       unittest.AssertExistsAndLoadBean(t, noticeBean)
-}
-
-// TODO TestRemoveAllWithNotice
-
-func TestCountNotices(t *testing.T) {
-       assert.NoError(t, unittest.PrepareTestDatabase())
-       assert.Equal(t, int64(3), CountNotices())
-}
-
-func TestNotices(t *testing.T) {
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       notices, err := Notices(1, 2)
-       assert.NoError(t, err)
-       if assert.Len(t, notices, 2) {
-               assert.Equal(t, int64(3), notices[0].ID)
-               assert.Equal(t, int64(2), notices[1].ID)
-       }
-
-       notices, err = Notices(2, 2)
-       assert.NoError(t, err)
-       if assert.Len(t, notices, 1) {
-               assert.Equal(t, int64(1), notices[0].ID)
-       }
-}
-
-func TestDeleteNotice(t *testing.T) {
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
-       assert.NoError(t, DeleteNotice(3))
-       unittest.AssertNotExistsBean(t, &Notice{ID: 3})
-}
-
-func TestDeleteNotices(t *testing.T) {
-       // delete a non-empty range
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
-       assert.NoError(t, DeleteNotices(1, 2))
-       unittest.AssertNotExistsBean(t, &Notice{ID: 1})
-       unittest.AssertNotExistsBean(t, &Notice{ID: 2})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
-}
-
-func TestDeleteNotices2(t *testing.T) {
-       // delete an empty range
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
-       assert.NoError(t, DeleteNotices(3, 2))
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
-}
-
-func TestDeleteNoticesByIDs(t *testing.T) {
-       assert.NoError(t, unittest.PrepareTestDatabase())
-
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 1})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 3})
-       assert.NoError(t, DeleteNoticesByIDs([]int64{1, 3}))
-       unittest.AssertNotExistsBean(t, &Notice{ID: 1})
-       unittest.AssertExistsAndLoadBean(t, &Notice{ID: 2})
-       unittest.AssertNotExistsBean(t, &Notice{ID: 3})
-}
index d7bf8ade5758eedc6aaec60ace8cf657a42ebba5..83cfbd0e49c1f84fa17da199001b6d08d0f08249 100644 (file)
@@ -5,6 +5,7 @@
 package models
 
 import (
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/db"
 
        "xorm.io/builder"
@@ -127,7 +128,7 @@ func DeleteOrphanedIssues() error {
 
        // Remove issue attachment files.
        for i := range attachmentPaths {
-               removeAllWithNotice(db.GetEngine(db.DefaultContext), "Delete issue attachment", attachmentPaths[i])
+               admin_model.RemoveAllWithNoticeCtx(db.DefaultContext, "Delete issue attachment", attachmentPaths[i])
        }
        return nil
 }
index d45f1b2fc357e3d98748c100ce13bee8fa5324a5..57806a86f7b5fb76f3f8b85b5a0c758df95c502a 100644 (file)
@@ -23,6 +23,7 @@ import (
 
        _ "image/jpeg" // Needed for jpeg support
 
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/db"
        "code.gitea.io/gitea/models/unit"
        "code.gitea.io/gitea/models/webhook"
@@ -133,7 +134,7 @@ func NewRepoContext() {
        loadRepoConfig()
        unit.LoadUnitConfig()
 
-       RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp"))
+       admin_model.RemoveAllWithNotice("Clean up repository temporary data", filepath.Join(setting.AppDataPath, "tmp"))
 }
 
 // RepositoryStatus defines the status of repository
@@ -1648,36 +1649,36 @@ func DeleteRepository(doer *User, uid, repoID int64) error {
 
        // Remove repository files.
        repoPath := repo.RepoPath()
-       removeAllWithNotice(db.GetEngine(db.DefaultContext), "Delete repository files", repoPath)
+       admin_model.RemoveAllWithNotice("Delete repository files", repoPath)
 
        // Remove wiki files
        if repo.HasWiki() {
-               removeAllWithNotice(db.GetEngine(db.DefaultContext), "Delete repository wiki", repo.WikiPath())
+               admin_model.RemoveAllWithNotice("Delete repository wiki", repo.WikiPath())
        }
 
        // Remove archives
        for i := range archivePaths {
-               removeStorageWithNotice(db.GetEngine(db.DefaultContext), storage.RepoArchives, "Delete repo archive file", archivePaths[i])
+               admin_model.RemoveStorageWithNotice(storage.RepoArchives, "Delete repo archive file", archivePaths[i])
        }
 
        // Remove lfs objects
        for i := range lfsPaths {
-               removeStorageWithNotice(db.GetEngine(db.DefaultContext), storage.LFS, "Delete orphaned LFS file", lfsPaths[i])
+               admin_model.RemoveStorageWithNotice(storage.LFS, "Delete orphaned LFS file", lfsPaths[i])
        }
 
        // Remove issue attachment files.
        for i := range attachmentPaths {
-               RemoveStorageWithNotice(storage.Attachments, "Delete issue attachment", attachmentPaths[i])
+               admin_model.RemoveStorageWithNotice(storage.Attachments, "Delete issue attachment", attachmentPaths[i])
        }
 
        // Remove release attachment files.
        for i := range releaseAttachments {
-               RemoveStorageWithNotice(storage.Attachments, "Delete release attachment", releaseAttachments[i])
+               admin_model.RemoveStorageWithNotice(storage.Attachments, "Delete release attachment", releaseAttachments[i])
        }
 
        // Remove attachment with no issue_id and release_id.
        for i := range newAttachmentPaths {
-               RemoveStorageWithNotice(storage.Attachments, "Delete issue attachment", attachmentPaths[i])
+               admin_model.RemoveStorageWithNotice(storage.Attachments, "Delete issue attachment", attachmentPaths[i])
        }
 
        if len(repo.Avatar) > 0 {
index a87929a35f7b8a0f6f0afe80cc18278ad76375a7..cc6c5a5578276775a12347e0919988ab8fca54ed 100644 (file)
@@ -22,6 +22,7 @@ import (
 
        _ "image/jpeg" // Needed for jpeg support
 
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/db"
        "code.gitea.io/gitea/models/login"
        "code.gitea.io/gitea/models/unit"
@@ -1148,7 +1149,8 @@ func deleteBeans(e db.Engine, beans ...interface{}) (err error) {
        return nil
 }
 
-func deleteUser(e db.Engine, u *User) error {
+func deleteUser(ctx context.Context, u *User) error {
+       e := db.GetEngine(ctx)
        // Note: A user owns any repository or belongs to any organization
        //      cannot perform delete operation.
 
@@ -1304,7 +1306,7 @@ func deleteUser(e db.Engine, u *User) error {
        path := UserPath(u.Name)
        if err = util.RemoveAll(path); err != nil {
                err = fmt.Errorf("Failed to RemoveAll %s: %v", path, err)
-               _ = createNotice(e, NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err))
+               _ = admin_model.CreateNoticeCtx(ctx, admin_model.NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err))
                return err
        }
 
@@ -1312,7 +1314,7 @@ func deleteUser(e db.Engine, u *User) error {
                avatarPath := u.CustomAvatarRelativePath()
                if err = storage.Avatars.Delete(avatarPath); err != nil {
                        err = fmt.Errorf("Failed to remove %s: %v", avatarPath, err)
-                       _ = createNotice(e, NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err))
+                       _ = admin_model.CreateNoticeCtx(ctx, admin_model.NoticeTask, fmt.Sprintf("delete user '%s': %v", u.Name, err))
                        return err
                }
        }
@@ -1328,18 +1330,18 @@ func DeleteUser(u *User) (err error) {
                return fmt.Errorf("%s is an organization not a user", u.Name)
        }
 
-       sess := db.NewSession(db.DefaultContext)
-       defer sess.Close()
-       if err = sess.Begin(); err != nil {
+       ctx, committer, err := db.TxContext()
+       if err != nil {
                return err
        }
+       defer committer.Close()
 
-       if err = deleteUser(sess, u); err != nil {
+       if err = deleteUser(ctx, u); err != nil {
                // Note: don't wrapper error here.
                return err
        }
 
-       return sess.Commit()
+       return committer.Commit()
 }
 
 // DeleteInactiveUsers deletes all inactive users and email addresses.
@@ -1825,3 +1827,16 @@ func GetUserByOpenID(uri string) (*User, error) {
 
        return nil, ErrUserNotExist{0, uri, 0}
 }
+
+// GetAdminUser returns the first administrator
+func GetAdminUser() (*User, error) {
+       var admin User
+       has, err := db.GetEngine(db.DefaultContext).Where("is_admin=?", true).Get(&admin)
+       if err != nil {
+               return nil, err
+       } else if !has {
+               return nil, ErrUserNotExist{}
+       }
+
+       return &admin, nil
+}
index 1857242f507c8569929271117b43f8118e319051..36bd4e2e0de6f0bb71c348f2c9e61b9565bdde71 100644 (file)
@@ -11,6 +11,7 @@ import (
        "time"
 
        "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/db"
        "code.gitea.io/gitea/modules/git"
        "code.gitea.io/gitea/modules/log"
@@ -38,7 +39,7 @@ func GitFsck(ctx context.Context, timeout time.Duration, args []string) error {
                        repoPath := repo.RepoPath()
                        if err := git.Fsck(ctx, repoPath, timeout, args...); err != nil {
                                log.Warn("Failed to health check repository (%v): %v", repo, err)
-                               if err = models.CreateRepositoryNotice("Failed to health check repository (%s): %v", repo.FullName(), err); err != nil {
+                               if err = admin_model.CreateRepositoryNotice("Failed to health check repository (%s): %v", repo.FullName(), err); err != nil {
                                        log.Error("CreateRepositoryNotice: %v", err)
                                }
                        }
@@ -87,7 +88,7 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...string) erro
                        if err != nil {
                                log.Error("Repository garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err)
                                desc := fmt.Sprintf("Repository garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err)
-                               if err = models.CreateRepositoryNotice(desc); err != nil {
+                               if err = admin_model.CreateRepositoryNotice(desc); err != nil {
                                        log.Error("CreateRepositoryNotice: %v", err)
                                }
                                return fmt.Errorf("Repository garbage collection failed in repo: %s: Error: %v", repo.FullName(), err)
@@ -97,7 +98,7 @@ func GitGcRepos(ctx context.Context, timeout time.Duration, args ...string) erro
                        if err := repo.UpdateSize(db.DefaultContext); err != nil {
                                log.Error("Updating size as part of garbage collection failed for %v. Stdout: %s\nError: %v", repo, stdout, err)
                                desc := fmt.Sprintf("Updating size as part of garbage collection failed for %s. Stdout: %s\nError: %v", repo.RepoPath(), stdout, err)
-                               if err = models.CreateRepositoryNotice(desc); err != nil {
+                               if err = admin_model.CreateRepositoryNotice(desc); err != nil {
                                        log.Error("CreateRepositoryNotice: %v", err)
                                }
                                return fmt.Errorf("Updating size as part of garbage collection failed in repo: %s: Error: %v", repo.FullName(), err)
@@ -139,7 +140,7 @@ func gatherMissingRepoRecords(ctx context.Context) ([]*models.Repository, error)
                if strings.HasPrefix(err.Error(), "Aborted gathering missing repo") {
                        return nil, err
                }
-               if err2 := models.CreateRepositoryNotice("gatherMissingRepoRecords: %v", err); err2 != nil {
+               if err2 := admin_model.CreateRepositoryNotice("gatherMissingRepoRecords: %v", err); err2 != nil {
                        log.Error("CreateRepositoryNotice: %v", err2)
                }
                return nil, err
@@ -167,7 +168,7 @@ func DeleteMissingRepositories(ctx context.Context, doer *models.User) error {
                log.Trace("Deleting %d/%d...", repo.OwnerID, repo.ID)
                if err := models.DeleteRepository(doer, repo.OwnerID, repo.ID); err != nil {
                        log.Error("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err)
-                       if err2 := models.CreateRepositoryNotice("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil {
+                       if err2 := admin_model.CreateRepositoryNotice("Failed to DeleteRepository %s [%d]: Error: %v", repo.FullName(), repo.ID, err); err2 != nil {
                                log.Error("CreateRepositoryNotice: %v", err)
                        }
                }
@@ -195,7 +196,7 @@ func ReinitMissingRepositories(ctx context.Context) error {
                log.Trace("Initializing %d/%d...", repo.OwnerID, repo.ID)
                if err := git.InitRepository(repo.RepoPath(), true); err != nil {
                        log.Error("Unable (re)initialize repository %d at %s. Error: %v", repo.ID, repo.RepoPath(), err)
-                       if err2 := models.CreateRepositoryNotice("InitRepository [%d]: %v", repo.ID, err); err2 != nil {
+                       if err2 := admin_model.CreateRepositoryNotice("InitRepository [%d]: %v", repo.ID, err); err2 != nil {
                                log.Error("CreateRepositoryNotice: %v", err2)
                        }
                }
index fab3aba533b6795a3c935c439c7d4f65ded8e8e7..3613f428ed797ed62b0d4d5a71e13e9682902a41 100644 (file)
@@ -9,7 +9,7 @@ import (
        "net/http"
        "strconv"
 
-       "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/modules/base"
        "code.gitea.io/gitea/modules/context"
        "code.gitea.io/gitea/modules/log"
@@ -26,13 +26,13 @@ func Notices(ctx *context.Context) {
        ctx.Data["PageIsAdmin"] = true
        ctx.Data["PageIsAdminNotices"] = true
 
-       total := models.CountNotices()
+       total := admin_model.CountNotices()
        page := ctx.FormInt("page")
        if page <= 1 {
                page = 1
        }
 
-       notices, err := models.Notices(page, setting.UI.Admin.NoticePagingNum)
+       notices, err := admin_model.Notices(page, setting.UI.Admin.NoticePagingNum)
        if err != nil {
                ctx.ServerError("Notices", err)
                return
@@ -57,7 +57,7 @@ func DeleteNotices(ctx *context.Context) {
                }
        }
 
-       if err := models.DeleteNoticesByIDs(ids); err != nil {
+       if err := admin_model.DeleteNoticesByIDs(ids); err != nil {
                ctx.Flash.Error("DeleteNoticesByIDs: " + err.Error())
                ctx.Status(500)
        } else {
@@ -68,7 +68,7 @@ func DeleteNotices(ctx *context.Context) {
 
 // EmptyNotices delete all the notices
 func EmptyNotices(ctx *context.Context) {
-       if err := models.DeleteNotices(0, 0); err != nil {
+       if err := admin_model.DeleteNotices(0, 0); err != nil {
                ctx.ServerError("DeleteNotices", err)
                return
        }
index 250544350416fa3e7248208f15fcb3b77d89200f..a5d478dd73b3fa641160cf7e90b513553a865256 100644 (file)
@@ -7,7 +7,7 @@ package repo
 import (
        "fmt"
 
-       "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/modules/context"
        "code.gitea.io/gitea/modules/git"
 )
@@ -23,7 +23,7 @@ func SetEditorconfigIfExists(ctx *context.Context) {
 
        if err != nil && !git.IsErrNotExist(err) {
                description := fmt.Sprintf("Error while getting .editorconfig file: %v", err)
-               if err := models.CreateRepositoryNotice(description); err != nil {
+               if err := admin_model.CreateRepositoryNotice(description); err != nil {
                        ctx.ServerError("ErrCreatingReporitoryNotice", err)
                }
                return
index 56c363e0b81980411585ea26846652ed47faecff..d29bf6d6bd174edc173be48bae337a2f3d4c0c3a 100644 (file)
@@ -11,6 +11,7 @@ import (
        "sync"
 
        "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/db"
        "code.gitea.io/gitea/modules/graceful"
        "code.gitea.io/gitea/modules/log"
@@ -89,18 +90,18 @@ func (t *Task) RunWithUser(doer *models.User, config Config) {
                if err := t.fun(ctx, doer, config); err != nil {
                        if db.IsErrCancelled(err) {
                                message := err.(db.ErrCancelled).Message
-                               if err := models.CreateNotice(models.NoticeTask, config.FormatMessage(t.Name, "aborted", doer, message)); err != nil {
+                               if err := admin_model.CreateNotice(admin_model.NoticeTask, config.FormatMessage(t.Name, "aborted", doer, message)); err != nil {
                                        log.Error("CreateNotice: %v", err)
                                }
                                return
                        }
-                       if err := models.CreateNotice(models.NoticeTask, config.FormatMessage(t.Name, "error", doer, err)); err != nil {
+                       if err := admin_model.CreateNotice(admin_model.NoticeTask, config.FormatMessage(t.Name, "error", doer, err)); err != nil {
                                log.Error("CreateNotice: %v", err)
                        }
                        return
                }
                if config.DoNoticeOnSuccess() {
-                       if err := models.CreateNotice(models.NoticeTask, config.FormatMessage(t.Name, "finished", doer)); err != nil {
+                       if err := admin_model.CreateNotice(admin_model.NoticeTask, config.FormatMessage(t.Name, "finished", doer)); err != nil {
                                log.Error("CreateNotice: %v", err)
                        }
                }
index 51ef0292df7fc61c86d768b79dbe486ccf15e408..00180adf41e20c6d11e759d463b2a50c6435e5f1 100644 (file)
@@ -15,7 +15,7 @@ import (
        "strings"
        "time"
 
-       "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/modules/log"
        base "code.gitea.io/gitea/modules/migration"
        "code.gitea.io/gitea/modules/proxy"
@@ -417,7 +417,7 @@ func (g *GiteaDownloader) GetIssues(page, perPage int) ([]*base.Issue, bool, err
                reactions, err := g.getIssueReactions(issue.Index)
                if err != nil {
                        log.Warn("Unable to load reactions during migrating issue #%d to %s/%s. Error: %v", issue.Index, g.repoOwner, g.repoName, err)
-                       if err2 := models.CreateRepositoryNotice(
+                       if err2 := admin_model.CreateRepositoryNotice(
                                fmt.Sprintf("Unable to load reactions during migrating issue #%d to %s/%s. Error: %v", issue.Index, g.repoOwner, g.repoName, err)); err2 != nil {
                                log.Error("create repository notice failed: ", err2)
                        }
@@ -479,7 +479,7 @@ func (g *GiteaDownloader) GetComments(opts base.GetCommentOptions) ([]*base.Comm
                        reactions, err := g.getCommentReactions(comment.ID)
                        if err != nil {
                                log.Warn("Unable to load comment reactions during migrating issue #%d for comment %d to %s/%s. Error: %v", opts.Context.ForeignID(), comment.ID, g.repoOwner, g.repoName, err)
-                               if err2 := models.CreateRepositoryNotice(
+                               if err2 := admin_model.CreateRepositoryNotice(
                                        fmt.Sprintf("Unable to load reactions during migrating issue #%d for comment %d to %s/%s. Error: %v", opts.Context.ForeignID(), comment.ID, g.repoOwner, g.repoName, err)); err2 != nil {
                                        log.Error("create repository notice failed: ", err2)
                                }
@@ -557,7 +557,7 @@ func (g *GiteaDownloader) GetPullRequests(page, perPage int) ([]*base.PullReques
                reactions, err := g.getIssueReactions(pr.Index)
                if err != nil {
                        log.Warn("Unable to load reactions during migrating pull #%d to %s/%s. Error: %v", pr.Index, g.repoOwner, g.repoName, err)
-                       if err2 := models.CreateRepositoryNotice(
+                       if err2 := admin_model.CreateRepositoryNotice(
                                fmt.Sprintf("Unable to load reactions during migrating pull #%d to %s/%s. Error: %v", pr.Index, g.repoOwner, g.repoName, err)); err2 != nil {
                                log.Error("create repository notice failed: ", err2)
                        }
index 21be2d3b0dddf984906f83f28075bff594b46fac..e6d5e8e4cc09826b6bd80d9dbded29406aefdf7a 100644 (file)
@@ -14,6 +14,7 @@ import (
        "strings"
 
        "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/modules/log"
        "code.gitea.io/gitea/modules/matchlist"
        base "code.gitea.io/gitea/modules/migration"
@@ -122,7 +123,7 @@ func MigrateRepository(ctx context.Context, doer *models.User, ownerName string,
                if err1 := uploader.Rollback(); err1 != nil {
                        log.Error("rollback failed: %v", err1)
                }
-               if err2 := models.CreateRepositoryNotice(fmt.Sprintf("Migrate repository from %s failed: %v", opts.OriginalURL, err)); err2 != nil {
+               if err2 := admin_model.CreateRepositoryNotice(fmt.Sprintf("Migrate repository from %s failed: %v", opts.OriginalURL, err)); err2 != nil {
                        log.Error("create respotiry notice failed: ", err2)
                }
                return nil, err
index 84644145f78626a6645fe11706fbde52ca58bc31..67eaa61c9cdad396b123f27d8cb79e8e7cf8814b 100644 (file)
@@ -11,6 +11,7 @@ import (
        "time"
 
        "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/db"
        "code.gitea.io/gitea/modules/cache"
        "code.gitea.io/gitea/modules/git"
@@ -170,7 +171,7 @@ func pruneBrokenReferences(ctx context.Context,
 
                log.Error("Failed to prune mirror repository %s%-v references:\nStdout: %s\nStderr: %s\nErr: %v", wiki, m.Repo, stdoutMessage, stderrMessage, pruneErr)
                desc := fmt.Sprintf("Failed to prune mirror repository %s'%s' references: %s", wiki, repoPath, stderrMessage)
-               if err := models.CreateRepositoryNotice(desc); err != nil {
+               if err := admin_model.CreateRepositoryNotice(desc); err != nil {
                        log.Error("CreateRepositoryNotice: %v", err)
                }
                // this if will only be reached on a successful prune so try to get the mirror again
@@ -239,7 +240,7 @@ func runSync(ctx context.Context, m *models.Mirror) ([]*mirrorSyncResult, bool)
                if err != nil {
                        log.Error("Failed to update mirror repository %-v:\nStdout: %s\nStderr: %s\nErr: %v", m.Repo, stdoutMessage, stderrMessage, err)
                        desc := fmt.Sprintf("Failed to update mirror repository '%s': %s", repoPath, stderrMessage)
-                       if err = models.CreateRepositoryNotice(desc); err != nil {
+                       if err = admin_model.CreateRepositoryNotice(desc); err != nil {
                                log.Error("CreateRepositoryNotice: %v", err)
                        }
                        return nil, false
@@ -323,7 +324,7 @@ func runSync(ctx context.Context, m *models.Mirror) ([]*mirrorSyncResult, bool)
                        if err != nil {
                                log.Error("Failed to update mirror repository wiki %-v:\nStdout: %s\nStderr: %s\nErr: %v", m.Repo, stdoutMessage, stderrMessage, err)
                                desc := fmt.Sprintf("Failed to update mirror repository wiki '%s': %s", wikiPath, stderrMessage)
-                               if err = models.CreateRepositoryNotice(desc); err != nil {
+                               if err = admin_model.CreateRepositoryNotice(desc); err != nil {
                                        log.Error("CreateRepositoryNotice: %v", err)
                                }
                                return nil, false
@@ -524,7 +525,7 @@ func checkAndUpdateEmptyRepository(m *models.Mirror, gitRepo *git.Repository, re
                        if !git.IsErrUnsupportedVersion(err) {
                                log.Error("Failed to update default branch of underlying git repository %-v. Error: %v", m.Repo, err)
                                desc := fmt.Sprintf("Failed to uupdate default branch of underlying git repository '%s': %v", m.Repo.RepoPath(), err)
-                               if err = models.CreateRepositoryNotice(desc); err != nil {
+                               if err = admin_model.CreateRepositoryNotice(desc); err != nil {
                                        log.Error("CreateRepositoryNotice: %v", err)
                                }
                                return false
@@ -535,7 +536,7 @@ func checkAndUpdateEmptyRepository(m *models.Mirror, gitRepo *git.Repository, re
                if err := models.UpdateRepositoryCols(m.Repo, "default_branch", "is_empty"); err != nil {
                        log.Error("Failed to update default branch of repository %-v. Error: %v", m.Repo, err)
                        desc := fmt.Sprintf("Failed to uupdate default branch of repository '%s': %v", m.Repo.RepoPath(), err)
-                       if err = models.CreateRepositoryNotice(desc); err != nil {
+                       if err = admin_model.CreateRepositoryNotice(desc); err != nil {
                                log.Error("CreateRepositoryNotice: %v", err)
                        }
                        return false
index 9d57ac432f405b1aea51b1586c530959f83cc897..2db982a50f1ebe7c390da17bce77d485b7356ad9 100644 (file)
@@ -12,6 +12,7 @@ import (
        "strings"
 
        "code.gitea.io/gitea/models"
+       admin_model "code.gitea.io/gitea/models/admin"
        "code.gitea.io/gitea/models/unit"
        "code.gitea.io/gitea/modules/git"
        "code.gitea.io/gitea/modules/log"
@@ -374,6 +375,6 @@ func DeleteWiki(repo *models.Repository) error {
                return err
        }
 
-       models.RemoveAllWithNotice("Delete repository wiki", repo.WikiPath())
+       admin_model.RemoveAllWithNotice("Delete repository wiki", repo.WikiPath())
        return nil
 }