| @@ -446,9 +446,9 @@ func runWeb(ctx *cli.Context) { | |||
| m.Post("/hooks/slack/:id", bindIgnErr(auth.NewSlackHookForm{}), repo.SlackHooksEditPost) | |||
| m.Group("/hooks/git", func() { | |||
| m.Get("", repo.GitHooks) | |||
| m.Get("/:name", repo.GitHooksEdit) | |||
| m.Post("/:name", repo.GitHooksEditPost) | |||
| m.Get("", repo.SettingsGitHooks) | |||
| m.Combo("/:name").Get(repo.SettingsGitHooksEdit). | |||
| Post(repo.SettingsGitHooksEditPost) | |||
| }, middleware.GitHookService()) | |||
| m.Group("/keys", func() { | |||
| @@ -10,6 +10,8 @@ import ( | |||
| "os" | |||
| "path" | |||
| "strings" | |||
| "github.com/Unknwon/com" | |||
| ) | |||
| // hookNames is a list of Git hooks' name that are supported. | |||
| @@ -81,7 +83,10 @@ func (h *Hook) Name() string { | |||
| // Update updates hook settings. | |||
| func (h *Hook) Update() error { | |||
| if len(strings.TrimSpace(h.Content)) == 0 { | |||
| return os.Remove(h.path) | |||
| if com.IsExist(h.path) { | |||
| return os.Remove(h.path) | |||
| } | |||
| return nil | |||
| } | |||
| return ioutil.WriteFile(h.path, []byte(strings.Replace(h.Content, "\r", "", -1)), os.ModePerm) | |||
| } | |||
| @@ -86,8 +86,14 @@ img { | |||
| } | |||
| } | |||
| } | |||
| &.green { | |||
| color: #6cc644!important; | |||
| } | |||
| &.left { | |||
| text-align: left!important; | |||
| } | |||
| &.right { | |||
| text-align: right; | |||
| text-align: right!important; | |||
| } | |||
| &.small { | |||
| font-size: 0.75em; | |||
| @@ -16,6 +16,7 @@ | |||
| } | |||
| } | |||
| } | |||
| .repository { | |||
| &.new.migrate, | |||
| &.new.fork { | |||
| @@ -57,4 +58,25 @@ | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .repository.edit.hook { | |||
| form { | |||
| @input-padding: 25%!important; | |||
| .inline.field > label { | |||
| text-align: right; | |||
| width: @input-padding; | |||
| word-wrap: break-word; | |||
| } | |||
| input, | |||
| textarea { | |||
| width: 50%!important; | |||
| } | |||
| } | |||
| } | |||
| .repository.edit.hook { | |||
| form { | |||
| textarea { | |||
| width: 70%!important; | |||
| } | |||
| } | |||
| } | |||
| @@ -623,6 +623,17 @@ | |||
| color: #666; | |||
| } | |||
| } | |||
| .hook.list { | |||
| .item:not(:first-child) { | |||
| border-top: 1px solid #eaeaea; | |||
| } | |||
| .item { | |||
| padding: 10px 20px; | |||
| i { | |||
| margin-right: 5px; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| .ui.vertical.menu { | |||
| @@ -608,7 +608,7 @@ func TriggerHook(ctx *middleware.Context) { | |||
| models.HookQueue.AddRepoID(repo.ID) | |||
| } | |||
| func GitHooks(ctx *middleware.Context) { | |||
| func SettingsGitHooks(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = ctx.Tr("repo.settings") | |||
| ctx.Data["PageIsSettingsGitHooks"] = true | |||
| @@ -622,7 +622,7 @@ func GitHooks(ctx *middleware.Context) { | |||
| ctx.HTML(200, GITHOOKS) | |||
| } | |||
| func GitHooksEdit(ctx *middleware.Context) { | |||
| func SettingsGitHooksEdit(ctx *middleware.Context) { | |||
| ctx.Data["Title"] = ctx.Tr("repo.settings") | |||
| ctx.Data["PageIsSettingsGitHooks"] = true | |||
| @@ -640,7 +640,7 @@ func GitHooksEdit(ctx *middleware.Context) { | |||
| ctx.HTML(200, GITHOOK_EDIT) | |||
| } | |||
| func GitHooksEditPost(ctx *middleware.Context) { | |||
| func SettingsGitHooksEditPost(ctx *middleware.Context) { | |||
| name := ctx.Params(":name") | |||
| hook, err := ctx.Repo.GitRepo.GetHook(name) | |||
| if err != nil { | |||
| @@ -1,41 +1,37 @@ | |||
| {{template "ng/base/head" .}} | |||
| {{template "ng/base/header" .}} | |||
| <div id="repo-wrapper"> | |||
| {{template "repo/header_old" .}} | |||
| <div id="setting-wrapper" class="main-wrapper"> | |||
| <div id="repo-setting" class="container clear"> | |||
| {{template "repo/settings/nav" .}} | |||
| <div class="grid-4-5 left"> | |||
| <div class="setting-content"> | |||
| {{template "ng/base/alert" .}} | |||
| <div id="setting-content"> | |||
| <div id="repo-hooks-panel" class="panel panel-radius"> | |||
| <div class="panel-header"> | |||
| <strong>{{.i18n.Tr "repo.settings.githooks"}}</strong> | |||
| </div> | |||
| <form class="form form-align panel-body" id="repo-setting-form" action="{{.RepoLink}}/settings/hooks/git/{{.Hook.Name}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| <div class="text-center panel-desc">{{.i18n.Tr "repo.settings.githook_edit_desc"}}</div> | |||
| {{with .Hook}} | |||
| <div class="field"> | |||
| <label>{{$.i18n.Tr "repo.settings.githook_name"}}</label> | |||
| <label class="text-left">{{.Name}}</label> | |||
| </div> | |||
| <div class="field clear"> | |||
| <label class="left" for="content">{{$.i18n.Tr "repo.settings.githook_content"}}</label> | |||
| <textarea class="ipt-textarea ipt-large ipt-radius" id="content" name="content" cols="60" rows="20" wrap="off">{{if .IsActive}}{{.Content}}{{else}}{{.Sample}}{{end}}</textarea> | |||
| </div> | |||
| <div class="field"> | |||
| <span class="form-label"></span> | |||
| <button class="btn btn-green btn-large btn-radius" id="change-reponame-btn" href="#change-reponame-modal">{{$.i18n.Tr "repo.settings.update_githook"}}</button> | |||
| </div> | |||
| {{end}} | |||
| </form> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{template "base/head" .}} | |||
| <div class="repository settings edit hook"> | |||
| {{template "repo/header" .}} | |||
| <div class="ui container"> | |||
| <div class="ui grid"> | |||
| {{template "repo/settings/navbar" .}} | |||
| <div class="twelve wide column content"> | |||
| {{template "base/alert" .}} | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.settings.githooks"}} | |||
| </h4> | |||
| <div class="ui attached segment"> | |||
| <p class="center">{{.i18n.Tr "repo.settings.githook_edit_desc"}}</p> | |||
| <form class="ui form" action="{{.Link}}" method="post"> | |||
| {{.CsrfTokenHtml}} | |||
| {{with .Hook}} | |||
| <div class="inline field"> | |||
| <label>{{$.i18n.Tr "repo.settings.githook_name"}}</label> | |||
| <label class="text left">{{.Name}}</label> | |||
| </div> | |||
| <div class="inline field"> | |||
| <label for="content">{{$.i18n.Tr "repo.settings.githook_content"}}</label> | |||
| <textarea id="content" name="content" rows="20" wrap="off">{{if .IsActive}}{{.Content}}{{else}}{{.Sample}}{{end}}</textarea> | |||
| </div> | |||
| <div class="inline field"> | |||
| <label></label> | |||
| <button class="ui green button" id="change-reponame-btn" href="#change-reponame-modal">{{$.i18n.Tr "repo.settings.update_githook"}}</button> | |||
| </div> | |||
| {{end}} | |||
| </form> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{template "ng/base/footer" .}} | |||
| {{template "base/footer" .}} | |||
| @@ -1,37 +1,34 @@ | |||
| {{template "ng/base/head" .}} | |||
| {{template "ng/base/header" .}} | |||
| <div id="repo-wrapper"> | |||
| {{template "repo/header_old" .}} | |||
| <div id="setting-wrapper" class="main-wrapper"> | |||
| <div id="repo-setting" class="container clear"> | |||
| {{template "repo/settings/nav" .}} | |||
| <div class="grid-4-5 left"> | |||
| <div class="setting-content"> | |||
| {{template "ng/base/alert" .}} | |||
| <div id="setting-content"> | |||
| <div id="repo-hooks-panel" class="panel panel-radius"> | |||
| <div class="panel-header"> | |||
| <strong>{{.i18n.Tr "repo.settings.githooks"}}</strong> | |||
| </div> | |||
| <ul class="panel-body setting-list"> | |||
| <li>{{.i18n.Tr "repo.settings.githooks_desc" | Str2html}}</li> | |||
| {{range .Hooks}} | |||
| <li> | |||
| {{if .IsActive}} | |||
| <span class="left text-success"><i class="octicon octicon-check"></i></span> | |||
| {{else}} | |||
| <span class="left text-grey"><i class="octicon octicon-primitive-dot"></i></span> | |||
| {{end}} | |||
| <span>{{.Name}}</span> | |||
| <a href="{{$.RepoLink}}/settings/hooks/git/{{.Name}}" class="text-blue right"><i class="fa fa-pencil"></i></a> | |||
| </li> | |||
| {{end}} | |||
| </ul> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{template "base/head" .}} | |||
| <div class="repository settings hooks"> | |||
| {{template "repo/header" .}} | |||
| <div class="ui container"> | |||
| <div class="ui grid"> | |||
| {{template "repo/settings/navbar" .}} | |||
| <div class="twelve wide column content"> | |||
| {{template "base/alert" .}} | |||
| <h4 class="ui top attached header"> | |||
| {{.i18n.Tr "repo.settings.githooks"}} | |||
| </h4> | |||
| <div class="ui attached table segment"> | |||
| <div class="ui hook list"> | |||
| <div class="item"> | |||
| {{.i18n.Tr "repo.settings.githooks_desc" | Str2html}} | |||
| </div> | |||
| {{range .Hooks}} | |||
| <div class="item"> | |||
| {{if .IsActive}} | |||
| <span class="text success"><i class="octicon octicon-check"></i></span> | |||
| {{else}} | |||
| <span class="text grey"><i class="octicon octicon-primitive-dot"></i></span> | |||
| {{end}} | |||
| <span>{{.Name}}</span> | |||
| <a href="{{$.RepoLink}}/settings/hooks/git/{{.Name}}" class="text blue ui right"><i class="fa fa-pencil"></i></a> | |||
| </div> | |||
| {{end}} | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| {{template "ng/base/footer" .}} | |||
| {{template "base/footer" .}} | |||