| @@ -307,6 +307,9 @@ func DeleteRepository(userId, repoId int64, userName string) (err error) { | |||
| } | |||
| session := orm.NewSession() | |||
| if err = session.Begin(); err != nil { | |||
| return err | |||
| } | |||
| if _, err = session.Delete(&Repository{Id: repoId}); err != nil { | |||
| session.Rollback() | |||
| return err | |||
| @@ -17,7 +17,6 @@ import ( | |||
| ) | |||
| type CreateRepoForm struct { | |||
| UserId int64 `form:"userId"` | |||
| RepoName string `form:"repo" binding:"Required;AlphaDash"` | |||
| Visibility string `form:"visibility"` | |||
| Description string `form:"desc" binding:"MaxSize(100)"` | |||
| @@ -52,9 +51,3 @@ func (f *CreateRepoForm) Validate(errors *binding.Errors, req *http.Request, con | |||
| validate(errors, data, f) | |||
| } | |||
| type DeleteRepoForm struct { | |||
| UserId int64 `form:"userId" binding:"Required"` | |||
| UserName string `form:"userName" binding:"Required"` | |||
| RepoId int64 `form:"repoId" binding:"Required"` | |||
| } | |||
| @@ -51,7 +51,6 @@ html, body { | |||
| .gogs-masthead { | |||
| background-color: #428bca; | |||
| box-shadow: inset 0 -2px 5px rgba(0, 0, 0, .1); | |||
| padding: 0 16px; | |||
| margin: 0; | |||
| } | |||
| @@ -133,6 +132,11 @@ html, body { | |||
| padding: 5px 0; | |||
| margin-left: 10px; | |||
| height: 28px; | |||
| float: right; | |||
| } | |||
| #gogs-nav-signin{ | |||
| float: right; | |||
| } | |||
| #gogs-nav-out .fa { | |||
| @@ -349,10 +353,6 @@ html, body { | |||
| /* #gogs-feed */ | |||
| #gogs-feed-left { | |||
| padding-left: 0; | |||
| } | |||
| #gogs-feed-right .repo-panel .panel-heading .btn { | |||
| margin-top: -4px; | |||
| } | |||
| @@ -635,7 +635,7 @@ html, body { | |||
| } | |||
| #footer .footer-wrap { | |||
| padding: 20px 0; | |||
| padding: 20px 15px; | |||
| } | |||
| #footer a { | |||
| @@ -43,7 +43,15 @@ var Gogits = { | |||
| Gogits.initTabs = function () { | |||
| var $tabs = $('[data-init=tabs]'); | |||
| $tabs.find("li:eq(0) a").tab("show"); | |||
| }; | |||
| // render markdown | |||
| Gogits.renderMarkdown = function () { | |||
| var $pre = $('.markdown').find('pre > code').parent(); | |||
| $pre.addClass("prettyprint"); | |||
| prettyPrint(); | |||
| } | |||
| })(jQuery); | |||
| // ajax utils | |||
| @@ -70,6 +78,7 @@ function initCore() { | |||
| Gogits.initTooltips(); | |||
| Gogits.initTabs(); | |||
| Gogits.initModals(); | |||
| Gogits.renderMarkdown(); | |||
| } | |||
| function initRegister() { | |||
| @@ -98,14 +107,14 @@ function initRegister() { | |||
| }); | |||
| } | |||
| function initUserSetting(){ | |||
| function initUserSetting() { | |||
| $('#gogs-ssh-keys .delete').confirmation({ | |||
| singleton: true, | |||
| onConfirm: function(e, $this){ | |||
| Gogits.ajaxDelete("",{"id":$this.data("del")},function(json){ | |||
| if(json.ok){ | |||
| onConfirm: function (e, $this) { | |||
| Gogits.ajaxDelete("", {"id": $this.data("del")}, function (json) { | |||
| if (json.ok) { | |||
| window.location.reload(); | |||
| }else{ | |||
| } else { | |||
| alert(json.err); | |||
| } | |||
| }); | |||
| @@ -113,11 +122,15 @@ function initUserSetting(){ | |||
| }); | |||
| } | |||
| ;(function($){ | |||
| // on Dom Ready | |||
| $(function(){ | |||
| var $pre = $('.markdown').find('pre > code').parent(); | |||
| $pre.addClass("prettyprint"); | |||
| prettyPrint(); | |||
| (function ($) { | |||
| $(function () { | |||
| initCore(); | |||
| var body = $("#gogs-body"); | |||
| if (body.data("page") == "user-signup") { | |||
| initRegister(); | |||
| } | |||
| if (body.data("page") == "user") { | |||
| initUserSetting(); | |||
| } | |||
| }); | |||
| })(jQuery); | |||
| @@ -20,49 +20,35 @@ func Create(ctx *middleware.Context, form auth.CreateRepoForm) { | |||
| return | |||
| } | |||
| if ctx.HasError() { | |||
| ctx.Render.HTML(200, "repo/create", ctx.Data) | |||
| if _, err := models.CreateRepository(ctx.User, | |||
| form.RepoName, form.Description, form.Language, form.License, | |||
| form.Visibility == "private", form.InitReadme == "on"); err == nil { | |||
| ctx.Render.Redirect("/"+ctx.User.Name+"/"+form.RepoName, 302) | |||
| return | |||
| } | |||
| // TODO: access check | |||
| user, err := models.GetUserById(form.UserId) | |||
| if err != nil { | |||
| if err.Error() == models.ErrUserNotExist.Error() { | |||
| ctx.RenderWithErr("User does not exist", "repo/create", &form) | |||
| return | |||
| } | |||
| } | |||
| if err == nil { | |||
| if _, err = models.CreateRepository(user, | |||
| form.RepoName, form.Description, form.Language, form.License, | |||
| form.Visibility == "private", form.InitReadme == "on"); err == nil { | |||
| ctx.Render.Redirect("/"+user.Name+"/"+form.RepoName, 302) | |||
| return | |||
| } | |||
| } | |||
| if err.Error() == models.ErrRepoAlreadyExist.Error() { | |||
| } else if err == models.ErrRepoAlreadyExist { | |||
| ctx.RenderWithErr("Repository name has already been used", "repo/create", &form) | |||
| return | |||
| } | |||
| ctx.Handle(200, "repo.Create", err) | |||
| } | |||
| func Delete(ctx *middleware.Context, form auth.DeleteRepoForm) { | |||
| ctx.Data["Title"] = "Delete repository" | |||
| if ctx.Req.Method == "GET" { | |||
| ctx.Render.HTML(200, "repo/delete", ctx.Data) | |||
| func SettingPost(ctx *middleware.Context) { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Render.Error(404) | |||
| return | |||
| } | |||
| if err := models.DeleteRepository(form.UserId, form.RepoId, form.UserName); err != nil { | |||
| ctx.Handle(200, "repo.Delete", err) | |||
| return | |||
| switch ctx.Query("action") { | |||
| case "delete": | |||
| if len(ctx.Repo.Repository.Name) == 0 || ctx.Repo.Repository.Name != ctx.Query("repository") { | |||
| ctx.Data["ErrorMsg"] = "Please make sure you entered repository name is correct." | |||
| ctx.Render.HTML(200, "repo/setting", ctx.Data) | |||
| return | |||
| } | |||
| if err := models.DeleteRepository(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.LowerName); err != nil { | |||
| ctx.Handle(200, "repo.Delete", err) | |||
| return | |||
| } | |||
| } | |||
| ctx.Render.Redirect("/", 302) | |||
| @@ -78,7 +78,8 @@ func Single(ctx *middleware.Context, params martini.Params) { | |||
| } | |||
| func Setting(ctx *middleware.Context, params martini.Params) { | |||
| if !ctx.Repo.IsValid { | |||
| if !ctx.Repo.IsOwner { | |||
| ctx.Render.Error(404) | |||
| return | |||
| } | |||
| @@ -1,19 +1,12 @@ | |||
| <script> | |||
| $(function(){ | |||
| initCore();{{if .PageIsSignUp}} | |||
| initRegister();{{end}}{{if .PageIsUserSetting}} | |||
| initUserSetting();{{end}} | |||
| }); | |||
| </script> | |||
| <div class="wrapper-push"></div> | |||
| <div class="wrapper-push"></div> | |||
| </div> | |||
| <footer id="footer"> | |||
| <div class="container footer-wrap"> | |||
| <p> | |||
| © 2014 Gogs · ver {{AppVer}} · <i class="fa fa-github"></i><a target="_blank" href="https://github.com/gogits/gogs">GitHub</a> | |||
| </p> | |||
| <p class="desc"></p> | |||
| </div> | |||
| <div class="container footer-wrap"> | |||
| <p>© 2014 Gogs · ver {{AppVer}} · | |||
| <i class="fa fa-github"></i><a target="_blank" href="https://github.com/gogits/gogs">GitHub</a> | |||
| </p> | |||
| <p class="desc"></p> | |||
| </div> | |||
| </footer> | |||
| </body> | |||
| </html> | |||
| @@ -1,12 +0,0 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div class="container"> | |||
| <form action="/repo/delete" method="post" class="form-horizontal"> | |||
| <div class="form-group"> | |||
| <div class="col-md-offset-4 col-md-3"> | |||
| <button type="submit" class="btn btn-danger">Delete repository</button> | |||
| </div> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| {{template "base/footer" .}} | |||
| @@ -4,30 +4,60 @@ | |||
| {{template "repo/toolbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Repository Settings</h4> | |||
| <ul class="list-group" data-init="tabs"> | |||
| <li class="list-group-item"><a href="#options" data-toggle="tab">Options</a></li> | |||
| <!--<li class="list-group-item" data-toggle="tab"><a href="#">Collaborators</a></li> | |||
| <li class="list-group-item" data-toggle="tab"><a href="#">Notifications</a></li>--> | |||
| <li class="list-group-item"><a href="#delete" data-toggle="tab">Delete</a></li> | |||
| <li class="list-group-item active"><a href="/{{.Owner.Name}}/{{.Repository.Name}}/settings">Options</a></li> | |||
| <!--<li class="list-group-item"><a href="#">Collaborators</a></li> | |||
| <li class="list-group-item"><a href="#">Notifications</a></li>--> | |||
| </ul> | |||
| </div> | |||
| <div id="gogs-repo-setting-container" class="col-md-9 tab-content"> | |||
| <div id="options" class="tab-pane"> | |||
| <h4>Repository Options</h4> | |||
| <div id="gogs-repo-setting-container" class="col-md-9"> | |||
| {{if .ErrorMsg}}<p class="alert alert-danger">{{.ErrorMsg}}</p>{{end}} | |||
| <div class="panel panel-default"> | |||
| <div class="panel-heading"> | |||
| Repository Options | |||
| </div> | |||
| <div class="panel-body"> | |||
| </div> | |||
| </div> | |||
| <div id="delete" class="tab-pane"> | |||
| <h4>Delete Repository</h4> | |||
| <p class="alert alert-warning">Unexpected bad things will happen if you don't read this!</p> | |||
| <p>This action <strong>CANNOT</strong> be undone. This will delete the repository, wiki, issues, and comments permanently. </p> | |||
| <div class="panel panel-warning"> | |||
| <div class="panel-heading"> | |||
| Danger Zone | |||
| </div> | |||
| <div class="panel-body"> | |||
| <button type="button" class="btn btn-default pull-right" href="#delete-repository-modal" data-toggle="modal"> | |||
| Delete this repository | |||
| </button> | |||
| <dd> | |||
| <dt>Delete this repository.</dt> | |||
| <dl>Once you delete a repository, there is no going back. Please be certain.</dl> | |||
| </dd> | |||
| <form action="/repo/delete" method="post"> | |||
| <input type="hidden" name="userId" value="{{.Owner.Id}}"/> | |||
| <input type="hidden" name="userName" value="{{.Owner.Name}}"/> | |||
| <input type="hidden" name="repoId" value="{{.Repository.Id}}"/> | |||
| <hr/> | |||
| <button class="btn btn-danger btn-lg">I understand the consequences, delete this repository</button> | |||
| </form> | |||
| <div class="modal fade" id="delete-repository-modal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | |||
| <div class="modal-dialog"> | |||
| <form action="/{{.Owner.Name}}/{{.Repository.Name}}/settings" method="post" class="modal-content"> | |||
| <input type="hidden" name="action" value="delete"> | |||
| <div class="modal-header"> | |||
| <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> | |||
| <h4 class="modal-title" id="myModalLabel">Delete repository</h4> | |||
| </div> | |||
| <div class="modal-body"> | |||
| <div class="form-group"> | |||
| <label>Please enter your repository name "<strong class="text-danger">{{.Repository.Name}}</strong>"</label> | |||
| <input name="repository" class="form-control" type="text" placeholder="Type your repository name" required="required"> | |||
| </div> | |||
| </div> | |||
| <div class="modal-footer"> | |||
| <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> | |||
| <button class="btn btn-danger btn-lg">I understand the consequences, delete this repository</button> | |||
| </div> | |||
| </form> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| @@ -11,7 +11,7 @@ | |||
| <h3>News Feed</h3> | |||
| </div> | |||
| </div> | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| {{if .HasInfo}}<div class="alert alert-info">{{.InfoMsg}}</div>{{end}} | |||
| <div id="gogs-feed-left" class="col-md-8"> | |||
| <ul class="list-unstyled activity-list"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Account Setting</h4> | |||
| <ul class="list-group"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Account Setting</h4> | |||
| <ul class="list-group"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Account Setting</h4> | |||
| <ul class="list-group"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-profile" class="col-md-3"> | |||
| <div class="profile-avatar text-center"> | |||
| <a href="{{.Owner.HomeLink}}" class="center-block" data-toggle="tooltip" data-placement="bottom" title="Change Avatar"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Account Setting</h4> | |||
| <ul class="list-group"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Account Setting</h4> | |||
| <ul class="list-group"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div id="gogs-body" class="container"> | |||
| <div id="gogs-body" class="container" data-page="user"> | |||
| <div id="gogs-user-setting-nav" class="col-md-3"> | |||
| <h4>Account Setting</h4> | |||
| <ul class="list-group"> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div class="container" id="gogs-body"> | |||
| <div class="container" id="gogs-body" data-page="user-signin"> | |||
| <form action="/user/login" method="post" class="form-horizontal gogs-card" id="gogs-login-card"> | |||
| <h3>Log in</h3> | |||
| <div class="alert alert-danger form-error{{if .HasError}}{{else}} hidden{{end}}">{{.ErrorMsg}}</div> | |||
| @@ -1,6 +1,6 @@ | |||
| {{template "base/head" .}} | |||
| {{template "base/navbar" .}} | |||
| <div class="container" id="gogs-body"> | |||
| <div class="container" id="gogs-body" data-page="user-signup"> | |||
| <form action="/user/sign_up" method="post" class="form-horizontal gogs-card" id="gogs-login-card"> | |||
| <h3>Sign Up</h3> | |||
| <div class="alert alert-danger form-error{{if .HasError}}{{else}} hidden{{end}}">{{.ErrorMsg}}</div> | |||
| @@ -68,11 +68,12 @@ func runWeb(*cli.Context) { | |||
| m.Get("/user/:username", middleware.SignInRequire(false), user.Profile) | |||
| m.Any("/repo/create", middleware.SignInRequire(true), binding.BindIgnErr(auth.CreateRepoForm{}), repo.Create) | |||
| m.Any("/repo/delete", middleware.SignInRequire(true), binding.Bind(auth.DeleteRepoForm{}), repo.Delete) | |||
| m.Get("/help", routers.Help) | |||
| m.Get("/:username/:reponame/settings", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Setting) | |||
| m.Post("/:username/:reponame/settings", middleware.SignInRequire(true), middleware.RepoAssignment(true), repo.SettingPost) | |||
| m.Get("/:username/:reponame/settings", middleware.SignInRequire(true), middleware.RepoAssignment(true), repo.Setting) | |||
| m.Get("/:username/:reponame/commits", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Commits) | |||
| m.Get("/:username/:reponame/issues", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Issues) | |||
| m.Get("/:username/:reponame/pulls", middleware.SignInRequire(false), middleware.RepoAssignment(true), repo.Pulls) | |||