2014-05-01 13:44:22 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
2014-07-26 10:28:04 +04:00
import (
2014-08-24 16:59:47 +04:00
"encoding/json"
2014-09-04 15:17:00 +04:00
"errors"
2014-07-26 10: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-07 01:50:00 +04:00
"github.com/gogits/gogs/modules/git"
2014-07-26 10: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 21:47:33 +04:00
SETTINGS_OPTIONS base . TplName = "repo/settings/options"
2014-08-07 14:40:05 +04:00
COLLABORATION base . TplName = "repo/settings/collaboration"
2014-08-09 21:29:51 +04:00
HOOKS base . TplName = "repo/settings/hooks"
2014-10-07 01:50:00 +04:00
GITHOOKS base . TplName = "repo/settings/githooks"
GITHOOK_EDIT base . TplName = "repo/settings/githook_edit"
2014-08-10 02:40:10 +04:00
HOOK_NEW base . TplName = "repo/settings/hook_new"
2014-09-04 15:17:00 +04:00
ORG_HOOK_NEW base . TplName = "org/settings/hook_new"
2014-07-26 10:28:04 +04:00
)
2014-08-02 21: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 10:28:04 +04:00
}
2014-08-02 21: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 10:28:04 +04:00
switch ctx . Query ( "action" ) {
case "update" :
if ctx . HasError ( ) {
2014-08-02 21:47:33 +04:00
ctx . HTML ( 200 , SETTINGS_OPTIONS )
2014-07-26 10:28:04 +04:00
return
}
newRepoName := form . RepoName
// Check if repository name has been changed.
if ctx . Repo . Repository . Name != newRepoName {
isExist , err := models . IsRepositoryExist ( ctx . Repo . Owner , newRepoName )
if err != nil {
2014-08-02 21:47:33 +04:00
ctx . Handle ( 500 , "IsRepositoryExist" , err )
2014-07-26 10:28:04 +04:00
return
} else if isExist {
2014-08-02 21:47:33 +04:00
ctx . Data [ "Err_RepoName" ] = true
ctx . RenderWithErr ( ctx . Tr ( "form.repo_name_been_taken" ) , SETTINGS_OPTIONS , nil )
2014-07-26 10:28:04 +04:00
return
} else if err = models . ChangeRepositoryName ( ctx . Repo . Owner . Name , ctx . Repo . Repository . Name , newRepoName ) ; err != nil {
2014-08-24 17:09:05 +04: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 10:28:04 +04:00
return
}
2014-08-02 21:47:33 +04:00
log . Trace ( "Repository name changed: %s/%s -> %s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name , newRepoName )
2014-07-26 10:28:04 +04:00
ctx . Repo . Repository . Name = newRepoName
}
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
ctx . Repo . Repository . IsPrivate = form . Private
ctx . Repo . Repository . IsGoget = form . GoGet
if err := models . UpdateRepository ( ctx . Repo . Repository ) ; err != nil {
ctx . Handle ( 404 , "UpdateRepository" , err )
return
}
2014-08-02 21:47:33 +04:00
log . Trace ( "Repository updated: %s/%s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name )
2014-07-26 10: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 21:47:33 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_settings_success" ) )
2014-09-20 04: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 10:28:04 +04:00
case "transfer" :
2014-08-02 21: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 10:28:04 +04:00
return
}
2014-08-02 21:47:33 +04:00
newOwner := ctx . Query ( "new_owner_name" )
2014-07-26 10:28:04 +04:00
isExist , err := models . IsUserExist ( newOwner )
if err != nil {
2014-08-02 21:47:33 +04:00
ctx . Handle ( 500 , "IsUserExist" , err )
2014-07-26 10:28:04 +04:00
return
} else if ! isExist {
2014-08-02 21:47:33 +04:00
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_owner_name" ) , SETTINGS_OPTIONS , nil )
2014-07-26 10:28:04 +04:00
return
2014-09-30 02:52:28 +04:00
} else if ! ctx . User . ValidtePassword ( ctx . Query ( "password" ) ) {
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_password" ) , SETTINGS_OPTIONS , nil )
return
2014-09-26 06:36:07 +04:00
} else if err = models . TransferOwnership ( ctx . User , newOwner , ctx . Repo . Repository ) ; err != nil {
2014-09-13 02: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 10:28:04 +04:00
return
}
2014-08-02 21:47:33 +04:00
log . Trace ( "Repository transfered: %s/%s -> %s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name , newOwner )
2014-09-17 22:52:46 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.transfer_succeed" ) )
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/" )
2014-07-26 10:28:04 +04:00
case "delete" :
2014-08-02 21: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 10:28:04 +04:00
return
2014-08-27 12:39:36 +04:00
}
if ctx . Repo . Owner . IsOrganization ( ) {
if ! ctx . Repo . Owner . IsOrgOwner ( ctx . User . Id ) {
ctx . Error ( 404 )
return
}
if ! ctx . User . ValidtePassword ( ctx . Query ( "password" ) ) {
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_password" ) , SETTINGS_OPTIONS , nil )
return
}
} else {
if ! ctx . Repo . Owner . ValidtePassword ( ctx . Query ( "password" ) ) {
ctx . RenderWithErr ( ctx . Tr ( "form.enterred_invalid_password" ) , SETTINGS_OPTIONS , nil )
return
}
2014-07-26 10: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 21:47:33 +04:00
ctx . Handle ( 500 , "DeleteRepository" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-08-02 21:47:33 +04:00
log . Trace ( "Repository deleted: %s/%s" , ctx . Repo . Owner . Name , ctx . Repo . Repository . Name )
2014-07-26 10:28:04 +04:00
if ctx . Repo . Owner . IsOrganization ( ) {
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/org/" + ctx . Repo . Owner . Name + "/dashboard" )
2014-07-26 10:28:04 +04:00
} else {
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + "/" )
2014-07-26 10:28:04 +04:00
}
}
}
2014-08-07 14:40:05 +04:00
func SettingsCollaboration ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsCollaboration" ] = true
2014-07-26 10:28:04 +04:00
repoLink := strings . TrimPrefix ( ctx . Repo . RepoLink , "/" )
2014-08-07 14:40:05 +04:00
if ctx . Req . Method == "POST" {
name := strings . ToLower ( ctx . Query ( "collaborator" ) )
if len ( name ) == 0 || ctx . Repo . Owner . LowerName == name {
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14:40:05 +04:00
return
}
has , err := models . HasAccess ( name , repoLink , models . WRITABLE )
if err != nil {
ctx . Handle ( 500 , "HasAccess" , err )
return
} else if has {
2014-09-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14: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-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14:40:05 +04:00
} else {
ctx . Handle ( 500 , "GetUserByName" , err )
}
return
}
2014-10-10 14: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
}
2014-08-07 14:40:05 +04:00
if err = models . AddAccess ( & models . Access { UserName : name , RepoName : repoLink ,
Mode : models . WRITABLE } ) ; err != nil {
2014-10-10 14:15:27 +04:00
ctx . Handle ( 500 , "AddAccess" , err )
2014-08-07 14: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-20 04:11:34 +04:00
ctx . Redirect ( setting . AppSubUrl + ctx . Req . URL . Path )
2014-08-07 14:40:05 +04:00
return
}
2014-07-26 10:28:04 +04:00
// Delete collaborator.
remove := strings . ToLower ( ctx . Query ( "remove" ) )
if len ( remove ) > 0 && remove != ctx . Repo . Owner . LowerName {
2014-08-24 17:09:05 +04:00
needDelete := true
if ctx . User . IsOrganization ( ) {
// Check if user belongs to a team that has access to this repository.
2014-09-13 05:36:26 +04:00
auth , err := models . GetHighestAuthorize ( ctx . Repo . Owner . Id , ctx . User . Id , ctx . Repo . Repository . Id , 0 )
2014-08-24 17:09:05 +04:00
if err != nil {
ctx . Handle ( 500 , "GetHighestAuthorize" , err )
return
}
if auth > 0 {
needDelete = false
}
}
if needDelete {
if err := models . DeleteAccess ( & models . Access { UserName : remove , RepoName : repoLink } ) ; err != nil {
ctx . Handle ( 500 , "DeleteAccess" , err )
return
}
2014-07-26 10:28:04 +04:00
}
2014-08-07 14:40:05 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.remove_collaborator_success" ) )
2014-07-26 10:28:04 +04:00
ctx . Redirect ( ctx . Repo . RepoLink + "/settings/collaboration" )
return
}
names , err := models . GetCollaboratorNames ( repoLink )
if err != nil {
2014-08-07 14:40:05 +04:00
ctx . Handle ( 500 , "GetCollaborators" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-10-10 14:15:27 +04:00
collaborators := make ( [ ] * models . User , 0 , len ( names ) )
for _ , name := range names {
u , err := models . GetUserByName ( name )
2014-07-26 10:28:04 +04:00
if err != nil {
2014-08-07 14:40:05 +04:00
ctx . Handle ( 500 , "GetUserByName" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-10-10 14:15:27 +04:00
// Does not show organization members.
if ctx . Repo . Owner . IsOrganization ( ) && ctx . Repo . Owner . IsOrgMember ( u . Id ) {
continue
}
collaborators = append ( collaborators , u )
2014-07-26 10:28:04 +04:00
}
2014-10-10 14:15:27 +04:00
ctx . Data [ "Collaborators" ] = collaborators
2014-07-26 10:28:04 +04:00
ctx . HTML ( 200 , COLLABORATION )
}
2014-08-09 21:29:51 +04:00
func Webhooks ( ctx * middleware . Context ) {
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
2014-07-26 10:28:04 +04:00
2014-08-09 21:29:51 +04:00
// Delete web hook.
2014-07-26 10:28:04 +04:00
remove := com . StrTo ( ctx . Query ( "remove" ) ) . MustInt64 ( )
if remove > 0 {
if err := models . DeleteWebhook ( remove ) ; err != nil {
2014-08-09 21:29:51 +04:00
ctx . Handle ( 500 , "DeleteWebhook" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-08-09 21:29:51 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.remove_hook_success" ) )
2014-07-26 10: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 21:29:51 +04:00
ctx . Handle ( 500 , "GetWebhooksByRepoId" , err )
2014-07-26 10:28:04 +04:00
return
}
ctx . Data [ "Webhooks" ] = ws
ctx . HTML ( 200 , HOOKS )
}
2014-08-24 16:59:47 +04:00
func renderHookTypes ( ctx * middleware . Context ) {
ctx . Data [ "HookTypes" ] = [ ] string { "Gogs" , "Slack" }
ctx . Data [ "HookType" ] = "Gogs"
}
2014-08-10 02:40:10 +04: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 16:59:47 +04:00
renderHookTypes ( ctx )
2014-09-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksNew(getOrgRepoCtx)" , err )
return
2014-09-04 15:17:00 +04:00
}
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
}
2014-08-10 02:40:10 +04: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 10:28:04 +04:00
2014-09-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksNewPost(getOrgRepoCtx)" , err )
return
}
2014-09-04 15:17:00 +04:00
2014-07-26 10:28:04 +04:00
if ctx . HasError ( ) {
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
return
}
2014-11-13 20:57:00 +03:00
// FIXME: code too old here, sync with APIs
2014-07-26 10:28:04 +04:00
ct := models . JSON
if form . ContentType == "2" {
ct = models . FORM
}
w := & models . Webhook {
2014-09-05 03:05:21 +04:00
RepoId : orCtx . RepoId ,
2014-08-10 02:40:10 +04:00
Url : form . PayloadUrl ,
2014-07-26 10:28:04 +04:00
ContentType : ct ,
Secret : form . Secret ,
HookEvent : & models . HookEvent {
PushOnly : form . PushOnly ,
} ,
2014-08-24 16:59:47 +04:00
IsActive : form . Active ,
HookTaskType : models . GOGS ,
Meta : "" ,
2014-09-05 03:05:21 +04:00
OrgId : orCtx . OrgId ,
2014-07-26 10:28:04 +04:00
}
2014-08-24 16:59:47 +04:00
2014-07-26 10:28:04 +04:00
if err := w . UpdateEvent ( ) ; err != nil {
2014-08-10 02:40:10 +04:00
ctx . Handle ( 500 , "UpdateEvent" , err )
2014-07-26 10:28:04 +04:00
return
} else if err := models . CreateWebhook ( w ) ; err != nil {
2014-08-10 02:40:10 +04:00
ctx . Handle ( 500 , "CreateWebhook" , err )
2014-07-26 10:28:04 +04:00
return
}
2014-08-10 02:40:10 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.add_hook_success" ) )
2014-09-05 03:05:21 +04:00
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
2014-07-26 10:28:04 +04:00
}
func WebHooksEdit ( ctx * middleware . Context ) {
2014-08-10 02:40:10 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
2014-07-26 10: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-10 02:40:10 +04:00
ctx . Handle ( 404 , "GetWebhookById" , nil )
2014-07-26 10:28:04 +04:00
} else {
2014-08-10 02:40:10 +04:00
ctx . Handle ( 500 , "GetWebhookById" , err )
2014-07-26 10:28:04 +04:00
}
return
}
2014-08-24 16:59:47 +04:00
// set data per HookTaskType
switch w . HookTaskType {
case models . SLACK :
{
ctx . Data [ "SlackHook" ] = w . GetSlackHook ( )
2014-09-04 06:14:55 +04:00
ctx . Data [ "HookType" ] = "Slack"
2014-08-24 16:59:47 +04:00
}
default :
{
2014-09-04 06:14:55 +04:00
ctx . Data [ "HookType" ] = "Gogs"
2014-08-24 16:59:47 +04:00
}
}
2014-07-26 10:28:04 +04:00
w . GetEvent ( )
ctx . Data [ "Webhook" ] = w
2014-09-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksEdit(getOrgRepoCtx)" , err )
return
2014-09-04 15:17:00 +04:00
}
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
}
func WebHooksEditPost ( ctx * middleware . Context , form auth . NewWebhookForm ) {
2014-08-10 02:40:10 +04:00
ctx . Data [ "Title" ] = ctx . Tr ( "repo.settings" )
ctx . Data [ "PageIsSettingsHooks" ] = true
ctx . Data [ "PageIsSettingsHooksEdit" ] = true
2014-07-26 10: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-10 02:40:10 +04:00
w . GetEvent ( )
ctx . Data [ "Webhook" ] = w
2014-07-26 10:28:04 +04:00
2014-09-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "WebHooksEditPost(getOrgRepoCtx)" , err )
return
}
2014-07-26 10:28:04 +04:00
if ctx . HasError ( ) {
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-07-26 10:28:04 +04:00
return
}
ct := models . JSON
if form . ContentType == "2" {
ct = models . FORM
}
2014-08-10 02:40:10 +04:00
w . Url = form . PayloadUrl
2014-07-26 10: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-10 02:40:10 +04:00
ctx . Flash . Success ( ctx . Tr ( "repo.settings.update_hook_success" ) )
2014-09-05 03:05:21 +04:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , hookId ) )
2014-07-26 10:28:04 +04:00
}
2014-08-24 16: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-05 03:05:21 +04:00
orCtx , err := getOrgRepoCtx ( ctx )
if err != nil {
ctx . Handle ( 500 , "SlackHooksNewPost(getOrgRepoCtx)" , err )
return
}
2014-08-24 16:59:47 +04:00
if ctx . HasError ( ) {
2014-09-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-08-24 16: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-05 03:05:21 +04:00
RepoId : orCtx . RepoId ,
2014-10-24 16:56:12 +04:00
Url : form . PayloadUrl ,
2014-08-24 16: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-05 03:05:21 +04:00
OrgId : orCtx . OrgId ,
2014-08-24 16: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-05 03:05:21 +04:00
ctx . Redirect ( orCtx . Link + "/settings/hooks" )
2014-08-24 16: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-05 03: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 16: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-05 03:05:21 +04:00
ctx . HTML ( 200 , orCtx . NewTemplate )
2014-08-24 16: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 16:56:12 +04:00
w . Url = form . PayloadUrl
2014-08-24 16: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-05 03:05:21 +04:00
ctx . Redirect ( fmt . Sprintf ( "%s/settings/hooks/%d" , orCtx . Link , hookId ) )
2014-09-04 15:17:00 +04:00
}
2014-09-05 03:05:21 +04:00
type OrgRepoCtx struct {
OrgId int64
RepoId int64
Link string
NewTemplate base . TplName
}
2014-09-04 15:17:00 +04:00
2014-09-05 03: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 15:17:00 +04:00
}
2014-08-24 16:59:47 +04:00
}
2014-10-07 01: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" )
}