2014-10-08 22:29:18 +00:00
|
|
|
// Copyright 2014 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 models
|
|
|
|
|
|
|
|
import (
|
2016-02-05 19:11:53 +00:00
|
|
|
"fmt"
|
|
|
|
"os"
|
2016-02-06 19:25:16 +00:00
|
|
|
"os/exec"
|
2015-12-05 06:09:14 +00:00
|
|
|
"strings"
|
2014-10-08 22:29:18 +00:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/Unknwon/com"
|
2016-03-10 00:53:30 +00:00
|
|
|
"github.com/go-xorm/xorm"
|
2015-12-05 06:09:14 +00:00
|
|
|
|
2016-11-02 16:57:42 +00:00
|
|
|
"github.com/go-gitea/gitea/modules/base"
|
|
|
|
"github.com/go-gitea/gitea/modules/log"
|
|
|
|
"github.com/go-gitea/gitea/modules/setting"
|
2014-10-08 22:29:18 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
type NoticeType int
|
|
|
|
|
|
|
|
const (
|
|
|
|
NOTICE_REPOSITORY NoticeType = iota + 1
|
|
|
|
)
|
|
|
|
|
|
|
|
// Notice represents a system notice for admin.
|
|
|
|
type Notice struct {
|
2015-12-05 06:09:14 +00:00
|
|
|
ID int64 `xorm:"pk autoincr"`
|
2014-10-08 22:29:18 +00:00
|
|
|
Type NoticeType
|
|
|
|
Description string `xorm:"TEXT"`
|
2016-03-10 00:53:30 +00:00
|
|
|
Created time.Time `xorm:"-"`
|
|
|
|
CreatedUnix int64
|
|
|
|
}
|
|
|
|
|
|
|
|
func (n *Notice) BeforeInsert() {
|
2016-07-23 12:24:44 +00:00
|
|
|
n.CreatedUnix = time.Now().Unix()
|
2016-03-10 00:53:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (n *Notice) AfterSet(colName string, _ xorm.Cell) {
|
|
|
|
switch colName {
|
|
|
|
case "created_unix":
|
|
|
|
n.Created = time.Unix(n.CreatedUnix, 0).Local()
|
|
|
|
}
|
2014-10-08 22:29:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// TrStr returns a translation format string.
|
|
|
|
func (n *Notice) TrStr() string {
|
|
|
|
return "admin.notices.type_" + com.ToStr(n.Type)
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateNotice creates new system notice.
|
|
|
|
func CreateNotice(tp NoticeType, desc string) error {
|
2016-05-06 19:48:18 +00:00
|
|
|
// prevent panic if database connection is not available at this point
|
|
|
|
if x == nil {
|
|
|
|
return fmt.Errorf("Could not save notice due database connection not being available: %d %s", tp, desc)
|
|
|
|
}
|
|
|
|
|
2014-10-08 22:29:18 +00:00
|
|
|
n := &Notice{
|
|
|
|
Type: tp,
|
|
|
|
Description: desc,
|
|
|
|
}
|
|
|
|
_, err := x.Insert(n)
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateRepositoryNotice creates new system notice with type NOTICE_REPOSITORY.
|
|
|
|
func CreateRepositoryNotice(desc string) error {
|
|
|
|
return CreateNotice(NOTICE_REPOSITORY, desc)
|
|
|
|
}
|
|
|
|
|
2016-02-05 19:11:53 +00:00
|
|
|
// RemoveAllWithNotice removes all directories in given path and
|
|
|
|
// creates a system notice when error occurs.
|
|
|
|
func RemoveAllWithNotice(title, path string) {
|
2016-02-06 19:25:16 +00:00
|
|
|
var err error
|
2016-05-23 20:24:40 +00:00
|
|
|
// workaround for Go not being able to remove read-only files/folders: https://github.com/golang/go/issues/9606
|
|
|
|
// this bug should be fixed on Go 1.7, so the workaround should be removed when Gogs don't support Go 1.6 anymore:
|
|
|
|
// https://github.com/golang/go/commit/2ffb3e5d905b5622204d199128dec06cefd57790
|
2016-02-06 19:25:16 +00:00
|
|
|
if setting.IsWindows {
|
2016-05-23 20:24:40 +00:00
|
|
|
// converting "/" to "\" in path on Windows
|
2016-05-06 19:48:18 +00:00
|
|
|
path = strings.Replace(path, "/", "\\", -1)
|
2016-02-06 19:25:16 +00:00
|
|
|
err = exec.Command("cmd", "/C", "rmdir", "/S", "/Q", path).Run()
|
|
|
|
} else {
|
|
|
|
err = os.RemoveAll(path)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err != nil {
|
2016-02-05 19:11:53 +00:00
|
|
|
desc := fmt.Sprintf("%s [%s]: %v", title, path, err)
|
|
|
|
log.Warn(desc)
|
|
|
|
if err = CreateRepositoryNotice(desc); err != nil {
|
|
|
|
log.Error(4, "CreateRepositoryNotice: %v", err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-10-08 22:29:18 +00:00
|
|
|
// CountNotices returns number of notices.
|
|
|
|
func CountNotices() int64 {
|
|
|
|
count, _ := x.Count(new(Notice))
|
|
|
|
return count
|
|
|
|
}
|
|
|
|
|
2015-09-25 16:13:38 +00:00
|
|
|
// Notices returns number of notices in given page.
|
|
|
|
func Notices(page, pageSize int) ([]*Notice, error) {
|
|
|
|
notices := make([]*Notice, 0, pageSize)
|
|
|
|
return notices, x.Limit(pageSize, (page-1)*pageSize).Desc("id").Find(¬ices)
|
2014-10-08 22:29:18 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// DeleteNotice deletes a system notice by given ID.
|
|
|
|
func DeleteNotice(id int64) error {
|
|
|
|
_, err := x.Id(id).Delete(new(Notice))
|
|
|
|
return err
|
|
|
|
}
|
2015-12-02 04:33:08 +00:00
|
|
|
|
|
|
|
// DeleteNotices deletes all notices with ID from start to end (inclusive).
|
|
|
|
func DeleteNotices(start, end int64) error {
|
|
|
|
sess := x.Where("id >= ?", start)
|
|
|
|
if end > 0 {
|
|
|
|
sess.And("id <= ?", end)
|
|
|
|
}
|
|
|
|
_, err := sess.Delete(new(Notice))
|
|
|
|
return err
|
|
|
|
}
|
2015-12-05 06:09:14 +00:00
|
|
|
|
|
|
|
// DeleteNoticesByIDs deletes notices by given IDs.
|
|
|
|
func DeleteNoticesByIDs(ids []int64) error {
|
|
|
|
if len(ids) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
_, err := x.Where("id IN (" + strings.Join(base.Int64sToStrings(ids), ",") + ")").Delete(new(Notice))
|
|
|
|
return err
|
|
|
|
}
|