mirror of
https://gitea.com/gitea/tea.git
synced 2026-10-26 11:01:25 +01:00
fix(pr): delete the local branch on merge only when asked to
Signed-off-by: bircni <bircni@icloud.com>
This commit is contained in:
2 files changed
+38
-6
No files matched your search
@@ -7,6 +7,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"slices"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gitea.dev/tea/internal/clierr"
|
"gitea.dev/tea/internal/clierr"
|
||||||
@@ -71,6 +72,29 @@ func TestPullMergeUsesTheRepositoryDefaults(t *testing.T) {
|
|||||||
require.Empty(t, diagnostics.String())
|
require.Empty(t, diagnostics.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPullMergeKeepsTheLocalBranchWithoutTheFlag(t *testing.T) {
|
||||||
|
for _, tc := range []struct {
|
||||||
|
name string
|
||||||
|
flags []string
|
||||||
|
local bool
|
||||||
|
}{
|
||||||
|
{"repository default", nil, false},
|
||||||
|
{"flag", []string{"--delete-branch"}, true},
|
||||||
|
} {
|
||||||
|
t.Run(tc.name, func(t *testing.T) {
|
||||||
|
var payload map[string]any
|
||||||
|
server := newAuthenticatedServer(mergeServer(t, openPull, &payload))
|
||||||
|
defer server.Close()
|
||||||
|
deps, _, _ := serverDeps(t, server.URL)
|
||||||
|
fake := &fakeGit{results: map[string]string{"symbolic-ref --short HEAD": "feature"}}
|
||||||
|
deps.Git = fake
|
||||||
|
require.NoError(t, Execute(context.Background(), deps, append([]string{"pr", "merge", "3", "-R", "alice/project", "--yes"}, tc.flags...)))
|
||||||
|
require.Equal(t, true, payload["delete_branch_after_merge"])
|
||||||
|
require.Equal(t, tc.local, slices.Contains(fake.calls, "rev-parse --verify refs/heads/feature^{commit}"), fake.calls)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPullMergeAsksForTheMethodAndBranchDeletion(t *testing.T) {
|
func TestPullMergeAsksForTheMethodAndBranchDeletion(t *testing.T) {
|
||||||
var payload map[string]any
|
var payload map[string]any
|
||||||
server := newAuthenticatedServer(mergeServer(t, openPull, &payload))
|
server := newAuthenticatedServer(mergeServer(t, openPull, &payload))
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ func (a *application) pullStateCommand(closing bool) *cobra.Command {
|
|||||||
a.done(cmd, "%s pull request %s", done, ref)
|
a.done(cmd, "%s pull request %s", done, ref)
|
||||||
}
|
}
|
||||||
if deleteBranch {
|
if deleteBranch {
|
||||||
a.deleteHead(cmd, service, item, false)
|
a.deleteHead(cmd, service, item, false, true)
|
||||||
}
|
}
|
||||||
return a.jsonResult(cmd, item)
|
return a.jsonResult(cmd, item)
|
||||||
}}
|
}}
|
||||||
@@ -124,9 +124,9 @@ $ tea pr close 13 -c "Superseded by #15" --delete-branch`
|
|||||||
}
|
}
|
||||||
|
|
||||||
// deleteHead deletes the head branch of a merged or closed pull request on Gitea, unless it is
|
// deleteHead deletes the head branch of a merged or closed pull request on Gitea, unless it is
|
||||||
// gone, and then locally, reporting each step. merging tells that Gitea deleted it as part of
|
// gone, and then locally when local is set, reporting each step. merging tells that Gitea deleted
|
||||||
// the merge.
|
// it as part of the merge.
|
||||||
func (a *application) deleteHead(cmd *cobra.Command, service services.Pulls, item services.Pull, merging bool) {
|
func (a *application) deleteHead(cmd *cobra.Command, service services.Pulls, item services.Pull, merging, local bool) {
|
||||||
switch {
|
switch {
|
||||||
case item.HeadRemoteDeleted && merging:
|
case item.HeadRemoteDeleted && merging:
|
||||||
a.done(cmd, "Deleted remote branch %s", item.Head)
|
a.done(cmd, "Deleted remote branch %s", item.Head)
|
||||||
@@ -141,7 +141,9 @@ func (a *application) deleteHead(cmd *cobra.Command, service services.Pulls, ite
|
|||||||
a.done(cmd, "Deleted remote branch %s", item.Head)
|
a.done(cmd, "Deleted remote branch %s", item.Head)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if local {
|
||||||
a.deleteLocalHead(cmd, item)
|
a.deleteLocalHead(cmd, item)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// deleteLocalHead deletes the checked-out branch when it is at the head of the pull request,
|
// deleteLocalHead deletes the checked-out branch when it is at the head of the pull request,
|
||||||
@@ -311,6 +313,9 @@ the base branch.`, Annotations: pullArgumentsAnnotation(map[string]string{"tea.c
|
|||||||
} else if !slices.Contains(repoSettings.Styles, method) {
|
} else if !slices.Contains(repoSettings.Styles, method) {
|
||||||
return clierr.Wrap(clierr.Usage, fmt.Errorf("%s merges are disabled in %s; use one of: %s", method, t.Repo, strings.Join(repoSettings.Styles, ", ")))
|
return clierr.Wrap(clierr.Usage, fmt.Errorf("%s merges are disabled in %s; use one of: %s", method, t.Repo, strings.Join(repoSettings.Styles, ", ")))
|
||||||
}
|
}
|
||||||
|
// The repository setting deletes the branch on Gitea only; the local branch goes when
|
||||||
|
// --delete-branch or the form asks for it.
|
||||||
|
deleteLocal := deleteBranch
|
||||||
if !cmd.Flags().Changed("delete-branch") {
|
if !cmd.Flags().Changed("delete-branch") {
|
||||||
deleteBranch = repoSettings.DeleteBranch
|
deleteBranch = repoSettings.DeleteBranch
|
||||||
}
|
}
|
||||||
@@ -328,6 +333,9 @@ the base branch.`, Annotations: pullArgumentsAnnotation(map[string]string{"tea.c
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
method, deleteBranch = values.Method, values.DeleteBranch
|
method, deleteBranch = values.Method, values.DeleteBranch
|
||||||
|
if askDelete {
|
||||||
|
deleteLocal = deleteBranch
|
||||||
|
}
|
||||||
} else if err := a.confirmAction(cmd, terminal.Confirmation{Prompt: header + "?", DefaultYes: true, NonTTY: "merge " + t.Repo + "#" + fmt.Sprint(n)}); err != nil {
|
} else if err := a.confirmAction(cmd, terminal.Confirmation{Prompt: header + "?", DefaultYes: true, NonTTY: "merge " + t.Repo + "#" + fmt.Sprint(n)}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -349,7 +357,7 @@ the base branch.`, Annotations: pullArgumentsAnnotation(map[string]string{"tea.c
|
|||||||
} else {
|
} else {
|
||||||
a.done(cmd, "%s pull request %s", mergeVerbs[method], ref)
|
a.done(cmd, "%s pull request %s", mergeVerbs[method], ref)
|
||||||
if deleteBranch {
|
if deleteBranch {
|
||||||
a.deleteHead(cmd, service, merged, true)
|
a.deleteHead(cmd, service, merged, true, deleteLocal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return a.jsonResult(cmd, merged)
|
return a.jsonResult(cmd, merged)
|
||||||
@@ -361,7 +369,7 @@ the base branch.`, Annotations: pullArgumentsAnnotation(map[string]string{"tea.c
|
|||||||
cmd.Flags().BoolVar(&style.merge, "merge", false, "Create a merge commit")
|
cmd.Flags().BoolVar(&style.merge, "merge", false, "Create a merge commit")
|
||||||
cmd.Flags().BoolVar(&style.squash, "squash", false, "Squash the commits into one commit and merge it")
|
cmd.Flags().BoolVar(&style.squash, "squash", false, "Squash the commits into one commit and merge it")
|
||||||
cmd.Flags().BoolVar(&style.rebase, "rebase", false, "Rebase the commits onto the base branch")
|
cmd.Flags().BoolVar(&style.rebase, "rebase", false, "Rebase the commits onto the base branch")
|
||||||
cmd.Flags().BoolVarP(&deleteBranch, "delete-branch", "d", false, "Delete the head branch after merging (default: the repository setting)")
|
cmd.Flags().BoolVarP(&deleteBranch, "delete-branch", "d", false, "Delete the head branch on Gitea and locally after merging (default: the repository setting, on Gitea only)")
|
||||||
cmd.Flags().BoolVar(&auto, "auto", false, "Merge once the required checks succeed")
|
cmd.Flags().BoolVar(&auto, "auto", false, "Merge once the required checks succeed")
|
||||||
cmd.Flags().StringVarP(&title, "title", "t", "", "Merge commit title")
|
cmd.Flags().StringVarP(&title, "title", "t", "", "Merge commit title")
|
||||||
cmd.Flags().StringVarP(&message, "message", "b", "", "Merge commit message")
|
cmd.Flags().StringVarP(&message, "message", "b", "", "Merge commit message")
|
||||||
|
|||||||
Reference in new issue
Block a user