2014-05-01 17:44:22 +08: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 repo
2014-07-26 02:28:04 -04:00
import (
2014-08-24 08:59:47 -04:00
"encoding/json"
2014-09-04 07:17:00 -04:00
"errors"
2014-07-26 02:28:04 -04:00
"fmt"
"strings"
"time"
"github.com/Unknwon/com"
"github.com/gogits/gogs/models"
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/base"
2014-10-06 17:50:00 -04:00
"github.com/gogits/gogs/modules/git"
2014-07-26 02:28:04 -04:00
"github.com/gogits/gogs/modules/log"
"github.com/gogits/gogs/modules/mailer"
"github.com/gogits/gogs/modules/middleware"
"github.com/gogits/gogs/modules/setting"
)
const (
2014-08-02 13:47:33 -04:00
SETTINGS_OPTIONS base . TplName = "repo/settings/options"
2014-08-07 06:40:05 -04:00
COLLABORATION base . TplName = "repo/settings/collaboration"
2014-08-09 10:29:51 -07:00
HOOKS base . TplName = "repo/settings/hooks"
2014-10-06 17:50:00 -04:00
GITHOOKS base . TplName = "repo/settings/githooks"
GITHOOK_EDIT base . TplName = "repo/settings/githook_edit"
2014-08-09 15:40:10 -07:00
HOOK_NEW base . TplName = "repo/settings/hook_new"
2014-09-04 07:17:00 -04:00
ORG_HOOK_NEW base . TplName = "org/settings/hook_new"
2014-07-26 02:28:04 -04:00
)
2014-08-02 13:47:33 -04:00
func Settings ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsOptions" ] = true
ctx . HTML ( 200 , SETTINGS_OPTIONS )
2014-07-26 02:28:04 -04:00
}
2014-08-02 13:47:33 -04:00
func SettingsPost ( ctx * middleware . Context , form auth . RepoSettingForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsOptions" ] = true
2014-07-26 02:28:04 -04:00
switch ctx . Query ( "action" ) {
case "update" :
if ctx . HasError ( ) {
2014-08-02 13:47:33 -04:00
ctx . HTML ( 200 , SETTINGS_OPTIONS )
2014-07-26 02:28:04 -04:00
return
}
newRepoName := form . RepoName
// Check if repository name has been changed.
if ctx . Repo . Repository . Name != newRepoName {
2015-02-24 00:27:22 -05:00
if models . IsRepositoryExist ( ctx . Repo . Owner , newRepoName ) {
2014-08-02 13:47:33 -04:00
ctx . Data [ "Err_RepoName" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.repo_name_been_taken" ) , SETTINGS_OPTIONS , nil )
2014-07-26 02:28:04 -04:00
return
2015-02-24 00:27:22 -05:00
} else if err := models . ChangeRepositoryName ( ctx . Repo . Owner . Name , ctx . Repo . Repository . Name , newRepoName ) ; err != nil {
2014-08-24 21:09:05 +08:00
if err == models . ErrRepoNameIllegal {
ctx . Data [ "Err_RepoName" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.illegal_repo_name" ) , SETTINGS_OPTIONS , nil )
} else {
ctx . Handle ( 500 , "ChangeRepositoryName" , err )
}
2014-07-26 02:28:04 -04:00
return
}
2014-08-02 13:47:33 -04:00
log . Trace ( "Repository name changed: %s/%s -> %s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name , newRepoName )
2014-07-26 02:28:04 -04:00
ctx . Repo . Repository . Name = newRepoName
2014-12-12 01:29:36 -05:00
ctx . Repo . Repository . LowerName = strings . ToLower ( newRepoName )
2014-07-26 02:28:04 -04:00
}
br := form . Branch
if ctx . Repo . GitRepo . IsBranchExist ( br ) {
ctx . Repo . Repository . DefaultBranch = br
}
ctx . Repo . Repository . Description = form . Description
ctx . Repo . Repository . Website = form . Website
2015-03-16 04:52:11 -04:00
visibilityChanged := ctx . Repo . Repository . IsPrivate != form . Private
2014-07-26 02:28:04 -04:00
ctx . Repo . Repository . IsPrivate = form . Private
2015-03-16 04:52:11 -04:00
if err := models . UpdateRepository ( ctx . Repo . Repository , visibilityChanged ) ; err != nil {
2014-07-26 02:28:04 -04:00
ctx . Handle ( 404 , "UpdateRepository" , err )
return
}
2014-08-02 13:47:33 -04:00
log . Trace ( "Repository updated: %s/%s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name )
2014-07-26 02:28:04 -04:00
if ctx . Repo . Repository . IsMirror {
if form . Interval > 0 {
ctx . Repo . Mirror . Interval = form . Interval
ctx . Repo . Mirror . NextUpdate = time . Now ( ) . Add ( time . Duration ( form . Interval ) * time . Hour )
if err := models . UpdateMirror ( ctx . Repo . Mirror ) ; err != nil {
log . Error ( 4 , "UpdateMirror: %v" , err )
}
}
}
2014-08-02 13:47:33 -04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_settings_success" ) )
2014-09-19 20:11:34 -04:00
ctx . Redirect ( fmt . Sprintf ( "%s/%s/%s/settings" , setting . AppSubUrl , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name ) )
2014-07-26 02:28:04 -04:00
case "transfer" :
2014-08-02 13:47:33 -04:00
if ctx . Repo . Repository . Name != form . RepoName {
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_repo_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 02:28:04 -04:00
return
}
2014-08-02 13:47:33 -04:00
newOwner := ctx . Query ( "new_owner_name" )
2015-02-22 18:24:49 -05:00
isExist , err := models . IsUserExist ( 0 , newOwner )
2014-07-26 02:28:04 -04:00
if err != nil {
2014-08-02 13:47:33 -04:00
ctx . Handle ( 500 , "IsUserExist" , err )
2014-07-26 02:28:04 -04:00
return
} else if ! isExist {
2014-08-02 13:47:33 -04:00
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_owner_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 02:28:04 -04:00
return
2015-03-05 19:20:27 -05:00
}
if _ , err = models . UserSignIn ( ctx . User . Name , ctx . Query ( "password" ) ) ; err != nil {
if err == models . ErrUserNotExist {
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_password" ) , SETTINGS_OPTIONS , nil )
} else {
ctx . Handle ( 500 , "UserSignIn" , err )
}
2014-09-29 18:52:28 -04:00
return
2015-03-05 19:20:27 -05:00
}
if err = models . TransferOwnership ( ctx . User , newOwner , ctx . Repo . Repository ) ; err != nil {
2014-09-12 18:29:58 -04:00
if err == models . ErrRepoAlreadyExist {
ctx . RenderWithErr ( ctx . Tr ( "repo.settings.new_owner_has_same_repo" ) , SETTINGS_OPTIONS , nil )
} else {
ctx . Handle ( 500 , "TransferOwnership" , err )
}
2014-07-26 02:28:04 -04:00
return
}
2014-08-02 13:47:33 -04:00
log . Trace ( "Repository transfered: %s/%s -> %s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name , newOwner )
2014-09-17 14:52:46 -04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.transfer_succeed" ) )
2014-09-19 20:11:34 -04:00
ctx . Redirect ( setting . AppSubUrl + "/" )
2014-07-26 02:28:04 -04:00
case "delete" :
2014-08-02 13:47:33 -04:00
if ctx . Repo . Repository . Name != form . RepoName {
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_repo_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 02:28:04 -04:00
return
2014-08-27 16:39:36 +08:00
}
if ctx . Repo . Owner . IsOrganization ( ) {
2014-12-12 20:30:32 -05:00
if ! ctx . Repo . Owner . IsOwnedBy ( ctx . User . Id ) {
2014-08-27 16:39:36 +08:00
ctx . Error ( 404 )
return
}
2015-03-05 19:20:27 -05:00
}
if _ , err := models . UserSignIn ( ctx . User . Name , ctx . Query ( "password" ) ) ; err != nil {
if err == models . ErrUserNotExist {
2014-08-27 16:39:36 +08:00
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_password" ) , SETTINGS_OPTIONS , nil )
2015-03-05 19:20:27 -05:00
} else {
ctx . Handle ( 500 , "UserSignIn" , err )
2014-08-27 16:39:36 +08:00
}
2015-03-05 19:20:27 -05:00
return
2014-07-26 02:28:04 -04:00
}
if err := models . DeleteRepository ( ctx . Repo . Owner . Id , ctx . Repo . Repository . Id , ctx . Repo . Owner . Name ) ; err != nil {
2014-08-02 13:47:33 -04:00
ctx . Handle ( 500 , "DeleteRepository" , err )
2014-07-26 02:28:04 -04:00
return
}
2014-08-02 13:47:33 -04:00
log . Trace ( "Repository deleted: %s/%s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name )
2014-07-26 02:28:04 -04:00
if ctx . Repo . Owner . IsOrganization ( ) {
2014-09-19 20:11:34 -04:00
ctx . Redirect ( setting . AppSubUrl + "/org/" + ctx . Repo . Owner . Name + "/dashboard" )
2014-07-26 02:28:04 -04:00
} else {
2014-09-19 20:11:34 -04:00
ctx . Redirect ( setting . AppSubUrl + "/" )
2014-07-26 02:28:04 -04:00
}
}
}
2014-08-07 06:40:05 -04:00
func SettingsCollaboration ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsCollaboration" ] = true
if ctx . Req . Method == "POST" {
name := strings . ToLower ( ctx . Query ( "collaborator" ) )
if len ( name ) == 0 || ctx . Repo . Owner . LowerName == name {
2014-09-19 20:11:34 -04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 06:40:05 -04:00
return
}
u , err := models . GetUserByName ( name )
if err != nil {
if err == models . ErrUserNotExist {
ctx . Flash . Error ( ctx . Tr ( "form.user_not_exist" ) )
2014-09-19 20:11:34 -04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 06:40:05 -04:00
} else {
ctx . Handle ( 500 , "GetUserByName" , err )
}
return
}
2014-10-10 06:15:27 -04:00
// Check if user is organization member.
if ctx . Repo . Owner . IsOrganization ( ) && ctx . Repo . Owner . IsOrgMember ( u . Id ) {
ctx . Flash . Info ( ctx . Tr ( "repo.settings.user_is_org_member" ) )
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/collaboration" )
return
}
2015-01-23 09:54:16 +02:00
if err = ctx . Repo . Repository . AddCollaborator ( u ) ; err != nil {
ctx . Handle ( 500 , "AddCollaborator" , err )
2014-08-07 06:40:05 -04:00
return
}
if setting . Service . EnableNotifyMail {
if err = mailer . SendCollaboratorMail ( ctx . Render , u , ctx . User , ctx . Repo . Repository ) ; err != nil {
ctx . Handle ( 500 , "SendCollaboratorMail" , err )
return
}
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_collaborator_success" ) )
2014-09-19 20:11:34 -04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 06:40:05 -04:00
return
}
2014-07-26 02:28:04 -04:00
// Delete collaborator.
remove := strings . ToLower ( ctx . Query ( "remove" ) )
if len ( remove ) > 0 && remove != ctx . Repo . Owner . LowerName {
2015-01-23 09:54:16 +02:00
u , err := models . GetUserByName ( remove )
if err != nil {
ctx . Handle ( 500 , "GetUserByName" , err )
return
2014-08-24 21:09:05 +08:00
}
2015-01-23 09:54:16 +02:00
if err := ctx . Repo . Repository . DeleteCollaborator ( u ) ; err != nil {
ctx . Handle ( 500 , "DeleteCollaborator" , err )
return
2014-07-26 02:28:04 -04:00
}
2014-08-07 06:40:05 -04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.remove_collaborator_success" ) )
2014-07-26 02:28:04 -04:00
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/collaboration" )
return
}
2015-01-23 09:54:16 +02:00
users , err := ctx . Repo . Repository . GetCollaborators ( )
2014-07-26 02:28:04 -04:00
if err != nil {
2014-08-07 06:40:05 -04:00
ctx . Handle ( 500 , "GetCollaborators" , err )
2014-07-26 02:28:04 -04:00
return
}
2015-01-23 09:54:16 +02:00
ctx . Data [ "Collaborators" ] = users
2014-07-26 02:28:04 -04:00
ctx . HTML ( 200 , COLLABORATION )
}
2014-08-09 10:29:51 -07:00
func Webhooks ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
2014-07-26 02:28:04 -04:00
2014-08-09 10:29:51 -07:00
// Delete web hook.
2014-07-26 02:28:04 -04:00
remove := com . StrTo ( ctx . Query ( "remove" ) ) . MustInt64 ( )
if remove > 0 {
if err := models . DeleteWebhook ( remove ) ; err != nil {
2014-08-09 10:29:51 -07:00
ctx . Handle ( 500 , "DeleteWebhook" , err )
2014-07-26 02:28:04 -04:00
return
}
2014-08-09 10:29:51 -07:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.remove_hook_success" ) )
2014-07-26 02:28:04 -04:00
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/hooks" )
return
}
ws , err := models . GetWebhooksByRepoId ( ctx . Repo . Repository . Id )
if err != nil {
2014-08-09 10:29:51 -07:00
ctx . Handle ( 500 , "GetWebhooksByRepoId" , err )
2014-07-26 02:28:04 -04:00
return
}
ctx . Data [ "Webhooks" ] = ws
ctx . HTML ( 200 , HOOKS )
}
2014-08-24 08:59:47 -04:00
func renderHookTypes ( ctx * middleware . Context ) {
ctx . Data [ "HookTypes" ] = [ ] string { "Gogs" , "Slack" }
ctx . Data [ "HookType" ] = "Gogs"
}
2014-08-09 15:40:10 -07:00
func WebHooksNew ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
2014-08-24 08:59:47 -04:00
renderHookTypes ( ctx )
2014-09-04 19:05:21 -04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksNew(getOrgRepoCtx)" , err )
return
2014-09-04 07:17:00 -04:00
}
2014-09-04 19:05:21 -04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 02:28:04 -04:00
}
2014-08-09 15:40:10 -07:00
func WebHooksNewPost ( ctx * middleware . Context , form auth . NewWebhookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
2014-07-26 02:28:04 -04:00
2014-09-04 19:05:21 -04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksNewPost(getOrgRepoCtx)" , err )
return
}
2014-09-04 07:17:00 -04:00
2014-07-26 02:28:04 -04:00
if ctx . HasError ( ) {
2014-09-04 19:05:21 -04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 02:28:04 -04:00
return
}
2014-11-13 12:57:00 -05:00
// FIXME: code too old here, sync with APIs
2014-07-26 02:28:04 -04:00
ct := models . JSON
if form . ContentType == "2" {
ct = models . FORM
}
w := & models . Webhook {
2014-09-04 19:05:21 -04:00
RepoId : orCtx . RepoId ,
2014-08-09 15:40:10 -07:00
Url : form . PayloadUrl ,
2014-07-26 02:28:04 -04:00
ContentType : ct ,
Secret : form . Secret ,
HookEvent : & models . HookEvent {
PushOnly : form . PushOnly ,
} ,
2014-08-24 08:59:47 -04:00
IsActive : form . Active ,
HookTaskType : models . GOGS ,
Meta : "" ,
2014-09-04 19:05:21 -04:00
OrgId : orCtx . OrgId ,
2014-07-26 02:28:04 -04:00
}
2014-08-24 08:59:47 -04:00
2014-07-26 02:28:04 -04:00
if err := w . UpdateEvent ( ) ; err != nil {
2014-08-09 15:40:10 -07:00
ctx . Handle ( 500 , "UpdateEvent" , err )
2014-07-26 02:28:04 -04:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2014-08-09 15:40:10 -07:00
ctx . Handle ( 500 , "CreateWebhook" , err )
2014-07-26 02:28:04 -04:00
return
}
2014-08-09 15:40:10 -07:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
2014-09-04 19:05:21 -04:00
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
2014-07-26 02:28:04 -04:00
}
func WebHooksEdit ( ctx * middleware . Context ) {
2014-08-09 15:40:10 -07:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
2014-07-26 02:28:04 -04:00
hookId := com . StrTo ( ctx . Params ( ":id" ) ) . MustInt64 ( )
if hookId == 0 {
ctx . Handle ( 404 , "setting.WebHooksEdit" , nil )
return
}
w , err := models . GetWebhookById ( hookId )
if err != nil {
if err == models . ErrWebhookNotExist {
2014-08-09 15:40:10 -07:00
ctx . Handle ( 404 , "GetWebhookById" , nil )
2014-07-26 02:28:04 -04:00
} else {
2014-08-09 15:40:10 -07:00
ctx . Handle ( 500 , "GetWebhookById" , err )
2014-07-26 02:28:04 -04:00
}
return
}
2014-08-24 08:59:47 -04:00
// set data per HookTaskType
switch w . HookTaskType {
case models . SLACK :
{
ctx . Data [ "SlackHook" ] = w . GetSlackHook ( )
2014-09-03 22:14:55 -04:00
ctx . Data [ "HookType" ] = "Slack"
2014-08-24 08:59:47 -04:00
}
default :
{
2014-09-03 22:14:55 -04:00
ctx . Data [ "HookType" ] = "Gogs"
2014-08-24 08:59:47 -04:00
}
}
2014-07-26 02:28:04 -04:00
w . GetEvent ( )
ctx . Data [ "Webhook" ] = w
2014-09-04 19:05:21 -04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksEdit(getOrgRepoCtx)" , err )
return
2014-09-04 07:17:00 -04:00
}
2014-09-04 19:05:21 -04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 02:28:04 -04:00
}
func WebHooksEditPost ( ctx * middleware . Context , form auth . NewWebhookForm ) {
2014-08-09 15:40:10 -07:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
2014-07-26 02:28:04 -04:00
hookId := com . StrTo ( ctx . Params ( ":id" ) ) . MustInt64 ( )
if hookId == 0 {
ctx . Handle ( 404 , "setting.WebHooksEditPost" , nil )
return
}
w , err := models . GetWebhookById ( hookId )
if err != nil {
if err == models . ErrWebhookNotExist {
ctx . Handle ( 404 , "GetWebhookById" , nil )
} else {
ctx . Handle ( 500 , "GetWebhookById" , err )
}
return
}
2014-08-09 15:40:10 -07:00
w . GetEvent ( )
ctx . Data [ "Webhook" ] = w
2014-07-26 02:28:04 -04:00
2014-09-04 19:05:21 -04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksEditPost(getOrgRepoCtx)" , err )
return
}
2014-07-26 02:28:04 -04:00
if ctx . HasError ( ) {
2014-09-04 19:05:21 -04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 02:28:04 -04:00
return
}
ct := models . JSON
if form . ContentType == "2" {
ct = models . FORM
}
2014-08-09 15:40:10 -07:00
w . Url = form . PayloadUrl
2014-07-26 02:28:04 -04:00
w . ContentType = ct
w . Secret = form . Secret
w . HookEvent = & models . HookEvent {
PushOnly : form . PushOnly ,
}
w . IsActive = form . Active
if err := w . UpdateEvent ( ) ; err != nil {
ctx . Handle ( 500 , "UpdateEvent" , err )
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
ctx . Handle ( 500 , "WebHooksEditPost" , err )
return
}
2014-08-09 15:40:10 -07:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2014-09-04 19:05:21 -04:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , hookId ) )
2014-07-26 02:28:04 -04:00
}
2014-08-24 08:59:47 -04:00
func SlackHooksNewPost ( ctx * middleware . Context , form auth . NewSlackHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksNew" ] = true
ctx . Data [ "Webhook" ] = models . Webhook { HookEvent : & models . HookEvent { } }
2014-09-04 19:05:21 -04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "SlackHooksNewPost(getOrgRepoCtx)" , err )
return
}
2014-08-24 08:59:47 -04:00
if ctx . HasError ( ) {
2014-09-04 19:05:21 -04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-08-24 08:59:47 -04:00
return
}
meta , err := json . Marshal ( & models . Slack {
Channel : form . Channel ,
} )
if err != nil {
ctx . Handle ( 500 , "SlackHooksNewPost: JSON marshal failed: " , err )
return
}
w := & models . Webhook {
2014-09-04 19:05:21 -04:00
RepoId : orCtx . RepoId ,
2014-10-24 08:56:12 -04:00
Url : form . PayloadUrl ,
2014-08-24 08:59:47 -04:00
ContentType : models . JSON ,
Secret : "" ,
HookEvent : & models . HookEvent {
PushOnly : form . PushOnly ,
} ,
IsActive : form . Active ,
HookTaskType : models . SLACK ,
Meta : string ( meta ) ,
2014-09-04 19:05:21 -04:00
OrgId : orCtx . OrgId ,
2014-08-24 08:59:47 -04:00
}
if err := w . UpdateEvent ( ) ; err != nil {
ctx . Handle ( 500 , "UpdateEvent" , err )
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
ctx . Handle ( 500 , "CreateWebhook" , err )
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
2014-09-04 19:05:21 -04:00
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
2014-08-24 08:59:47 -04:00
}
func SlackHooksEditPost ( ctx * middleware . Context , form auth . NewSlackHookForm ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
hookId := com . StrTo ( ctx . Params ( ":id" ) ) . MustInt64 ( )
if hookId == 0 {
2014-09-04 19:05:21 -04:00
ctx . Handle ( 404 , "SlackHooksEditPost(hookId)" , nil )
return
}
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "SlackHooksEditPost(getOrgRepoCtx)" , err )
2014-08-24 08:59:47 -04:00
return
}
w , err := models . GetWebhookById ( hookId )
if err != nil {
if err == models . ErrWebhookNotExist {
ctx . Handle ( 404 , "GetWebhookById" , nil )
} else {
ctx . Handle ( 500 , "GetWebhookById" , err )
}
return
}
w . GetEvent ( )
ctx . Data [ "Webhook" ] = w
if ctx . HasError ( ) {
2014-09-04 19:05:21 -04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-08-24 08:59:47 -04:00
return
}
meta , err := json . Marshal ( & models . Slack {
Channel : form . Channel ,
} )
if err != nil {
ctx . Handle ( 500 , "SlackHooksNewPost: JSON marshal failed: " , err )
return
}
2014-10-24 08:56:12 -04:00
w . Url = form . PayloadUrl
2014-08-24 08:59:47 -04:00
w . Meta = string ( meta )
w . HookEvent = & models . HookEvent {
PushOnly : form . PushOnly ,
}
w . IsActive = form . Active
if err := w . UpdateEvent ( ) ; err != nil {
ctx . Handle ( 500 , "UpdateEvent" , err )
return
} else if err := models . UpdateWebhook ( w ) ; err != nil {
ctx . Handle ( 500 , "SlackHooksEditPost" , err )
return
}
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2014-09-04 19:05:21 -04:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , hookId ) )
2014-09-04 07:17:00 -04:00
}
2014-09-04 19:05:21 -04:00
type OrgRepoCtx struct {
OrgId int64
RepoId int64
Link string
NewTemplate base . TplName
}
2014-09-04 07:17:00 -04:00
2014-09-04 19:05:21 -04:00
// determines whether this is a repo context or organization context
func getOrgRepoCtx ( ctx * middleware . Context ) ( * OrgRepoCtx , error ) {
if _ , ok := ctx . Data [ "RepoLink" ] ; ok {
return & OrgRepoCtx {
OrgId : int64 ( 0 ) ,
RepoId : ctx . Repo . Repository . Id ,
Link : ctx . Repo . RepoLink ,
NewTemplate : HOOK_NEW ,
} , nil
} else if _ , ok := ctx . Data [ "OrgLink" ] ; ok {
return & OrgRepoCtx {
OrgId : ctx . Org . Organization . Id ,
RepoId : int64 ( 0 ) ,
Link : ctx . Org . OrgLink ,
NewTemplate : ORG_HOOK_NEW ,
} , nil
} else {
return & OrgRepoCtx { } , errors . New ( "Unable to set OrgRepo context" )
2014-09-04 07:17:00 -04:00
}
2014-08-24 08:59:47 -04:00
}
2014-10-06 17:50:00 -04:00
func GitHooks ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsGitHooks" ] = true
hooks , err := ctx . Repo . GitRepo . Hooks ( )
if err != nil {
ctx . Handle ( 500 , "Hooks" , err )
return
}
ctx . Data [ "Hooks" ] = hooks
ctx . HTML ( 200 , GITHOOKS )
}
func GitHooksEdit ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsGitHooks" ] = true
name := ctx . Params ( ":name" )
hook , err := ctx . Repo . GitRepo . GetHook ( name )
if err != nil {
if err == git . ErrNotValidHook {
ctx . Handle ( 404 , "GetHook" , err )
} else {
ctx . Handle ( 500 , "GetHook" , err )
}
return
}
ctx . Data [ "Hook" ] = hook
ctx . HTML ( 200 , GITHOOK_EDIT )
}
func GitHooksEditPost ( ctx * middleware . Context ) {
name := ctx . Params ( ":name" )
hook , err := ctx . Repo . GitRepo . GetHook ( name )
if err != nil {
if err == git . ErrNotValidHook {
ctx . Handle ( 404 , "GetHook" , err )
} else {
ctx . Handle ( 500 , "GetHook" , err )
}
return
}
hook . Content = ctx . Query ( "content" )
if err = hook . Update ( ) ; err != nil {
ctx . Handle ( 500 , "hook.Update" , err )
return
}
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/hooks/git" )
}