Web editor: improve delete file
This commit is contained in:
		
							parent
							
								
									cd89f6c502
								
							
						
					
					
						commit
						54e0ada9d5
					
				
							
								
								
									
										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 New Issue
	
	Block a user