+++ /dev/null
-// 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(¬ices)
-}
-
-// 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
-}
--- /dev/null
+// 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",
+ )
+}
--- /dev/null
+// 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(¬ices)
+}
+
+// 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
+}
--- /dev/null
+// 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})
+}
+++ /dev/null
-// 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})
-}
package models
import (
+ admin_model "code.gitea.io/gitea/models/admin"
"code.gitea.io/gitea/models/db"
"xorm.io/builder"
// 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
}
_ "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"
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
// 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 {
_ "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"
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.
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
}
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
}
}
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.
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
+}
"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"
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)
}
}
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)
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)
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
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)
}
}
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)
}
}
"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"
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
}
}
- 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 {
// 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
}
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"
)
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
"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"
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)
}
}
"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"
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)
}
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)
}
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)
}
"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"
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
"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"
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
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
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
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
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
"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"
return err
}
- models.RemoveAllWithNotice("Delete repository wiki", repo.WikiPath())
+ admin_model.RemoveAllWithNotice("Delete repository wiki", repo.WikiPath())
return nil
}