mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-25 05:22:44 +01:00
Web editor: improve delete file
This commit is contained in:
parent
cd89f6c502
commit
54e0ada9d5
8 changed files with 89 additions and 101 deletions
11
cmd/web.go
11
cmd/web.go
|
@ -503,14 +503,19 @@ func runWeb(ctx *cli.Context) error {
|
||||||
Post(bindIgnErr(auth.EditRepoFileForm{}), repo.EditFilePost)
|
Post(bindIgnErr(auth.EditRepoFileForm{}), repo.EditFilePost)
|
||||||
m.Combo("/_new/*").Get(repo.NewFile).
|
m.Combo("/_new/*").Get(repo.NewFile).
|
||||||
Post(bindIgnErr(auth.EditRepoFileForm{}), repo.NewFilePost)
|
Post(bindIgnErr(auth.EditRepoFileForm{}), repo.NewFilePost)
|
||||||
m.Post("/preview/*", bindIgnErr(auth.EditPreviewDiffForm{}), repo.DiffPreviewPost)
|
m.Post("/_preview/*", bindIgnErr(auth.EditPreviewDiffForm{}), repo.DiffPreviewPost)
|
||||||
m.Combo("/upload/*").Get(repo.UploadFile).
|
m.Combo("/upload/*").Get(repo.UploadFile).
|
||||||
Post(bindIgnErr(auth.UploadRepoFileForm{}), repo.UploadFilePost)
|
Post(bindIgnErr(auth.UploadRepoFileForm{}), repo.UploadFilePost)
|
||||||
m.Post("/delete/*", bindIgnErr(auth.DeleteRepoFileForm{}), repo.DeleteFilePost)
|
m.Post("/_delete/*", bindIgnErr(auth.DeleteRepoFileForm{}), repo.DeleteFilePost)
|
||||||
m.Post("/branches", bindIgnErr(auth.NewBranchForm{}), repo.NewBranchPost)
|
m.Post("/branches", bindIgnErr(auth.NewBranchForm{}), repo.NewBranchPost)
|
||||||
m.Post("/upload-file", repo.UploadFileToServer)
|
m.Post("/upload-file", repo.UploadFileToServer)
|
||||||
m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer)
|
m.Post("/upload-remove", bindIgnErr(auth.RemoveUploadFileForm{}), repo.RemoveUploadFileFromServer)
|
||||||
}, reqRepoWriter, context.RepoRef())
|
}, reqRepoWriter, context.RepoRef(), func(ctx *context.Context) {
|
||||||
|
if ctx.Repo.IsViewCommit {
|
||||||
|
ctx.Handle(404, "", nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
})
|
||||||
}, reqSignIn, context.RepoAssignment(), repo.MustBeNotBare)
|
}, reqSignIn, context.RepoAssignment(), repo.MustBeNotBare)
|
||||||
|
|
||||||
m.Group("/:username/:reponame", func() {
|
m.Group("/:username/:reponame", func() {
|
||||||
|
|
|
@ -2240,43 +2240,6 @@ func (repo *Repository) GetForks() ([]*Repository, error) {
|
||||||
return forks, x.Find(&forks, &Repository{ForkID: repo.ID})
|
return forks, x.Find(&forks, &Repository{ForkID: repo.ID})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ________ .__ __ ___________.__.__
|
|
||||||
// \______ \ ____ | | _____/ |_ ____ \_ _____/|__| | ____
|
|
||||||
// | | \_/ __ \| | _/ __ \ __\/ __ \ | __) | | | _/ __ \
|
|
||||||
// | ` \ ___/| |_\ ___/| | \ ___/ | \ | | |_\ ___/
|
|
||||||
// /_______ /\___ >____/\___ >__| \___ > \___ / |__|____/\___ >
|
|
||||||
// \/ \/ \/ \/ \/ \/
|
|
||||||
//
|
|
||||||
|
|
||||||
func (repo *Repository) DeleteRepoFile(doer *User, branch, treeName, message string) (err error) {
|
|
||||||
repoWorkingPool.CheckIn(com.ToStr(repo.ID))
|
|
||||||
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
|
||||||
|
|
||||||
localPath := repo.LocalCopyPath()
|
|
||||||
if err = discardLocalRepoBranchChanges(localPath, branch); err != nil {
|
|
||||||
return fmt.Errorf("discardLocalRepoChanges: %v", err)
|
|
||||||
} else if err = repo.UpdateLocalCopyBranch(branch); err != nil {
|
|
||||||
return fmt.Errorf("UpdateLocalCopyBranch: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
filePath := path.Join(localPath, treeName)
|
|
||||||
os.Remove(filePath)
|
|
||||||
|
|
||||||
if len(message) == 0 {
|
|
||||||
message = "Delete file '" + treeName + "'"
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = git.AddChanges(localPath, true); err != nil {
|
|
||||||
return fmt.Errorf("AddChanges: %v", err)
|
|
||||||
} else if err = git.CommitChanges(localPath, message, doer.NewGitSig()); err != nil {
|
|
||||||
return fmt.Errorf("CommitChanges: %v", err)
|
|
||||||
} else if err = git.Push(localPath, "origin", branch); err != nil {
|
|
||||||
return fmt.Errorf("Push: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// ____ ___ .__ .___ ___________.___.__
|
// ____ ___ .__ .___ ___________.___.__
|
||||||
// | | \______ | | _________ __| _/ \_ _____/| | | ____ ______
|
// | | \______ | | _________ __| _/ \_ _____/| | | ____ ______
|
||||||
// | | /\____ \| | / _ \__ \ / __ | | __) | | | _/ __ \ / ___/
|
// | | /\____ \| | / _ \__ \ / __ | | __) | | | _/ __ \ / ___/
|
||||||
|
|
|
@ -209,3 +209,63 @@ func (repo *Repository) GetDiffPreview(branch, treeName, content string) (diff *
|
||||||
|
|
||||||
return diff, nil
|
return diff, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ________ .__ __ ___________.__.__
|
||||||
|
// \______ \ ____ | | _____/ |_ ____ \_ _____/|__| | ____
|
||||||
|
// | | \_/ __ \| | _/ __ \ __\/ __ \ | __) | | | _/ __ \
|
||||||
|
// | ` \ ___/| |_\ ___/| | \ ___/ | \ | | |_\ ___/
|
||||||
|
// /_______ /\___ >____/\___ >__| \___ > \___ / |__|____/\___ >
|
||||||
|
// \/ \/ \/ \/ \/ \/
|
||||||
|
//
|
||||||
|
|
||||||
|
func (repo *Repository) DeleteRepoFile(doer *User, oldCommitID, branch, treeName, message string) (err error) {
|
||||||
|
repoWorkingPool.CheckIn(com.ToStr(repo.ID))
|
||||||
|
defer repoWorkingPool.CheckOut(com.ToStr(repo.ID))
|
||||||
|
|
||||||
|
localPath := repo.LocalCopyPath()
|
||||||
|
if err = discardLocalRepoBranchChanges(localPath, branch); err != nil {
|
||||||
|
return fmt.Errorf("discardLocalRepoChanges: %v", err)
|
||||||
|
} else if err = repo.UpdateLocalCopyBranch(branch); err != nil {
|
||||||
|
return fmt.Errorf("UpdateLocalCopyBranch: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath := path.Join(localPath, treeName)
|
||||||
|
os.Remove(filePath)
|
||||||
|
|
||||||
|
if len(message) == 0 {
|
||||||
|
message = "Delete file '" + treeName + "'"
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = git.AddChanges(localPath, true); err != nil {
|
||||||
|
return fmt.Errorf("AddChanges: %v", err)
|
||||||
|
} else if err = git.CommitChanges(localPath, message, doer.NewGitSig()); err != nil {
|
||||||
|
return fmt.Errorf("CommitChanges: %v", err)
|
||||||
|
} else if err = git.Push(localPath, "origin", branch); err != nil {
|
||||||
|
return fmt.Errorf("Push: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
gitRepo, err := git.OpenRepository(repo.RepoPath())
|
||||||
|
if err != nil {
|
||||||
|
log.Error(4, "OpenRepository: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
commit, err := gitRepo.GetBranchCommit(branch)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(4, "GetBranchCommit [branch: %s]: %v", branch, err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
pushCommits := &PushCommits{
|
||||||
|
Len: 1,
|
||||||
|
Commits: []*PushCommit{CommitToPushCommit(commit)},
|
||||||
|
}
|
||||||
|
if err := CommitRepoAction(doer.ID, repo.MustOwner().ID, doer.Name, doer.Email,
|
||||||
|
repo.ID, repo.MustOwner().Name, repo.Name, git.BRANCH_PREFIX+branch,
|
||||||
|
pushCommits, oldCommitID, commit.ID.String()); err != nil {
|
||||||
|
log.Error(4, "CommitRepoAction: %v", err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
go HookQueue.Add(repo.ID)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
// Copyright 2016 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
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/gogits/gogs/models"
|
|
||||||
"github.com/gogits/gogs/modules/auth"
|
|
||||||
"github.com/gogits/gogs/modules/context"
|
|
||||||
"github.com/gogits/gogs/modules/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) {
|
|
||||||
branchName := ctx.Repo.BranchName
|
|
||||||
treeName := ctx.Repo.TreeName
|
|
||||||
|
|
||||||
if ctx.HasError() {
|
|
||||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName + "/" + treeName)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := ctx.Repo.Repository.DeleteRepoFile(ctx.User, branchName, treeName, form.CommitSummary); err != nil {
|
|
||||||
ctx.Handle(500, "DeleteRepoFile", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Was successful, so now need to call models.CommitRepoAction() with the new commitID for webhooks and watchers
|
|
||||||
if branch, err := ctx.Repo.Repository.GetBranch(branchName); err != nil {
|
|
||||||
log.Error(4, "repo.Repository.GetBranch(%s): %v", branchName, err)
|
|
||||||
} else if commit, err := branch.GetCommit(); err != nil {
|
|
||||||
log.Error(4, "branch.GetCommit(): %v", err)
|
|
||||||
} else {
|
|
||||||
pc := &models.PushCommits{
|
|
||||||
Len: 1,
|
|
||||||
Commits: []*models.PushCommit{models.CommitToPushCommit(commit)},
|
|
||||||
}
|
|
||||||
oldCommitID := ctx.Repo.CommitID
|
|
||||||
newCommitID := commit.ID.String()
|
|
||||||
if err := models.CommitRepoAction(ctx.User.ID, ctx.Repo.Owner.ID, ctx.User.LowerName, ctx.Repo.Owner.Email,
|
|
||||||
ctx.Repo.Repository.ID, ctx.Repo.Owner.LowerName, ctx.Repo.Repository.Name, "refs/heads/"+branchName, pc,
|
|
||||||
oldCommitID, newCommitID); err != nil {
|
|
||||||
log.Error(4, "models.CommitRepoAction(branch = %s): %v", branchName, err)
|
|
||||||
}
|
|
||||||
models.HookQueue.Add(ctx.Repo.Repository.ID)
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName)
|
|
||||||
}
|
|
|
@ -26,12 +26,6 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
func editFile(ctx *context.Context, isNewFile bool) {
|
func editFile(ctx *context.Context, isNewFile bool) {
|
||||||
// Don't allow edit a file in a specific commit.
|
|
||||||
if ctx.Repo.IsViewCommit {
|
|
||||||
ctx.Handle(404, "", nil)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.Data["PageIsEdit"] = true
|
ctx.Data["PageIsEdit"] = true
|
||||||
ctx.Data["IsNewFile"] = isNewFile
|
ctx.Data["IsNewFile"] = isNewFile
|
||||||
ctx.Data["RequireHighlightJS"] = true
|
ctx.Data["RequireHighlightJS"] = true
|
||||||
|
@ -327,3 +321,20 @@ func DiffPreviewPost(ctx *context.Context, form auth.EditPreviewDiffForm) {
|
||||||
|
|
||||||
ctx.HTML(200, DIFF_PREVIEW)
|
ctx.HTML(200, DIFF_PREVIEW)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DeleteFilePost(ctx *context.Context, form auth.DeleteRepoFileForm) {
|
||||||
|
branchName := ctx.Repo.BranchName
|
||||||
|
treeName := ctx.Repo.TreeName
|
||||||
|
|
||||||
|
if ctx.HasError() {
|
||||||
|
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName + "/" + treeName)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := ctx.Repo.Repository.DeleteRepoFile(ctx.User, ctx.Repo.CommitID, branchName, treeName, form.CommitSummary); err != nil {
|
||||||
|
ctx.Handle(500, "DeleteRepoFile", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.Redirect(ctx.Repo.RepoLink + "/src/" + branchName)
|
||||||
|
}
|
|
@ -53,7 +53,6 @@ func Home(ctx *context.Context) {
|
||||||
rawLink := ctx.Repo.RepoLink + "/raw/" + branchName
|
rawLink := ctx.Repo.RepoLink + "/raw/" + branchName
|
||||||
editLink := ctx.Repo.RepoLink + "/_edit/" + branchName
|
editLink := ctx.Repo.RepoLink + "/_edit/" + branchName
|
||||||
newFileLink := ctx.Repo.RepoLink + "/_new/" + branchName
|
newFileLink := ctx.Repo.RepoLink + "/_new/" + branchName
|
||||||
deleteLink := ctx.Repo.RepoLink + "/delete/" + branchName
|
|
||||||
forkLink := setting.AppSubUrl + "/repo/fork/" + strconv.FormatInt(ctx.Repo.Repository.ID, 10)
|
forkLink := setting.AppSubUrl + "/repo/fork/" + strconv.FormatInt(ctx.Repo.Repository.ID, 10)
|
||||||
uploadFileLink := ctx.Repo.RepoLink + "/upload/" + branchName
|
uploadFileLink := ctx.Repo.RepoLink + "/upload/" + branchName
|
||||||
|
|
||||||
|
@ -171,7 +170,6 @@ func Home(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch {
|
if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch {
|
||||||
ctx.Data["FileDeleteLink"] = deleteLink + "/" + treename
|
|
||||||
ctx.Data["FileDeleteLinkTooltip"] = ctx.Tr("repo.delete_this_file")
|
ctx.Data["FileDeleteLinkTooltip"] = ctx.Tr("repo.delete_this_file")
|
||||||
} else {
|
} else {
|
||||||
if !ctx.Repo.IsViewBranch {
|
if !ctx.Repo.IsViewBranch {
|
||||||
|
@ -259,7 +257,7 @@ func Home(ctx *context.Context) {
|
||||||
ctx.Data["LastCommitUser"] = models.ValidateCommitWithEmail(lastCommit)
|
ctx.Data["LastCommitUser"] = models.ValidateCommitWithEmail(lastCommit)
|
||||||
if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch {
|
if ctx.Repo.IsWriter() && ctx.Repo.IsViewBranch {
|
||||||
ctx.Data["NewFileLink"] = newFileLink + "/" + treename
|
ctx.Data["NewFileLink"] = newFileLink + "/" + treename
|
||||||
if !setting.Repository.Upload.Enabled {
|
if setting.Repository.Upload.Enabled {
|
||||||
ctx.Data["UploadFileLink"] = uploadFileLink + "/" + treename
|
ctx.Data["UploadFileLink"] = uploadFileLink + "/" + treename
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
<div class="ui top attached tabular menu" data-write="write" data-preview="preview" data-diff="diff">
|
<div class="ui top attached tabular menu" data-write="write" data-preview="preview" data-diff="diff">
|
||||||
<a class="active item" data-tab="write"><i class="octicon octicon-code"></i> {{.i18n.Tr "repo.edit_file"}}</a>
|
<a class="active item" data-tab="write"><i class="octicon octicon-code"></i> {{.i18n.Tr "repo.edit_file"}}</a>
|
||||||
<a class="item" data-tab="preview" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}" data-preview-file-modes="{{.PreviewableFileModes}}"><i class="octicon octicon-eye"></i> {{.i18n.Tr "repo.release.preview"}}</a>
|
<a class="item" data-tab="preview" data-url="{{AppSubUrl}}/api/v1/markdown" data-context="{{.RepoLink}}" data-preview-file-modes="{{.PreviewableFileModes}}"><i class="octicon octicon-eye"></i> {{.i18n.Tr "repo.release.preview"}}</a>
|
||||||
<a class="item" data-tab="diff" data-url="{{.RepoLink}}/preview/{{.BranchName}}/{{.TreeName}}" data-context="{{.BranchLink}}"><i class="octicon octicon-diff"></i> {{.i18n.Tr "repo.preview_changes"}}</a>
|
<a class="item" data-tab="diff" data-url="{{.RepoLink}}/_preview/{{.BranchName}}/{{.TreeName}}" data-context="{{.BranchLink}}"><i class="octicon octicon-diff"></i> {{.i18n.Tr "repo.preview_changes"}}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="ui bottom attached active tab segment" data-tab="write">
|
<div class="ui bottom attached active tab segment" data-tab="write">
|
||||||
<textarea id="edit_area" name="content" data-id="repo-{{.Repository.Name}}-{{.TreeName}}"
|
<textarea id="edit_area" name="content" data-id="repo-{{.Repository.Name}}-{{.TreeName}}"
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
{{else}}
|
{{else}}
|
||||||
<i class="octicon btn-octicon octicon-pencil poping up disabled" data-content="{{.FileEditLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></i>
|
<i class="octicon btn-octicon octicon-pencil poping up disabled" data-content="{{.FileEditLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></i>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .FileDeleteLink}}
|
{{if and .IsViewBranch .IsRepositoryWriter}}
|
||||||
<form id="delete-file-form" class="ui form inline-form" action="{{EscapePound $.FileDeleteLink}}" method="post">
|
<form id="delete-file-form" class="ui form inline-form" action="{{.RepoLink}}/_delete/{{EscapePound .BranchName}}/{{.TreeName}}" method="post">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
<button onclick="submitDeleteForm()" class="octicon octicon-trashcan btn-octicon btn-octicon-danger poping up" type="button" data-content="{{.FileDeleteLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></button>
|
<button onclick="submitDeleteForm()" class="octicon octicon-trashcan btn-octicon btn-octicon-danger poping up" type="button" data-content="{{.FileDeleteLinkTooltip}}" data-position="bottom center" data-variation="tiny inverted"></button>
|
||||||
<input type="hidden" id="delete-message" name="commit_message" value="">
|
<input type="hidden" id="delete-message" name="commit_message" value="">
|
||||||
|
|
Loading…
Reference in a new issue