fix repo setting and delete repo

This commit is contained in:
slene 2014-03-17 14:36:28 +08:00
parent d64a8e8d3a
commit 3a2eee0827
7 changed files with 77 additions and 75 deletions

View File

@ -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

View File

@ -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"`
}

View File

@ -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)

View File

@ -65,7 +65,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
}

View File

@ -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" .}}

View File

@ -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>
<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 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">
<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>
</div>
<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>
<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">&times;</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>

5
web.go
View File

@ -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)