| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- // Copyright 2021 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package repo
-
- import (
- "bytes"
- "net/http"
- "strings"
-
- "code.gitea.io/gitea/modules/git"
- "code.gitea.io/gitea/modules/util"
- "code.gitea.io/gitea/services/context"
- "code.gitea.io/gitea/services/forms"
- "code.gitea.io/gitea/services/repository/files"
- )
-
- func CherryPick(ctx *context.Context) {
- prepareEditorCommitFormOptions(ctx, "_cherrypick")
- if ctx.Written() {
- return
- }
-
- fromCommitID := ctx.PathParam("sha")
- ctx.Data["FromCommitID"] = fromCommitID
- cherryPickCommit, err := ctx.Repo.GitRepo.GetCommit(fromCommitID)
- if err != nil {
- HandleGitError(ctx, "GetCommit", err)
- return
- }
-
- if ctx.FormString("cherry-pick-type") == "revert" {
- ctx.Data["CherryPickType"] = "revert"
- ctx.Data["commit_summary"] = "revert " + ctx.PathParam("sha")
- ctx.Data["commit_message"] = "revert " + cherryPickCommit.Message()
- } else {
- ctx.Data["CherryPickType"] = "cherry-pick"
- splits := strings.SplitN(cherryPickCommit.Message(), "\n", 2)
- ctx.Data["commit_summary"] = splits[0]
- ctx.Data["commit_message"] = splits[1]
- }
-
- ctx.HTML(http.StatusOK, tplCherryPick)
- }
-
- func CherryPickPost(ctx *context.Context) {
- fromCommitID := ctx.PathParam("sha")
- parsed := prepareEditorCommitSubmittedForm[*forms.CherryPickForm](ctx)
- if ctx.Written() {
- return
- }
-
- defaultCommitMessage := util.Iif(parsed.form.Revert, ctx.Locale.TrString("repo.commit.revert-header", fromCommitID), ctx.Locale.TrString("repo.commit.cherry-pick-header", fromCommitID))
- opts := &files.ApplyDiffPatchOptions{
- LastCommitID: parsed.form.LastCommit,
- OldBranch: parsed.OldBranchName,
- NewBranch: parsed.NewBranchName,
- Message: parsed.GetCommitMessage(defaultCommitMessage),
- Author: parsed.GitCommitter,
- Committer: parsed.GitCommitter,
- }
-
- // First try the simple plain read-tree -m approach
- opts.Content = fromCommitID
- if _, err := files.CherryPick(ctx, ctx.Repo.Repository, ctx.Doer, parsed.form.Revert, opts); err != nil {
- // Drop through to the "apply" method
- buf := &bytes.Buffer{}
- if parsed.form.Revert {
- err = git.GetReverseRawDiff(ctx, ctx.Repo.Repository.RepoPath(), fromCommitID, buf)
- } else {
- err = git.GetRawDiff(ctx.Repo.GitRepo, fromCommitID, "patch", buf)
- }
- if err == nil {
- opts.Content = buf.String()
- _, err = files.ApplyDiffPatch(ctx, ctx.Repo.Repository, ctx.Doer, opts)
- if err != nil {
- err = util.ErrorWrapLocale(err, "repo.editor.fail_to_apply_patch")
- }
- }
- if err != nil {
- editorHandleFileOperationError(ctx, parsed.NewBranchName, err)
- return
- }
- }
- redirectForCommitChoice(ctx, parsed, parsed.form.TreePath)
- }
|