2022-02-10 04:28:55 +08:00
|
|
|
// Copyright 2021 The Gitea Authors. All rights reserved.
|
2022-11-28 02:20:29 +08:00
|
|
|
// SPDX-License-Identifier: MIT
|
2022-02-10 04:28:55 +08:00
|
|
|
|
|
|
|
package repo
|
|
|
|
|
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"code.gitea.io/gitea/models"
|
2023-06-29 18:03:20 +08:00
|
|
|
git_model "code.gitea.io/gitea/models/git"
|
2022-02-10 04:28:55 +08:00
|
|
|
"code.gitea.io/gitea/models/unit"
|
|
|
|
"code.gitea.io/gitea/modules/base"
|
|
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"code.gitea.io/gitea/modules/util"
|
|
|
|
"code.gitea.io/gitea/modules/web"
|
2024-02-27 15:12:22 +08:00
|
|
|
"code.gitea.io/gitea/services/context"
|
2022-02-10 04:28:55 +08:00
|
|
|
"code.gitea.io/gitea/services/forms"
|
|
|
|
"code.gitea.io/gitea/services/repository/files"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
tplPatchFile base.TplName = "repo/editor/patch"
|
|
|
|
)
|
|
|
|
|
|
|
|
// NewDiffPatch render create patch page
|
|
|
|
func NewDiffPatch(ctx *context.Context) {
|
|
|
|
canCommit := renderCommitRights(ctx)
|
|
|
|
|
2023-02-24 05:14:07 +08:00
|
|
|
ctx.Data["PageIsPatch"] = true
|
|
|
|
|
2022-02-10 04:28:55 +08:00
|
|
|
ctx.Data["commit_summary"] = ""
|
|
|
|
ctx.Data["commit_message"] = ""
|
|
|
|
if canCommit {
|
|
|
|
ctx.Data["commit_choice"] = frmCommitChoiceDirect
|
|
|
|
} else {
|
|
|
|
ctx.Data["commit_choice"] = frmCommitChoiceNewBranch
|
|
|
|
}
|
|
|
|
ctx.Data["new_branch_name"] = GetUniquePatchBranchName(ctx)
|
|
|
|
ctx.Data["last_commit"] = ctx.Repo.CommitID
|
|
|
|
ctx.Data["LineWrapExtensions"] = strings.Join(setting.Repository.Editor.LineWrapExtensions, ",")
|
|
|
|
ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL()
|
|
|
|
|
|
|
|
ctx.HTML(200, tplPatchFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewDiffPatchPost response for sending patch page
|
|
|
|
func NewDiffPatchPost(ctx *context.Context) {
|
|
|
|
form := web.GetForm(ctx).(*forms.EditRepoFileForm)
|
|
|
|
|
|
|
|
canCommit := renderCommitRights(ctx)
|
|
|
|
branchName := ctx.Repo.BranchName
|
|
|
|
if form.CommitChoice == frmCommitChoiceNewBranch {
|
|
|
|
branchName = form.NewBranchName
|
|
|
|
}
|
2023-02-24 05:14:07 +08:00
|
|
|
ctx.Data["PageIsPatch"] = true
|
2022-02-10 04:28:55 +08:00
|
|
|
ctx.Data["BranchLink"] = ctx.Repo.RepoLink + "/src/" + ctx.Repo.BranchNameSubURL()
|
|
|
|
ctx.Data["FileContent"] = form.Content
|
|
|
|
ctx.Data["commit_summary"] = form.CommitSummary
|
|
|
|
ctx.Data["commit_message"] = form.CommitMessage
|
|
|
|
ctx.Data["commit_choice"] = form.CommitChoice
|
|
|
|
ctx.Data["new_branch_name"] = form.NewBranchName
|
|
|
|
ctx.Data["last_commit"] = ctx.Repo.CommitID
|
|
|
|
ctx.Data["LineWrapExtensions"] = strings.Join(setting.Repository.Editor.LineWrapExtensions, ",")
|
|
|
|
|
|
|
|
if ctx.HasError() {
|
|
|
|
ctx.HTML(200, tplPatchFile)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Cannot commit to a an existing branch if user doesn't have rights
|
|
|
|
if branchName == ctx.Repo.BranchName && !canCommit {
|
|
|
|
ctx.Data["Err_NewBranchName"] = true
|
|
|
|
ctx.Data["commit_choice"] = frmCommitChoiceNewBranch
|
|
|
|
ctx.RenderWithErr(ctx.Tr("repo.editor.cannot_commit_to_protected_branch", branchName), tplEditFile, &form)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// CommitSummary is optional in the web form, if empty, give it a default message based on add or update
|
|
|
|
// `message` will be both the summary and message combined
|
|
|
|
message := strings.TrimSpace(form.CommitSummary)
|
|
|
|
if len(message) == 0 {
|
2024-02-15 05:48:45 +08:00
|
|
|
message = ctx.Locale.TrString("repo.editor.patch")
|
2022-02-10 04:28:55 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
form.CommitMessage = strings.TrimSpace(form.CommitMessage)
|
|
|
|
if len(form.CommitMessage) > 0 {
|
|
|
|
message += "\n\n" + form.CommitMessage
|
|
|
|
}
|
|
|
|
|
2023-02-25 00:56:41 +08:00
|
|
|
fileResponse, err := files.ApplyDiffPatch(ctx, ctx.Repo.Repository, ctx.Doer, &files.ApplyDiffPatchOptions{
|
2022-02-10 04:28:55 +08:00
|
|
|
LastCommitID: form.LastCommit,
|
|
|
|
OldBranch: ctx.Repo.BranchName,
|
|
|
|
NewBranch: branchName,
|
|
|
|
Message: message,
|
|
|
|
Content: strings.ReplaceAll(form.Content, "\r", ""),
|
2023-02-25 00:56:41 +08:00
|
|
|
})
|
|
|
|
if err != nil {
|
2023-06-29 18:03:20 +08:00
|
|
|
if git_model.IsErrBranchAlreadyExists(err) {
|
2022-02-10 04:28:55 +08:00
|
|
|
// User has specified a branch that already exists
|
2023-06-29 18:03:20 +08:00
|
|
|
branchErr := err.(git_model.ErrBranchAlreadyExists)
|
2022-02-10 04:28:55 +08:00
|
|
|
ctx.Data["Err_NewBranchName"] = true
|
|
|
|
ctx.RenderWithErr(ctx.Tr("repo.editor.branch_already_exists", branchErr.BranchName), tplEditFile, &form)
|
|
|
|
return
|
|
|
|
} else if models.IsErrCommitIDDoesNotMatch(err) {
|
|
|
|
ctx.RenderWithErr(ctx.Tr("repo.editor.file_changed_while_editing", ctx.Repo.RepoLink+"/compare/"+form.LastCommit+"..."+ctx.Repo.CommitID), tplPatchFile, &form)
|
|
|
|
return
|
|
|
|
}
|
2023-10-24 10:54:59 +08:00
|
|
|
ctx.RenderWithErr(ctx.Tr("repo.editor.fail_to_apply_patch", err), tplPatchFile, &form)
|
|
|
|
return
|
2022-02-10 04:28:55 +08:00
|
|
|
}
|
|
|
|
|
2022-12-10 10:46:31 +08:00
|
|
|
if form.CommitChoice == frmCommitChoiceNewBranch && ctx.Repo.Repository.UnitEnabled(ctx, unit.TypePullRequests) {
|
2022-02-10 04:28:55 +08:00
|
|
|
ctx.Redirect(ctx.Repo.RepoLink + "/compare/" + util.PathEscapeSegments(ctx.Repo.BranchName) + "..." + util.PathEscapeSegments(form.NewBranchName))
|
|
|
|
} else {
|
2023-02-25 00:56:41 +08:00
|
|
|
ctx.Redirect(ctx.Repo.RepoLink + "/commit/" + fileResponse.Commit.SHA)
|
2022-02-10 04:28:55 +08:00
|
|
|
}
|
|
|
|
}
|