2014-10-09 02:29:18 +04: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 22:11:53 +03:00
"fmt"
"os"
2016-02-06 22:25:16 +03:00
"os/exec"
2015-12-05 09:09:14 +03:00
"strings"
2014-10-09 02:29:18 +04:00
"time"
"github.com/Unknwon/com"
2016-03-10 03:53:30 +03:00
"github.com/go-xorm/xorm"
2015-12-05 09:09:14 +03:00
2016-11-10 19:24:48 +03:00
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
2014-10-09 02:29:18 +04:00
)
2016-11-24 23:54:00 +03:00
//NoticeType describes the notice type
2014-10-09 02:29:18 +04:00
type NoticeType int
const (
2016-11-24 23:54:00 +03:00
//NoticeRepository type
2016-11-07 19:24:59 +03:00
NoticeRepository NoticeType = iota + 1
2014-10-09 02:29:18 +04:00
)
// Notice represents a system notice for admin.
type Notice struct {
2015-12-05 09:09:14 +03:00
ID int64 ` xorm:"pk autoincr" `
2014-10-09 02:29:18 +04:00
Type NoticeType
Description string ` xorm:"TEXT" `
2016-03-10 03:53:30 +03:00
Created time . Time ` xorm:"-" `
2017-01-06 18:14:33 +03:00
CreatedUnix int64 ` xorm:"INDEX" `
2016-03-10 03:53:30 +03:00
}
2016-11-24 23:54:00 +03:00
// BeforeInsert is invoked from XORM before inserting an object of this type.
2016-03-10 03:53:30 +03:00
func ( n * Notice ) BeforeInsert ( ) {
2016-07-23 15:24:44 +03:00
n . CreatedUnix = time . Now ( ) . Unix ( )
2016-03-10 03:53:30 +03:00
}
2016-11-24 23:54:00 +03:00
// AfterSet is invoked from XORM after setting the value of a field of this object.
2016-03-10 03:53:30 +03:00
func ( n * Notice ) AfterSet ( colName string , _ xorm . Cell ) {
switch colName {
case "created_unix" :
n . Created = time . Unix ( n . CreatedUnix , 0 ) . Local ( )
}
2014-10-09 02:29:18 +04: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 22:48:18 +03: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-09 02:29:18 +04:00
n := & Notice {
Type : tp ,
Description : desc ,
}
_ , err := x . Insert ( n )
return err
}
2016-11-07 19:24:59 +03:00
// CreateRepositoryNotice creates new system notice with type NoticeRepository.
2014-10-09 02:29:18 +04:00
func CreateRepositoryNotice ( desc string ) error {
2016-11-07 19:24:59 +03:00
return CreateNotice ( NoticeRepository , desc )
2014-10-09 02:29:18 +04:00
}
2016-02-05 22:11:53 +03:00
// RemoveAllWithNotice removes all directories in given path and
// creates a system notice when error occurs.
func RemoveAllWithNotice ( title , path string ) {
2016-02-06 22:25:16 +03:00
var err error
2016-05-23 23:24:40 +03: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 22:25:16 +03:00
if setting . IsWindows {
2016-05-23 23:24:40 +03:00
// converting "/" to "\" in path on Windows
2016-05-06 22:48:18 +03:00
path = strings . Replace ( path , "/" , "\\" , - 1 )
2016-02-06 22:25:16 +03:00
err = exec . Command ( "cmd" , "/C" , "rmdir" , "/S" , "/Q" , path ) . Run ( )
} else {
err = os . RemoveAll ( path )
}
if err != nil {
2016-02-05 22:11:53 +03: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-09 02:29:18 +04:00
// CountNotices returns number of notices.
func CountNotices ( ) int64 {
count , _ := x . Count ( new ( Notice ) )
return count
}
2015-09-25 19:13:38 +03:00
// Notices returns number of notices in given page.
func Notices ( page , pageSize int ) ( [ ] * Notice , error ) {
notices := make ( [ ] * Notice , 0 , pageSize )
2016-11-10 18:16:32 +03:00
return notices , x .
Limit ( pageSize , ( page - 1 ) * pageSize ) .
Desc ( "id" ) .
Find ( & notices )
2014-10-09 02:29:18 +04: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 07:33:08 +03: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 09:09:14 +03:00
// DeleteNoticesByIDs deletes notices by given IDs.
func DeleteNoticesByIDs ( ids [ ] int64 ) error {
if len ( ids ) == 0 {
return nil
}
2016-11-10 18:16:32 +03:00
_ , err := x .
2016-11-12 11:29:18 +03:00
In ( "id" , ids ) .
2016-11-10 18:16:32 +03:00
Delete ( new ( Notice ) )
2015-12-05 09:09:14 +03:00
return err
}