aboutsummaryrefslogtreecommitdiff
path: root/routers
diff options
context:
space:
mode:
Diffstat (limited to 'routers')
-rw-r--r--routers/admin/auths.go8
-rw-r--r--routers/admin/users.go16
-rw-r--r--routers/api/v1/repo.go13
-rw-r--r--routers/api/v1/user.go7
-rw-r--r--routers/install.go85
-rw-r--r--routers/org/members.go2
-rw-r--r--routers/org/org.go17
-rw-r--r--routers/org/setting.go2
-rw-r--r--routers/org/teams.go2
-rw-r--r--routers/repo/download.go15
-rw-r--r--routers/repo/http.go23
-rw-r--r--routers/repo/issue.go523
-rw-r--r--routers/repo/pull.go101
-rw-r--r--routers/repo/repo.go218
-rw-r--r--routers/repo/setting.go144
-rw-r--r--routers/user/auth.go21
-rw-r--r--routers/user/home.go32
-rw-r--r--routers/user/setting.go56
18 files changed, 746 insertions, 539 deletions
diff --git a/routers/admin/auths.go b/routers/admin/auths.go
index b13b0bd1..2bec7da4 100644
--- a/routers/admin/auths.go
+++ b/routers/admin/auths.go
@@ -84,6 +84,10 @@ func NewAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
Port: form.SMTPPort,
TLS: form.TLS,
}
+ case models.PAM:
+ u = &models.PAMConfig{
+ ServiceName: form.PAMServiceName,
+ }
default:
ctx.Error(400)
return
@@ -166,6 +170,10 @@ func EditAuthSourcePost(ctx *middleware.Context, form auth.AuthenticationForm) {
Port: form.SMTPPort,
TLS: form.TLS,
}
+ case models.PAM:
+ config = &models.PAMConfig{
+ ServiceName: form.PAMServiceName,
+ }
default:
ctx.Error(400)
return
diff --git a/routers/admin/users.go b/routers/admin/users.go
index ddd12a8b..12c52236 100644
--- a/routers/admin/users.go
+++ b/routers/admin/users.go
@@ -106,16 +106,19 @@ func NewUserPost(ctx *middleware.Context, form auth.RegisterForm) {
}
if err := models.CreateUser(u); err != nil {
- switch err {
- case models.ErrUserAlreadyExist:
+ switch {
+ case models.IsErrUserAlreadyExist(err):
ctx.Data["Err_UserName"] = true
ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), USER_NEW, &form)
- case models.ErrEmailAlreadyUsed:
+ case models.IsErrEmailAlreadyUsed(err):
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_NEW, &form)
- case models.ErrUserNameIllegal:
+ case models.IsErrNameReserved(err):
+ ctx.Data["Err_UserName"] = true
+ ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), USER_NEW, &form)
+ case models.IsErrNamePatternNotAllowed(err):
ctx.Data["Err_UserName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_username"), USER_NEW, &form)
+ ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), USER_NEW, &form)
default:
ctx.Handle(500, "CreateUser", err)
}
@@ -182,6 +185,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) {
u.EncodePasswd()
}
+ u.FullName = form.FullName
u.Email = form.Email
u.Website = form.Website
u.Location = form.Location
@@ -195,7 +199,7 @@ func EditUserPost(ctx *middleware.Context, form auth.AdminEditUserForm) {
u.AllowGitHook = form.AllowGitHook
if err := models.UpdateUser(u); err != nil {
- if err == models.ErrEmailAlreadyUsed {
+ if models.IsErrEmailAlreadyUsed(err) {
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), USER_EDIT, &form)
} else {
diff --git a/routers/api/v1/repo.go b/routers/api/v1/repo.go
index d7cc5955..fdf05c05 100644
--- a/routers/api/v1/repo.go
+++ b/routers/api/v1/repo.go
@@ -104,8 +104,9 @@ func createRepo(ctx *middleware.Context, owner *models.User, opt api.CreateRepoO
repo, err := models.CreateRepository(owner, opt.Name, opt.Description,
opt.Gitignore, opt.License, opt.Private, false, opt.AutoInit)
if err != nil {
- if err == models.ErrRepoAlreadyExist ||
- err == models.ErrRepoNameIllegal {
+ if models.IsErrRepoAlreadyExist(err) ||
+ models.IsErrNameReserved(err) ||
+ models.IsErrNamePatternNotAllowed(err) {
ctx.JSON(422, &base.ApiJsonErr{err.Error(), base.DOC_URL})
} else {
log.Error(4, "CreateRepository: %v", err)
@@ -138,7 +139,7 @@ func CreateRepo(ctx *middleware.Context, opt api.CreateRepoOption) {
func CreateOrgRepo(ctx *middleware.Context, opt api.CreateRepoOption) {
org, err := models.GetOrgByName(ctx.Params(":org"))
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Error(404)
} else {
ctx.Error(500)
@@ -156,14 +157,14 @@ func CreateOrgRepo(ctx *middleware.Context, opt api.CreateRepoOption) {
func MigrateRepo(ctx *middleware.Context, form auth.MigrateRepoForm) {
u, err := models.GetUserByName(ctx.Query("username"))
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.HandleAPI(422, err)
} else {
ctx.HandleAPI(500, err)
}
return
}
- if !u.ValidtePassword(ctx.Query("password")) {
+ if !u.ValidatePassword(ctx.Query("password")) {
ctx.HandleAPI(422, "Username or password is not correct.")
return
}
@@ -173,7 +174,7 @@ func MigrateRepo(ctx *middleware.Context, form auth.MigrateRepoForm) {
if form.Uid != u.Id {
org, err := models.GetUserById(form.Uid)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.HandleAPI(422, err)
} else {
ctx.HandleAPI(500, err)
diff --git a/routers/api/v1/user.go b/routers/api/v1/user.go
index e9ba615f..feecda48 100644
--- a/routers/api/v1/user.go
+++ b/routers/api/v1/user.go
@@ -61,12 +61,17 @@ func SearchUsers(ctx *middleware.Context) {
func GetUserInfo(ctx *middleware.Context) {
u, err := models.GetUserByName(ctx.Params(":username"))
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Error(404)
} else {
ctx.JSON(500, &base.ApiJsonErr{"GetUserByName: " + err.Error(), base.DOC_URL})
}
return
}
+
+ // Hide user e-mail when API caller isn't signed in.
+ if !ctx.IsSigned {
+ u.Email = ""
+ }
ctx.JSON(200, &api.User{u.Id, u.Name, u.FullName, u.Email, u.AvatarLink()})
}
diff --git a/routers/install.go b/routers/install.go
index f5dc0c58..3d3e8997 100644
--- a/routers/install.go
+++ b/routers/install.go
@@ -36,6 +36,7 @@ func checkRunMode() {
switch setting.Cfg.Section("").Key("RUN_MODE").String() {
case "prod":
macaron.Env = macaron.PROD
+ macaron.ColorLog = false
setting.ProdMode = true
case "test":
macaron.Env = macaron.TEST
@@ -67,10 +68,11 @@ func GlobalInit() {
models.HasEngine = true
cron.NewCronContext()
+ models.InitDeliverHooks()
log.NewGitLogger(path.Join(setting.LogRootPath, "http.log"))
}
if models.EnableSQLite3 {
- log.Info("SQLite3 Enabled")
+ log.Info("SQLite3 Supported")
}
checkRunMode()
}
@@ -90,11 +92,20 @@ func InstallInit(ctx *middleware.Context) {
func Install(ctx *middleware.Context) {
form := auth.InstallForm{}
+ // Database settings
form.DbHost = models.DbCfg.Host
form.DbUser = models.DbCfg.User
form.DbName = models.DbCfg.Name
form.DbPath = models.DbCfg.Path
+ if models.EnableSQLite3 {
+ ctx.Data["CurDbOption"] = "SQLite3" // Default when enabled.
+ } else {
+ ctx.Data["CurDbOption"] = "MySQL"
+ }
+
+ // Application general settings
+ form.AppName = setting.AppName
form.RepoRootPath = setting.RepoRootPath
// Note(unknwon): it's hard for Windows users change a running user,
@@ -112,11 +123,19 @@ func Install(ctx *middleware.Context) {
form.HTTPPort = setting.HttpPort
form.AppUrl = setting.AppUrl
- curDbOp := ""
- if models.EnableSQLite3 {
- curDbOp = "SQLite3" // Default when enabled.
+ // E-mail service settings
+ if setting.MailService != nil {
+ form.SMTPHost = setting.MailService.Host
+ form.SMTPFrom = setting.MailService.From
+ form.SMTPEmail = setting.MailService.User
}
- ctx.Data["CurDbOption"] = curDbOp
+ form.RegisterConfirm = setting.Service.RegisterEmailConfirm
+ form.MailNotify = setting.Service.EnableNotifyMail
+
+ // Server and other services settings
+ form.OfflineMode = setting.OfflineMode
+ form.DisableRegistration = setting.Service.DisableRegistration
+ form.RequireSignInView = setting.Service.RequireSignInView
auth.AssignForm(form, ctx.Data)
ctx.HTML(200, INSTALL)
@@ -126,6 +145,15 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
ctx.Data["CurDbOption"] = form.DbType
if ctx.HasError() {
+ if ctx.HasValue("Err_SMTPEmail") {
+ ctx.Data["Err_SMTP"] = true
+ }
+ if ctx.HasValue("Err_AdminName") ||
+ ctx.HasValue("Err_AdminPasswd") ||
+ ctx.HasValue("Err_AdminEmail") {
+ ctx.Data["Err_Admin"] = true
+ }
+
ctx.HTML(200, INSTALL)
return
}
@@ -146,12 +174,20 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
models.DbCfg.SSLMode = form.SSLMode
models.DbCfg.Path = form.DbPath
+ if models.DbCfg.Type == "sqlite3" && len(models.DbCfg.Path) == 0 {
+ ctx.Data["Err_DbPath"] = true
+ ctx.RenderWithErr(ctx.Tr("install.err_empty_sqlite_path"), INSTALL, &form)
+ return
+ }
+
// Set test engine.
var x *xorm.Engine
if err := models.NewTestEngine(x); err != nil {
if strings.Contains(err.Error(), `Unknown database type: sqlite3`) {
+ ctx.Data["Err_DbType"] = true
ctx.RenderWithErr(ctx.Tr("install.sqlite3_not_available", "http://gogs.io/docs/installation/install_from_binary.html"), INSTALL, &form)
} else {
+ ctx.Data["Err_DbSetting"] = true
ctx.RenderWithErr(ctx.Tr("install.invalid_db_setting", err), INSTALL, &form)
}
return
@@ -177,6 +213,7 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
// Check admin password.
if form.AdminPasswd != form.AdminConfirmPasswd {
+ ctx.Data["Err_Admin"] = true
ctx.Data["Err_AdminPasswd"] = true
ctx.RenderWithErr(ctx.Tr("form.password_not_match"), INSTALL, form)
return
@@ -202,6 +239,7 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
cfg.Section("database").Key("SSL_MODE").SetValue(models.DbCfg.SSLMode)
cfg.Section("database").Key("PATH").SetValue(models.DbCfg.Path)
+ cfg.Section("").Key("APP_NAME").SetValue(form.AppName)
cfg.Section("repository").Key("ROOT").SetValue(form.RepoRootPath)
cfg.Section("").Key("RUN_USER").SetValue(form.RunUser)
cfg.Section("server").Key("DOMAIN").SetValue(form.Domain)
@@ -211,12 +249,18 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
if len(strings.TrimSpace(form.SMTPHost)) > 0 {
cfg.Section("mailer").Key("ENABLED").SetValue("true")
cfg.Section("mailer").Key("HOST").SetValue(form.SMTPHost)
+ cfg.Section("mailer").Key("FROM").SetValue(form.SMTPFrom)
cfg.Section("mailer").Key("USER").SetValue(form.SMTPEmail)
cfg.Section("mailer").Key("PASSWD").SetValue(form.SMTPPasswd)
-
- cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").SetValue(com.ToStr(form.RegisterConfirm == "on"))
- cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").SetValue(com.ToStr(form.MailNotify == "on"))
+ } else {
+ cfg.Section("mailer").Key("ENABLED").SetValue("false")
}
+ cfg.Section("service").Key("REGISTER_EMAIL_CONFIRM").SetValue(com.ToStr(form.RegisterConfirm))
+ cfg.Section("service").Key("ENABLE_NOTIFY_MAIL").SetValue(com.ToStr(form.MailNotify))
+
+ cfg.Section("server").Key("OFFLINE_MODE").SetValue(com.ToStr(form.OfflineMode))
+ cfg.Section("service").Key("DISABLE_REGISTRATION").SetValue(com.ToStr(form.DisableRegistration))
+ cfg.Section("service").Key("REQUIRE_SIGNIN_VIEW").SetValue(com.ToStr(form.RequireSignInView))
cfg.Section("").Key("RUN_MODE").SetValue("prod")
@@ -237,16 +281,23 @@ func InstallPost(ctx *middleware.Context, form auth.InstallForm) {
GlobalInit()
// Create admin account.
- if err := models.CreateUser(&models.User{Name: form.AdminName, Email: form.AdminEmail, Passwd: form.AdminPasswd,
- IsAdmin: true, IsActive: true}); err != nil {
- if err != models.ErrUserAlreadyExist {
- setting.InstallLock = false
- ctx.Data["Err_AdminName"] = true
- ctx.Data["Err_AdminEmail"] = true
- ctx.RenderWithErr(ctx.Tr("install.invalid_admin_setting", err), INSTALL, &form)
- return
+ if len(form.AdminName) > 0 {
+ if err := models.CreateUser(&models.User{
+ Name: form.AdminName,
+ Email: form.AdminEmail,
+ Passwd: form.AdminPasswd,
+ IsAdmin: true,
+ IsActive: true,
+ }); err != nil {
+ if !models.IsErrUserAlreadyExist(err) {
+ setting.InstallLock = false
+ ctx.Data["Err_AdminName"] = true
+ ctx.Data["Err_AdminEmail"] = true
+ ctx.RenderWithErr(ctx.Tr("install.invalid_admin_setting", err), INSTALL, &form)
+ return
+ }
+ log.Info("Admin account already exist")
}
- log.Info("Admin account already exist")
}
log.Info("First-time run install finished!")
diff --git a/routers/org/members.go b/routers/org/members.go
index c8c90cfe..dd742bb7 100644
--- a/routers/org/members.go
+++ b/routers/org/members.go
@@ -100,7 +100,7 @@ func Invitation(ctx *middleware.Context) {
uname := ctx.Query("uname")
u, err := models.GetUserByName(uname)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
ctx.Redirect(ctx.Org.OrgLink + "/invitations/new")
} else {
diff --git a/routers/org/org.go b/routers/org/org.go
index ab589832..ed4f2abd 100644
--- a/routers/org/org.go
+++ b/routers/org/org.go
@@ -65,19 +65,22 @@ func CreatePost(ctx *middleware.Context, form auth.CreateOrgForm) {
}
var err error
- if org, err = models.CreateOrganization(org, ctx.User); err != nil {
- switch err {
- case models.ErrUserAlreadyExist:
+ if err = models.CreateOrganization(org, ctx.User); err != nil {
+ switch {
+ case models.IsErrUserAlreadyExist(err):
ctx.Data["Err_OrgName"] = true
ctx.RenderWithErr(ctx.Tr("form.org_name_been_taken"), CREATE, &form)
- case models.ErrEmailAlreadyUsed:
+ case models.IsErrEmailAlreadyUsed(err):
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), CREATE, &form)
- case models.ErrUserNameIllegal:
+ case models.IsErrNameReserved(err):
ctx.Data["Err_OrgName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_org_name"), CREATE, &form)
+ ctx.RenderWithErr(ctx.Tr("org.form.name_reserved", err.(models.ErrNameReserved).Name), CREATE, &form)
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Data["Err_OrgName"] = true
+ ctx.RenderWithErr(ctx.Tr("org.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), CREATE, &form)
default:
- ctx.Handle(500, "CreateUser", err)
+ ctx.Handle(500, "CreateOrganization", err)
}
return
}
diff --git a/routers/org/setting.go b/routers/org/setting.go
index 8bc6a2a9..7a761995 100644
--- a/routers/org/setting.go
+++ b/routers/org/setting.go
@@ -68,7 +68,7 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateOrgSettingForm) {
org.Avatar = base.EncodeMd5(form.Avatar)
org.AvatarEmail = form.Avatar
if err := models.UpdateUser(org); err != nil {
- if err == models.ErrEmailAlreadyUsed {
+ if models.IsErrEmailAlreadyUsed(err) {
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), SETTINGS_OPTIONS, &form)
} else {
diff --git a/routers/org/teams.go b/routers/org/teams.go
index 7436e30e..6968512f 100644
--- a/routers/org/teams.go
+++ b/routers/org/teams.go
@@ -77,7 +77,7 @@ func TeamsAction(ctx *middleware.Context) {
var u *models.User
u, err = models.GetUserByName(uname)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName)
} else {
diff --git a/routers/repo/download.go b/routers/repo/download.go
index b1c5fbc8..c71f8d29 100644
--- a/routers/repo/download.go
+++ b/routers/repo/download.go
@@ -26,10 +26,17 @@ func ServeBlob(ctx *middleware.Context, blob *git.Blob) error {
}
_, isTextFile := base.IsTextFile(buf)
- _, isImageFile := base.IsImageFile(buf)
- if !isTextFile && !isImageFile {
- ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName))
- ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary")
+ if isTextFile {
+ charset, _ := base.DetectEncoding(buf)
+ if charset != "UTF-8" {
+ ctx.Resp.Header().Set("Content-Type", "text/plain; charset="+charset)
+ }
+ } else {
+ _, isImageFile := base.IsImageFile(buf)
+ if !isImageFile {
+ ctx.Resp.Header().Set("Content-Disposition", "attachment; filename="+path.Base(ctx.Repo.TreeName))
+ ctx.Resp.Header().Set("Content-Transfer-Encoding", "binary")
+ }
}
ctx.Resp.Write(buf)
_, err = io.Copy(ctx.Resp, dataRc)
diff --git a/routers/repo/http.go b/routers/repo/http.go
index 9165128a..45b0ec59 100644
--- a/routers/repo/http.go
+++ b/routers/repo/http.go
@@ -55,7 +55,7 @@ func Http(ctx *middleware.Context) {
repoUser, err := models.GetUserByName(username)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Handle(404, "GetUserByName", nil)
} else {
ctx.Handle(500, "GetUserByName", err)
@@ -96,18 +96,18 @@ func Http(ctx *middleware.Context) {
// FIXME: middlewares/context.go did basic auth check already,
// maybe could use that one.
if len(auths) != 2 || auths[0] != "Basic" {
- ctx.Handle(401, "no basic auth and digit auth", nil)
+ ctx.HandleText(401, "no basic auth and digit auth")
return
}
authUsername, authPasswd, err = base.BasicAuthDecode(auths[1])
if err != nil {
- ctx.Handle(401, "no basic auth and digit auth", nil)
+ ctx.HandleText(401, "no basic auth and digit auth")
return
}
authUser, err = models.UserSignIn(authUsername, authPasswd)
if err != nil {
- if err != models.ErrUserNotExist {
+ if !models.IsErrUserNotExist(err) {
ctx.Handle(500, "UserSignIn error: %v", err)
return
}
@@ -116,7 +116,7 @@ func Http(ctx *middleware.Context) {
token, err := models.GetAccessTokenBySha(authUsername)
if err != nil {
if err == models.ErrAccessTokenNotExist {
- ctx.Handle(401, "invalid token", nil)
+ ctx.HandleText(401, "invalid token")
} else {
ctx.Handle(500, "GetAccessTokenBySha", err)
}
@@ -138,23 +138,23 @@ func Http(ctx *middleware.Context) {
has, err := models.HasAccess(authUser, repo, tp)
if err != nil {
- ctx.Handle(401, "no basic auth and digit auth", nil)
+ ctx.HandleText(401, "no basic auth and digit auth")
return
} else if !has {
if tp == models.ACCESS_MODE_READ {
has, err = models.HasAccess(authUser, repo, models.ACCESS_MODE_WRITE)
if err != nil || !has {
- ctx.Handle(401, "no basic auth and digit auth", nil)
+ ctx.HandleText(401, "no basic auth and digit auth")
return
}
} else {
- ctx.Handle(401, "no basic auth and digit auth", nil)
+ ctx.HandleText(401, "no basic auth and digit auth")
return
}
}
if !isPull && repo.IsMirror {
- ctx.Handle(401, "can't push to mirror", nil)
+ ctx.HandleText(401, "can't push to mirror")
return
}
}
@@ -190,7 +190,10 @@ func Http(ctx *middleware.Context) {
refName := fields[2]
// FIXME: handle error.
- models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id)
+ if err = models.Update(refName, oldCommitId, newCommitId, authUsername, username, reponame, authUser.Id); err == nil {
+ models.HookQueue.AddRepoID(repo.Id)
+ }
+
}
lastLine = lastLine + size
} else {
diff --git a/routers/repo/issue.go b/routers/repo/issue.go
index 294d3d28..9d59d19a 100644
--- a/routers/repo/issue.go
+++ b/routers/repo/issue.go
@@ -15,6 +15,7 @@ import (
"time"
"github.com/Unknwon/com"
+ "github.com/Unknwon/paginater"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
@@ -30,7 +31,9 @@ const (
ISSUE_CREATE base.TplName = "repo/issue/create"
ISSUE_VIEW base.TplName = "repo/issue/view"
- MILESTONE base.TplName = "repo/issue/milestone"
+ LABELS base.TplName = "repo/issue/labels"
+
+ MILESTONE base.TplName = "repo/issue/milestones"
MILESTONE_NEW base.TplName = "repo/issue/milestone_new"
MILESTONE_EDIT base.TplName = "repo/issue/milestone_edit"
)
@@ -40,10 +43,22 @@ var (
ErrTooManyFiles = errors.New("Maximum number of files to upload exceeded")
)
+func RetrieveLabels(ctx *middleware.Context) {
+ labels, err := models.GetLabels(ctx.Repo.Repository.Id)
+ if err != nil {
+ ctx.Handle(500, "RetrieveLabels.GetLabels: %v", err)
+ return
+ }
+ for _, l := range labels {
+ l.CalOpenIssues()
+ }
+ ctx.Data["Labels"] = labels
+ ctx.Data["NumLabels"] = len(labels)
+}
+
func Issues(ctx *middleware.Context) {
- ctx.Data["Title"] = "Issues"
- ctx.Data["IsRepoToolbarIssues"] = true
- ctx.Data["IsRepoToolbarIssuesList"] = true
+ ctx.Data["Title"] = ctx.Tr("repo.issues")
+ ctx.Data["PageIsIssueList"] = true
viewType := ctx.Query("type")
types := []string{"assigned", "created_by", "mentioned"}
@@ -51,107 +66,111 @@ func Issues(ctx *middleware.Context) {
viewType = "all"
}
- isShowClosed := ctx.Query("state") == "closed"
-
+ // Must sign in to see issues about you.
if viewType != "all" && !ctx.IsSigned {
ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl)
ctx.Redirect(setting.AppSubUrl + "/user/login")
return
}
- var assigneeId, posterId int64
- var filterMode int
+ var assigneeID, posterID int64
+ filterMode := models.FM_ALL
switch viewType {
case "assigned":
- assigneeId = ctx.User.Id
+ assigneeID = ctx.User.Id
filterMode = models.FM_ASSIGN
case "created_by":
- posterId = ctx.User.Id
+ posterID = ctx.User.Id
filterMode = models.FM_CREATE
case "mentioned":
filterMode = models.FM_MENTION
}
- var mid int64
- midx, _ := com.StrTo(ctx.Query("milestone")).Int64()
- if midx > 0 {
- mile, err := models.GetMilestoneByIndex(ctx.Repo.Repository.Id, midx)
- if err != nil {
- ctx.Handle(500, "issue.Issues(GetMilestoneByIndex): %v", err)
- return
- }
- mid = mile.Id
+ var uid int64 = -1
+ if ctx.IsSigned {
+ uid = ctx.User.Id
}
+ repo := ctx.Repo.Repository
selectLabels := ctx.Query("labels")
- labels, err := models.GetLabels(ctx.Repo.Repository.Id)
- if err != nil {
- ctx.Handle(500, "issue.Issues(GetLabels): %v", err)
- return
- }
- for _, l := range labels {
- l.CalOpenIssues()
+ milestoneID := ctx.QueryInt64("milestone")
+ isShowClosed := ctx.Query("state") == "closed"
+ issueStats := models.GetIssueStats(repo.Id, uid, com.StrTo(selectLabels).MustInt64(), milestoneID, isShowClosed, filterMode)
+
+ page := ctx.QueryInt("page")
+ if page <= 1 {
+ page = 1
}
- ctx.Data["Labels"] = labels
- page, _ := com.StrTo(ctx.Query("page")).Int()
+ var total int
+ if !isShowClosed {
+ total = int(issueStats.OpenCount)
+ } else {
+ total = int(issueStats.ClosedCount)
+ }
+ ctx.Data["Page"] = paginater.New(total, setting.IssuePagingNum, page, 5)
// Get issues.
- issues, err := models.GetIssues(assigneeId, ctx.Repo.Repository.Id, posterId, mid, page,
- isShowClosed, selectLabels, ctx.Query("sortType"))
+ issues, err := models.Issues(uid, assigneeID, repo.Id, posterID, milestoneID,
+ page, isShowClosed, filterMode == models.FM_MENTION, selectLabels, ctx.Query("sortType"))
if err != nil {
- ctx.Handle(500, "issue.Issues(GetIssues): %v", err)
+ ctx.Handle(500, "GetIssues: %v", err)
return
}
// Get issue-user pairs.
- pairs, err := models.GetIssueUserPairs(ctx.Repo.Repository.Id, posterId, isShowClosed)
+ pairs, err := models.GetIssueUserPairs(repo.Id, posterID, isShowClosed)
if err != nil {
- ctx.Handle(500, "issue.Issues(GetIssueUserPairs): %v", err)
+ ctx.Handle(500, "GetIssueUserPairs: %v", err)
return
}
// Get posters.
for i := range issues {
- if err = issues[i].GetLabels(); err != nil {
- ctx.Handle(500, "GetLabels", fmt.Errorf("[#%d]%v", issues[i].Id, err))
+ if err = issues[i].GetPoster(); err != nil {
+ ctx.Handle(500, "GetPoster", fmt.Errorf("[#%d]%v", issues[i].ID, err))
return
}
- idx := models.PairsContains(pairs, issues[i].Id)
+ if err = issues[i].GetLabels(); err != nil {
+ ctx.Handle(500, "GetLabels", fmt.Errorf("[#%d]%v", issues[i].ID, err))
+ return
+ }
- if filterMode == models.FM_MENTION && (idx == -1 || !pairs[idx].IsMentioned) {
+ if !ctx.IsSigned {
+ issues[i].IsRead = true
continue
}
+ // Check read status.
+ idx := models.PairsContains(pairs, issues[i].ID, ctx.User.Id)
if idx > -1 {
issues[i].IsRead = pairs[idx].IsRead
} else {
issues[i].IsRead = true
}
-
- if err = issues[i].GetPoster(); err != nil {
- ctx.Handle(500, "issue.Issues(GetPoster)", fmt.Errorf("[#%d]%v", issues[i].Id, err))
- return
- }
}
+ ctx.Data["Issues"] = issues
- var uid int64 = -1
- if ctx.User != nil {
- uid = ctx.User.Id
+ // Get milestones.
+ miles, err := models.GetAllRepoMilestones(repo.Id)
+ if err != nil {
+ ctx.Handle(500, "GetAllRepoMilestones: %v", err)
+ return
}
- issueStats := models.GetIssueStats(ctx.Repo.Repository.Id, uid, isShowClosed, filterMode)
+ ctx.Data["Milestones"] = miles
+
ctx.Data["IssueStats"] = issueStats
- ctx.Data["SelectLabels"], _ = com.StrTo(selectLabels).Int64()
+ ctx.Data["SelectLabels"] = com.StrTo(selectLabels).MustInt64()
ctx.Data["ViewType"] = viewType
- ctx.Data["Issues"] = issues
+ ctx.Data["MilestoneID"] = milestoneID
ctx.Data["IsShowClosed"] = isShowClosed
if isShowClosed {
ctx.Data["State"] = "closed"
- ctx.Data["ShowCount"] = issueStats.ClosedCount
} else {
- ctx.Data["ShowCount"] = issueStats.OpenCount
+ ctx.Data["State"] = "open"
}
+
ctx.HTML(200, ISSUES)
}
@@ -161,22 +180,25 @@ func CreateIssue(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarIssuesList"] = false
ctx.Data["AttachmentsEnabled"] = setting.AttachmentEnabled
- var err error
+ var (
+ repo = ctx.Repo.Repository
+ err error
+ )
// Get all milestones.
- ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, false)
+ ctx.Data["OpenMilestones"], err = models.GetMilestones(repo.Id, -1, false)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetMilestones.1): %v", err)
+ ctx.Handle(500, "GetMilestones.1: %v", err)
return
}
- ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, true)
+ ctx.Data["ClosedMilestones"], err = models.GetMilestones(repo.Id, -1, true)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetMilestones.2): %v", err)
+ ctx.Handle(500, "GetMilestones.2: %v", err)
return
}
- us, err := ctx.Repo.Repository.GetCollaborators()
+ us, err := repo.GetCollaborators()
if err != nil {
- ctx.Handle(500, "issue.CreateIssue(GetCollaborators)", err)
+ ctx.Handle(500, "GetCollaborators", err)
return
}
@@ -207,12 +229,12 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
var err error
// Get all milestones.
- _, err = models.GetMilestones(ctx.Repo.Repository.Id, false)
+ _, err = models.GetMilestones(ctx.Repo.Repository.Id, -1, false)
if err != nil {
send(500, nil, err)
return
}
- _, err = models.GetMilestones(ctx.Repo.Repository.Id, true)
+ _, err = models.GetMilestones(ctx.Repo.Repository.Id, -1, true)
if err != nil {
send(500, nil, err)
return
@@ -234,26 +256,26 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
form.AssigneeId = 0
}
issue := &models.Issue{
- RepoId: ctx.Repo.Repository.Id,
+ RepoID: ctx.Repo.Repository.Id,
Index: int64(ctx.Repo.Repository.NumIssues) + 1,
Name: form.IssueName,
- PosterId: ctx.User.Id,
- MilestoneId: form.MilestoneId,
- AssigneeId: form.AssigneeId,
+ PosterID: ctx.User.Id,
+ MilestoneID: form.MilestoneId,
+ AssigneeID: form.AssigneeId,
LabelIds: form.Labels,
Content: form.Content,
}
if err := models.NewIssue(issue); err != nil {
send(500, nil, err)
return
- } else if err := models.NewIssueUserPairs(ctx.Repo.Repository, issue.Id, ctx.Repo.Owner.Id,
+ } else if err := models.NewIssueUserPairs(ctx.Repo.Repository, issue.ID, ctx.Repo.Owner.Id,
ctx.User.Id, form.AssigneeId); err != nil {
send(500, nil, err)
return
}
if setting.AttachmentEnabled {
- uploadFiles(ctx, issue.Id, 0)
+ uploadFiles(ctx, issue.ID, 0)
}
// Update mentions.
@@ -263,7 +285,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
ms[i] = ms[i][1:]
}
- if err := models.UpdateMentions(ms, issue.Id); err != nil {
+ if err := models.UpdateMentions(ms, issue.ID); err != nil {
send(500, nil, err)
return
}
@@ -310,7 +332,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
return
}
}
- log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.Id)
+ log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.ID)
send(200, fmt.Sprintf("%s/%s/%s/issues/%d", setting.AppSubUrl, ctx.Params(":username"), ctx.Params(":reponame"), issue.Index), nil)
}
@@ -318,7 +340,7 @@ func CreateIssuePost(ctx *middleware.Context, form auth.CreateIssueForm) {
func checkLabels(labels, allLabels []*models.Label) {
for _, l := range labels {
for _, l2 := range allLabels {
- if l.Id == l2.Id {
+ if l.ID == l2.ID {
l2.IsChecked = true
break
}
@@ -338,80 +360,80 @@ func ViewIssue(ctx *middleware.Context) {
issue, err := models.GetIssueByIndex(ctx.Repo.Repository.Id, idx)
if err != nil {
if err == models.ErrIssueNotExist {
- ctx.Handle(404, "issue.ViewIssue(GetIssueByIndex)", err)
+ ctx.Handle(404, "GetIssueByIndex", err)
} else {
- ctx.Handle(500, "issue.ViewIssue(GetIssueByIndex)", err)
+ ctx.Handle(500, "GetIssueByIndex", err)
}
return
}
// Get labels.
if err = issue.GetLabels(); err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetLabels)", err)
+ ctx.Handle(500, "GetLabels", err)
return
}
labels, err := models.GetLabels(ctx.Repo.Repository.Id)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetLabels.2)", err)
+ ctx.Handle(500, "GetLabels.2", err)
return
}
checkLabels(issue.Labels, labels)
ctx.Data["Labels"] = labels
// Get assigned milestone.
- if issue.MilestoneId > 0 {
- ctx.Data["Milestone"], err = models.GetMilestoneById(issue.MilestoneId)
+ if issue.MilestoneID > 0 {
+ ctx.Data["Milestone"], err = models.GetMilestoneByID(issue.MilestoneID)
if err != nil {
- if err == models.ErrMilestoneNotExist {
- log.Warn("issue.ViewIssue(GetMilestoneById): %v", err)
+ if models.IsErrMilestoneNotExist(err) {
+ log.Warn("GetMilestoneById: %v", err)
} else {
- ctx.Handle(500, "issue.ViewIssue(GetMilestoneById)", err)
+ ctx.Handle(500, "GetMilestoneById", err)
return
}
}
}
// Get all milestones.
- ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, false)
+ ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, -1, false)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetMilestones.1): %v", err)
+ ctx.Handle(500, "GetMilestones.1: %v", err)
return
}
- ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, true)
+ ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, -1, true)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetMilestones.2): %v", err)
+ ctx.Handle(500, "GetMilestones.2: %v", err)
return
}
// Get all collaborators.
ctx.Data["Collaborators"], err = ctx.Repo.Repository.GetCollaborators()
if err != nil {
- ctx.Handle(500, "issue.CreateIssue(GetCollaborators)", err)
+ ctx.Handle(500, "GetCollaborators", err)
return
}
if ctx.IsSigned {
// Update issue-user.
- if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.Id); err != nil {
- ctx.Handle(500, "issue.ViewIssue(UpdateIssueUserPairByRead): %v", err)
+ if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.ID); err != nil {
+ ctx.Handle(500, "UpdateIssueUserPairByRead: %v", err)
return
}
}
// Get poster and Assignee.
if err = issue.GetPoster(); err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetPoster): %v", err)
+ ctx.Handle(500, "GetPoster: %v", err)
return
} else if err = issue.GetAssignee(); err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetAssignee): %v", err)
+ ctx.Handle(500, "GetAssignee: %v", err)
return
}
issue.RenderedContent = string(base.RenderMarkdown([]byte(issue.Content), ctx.Repo.RepoLink))
// Get comments.
- comments, err := models.GetIssueComments(issue.Id)
+ comments, err := models.GetIssueComments(issue.ID)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetIssueComments): %v", err)
+ ctx.Handle(500, "GetIssueComments: %v", err)
return
}
@@ -419,7 +441,7 @@ func ViewIssue(ctx *middleware.Context) {
for i := range comments {
u, err := models.GetUserById(comments[i].PosterId)
if err != nil {
- ctx.Handle(500, "issue.ViewIssue(GetUserById.2): %v", err)
+ ctx.Handle(500, "GetUserById.2: %v", err)
return
}
comments[i].Poster = u
@@ -434,7 +456,7 @@ func ViewIssue(ctx *middleware.Context) {
ctx.Data["Title"] = issue.Name
ctx.Data["Issue"] = issue
ctx.Data["Comments"] = comments
- ctx.Data["IsIssueOwner"] = ctx.Repo.IsOwner() || (ctx.IsSigned && issue.PosterId == ctx.User.Id)
+ ctx.Data["IsIssueOwner"] = ctx.Repo.IsOwner() || (ctx.IsSigned && issue.PosterID == ctx.User.Id)
ctx.Data["IsRepoToolbarIssues"] = true
ctx.Data["IsRepoToolbarIssuesList"] = false
ctx.HTML(200, ISSUE_VIEW)
@@ -457,7 +479,7 @@ func UpdateIssue(ctx *middleware.Context, form auth.CreateIssueForm) {
return
}
- if ctx.User.Id != issue.PosterId && !ctx.Repo.IsOwner() {
+ if ctx.User.Id != issue.PosterID && !ctx.Repo.IsOwner() {
ctx.Error(403)
return
}
@@ -582,7 +604,7 @@ func UpdateIssueMilestone(ctx *middleware.Context) {
return
}
- oldMid := issue.MilestoneId
+ oldMid := issue.MilestoneID
mid := com.StrTo(ctx.Query("milestoneid")).MustInt64()
if oldMid == mid {
ctx.JSON(200, map[string]interface{}{
@@ -592,7 +614,7 @@ func UpdateIssueMilestone(ctx *middleware.Context) {
}
// Not check for invalid milestone id and give responsibility to owners.
- issue.MilestoneId = mid
+ issue.MilestoneID = mid
if err = models.ChangeMilestoneAssign(oldMid, mid, issue); err != nil {
ctx.Handle(500, "issue.UpdateIssueMilestone(ChangeMilestoneAssign)", err)
return
@@ -630,8 +652,8 @@ func UpdateAssignee(ctx *middleware.Context) {
aid := com.StrTo(ctx.Query("assigneeid")).MustInt64()
// Not check for invalid assignee id and give responsibility to owners.
- issue.AssigneeId = aid
- if err = models.UpdateIssueUserPairByAssignee(aid, issue.Id); err != nil {
+ issue.AssigneeID = aid
+ if err = models.UpdateIssueUserPairByAssignee(aid, issue.ID); err != nil {
ctx.Handle(500, "UpdateIssueUserPairByAssignee: %v", err)
return
} else if err = models.UpdateIssue(issue); err != nil {
@@ -753,7 +775,7 @@ func Comment(ctx *middleware.Context) {
// Check if issue owner changes the status of issue.
var newStatus string
- if ctx.Repo.IsOwner() || issue.PosterId == ctx.User.Id {
+ if ctx.Repo.IsOwner() || issue.PosterID == ctx.User.Id {
newStatus = ctx.Query("change_status")
}
if len(newStatus) > 0 {
@@ -763,7 +785,7 @@ func Comment(ctx *middleware.Context) {
if err = models.UpdateIssue(issue); err != nil {
send(500, nil, err)
return
- } else if err = models.UpdateIssueUserPairsByStatus(issue.Id, issue.IsClosed); err != nil {
+ } else if err = models.UpdateIssueUserPairsByStatus(issue.ID, issue.IsClosed); err != nil {
send(500, nil, err)
return
}
@@ -787,7 +809,7 @@ func Comment(ctx *middleware.Context) {
}
// Change open/closed issue counter for the associated milestone
- if issue.MilestoneId > 0 {
+ if issue.MilestoneID > 0 {
if err = models.ChangeMilestoneIssueStats(issue); err != nil {
send(500, nil, err)
}
@@ -798,11 +820,11 @@ func Comment(ctx *middleware.Context) {
cmtType = models.COMMENT_TYPE_REOPEN
}
- if _, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, cmtType, "", nil); err != nil {
+ if _, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.ID, 0, 0, cmtType, "", nil); err != nil {
send(200, nil, err)
return
}
- log.Trace("%s Issue(%d) status changed: %v", ctx.Req.RequestURI, issue.Id, !issue.IsClosed)
+ log.Trace("%s Issue(%d) status changed: %v", ctx.Req.RequestURI, issue.ID, !issue.IsClosed)
}
}
@@ -814,7 +836,7 @@ func Comment(ctx *middleware.Context) {
if len(content) > 0 || len(ctx.Req.MultipartForm.File["attachments"]) > 0 {
switch ctx.Params(":action") {
case "new":
- if comment, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.Id, 0, 0, models.COMMENT_TYPE_COMMENT, content, nil); err != nil {
+ if comment, err = models.CreateComment(ctx.User.Id, ctx.Repo.Repository.Id, issue.ID, 0, 0, models.COMMENT_TYPE_COMMENT, content, nil); err != nil {
send(500, nil, err)
return
}
@@ -826,13 +848,13 @@ func Comment(ctx *middleware.Context) {
ms[i] = ms[i][1:]
}
- if err := models.UpdateMentions(ms, issue.Id); err != nil {
+ if err := models.UpdateMentions(ms, issue.ID); err != nil {
send(500, nil, err)
return
}
}
- log.Trace("%s Comment created: %d", ctx.Req.RequestURI, issue.Id)
+ log.Trace("%s Comment created: %d", ctx.Req.RequestURI, issue.ID)
default:
ctx.Handle(404, "issue.Comment", err)
return
@@ -840,7 +862,7 @@ func Comment(ctx *middleware.Context) {
}
if comment != nil {
- uploadFiles(ctx, issue.Id, comment.Id)
+ uploadFiles(ctx, issue.ID, comment.Id)
}
// Notify watchers.
@@ -853,6 +875,7 @@ func Comment(ctx *middleware.Context) {
RepoID: ctx.Repo.Repository.Id,
RepoUserName: ctx.Repo.Owner.LowerName,
RepoName: ctx.Repo.Repository.LowerName,
+ IsPrivate: ctx.Repo.Repository.IsPrivate,
}
if err = models.NotifyWatchers(act); err != nil {
send(500, nil, err)
@@ -887,9 +910,19 @@ func Comment(ctx *middleware.Context) {
send(200, fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, index), nil)
}
+func Labels(ctx *middleware.Context) {
+ ctx.Data["Title"] = ctx.Tr("repo.labels")
+ ctx.Data["PageIsLabels"] = true
+ ctx.HTML(200, LABELS)
+}
+
func NewLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
+ ctx.Data["Title"] = ctx.Tr("repo.labels")
+ ctx.Data["PageIsLabels"] = true
+
if ctx.HasError() {
- Issues(ctx)
+ ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
+ ctx.Redirect(ctx.Repo.RepoLink + "/labels")
return
}
@@ -899,63 +932,71 @@ func NewLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
Color: form.Color,
}
if err := models.NewLabel(l); err != nil {
- ctx.Handle(500, "issue.NewLabel(NewLabel)", err)
+ ctx.Handle(500, "NewLabel", err)
return
}
- ctx.Redirect(ctx.Repo.RepoLink + "/issues")
+ ctx.Redirect(ctx.Repo.RepoLink + "/labels")
}
func UpdateLabel(ctx *middleware.Context, form auth.CreateLabelForm) {
- id := com.StrTo(ctx.Query("id")).MustInt64()
- if id == 0 {
- ctx.Error(404)
+ l, err := models.GetLabelById(form.ID)
+ if err != nil {
+ switch err {
+ case models.ErrLabelNotExist:
+ ctx.Error(404)
+ default:
+ ctx.Handle(500, "UpdateLabel", err)
+ }
return
}
- l := &models.Label{
- Id: id,
- Name: form.Title,
- Color: form.Color,
- }
+ l.Name = form.Title
+ l.Color = form.Color
if err := models.UpdateLabel(l); err != nil {
- ctx.Handle(500, "issue.UpdateLabel(UpdateLabel)", err)
+ ctx.Handle(500, "UpdateLabel", err)
return
}
- ctx.Redirect(ctx.Repo.RepoLink + "/issues")
+ ctx.Redirect(ctx.Repo.RepoLink + "/labels")
}
func DeleteLabel(ctx *middleware.Context) {
- removes := ctx.Query("remove")
- if len(strings.TrimSpace(removes)) == 0 {
- ctx.JSON(200, map[string]interface{}{
- "ok": true,
- })
- return
- }
-
- strIds := strings.Split(removes, ",")
- for _, strId := range strIds {
- if err := models.DeleteLabel(ctx.Repo.Repository.Id, strId); err != nil {
- ctx.Handle(500, "issue.DeleteLabel(DeleteLabel)", err)
- return
- }
+ if err := models.DeleteLabel(ctx.Repo.Repository.Id, ctx.QueryInt64("id")); err != nil {
+ ctx.Flash.Error("DeleteLabel: " + err.Error())
+ } else {
+ ctx.Flash.Success(ctx.Tr("repo.issues.label_deletion_success"))
}
ctx.JSON(200, map[string]interface{}{
- "ok": true,
+ "redirect": ctx.Repo.RepoLink + "/labels",
})
+ return
}
func Milestones(ctx *middleware.Context) {
- ctx.Data["Title"] = "Milestones"
- ctx.Data["IsRepoToolbarIssues"] = true
- ctx.Data["IsRepoToolbarIssuesList"] = true
+ ctx.Data["Title"] = ctx.Tr("repo.milestones")
+ ctx.Data["PageIsMilestones"] = true
isShowClosed := ctx.Query("state") == "closed"
+ openCount, closedCount := models.MilestoneStats(ctx.Repo.Repository.Id)
+ ctx.Data["OpenCount"] = openCount
+ ctx.Data["ClosedCount"] = closedCount
+
+ page := ctx.QueryInt("page")
+ if page <= 1 {
+ page = 1
+ }
- miles, err := models.GetMilestones(ctx.Repo.Repository.Id, isShowClosed)
+ var total int
+ if !isShowClosed {
+ total = int(openCount)
+ } else {
+ total = int(closedCount)
+ }
+ ctx.Data["Page"] = paginater.New(total, setting.IssuePagingNum, page, 5)
+
+ miles, err := models.GetMilestones(ctx.Repo.Repository.Id, page, isShowClosed)
if err != nil {
- ctx.Handle(500, "issue.Milestones(GetMilestones)", err)
+ ctx.Handle(500, "GetMilestones", err)
return
}
for _, m := range miles {
@@ -969,155 +1010,161 @@ func Milestones(ctx *middleware.Context) {
} else {
ctx.Data["State"] = "open"
}
+
+ ctx.Data["IsShowClosed"] = isShowClosed
ctx.HTML(200, MILESTONE)
}
func NewMilestone(ctx *middleware.Context) {
- ctx.Data["Title"] = "New Milestone"
- ctx.Data["IsRepoToolbarIssues"] = true
- ctx.Data["IsRepoToolbarIssuesList"] = true
+ ctx.Data["Title"] = ctx.Tr("repo.milestones.new")
+ ctx.Data["PageIsMilestones"] = true
+ ctx.Data["DateLang"] = setting.DateLang(ctx.Locale.Language())
ctx.HTML(200, MILESTONE_NEW)
}
func NewMilestonePost(ctx *middleware.Context, form auth.CreateMilestoneForm) {
- ctx.Data["Title"] = "New Milestone"
- ctx.Data["IsRepoToolbarIssues"] = true
- ctx.Data["IsRepoToolbarIssuesList"] = true
+ ctx.Data["Title"] = ctx.Tr("repo.milestones.new")
+ ctx.Data["PageIsMilestones"] = true
+ ctx.Data["DateLang"] = setting.DateLang(ctx.Locale.Language())
if ctx.HasError() {
ctx.HTML(200, MILESTONE_NEW)
return
}
- var deadline time.Time
- var err error
if len(form.Deadline) == 0 {
- form.Deadline = "12/31/9999"
+ form.Deadline = "9999-12-31"
}
- deadline, err = time.Parse("01/02/2006", form.Deadline)
+ deadline, err := time.Parse("2006-01-02", form.Deadline)
if err != nil {
- ctx.Handle(500, "issue.NewMilestonePost(time.Parse)", err)
+ ctx.Data["Err_Deadline"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.milestones.invalid_due_date_format"), MILESTONE_NEW, &form)
return
}
- mile := &models.Milestone{
- RepoId: ctx.Repo.Repository.Id,
- Index: int64(ctx.Repo.Repository.NumMilestones) + 1,
+ if err = models.NewMilestone(&models.Milestone{
+ RepoID: ctx.Repo.Repository.Id,
Name: form.Title,
Content: form.Content,
Deadline: deadline,
- }
- if err = models.NewMilestone(mile); err != nil {
- ctx.Handle(500, "issue.NewMilestonePost(NewMilestone)", err)
+ }); err != nil {
+ ctx.Handle(500, "NewMilestone", err)
return
}
- ctx.Redirect(ctx.Repo.RepoLink + "/issues/milestones")
+ ctx.Flash.Success(ctx.Tr("repo.milestones.create_success", form.Title))
+ ctx.Redirect(ctx.Repo.RepoLink + "/milestones")
}
-func UpdateMilestone(ctx *middleware.Context) {
- ctx.Data["Title"] = "Update Milestone"
- ctx.Data["IsRepoToolbarIssues"] = true
- ctx.Data["IsRepoToolbarIssuesList"] = true
-
- idx := com.StrTo(ctx.Params(":index")).MustInt64()
- if idx == 0 {
- ctx.Handle(404, "issue.UpdateMilestone", nil)
- return
- }
+func EditMilestone(ctx *middleware.Context) {
+ ctx.Data["Title"] = ctx.Tr("repo.milestones.edit")
+ ctx.Data["PageIsMilestones"] = true
+ ctx.Data["PageIsEditMilestone"] = true
+ ctx.Data["DateLang"] = setting.DateLang(ctx.Locale.Language())
- mile, err := models.GetMilestoneByIndex(ctx.Repo.Repository.Id, idx)
+ m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id"))
if err != nil {
- if err == models.ErrMilestoneNotExist {
- ctx.Handle(404, "issue.UpdateMilestone(GetMilestoneByIndex)", err)
+ if models.IsErrMilestoneNotExist(err) {
+ ctx.Handle(404, "GetMilestoneByID", nil)
} else {
- ctx.Handle(500, "issue.UpdateMilestone(GetMilestoneByIndex)", err)
+ ctx.Handle(500, "GetMilestoneByID", err)
}
return
}
+ ctx.Data["title"] = m.Name
+ ctx.Data["content"] = m.Content
+ if len(m.DeadlineString) > 0 {
+ ctx.Data["deadline"] = m.DeadlineString
+ }
+ ctx.HTML(200, MILESTONE_NEW)
+}
- action := ctx.Params(":action")
- if len(action) > 0 {
- switch action {
- case "open":
- if mile.IsClosed {
- if err = models.ChangeMilestoneStatus(mile, false); err != nil {
- ctx.Handle(500, "issue.UpdateMilestone(ChangeMilestoneStatus)", err)
- return
- }
- }
- case "close":
- if !mile.IsClosed {
- mile.ClosedDate = time.Now()
- if err = models.ChangeMilestoneStatus(mile, true); err != nil {
- ctx.Handle(500, "issue.UpdateMilestone(ChangeMilestoneStatus)", err)
- return
- }
- }
- case "delete":
- if err = models.DeleteMilestone(mile); err != nil {
- ctx.Handle(500, "issue.UpdateMilestone(DeleteMilestone)", err)
- return
- }
- }
- ctx.Redirect(ctx.Repo.RepoLink + "/issues/milestones")
+func EditMilestonePost(ctx *middleware.Context, form auth.CreateMilestoneForm) {
+ ctx.Data["Title"] = ctx.Tr("repo.milestones.edit")
+ ctx.Data["PageIsMilestones"] = true
+ ctx.Data["PageIsEditMilestone"] = true
+ ctx.Data["DateLang"] = setting.DateLang(ctx.Locale.Language())
+
+ if ctx.HasError() {
+ ctx.HTML(200, MILESTONE_NEW)
return
}
- mile.DeadlineString = mile.Deadline.UTC().Format("01/02/2006")
- if mile.DeadlineString == "12/31/9999" {
- mile.DeadlineString = ""
+ if len(form.Deadline) == 0 {
+ form.Deadline = "9999-12-31"
}
- ctx.Data["Milestone"] = mile
-
- ctx.HTML(200, MILESTONE_EDIT)
-}
-
-func UpdateMilestonePost(ctx *middleware.Context, form auth.CreateMilestoneForm) {
- ctx.Data["Title"] = "Update Milestone"
- ctx.Data["IsRepoToolbarIssues"] = true
- ctx.Data["IsRepoToolbarIssuesList"] = true
-
- idx := com.StrTo(ctx.Params(":index")).MustInt64()
- if idx == 0 {
- ctx.Handle(404, "issue.UpdateMilestonePost", nil)
+ deadline, err := time.Parse("2006-01-02", form.Deadline)
+ if err != nil {
+ ctx.Data["Err_Deadline"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.milestones.invalid_due_date_format"), MILESTONE_NEW, &form)
return
}
- mile, err := models.GetMilestoneByIndex(ctx.Repo.Repository.Id, idx)
+ m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id"))
if err != nil {
- if err == models.ErrMilestoneNotExist {
- ctx.Handle(404, "issue.UpdateMilestonePost(GetMilestoneByIndex)", err)
+ if models.IsErrMilestoneNotExist(err) {
+ ctx.Handle(404, "GetMilestoneByID", nil)
} else {
- ctx.Handle(500, "issue.UpdateMilestonePost(GetMilestoneByIndex)", err)
+ ctx.Handle(500, "GetMilestoneByID", err)
}
return
}
-
- if ctx.HasError() {
- ctx.HTML(200, MILESTONE_EDIT)
+ m.Name = form.Title
+ m.Content = form.Content
+ m.Deadline = deadline
+ if err = models.UpdateMilestone(m); err != nil {
+ ctx.Handle(500, "UpdateMilestone", err)
return
}
- var deadline time.Time
- if len(form.Deadline) == 0 {
- form.Deadline = "12/31/9999"
- }
- deadline, err = time.Parse("01/02/2006", form.Deadline)
+ ctx.Flash.Success(ctx.Tr("repo.milestones.edit_success", m.Name))
+ ctx.Redirect(ctx.Repo.RepoLink + "/milestones")
+}
+
+func ChangeMilestonStatus(ctx *middleware.Context) {
+ m, err := models.GetMilestoneByID(ctx.ParamsInt64(":id"))
if err != nil {
- ctx.Handle(500, "issue.UpdateMilestonePost(time.Parse)", err)
+ if models.IsErrMilestoneNotExist(err) {
+ ctx.Handle(404, "GetMilestoneByID", err)
+ } else {
+ ctx.Handle(500, "GetMilestoneByID", err)
+ }
return
}
- mile.Name = form.Title
- mile.Content = form.Content
- mile.Deadline = deadline
- if err = models.UpdateMilestone(mile); err != nil {
- ctx.Handle(500, "issue.UpdateMilestonePost(UpdateMilestone)", err)
- return
+ switch ctx.Params(":action") {
+ case "open":
+ if m.IsClosed {
+ if err = models.ChangeMilestoneStatus(m, false); err != nil {
+ ctx.Handle(500, "ChangeMilestoneStatus", err)
+ return
+ }
+ }
+ ctx.Redirect(ctx.Repo.RepoLink + "/milestones?state=open")
+ case "close":
+ if !m.IsClosed {
+ m.ClosedDate = time.Now()
+ if err = models.ChangeMilestoneStatus(m, true); err != nil {
+ ctx.Handle(500, "ChangeMilestoneStatus", err)
+ return
+ }
+ }
+ ctx.Redirect(ctx.Repo.RepoLink + "/milestones?state=closed")
+ default:
+ ctx.Redirect(ctx.Repo.RepoLink + "/milestones")
+ }
+}
+
+func DeleteMilestone(ctx *middleware.Context) {
+ if err := models.DeleteMilestoneByID(ctx.QueryInt64("id")); err != nil {
+ ctx.Flash.Error("DeleteMilestone: " + err.Error())
+ } else {
+ ctx.Flash.Success(ctx.Tr("repo.milestones.deletion_success"))
}
- ctx.Redirect(ctx.Repo.RepoLink + "/issues/milestones")
+ ctx.JSON(200, map[string]interface{}{
+ "redirect": ctx.Repo.RepoLink + "/milestones",
+ })
}
func IssueGetAttachment(ctx *middleware.Context) {
@@ -1130,7 +1177,7 @@ func IssueGetAttachment(ctx *middleware.Context) {
attachment, err := models.GetAttachmentById(id)
if err != nil {
- ctx.Handle(404, "issue.IssueGetAttachment(models.GetAttachmentById)", err)
+ ctx.Handle(404, "models.GetAttachmentById", err)
return
}
@@ -1139,20 +1186,6 @@ func IssueGetAttachment(ctx *middleware.Context) {
ctx.ServeFile(attachment.Path, "\""+attachment.Name+"\"")
}
-// testing route handler for new issue ui page
-// todo : move to Issue() function
-func Issues2(ctx *middleware.Context) {
- ctx.HTML(200, "repo/issue2/list")
-}
-
func PullRequest2(ctx *middleware.Context) {
ctx.HTML(200, "repo/pr2/list")
}
-
-func Labels2(ctx *middleware.Context) {
- ctx.HTML(200, "repo/issue2/labels")
-}
-
-func Milestones2(ctx *middleware.Context) {
- ctx.HTML(200, "repo/milestone2/list")
-}
diff --git a/routers/repo/pull.go b/routers/repo/pull.go
index d379a54e..a4ebb91a 100644
--- a/routers/repo/pull.go
+++ b/routers/repo/pull.go
@@ -5,14 +5,115 @@
package repo
import (
+ "github.com/gogits/gogs/models"
+ "github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
+ "github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/middleware"
+ "github.com/gogits/gogs/modules/setting"
)
const (
+ FORK base.TplName = "repo/pulls/fork"
PULLS base.TplName = "repo/pulls"
)
+func getForkRepository(ctx *middleware.Context) *models.Repository {
+ forkRepo, err := models.GetRepositoryById(ctx.ParamsInt64(":repoid"))
+ if err != nil {
+ if models.IsErrRepoNotExist(err) {
+ ctx.Handle(404, "GetRepositoryById", nil)
+ } else {
+ ctx.Handle(500, "GetRepositoryById", err)
+ }
+ return nil
+ }
+ ctx.Data["repo_name"] = forkRepo.Name
+ ctx.Data["desc"] = forkRepo.Description
+ ctx.Data["IsPrivate"] = forkRepo.IsPrivate
+
+ if err = forkRepo.GetOwner(); err != nil {
+ ctx.Handle(500, "GetOwner", err)
+ return nil
+ }
+ ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name
+
+ if err := ctx.User.GetOrganizations(); err != nil {
+ ctx.Handle(500, "GetOrganizations", err)
+ return nil
+ }
+ ctx.Data["Orgs"] = ctx.User.Orgs
+
+ return forkRepo
+}
+
+func Fork(ctx *middleware.Context) {
+ ctx.Data["Title"] = ctx.Tr("new_fork")
+
+ getForkRepository(ctx)
+ if ctx.Written() {
+ return
+ }
+
+ ctx.Data["ContextUser"] = ctx.User
+ ctx.HTML(200, FORK)
+}
+
+func ForkPost(ctx *middleware.Context, form auth.CreateRepoForm) {
+ ctx.Data["Title"] = ctx.Tr("new_fork")
+
+ forkRepo := getForkRepository(ctx)
+ if ctx.Written() {
+ return
+ }
+
+ ctxUser := checkContextUser(ctx, form.Uid)
+ if ctx.Written() {
+ return
+ }
+ ctx.Data["ContextUser"] = ctxUser
+
+ if ctx.HasError() {
+ ctx.HTML(200, FORK)
+ return
+ }
+
+ repo, has := models.HasForkedRepo(ctxUser.Id, forkRepo.Id)
+ if has {
+ ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name)
+ return
+ }
+
+ // Check ownership of organization.
+ if ctxUser.IsOrganization() {
+ if !ctxUser.IsOwnedBy(ctx.User.Id) {
+ ctx.Error(403)
+ return
+ }
+ }
+
+ repo, err := models.ForkRepository(ctxUser, forkRepo, form.RepoName, form.Description)
+ if err != nil {
+ switch {
+ case models.IsErrRepoAlreadyExist(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.settings.new_owner_has_same_repo"), FORK, &form)
+ case models.IsErrNameReserved(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), FORK, &form)
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), FORK, &form)
+ default:
+ ctx.Handle(500, "ForkPost", err)
+ }
+ return
+ }
+
+ log.Trace("Repository forked[%d]: %s/%s", forkRepo.Id, ctxUser.Name, repo.Name)
+ ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name)
+}
+
func Pulls(ctx *middleware.Context) {
ctx.Data["IsRepoToolbarPulls"] = true
ctx.HTML(200, PULLS)
diff --git a/routers/repo/repo.go b/routers/repo/repo.go
index 73c9277d..dde8b584 100644
--- a/routers/repo/repo.go
+++ b/routers/repo/repo.go
@@ -25,21 +25,27 @@ import (
const (
CREATE base.TplName = "repo/create"
MIGRATE base.TplName = "repo/migrate"
- FORK base.TplName = "repo/fork"
)
-func checkContextUser(ctx *middleware.Context, uid int64) (*models.User, error) {
- ctxUser := ctx.User
- if uid > 0 {
- org, err := models.GetUserById(uid)
- if err != models.ErrUserNotExist {
- if err != nil {
- return nil, fmt.Errorf("GetUserById: %v", err)
- }
- ctxUser = org
- }
+func checkContextUser(ctx *middleware.Context, uid int64) *models.User {
+ // Not equal means current user is an organization.
+ if uid == ctx.User.Id || uid == 0 {
+ return ctx.User
+ }
+
+ org, err := models.GetUserById(uid)
+ if models.IsErrUserNotExist(err) {
+ return ctx.User
+ }
+
+ if err != nil {
+ ctx.Handle(500, "checkContextUser", fmt.Errorf("GetUserById(%d): %v", uid, err))
+ return nil
+ } else if !org.IsOrganization() {
+ ctx.Error(403)
+ return nil
}
- return ctxUser, nil
+ return org
}
func Create(ctx *middleware.Context) {
@@ -51,9 +57,8 @@ func Create(ctx *middleware.Context) {
ctx.Data["Gitignores"] = models.Gitignores
ctx.Data["Licenses"] = models.Licenses
- ctxUser, err := checkContextUser(ctx, ctx.QueryInt64("org"))
- if err != nil {
- ctx.Handle(500, "checkContextUser", err)
+ ctxUser := checkContextUser(ctx, ctx.QueryInt64("org"))
+ if ctx.Written() {
return
}
ctx.Data["ContextUser"] = ctxUser
@@ -73,15 +78,9 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
ctx.Data["Gitignores"] = models.Gitignores
ctx.Data["Licenses"] = models.Licenses
- ctxUser := ctx.User
- // Not equal means current user is an organization.
- if form.Uid != ctx.User.Id {
- var err error
- ctxUser, err = checkContextUser(ctx, form.Uid)
- if err != nil {
- ctx.Handle(500, "checkContextUser", err)
- return
- }
+ ctxUser := checkContextUser(ctx, form.Uid)
+ if ctx.Written() {
+ return
}
ctx.Data["ContextUser"] = ctxUser
@@ -110,14 +109,6 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
log.Trace("Repository created: %s/%s", ctxUser.Name, repo.Name)
ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name)
return
- } else if err == models.ErrRepoAlreadyExist {
- ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), CREATE, &form)
- return
- } else if err == models.ErrRepoNameIllegal {
- ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_repo_name"), CREATE, &form)
- return
}
if repo != nil {
@@ -125,15 +116,27 @@ func CreatePost(ctx *middleware.Context, form auth.CreateRepoForm) {
log.Error(4, "DeleteRepository: %v", errDelete)
}
}
- ctx.Handle(500, "CreatePost", err)
+
+ switch {
+ case models.IsErrRepoAlreadyExist(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), CREATE, &form)
+ case models.IsErrNameReserved(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), CREATE, &form)
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), CREATE, &form)
+ default:
+ ctx.Handle(500, "CreatePost", err)
+ }
}
func Migrate(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("new_migrate")
- ctxUser, err := checkContextUser(ctx, ctx.QueryInt64("org"))
- if err != nil {
- ctx.Handle(500, "checkContextUser", err)
+ ctxUser := checkContextUser(ctx, ctx.QueryInt64("org"))
+ if ctx.Written() {
return
}
ctx.Data["ContextUser"] = ctxUser
@@ -150,15 +153,9 @@ func Migrate(ctx *middleware.Context) {
func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
ctx.Data["Title"] = ctx.Tr("new_migrate")
- ctxUser := ctx.User
- // Not equal means current user is an organization.
- if form.Uid != ctx.User.Id {
- var err error
- ctxUser, err = checkContextUser(ctx, form.Uid)
- if err != nil {
- ctx.Handle(500, "checkContextUser", err)
- return
- }
+ ctxUser := checkContextUser(ctx, form.Uid)
+ if ctx.Written() {
+ return
}
ctx.Data["ContextUser"] = ctxUser
@@ -209,14 +206,6 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
log.Trace("Repository migrated: %s/%s", ctxUser.Name, form.RepoName)
ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + form.RepoName)
return
- } else if err == models.ErrRepoAlreadyExist {
- ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), MIGRATE, &form)
- return
- } else if err == models.ErrRepoNameIllegal {
- ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_repo_name"), MIGRATE, &form)
- return
}
if repo != nil {
@@ -230,115 +219,20 @@ func MigratePost(ctx *middleware.Context, form auth.MigrateRepoForm) {
ctx.RenderWithErr(ctx.Tr("form.auth_failed", err), MIGRATE, &form)
return
}
- ctx.Handle(500, "MigratePost", err)
-}
-
-func getForkRepository(ctx *middleware.Context) (*models.Repository, error) {
- forkId := ctx.QueryInt64("fork_id")
- ctx.Data["ForkId"] = forkId
-
- forkRepo, err := models.GetRepositoryById(forkId)
- if err != nil {
- return nil, fmt.Errorf("GetRepositoryById: %v", err)
- }
- ctx.Data["repo_name"] = forkRepo.Name
- ctx.Data["desc"] = forkRepo.Description
-
- if err = forkRepo.GetOwner(); err != nil {
- return nil, fmt.Errorf("GetOwner: %v", err)
- }
- ctx.Data["ForkFrom"] = forkRepo.Owner.Name + "/" + forkRepo.Name
- return forkRepo, nil
-}
-
-func Fork(ctx *middleware.Context) {
- ctx.Data["Title"] = ctx.Tr("new_fork")
-
- if _, err := getForkRepository(ctx); err != nil {
- if models.IsErrRepoNotExist(err) {
- ctx.Redirect(setting.AppSubUrl + "/")
- } else {
- ctx.Handle(500, "getForkRepository", err)
- }
- return
- }
-
- // FIXME: maybe sometime can directly fork to organization?
- ctx.Data["ContextUser"] = ctx.User
- if err := ctx.User.GetOrganizations(); err != nil {
- ctx.Handle(500, "GetOrganizations", err)
- return
- }
- ctx.Data["Orgs"] = ctx.User.Orgs
-
- ctx.HTML(200, FORK)
-}
-
-func ForkPost(ctx *middleware.Context, form auth.CreateRepoForm) {
- ctx.Data["Title"] = ctx.Tr("new_fork")
-
- forkRepo, err := getForkRepository(ctx)
- if err != nil {
- if models.IsErrRepoNotExist(err) {
- ctx.Redirect(setting.AppSubUrl + "/")
- } else {
- ctx.Handle(500, "getForkRepository", err)
- }
- return
- }
-
- ctxUser := ctx.User
- // Not equal means current user is an organization.
- if form.Uid != ctx.User.Id {
- var err error
- ctxUser, err = checkContextUser(ctx, form.Uid)
- if err != nil {
- ctx.Handle(500, "checkContextUser", err)
- return
- }
- }
- ctx.Data["ContextUser"] = ctxUser
-
- if err := ctx.User.GetOrganizations(); err != nil {
- ctx.Handle(500, "GetOrganizations", err)
- return
- }
- ctx.Data["Orgs"] = ctx.User.Orgs
-
- if ctx.HasError() {
- ctx.HTML(200, CREATE)
- return
- }
-
- if ctxUser.IsOrganization() {
- // Check ownership of organization.
- if !ctxUser.IsOwnedBy(ctx.User.Id) {
- ctx.Error(403)
- return
- }
- }
- repo, err := models.ForkRepository(ctxUser, forkRepo, form.RepoName, form.Description)
- if err == nil {
- log.Trace("Repository forked: %s/%s", ctxUser.Name, repo.Name)
- ctx.Redirect(setting.AppSubUrl + "/" + ctxUser.Name + "/" + repo.Name)
- return
- } else if err == models.ErrRepoAlreadyExist {
+ switch {
+ case models.IsErrRepoAlreadyExist(err):
ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), FORK, &form)
- return
- } else if err == models.ErrRepoNameIllegal {
+ ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), MIGRATE, &form)
+ case models.IsErrNameReserved(err):
ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_repo_name"), CREATE, &form)
- return
- }
-
- if repo != nil {
- if errDelete := models.DeleteRepository(ctxUser.Id, repo.Id, ctxUser.Name); errDelete != nil {
- log.Error(4, "DeleteRepository: %v", errDelete)
- }
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), MIGRATE, &form)
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), MIGRATE, &form)
+ default:
+ ctx.Handle(500, "MigratePost", err)
}
- ctx.Handle(500, "ForkPost", err)
}
func Action(ctx *middleware.Context) {
@@ -371,7 +265,13 @@ func Action(ctx *middleware.Context) {
})
return
}
- ctx.Redirect(ctx.Repo.RepoLink)
+
+ redirectTo := ctx.Query("redirect_to")
+ if len(redirectTo) == 0 {
+ redirectTo = ctx.Repo.RepoLink
+ }
+ ctx.Redirect(redirectTo)
+
return
ctx.JSON(200, map[string]interface{}{
"ok": true,
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index be21405b..1d5e0702 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -27,10 +27,11 @@ const (
SETTINGS_OPTIONS base.TplName = "repo/settings/options"
COLLABORATION base.TplName = "repo/settings/collaboration"
HOOKS base.TplName = "repo/settings/hooks"
- GITHOOKS base.TplName = "repo/settings/githooks"
- GITHOOK_EDIT base.TplName = "repo/settings/githook_edit"
HOOK_NEW base.TplName = "repo/settings/hook_new"
ORG_HOOK_NEW base.TplName = "org/settings/hook_new"
+ GITHOOKS base.TplName = "repo/settings/githooks"
+ GITHOOK_EDIT base.TplName = "repo/settings/githook_edit"
+ DEPLOY_KEYS base.TplName = "repo/settings/deploy_keys"
)
func Settings(ctx *middleware.Context) {
@@ -53,15 +54,18 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
newRepoName := form.RepoName
// Check if repository name has been changed.
if ctx.Repo.Repository.Name != newRepoName {
- if models.IsRepositoryExist(ctx.Repo.Owner, newRepoName) {
- ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), SETTINGS_OPTIONS, nil)
- return
- } else if err := models.ChangeRepositoryName(ctx.Repo.Owner.Name, ctx.Repo.Repository.Name, newRepoName); err != nil {
- if err == models.ErrRepoNameIllegal {
+ if err := models.ChangeRepositoryName(ctx.Repo.Owner, ctx.Repo.Repository.Name, newRepoName); err != nil {
+ switch {
+ case models.IsErrRepoAlreadyExist(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("form.repo_name_been_taken"), SETTINGS_OPTIONS, &form)
+ case models.IsErrNameReserved(err):
ctx.Data["Err_RepoName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_repo_name"), SETTINGS_OPTIONS, nil)
- } else {
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_reserved", err.(models.ErrNameReserved).Name), SETTINGS_OPTIONS, &form)
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Data["Err_RepoName"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), SETTINGS_OPTIONS, &form)
+ default:
ctx.Handle(500, "ChangeRepositoryName", err)
}
return
@@ -115,7 +119,7 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
}
if _, err = models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), SETTINGS_OPTIONS, nil)
} else {
ctx.Handle(500, "UserSignIn", err)
@@ -124,7 +128,7 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
}
if err = models.TransferOwnership(ctx.User, newOwner, ctx.Repo.Repository); err != nil {
- if err == models.ErrRepoAlreadyExist {
+ if models.IsErrRepoAlreadyExist(err) {
ctx.RenderWithErr(ctx.Tr("repo.settings.new_owner_has_same_repo"), SETTINGS_OPTIONS, nil)
} else {
ctx.Handle(500, "TransferOwnership", err)
@@ -148,7 +152,7 @@ func SettingsPost(ctx *middleware.Context, form auth.RepoSettingForm) {
}
if _, err := models.UserSignIn(ctx.User.Name, ctx.Query("password")); err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.RenderWithErr(ctx.Tr("form.enterred_invalid_password"), SETTINGS_OPTIONS, nil)
} else {
ctx.Handle(500, "UserSignIn", err)
@@ -182,7 +186,7 @@ func SettingsCollaboration(ctx *middleware.Context) {
u, err := models.GetUserByName(name)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
} else {
@@ -279,6 +283,7 @@ func WebHooksNew(ctx *middleware.Context) {
ctx.Data["PageIsSettingsHooksNew"] = true
ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
renderHookTypes(ctx)
+
orCtx, err := getOrgRepoCtx(ctx)
if err != nil {
ctx.Handle(500, "WebHooksNew(getOrgRepoCtx)", err)
@@ -293,6 +298,7 @@ func WebHooksNewPost(ctx *middleware.Context, form auth.NewWebhookForm) {
ctx.Data["PageIsSettingsHooks"] = true
ctx.Data["PageIsSettingsHooksNew"] = true
ctx.Data["Webhook"] = models.Webhook{HookEvent: &models.HookEvent{}}
+ renderHookTypes(ctx)
orCtx, err := getOrgRepoCtx(ctx)
if err != nil {
@@ -361,14 +367,10 @@ func WebHooksEdit(ctx *middleware.Context) {
// set data per HookTaskType
switch w.HookTaskType {
case models.SLACK:
- {
- ctx.Data["SlackHook"] = w.GetSlackHook()
- ctx.Data["HookType"] = "Slack"
- }
+ ctx.Data["SlackHook"] = w.GetSlackHook()
+ ctx.Data["HookType"] = "Slack"
default:
- {
- ctx.Data["HookType"] = "Gogs"
- }
+ ctx.Data["HookType"] = "Gogs"
}
w.GetEvent()
ctx.Data["Webhook"] = w
@@ -400,6 +402,15 @@ func WebHooksEditPost(ctx *middleware.Context, form auth.NewWebhookForm) {
}
return
}
+
+ // set data per HookTaskType
+ switch w.HookTaskType {
+ case models.SLACK:
+ ctx.Data["SlackHook"] = w.GetSlackHook()
+ ctx.Data["HookType"] = "Slack"
+ default:
+ ctx.Data["HookType"] = "Gogs"
+ }
w.GetEvent()
ctx.Data["Webhook"] = w
@@ -574,6 +585,29 @@ func getOrgRepoCtx(ctx *middleware.Context) (*OrgRepoCtx, error) {
}
}
+func TriggerHook(ctx *middleware.Context) {
+ u, err := models.GetUserByName(ctx.Params(":username"))
+ if err != nil {
+ if models.IsErrUserNotExist(err) {
+ ctx.Handle(404, "GetUserByName", err)
+ } else {
+ ctx.Handle(500, "GetUserByName", err)
+ }
+ return
+ }
+
+ repo, err := models.GetRepositoryByName(u.Id, ctx.Params(":reponame"))
+ if err != nil {
+ if models.IsErrRepoNotExist(err) {
+ ctx.Handle(404, "GetRepositoryByName", err)
+ } else {
+ ctx.Handle(500, "GetRepositoryByName", err)
+ }
+ return
+ }
+ models.HookQueue.AddRepoID(repo.Id)
+}
+
func GitHooks(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("repo.settings")
ctx.Data["PageIsSettingsGitHooks"] = true
@@ -624,3 +658,71 @@ func GitHooksEditPost(ctx *middleware.Context) {
}
ctx.Redirect(ctx.Repo.RepoLink + "/settings/hooks/git")
}
+
+func SettingsDeployKeys(ctx *middleware.Context) {
+ ctx.Data["Title"] = ctx.Tr("repo.settings")
+ ctx.Data["PageIsSettingsKeys"] = true
+
+ keys, err := models.ListDeployKeys(ctx.Repo.Repository.Id)
+ if err != nil {
+ ctx.Handle(500, "ListDeployKeys", err)
+ return
+ }
+ ctx.Data["Deploykeys"] = keys
+
+ ctx.HTML(200, DEPLOY_KEYS)
+}
+
+func SettingsDeployKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
+ ctx.Data["Title"] = ctx.Tr("repo.settings")
+ ctx.Data["PageIsSettingsKeys"] = true
+
+ if ctx.HasError() {
+ ctx.HTML(200, DEPLOY_KEYS)
+ return
+ }
+
+ content, err := models.CheckPublicKeyString(form.Content)
+ if err != nil {
+ if err == models.ErrKeyUnableVerify {
+ ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key"))
+ } else {
+ ctx.Data["HasError"] = true
+ ctx.Data["Err_Content"] = true
+ ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error()))
+ ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys")
+ return
+ }
+ }
+
+ if err = models.AddDeployKey(ctx.Repo.Repository.Id, form.Title, content); err != nil {
+ ctx.Data["HasError"] = true
+ switch {
+ case models.IsErrKeyAlreadyExist(err):
+ ctx.Data["Err_Content"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.settings.key_been_used"), DEPLOY_KEYS, &form)
+ case models.IsErrKeyNameAlreadyUsed(err):
+ ctx.Data["Err_Title"] = true
+ ctx.RenderWithErr(ctx.Tr("repo.settings.key_name_used"), DEPLOY_KEYS, &form)
+ default:
+ ctx.Handle(500, "AddDeployKey", err)
+ }
+ return
+ }
+
+ log.Trace("Deploy key added: %d", ctx.Repo.Repository.Id)
+ ctx.Flash.Success(ctx.Tr("repo.settings.add_key_success", form.Title))
+ ctx.Redirect(ctx.Repo.RepoLink + "/settings/keys")
+}
+
+func DeleteDeployKey(ctx *middleware.Context) {
+ if err := models.DeleteDeployKey(ctx.QueryInt64("id")); err != nil {
+ ctx.Flash.Error("DeleteDeployKey: " + err.Error())
+ } else {
+ ctx.Flash.Success(ctx.Tr("repo.settings.deploy_key_deletion_success"))
+ }
+
+ ctx.JSON(200, map[string]interface{}{
+ "redirect": ctx.Repo.RepoLink + "/settings/keys",
+ })
+}
diff --git a/routers/user/auth.go b/routers/user/auth.go
index 5dacaf8c..4b29a29e 100644
--- a/routers/user/auth.go
+++ b/routers/user/auth.go
@@ -60,7 +60,7 @@ func SignIn(ctx *middleware.Context) {
u, err := models.GetUserByName(uname)
if err != nil {
- if err != models.ErrUserNotExist {
+ if !models.IsErrUserNotExist(err) {
ctx.Handle(500, "GetUserByName", err)
} else {
ctx.HTML(200, SIGNIN)
@@ -105,7 +105,7 @@ func SignInPost(ctx *middleware.Context, form auth.SignInForm) {
u, err := models.UserSignIn(form.UserName, form.Password)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.RenderWithErr(ctx.Tr("form.username_password_incorrect"), SIGNIN, &form)
} else {
ctx.Handle(500, "UserSignIn", err)
@@ -249,16 +249,19 @@ func SignUpPost(ctx *middleware.Context, cpt *captcha.Captcha, form auth.Registe
}
if err := models.CreateUser(u); err != nil {
- switch err {
- case models.ErrUserAlreadyExist:
+ switch {
+ case models.IsErrUserAlreadyExist(err):
ctx.Data["Err_UserName"] = true
ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), SIGNUP, &form)
- case models.ErrEmailAlreadyUsed:
+ case models.IsErrEmailAlreadyUsed(err):
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), SIGNUP, &form)
- case models.ErrUserNameIllegal:
+ case models.IsErrNameReserved(err):
ctx.Data["Err_UserName"] = true
- ctx.RenderWithErr(ctx.Tr("form.illegal_username"), SIGNUP, &form)
+ ctx.RenderWithErr(ctx.Tr("user.form.name_reserved", err.(models.ErrNameReserved).Name), SIGNUP, &form)
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Data["Err_UserName"] = true
+ ctx.RenderWithErr(ctx.Tr("user.form.name_pattern_not_allowed", err.(models.ErrNamePatternNotAllowed).Pattern), SIGNUP, &form)
default:
ctx.Handle(500, "CreateUser", err)
}
@@ -325,7 +328,7 @@ func Activate(ctx *middleware.Context) {
user.IsActive = true
user.Rands = models.GetUserSalt()
if err := models.UpdateUser(user); err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Error(404)
} else {
ctx.Handle(500, "UpdateUser", err)
@@ -388,7 +391,7 @@ func ForgotPasswdPost(ctx *middleware.Context) {
email := ctx.Query("email")
u, err := models.GetUserByEmail(email)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Data["Err_Email"] = true
ctx.RenderWithErr(ctx.Tr("auth.email_not_associate"), FORGOT_PASSWORD, nil)
} else {
diff --git a/routers/user/home.go b/routers/user/home.go
index 3484e780..c38dba52 100644
--- a/routers/user/home.go
+++ b/routers/user/home.go
@@ -38,7 +38,7 @@ func Dashboard(ctx *middleware.Context) {
// Organization.
org, err := models.GetUserByName(orgName)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Handle(404, "GetUserByName", err)
} else {
ctx.Handle(500, "GetUserByName", err)
@@ -115,7 +115,7 @@ func Dashboard(ctx *middleware.Context) {
// FIXME: cache results?
u, err := models.GetUserByName(act.ActUserName)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
continue
}
ctx.Handle(500, "GetUserByName", err)
@@ -152,6 +152,7 @@ func ShowSSHKeys(ctx *middleware.Context, uid int64) {
var buf bytes.Buffer
for i := range keys {
buf.WriteString(keys[i].OmitEmail())
+ buf.WriteString("\n")
}
ctx.RenderData(200, buf.Bytes())
}
@@ -175,7 +176,7 @@ func Profile(ctx *middleware.Context) {
u, err := models.GetUserByName(uname)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
ctx.Handle(404, "GetUserByName", err)
} else {
ctx.Handle(500, "GetUserByName", err)
@@ -193,11 +194,6 @@ func Profile(ctx *middleware.Context) {
ctx.Redirect(setting.AppSubUrl + "/org/" + u.Name)
return
}
-
- // For security reason, hide e-mail address for anonymous visitors.
- if !ctx.IsSigned {
- u.Email = ""
- }
ctx.Data["Owner"] = u
tab := ctx.Query("tab")
@@ -227,7 +223,7 @@ func Profile(ctx *middleware.Context) {
// FIXME: cache results?
u, err := models.GetUserByName(act.ActUserName)
if err != nil {
- if err == models.ErrUserNotExist {
+ if models.IsErrUserNotExist(err) {
continue
}
ctx.Handle(500, "GetUserByName", err)
@@ -251,17 +247,17 @@ func Profile(ctx *middleware.Context) {
func Email2User(ctx *middleware.Context) {
u, err := models.GetUserByEmail(ctx.Query("email"))
if err != nil {
- if err == models.ErrUserNotExist {
- ctx.Handle(404, "user.Email2User(GetUserByEmail)", err)
+ if models.IsErrUserNotExist(err) {
+ ctx.Handle(404, "GetUserByEmail", err)
} else {
- ctx.Handle(500, "user.Email2User(GetUserByEmail)", err)
+ ctx.Handle(500, "GetUserByEmail", err)
}
return
}
ctx.Redirect(setting.AppSubUrl + "/user/" + u.Name)
}
-func Issues(ctx *middleware.Context) {
+func Issues(ctx *middleware.Context) {
ctx.Data["Title"] = ctx.Tr("issues")
ctx.Data["PageIsDashboard"] = true
ctx.Data["PageIsIssues"] = true
@@ -354,13 +350,13 @@ func Issues(ctx *middleware.Context) {
}
}
- issues[i].Repo, err = models.GetRepositoryById(issues[i].RepoId)
+ issues[i].Repo, err = models.GetRepositoryById(issues[i].RepoID)
if err != nil {
if models.IsErrRepoNotExist(err) {
- log.Warn("user.Issues(GetRepositoryById #%d): repository not exist", issues[i].RepoId)
+ log.Warn("GetRepositoryById[%d]: repository not exist", issues[i].RepoID)
continue
} else {
- ctx.Handle(500, fmt.Sprintf("user.Issues(GetRepositoryById #%d)", issues[i].RepoId), err)
+ ctx.Handle(500, fmt.Sprintf("GetRepositoryById[%d]", issues[i].RepoID), err)
return
}
}
@@ -388,8 +384,8 @@ func Issues(ctx *middleware.Context) {
} else {
ctx.Data["ShowCount"] = issueStats.OpenCount
}
-
+
ctx.Data["ContextUser"] = ctx.User
-
+
ctx.HTML(200, ISSUES)
}
diff --git a/routers/user/setting.go b/routers/user/setting.go
index 20e6c060..de9af655 100644
--- a/routers/user/setting.go
+++ b/routers/user/setting.go
@@ -50,21 +50,20 @@ func SettingsPost(ctx *middleware.Context, form auth.UpdateProfileForm) {
// Check if user name has been changed.
if ctx.User.Name != form.UserName {
- isExist, err := models.IsUserExist(ctx.User.Id, form.UserName)
- if err != nil {
- ctx.Handle(500, "IsUserExist", err)
- return
- } else if isExist {
- ctx.RenderWithErr(ctx.Tr("form.username_been_taken"), SETTINGS_PROFILE, &form)
- return
- } else if err = models.ChangeUserName(ctx.User, form.UserName); err != nil {
- switch err {
- case models.ErrUserNameIllegal:
- ctx.Flash.Error(ctx.Tr("form.illegal_username"))
+ if err := models.ChangeUserName(ctx.User, form.UserName); err != nil {
+ switch {
+ case models.IsErrUserAlreadyExist(err):
+ ctx.Flash.Error(ctx.Tr("form.username_been_taken"))
ctx.Redirect(setting.AppSubUrl + "/user/settings")
- case models.ErrEmailAlreadyUsed:
+ case models.IsErrEmailAlreadyUsed(err):
ctx.Flash.Error(ctx.Tr("form.email_been_used"))
ctx.Redirect(setting.AppSubUrl + "/user/settings")
+ case models.IsErrNameReserved(err):
+ ctx.Flash.Error(ctx.Tr("user.form.name_reserved"))
+ ctx.Redirect(setting.AppSubUrl + "/user/settings")
+ case models.IsErrNamePatternNotAllowed(err):
+ ctx.Flash.Error(ctx.Tr("user.form.name_pattern_not_allowed"))
+ ctx.Redirect(setting.AppSubUrl + "/user/settings")
default:
ctx.Handle(500, "ChangeUserName", err)
}
@@ -204,7 +203,7 @@ func SettingsEmailPost(ctx *middleware.Context, form auth.AddEmailForm) {
}
if err := models.AddEmailAddress(e); err != nil {
- if err == models.ErrEmailAlreadyUsed {
+ if models.IsErrEmailAlreadyUsed(err) {
ctx.RenderWithErr(ctx.Tr("form.email_been_used"), SETTINGS_EMAILS, &form)
return
}
@@ -306,7 +305,7 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
return
}
- if err = models.DeletePublicKey(&models.PublicKey{Id: id}); err != nil {
+ if err = models.DeletePublicKey(&models.PublicKey{ID: id}); err != nil {
ctx.Handle(500, "DeletePublicKey", err)
} else {
log.Trace("SSH key deleted: %s", ctx.User.Name)
@@ -322,15 +321,8 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
return
}
- // Parse openssh style string from form content
- content, err := models.ParseKeyString(form.Content)
+ content, err := models.CheckPublicKeyString(form.Content)
if err != nil {
- ctx.Flash.Error(ctx.Tr("form.invalid_ssh_key", err.Error()))
- ctx.Redirect(setting.AppSubUrl + "/user/settings/ssh")
- return
- }
-
- if ok, err := models.CheckPublicKeyString(content); !ok {
if err == models.ErrKeyUnableVerify {
ctx.Flash.Info(ctx.Tr("form.unable_verify_ssh_key"))
} else {
@@ -340,21 +332,19 @@ func SettingsSSHKeysPost(ctx *middleware.Context, form auth.AddSSHKeyForm) {
}
}
- k := &models.PublicKey{
- OwnerId: ctx.User.Id,
- Name: form.SSHTitle,
- Content: content,
- }
- if err := models.AddPublicKey(k); err != nil {
- if err == models.ErrKeyAlreadyExist {
- ctx.RenderWithErr(ctx.Tr("form.ssh_key_been_used"), SETTINGS_SSH_KEYS, &form)
- return
+ if err = models.AddPublicKey(ctx.User.Id, form.Title, content); err != nil {
+ switch {
+ case models.IsErrKeyAlreadyExist(err):
+ ctx.RenderWithErr(ctx.Tr("settings.ssh_key_been_used"), SETTINGS_SSH_KEYS, &form)
+ case models.IsErrKeyNameAlreadyUsed(err):
+ ctx.RenderWithErr(ctx.Tr("settings.ssh_key_name_used"), SETTINGS_SSH_KEYS, &form)
+ default:
+ ctx.Handle(500, "AddPublicKey", err)
}
- ctx.Handle(500, "ssh.AddPublicKey", err)
return
} else {
log.Trace("SSH key added: %s", ctx.User.Name)
- ctx.Flash.Success(ctx.Tr("settings.add_key_success"))
+ ctx.Flash.Success(ctx.Tr("settings.add_key_success", form.Title))
ctx.Redirect(setting.AppSubUrl + "/user/settings/ssh")
return
}