diff --git a/cmd/pulls.go b/cmd/pulls.go index b89011e..db789db 100644 --- a/cmd/pulls.go +++ b/cmd/pulls.go @@ -12,6 +12,7 @@ import ( "code.gitea.io/tea/modules/interact" "code.gitea.io/tea/modules/print" "code.gitea.io/tea/modules/utils" + "code.gitea.io/tea/modules/workaround" "code.gitea.io/sdk/gitea" "github.com/urfave/cli/v2" @@ -65,6 +66,9 @@ func runPullDetail(cmd *cli.Context, index string) error { if err != nil { return err } + if err := workaround.FixPullHeadSha(client, pr); err != nil { + return err + } reviews, _, err := client.ListPullReviews(ctx.Owner, ctx.Repo, idx, gitea.ListPullReviewsOptions{}) if err != nil { diff --git a/modules/task/pull_checkout.go b/modules/task/pull_checkout.go index 573b11d..6140ea0 100644 --- a/modules/task/pull_checkout.go +++ b/modules/task/pull_checkout.go @@ -9,6 +9,7 @@ import ( "code.gitea.io/tea/modules/config" local_git "code.gitea.io/tea/modules/git" + "code.gitea.io/tea/modules/workaround" "github.com/go-git/go-git/v5" git_plumbing "github.com/go-git/go-git/v5/plumbing" @@ -28,6 +29,10 @@ func PullCheckout(login *config.Login, repoOwner, repoName string, forceCreateBr if err != nil { return err } + if err := workaround.FixPullHeadSha(client, pr); err != nil { + return err + } + remoteDeleted := pr.Head.Ref == fmt.Sprintf("refs/pull/%d/head", pr.Index) if remoteDeleted { return fmt.Errorf("Can't checkout: remote head branch was already deleted") diff --git a/modules/task/pull_clean.go b/modules/task/pull_clean.go index bcefbbc..0528cb4 100644 --- a/modules/task/pull_clean.go +++ b/modules/task/pull_clean.go @@ -9,6 +9,7 @@ import ( "code.gitea.io/tea/modules/config" local_git "code.gitea.io/tea/modules/git" + "code.gitea.io/tea/modules/workaround" "code.gitea.io/sdk/gitea" git_config "github.com/go-git/go-git/v5/config" @@ -33,6 +34,10 @@ func PullClean(login *config.Login, repoOwner, repoName string, index int64, ign if err != nil { return err } + if err := workaround.FixPullHeadSha(client, pr); err != nil { + return err + } + if pr.State == gitea.StateOpen { return fmt.Errorf("PR is still open, won't delete branches") } diff --git a/modules/workaround/pull.go b/modules/workaround/pull.go new file mode 100644 index 0000000..79d5b31 --- /dev/null +++ b/modules/workaround/pull.go @@ -0,0 +1,30 @@ +// Copyright 2021 The Gitea 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 workaround + +import ( + "fmt" + + "code.gitea.io/sdk/gitea" +) + +// FixPullHeadSha is a workaround for https://github.com/go-gitea/gitea/issues/12675 +// When no head sha is available, this is because the branch got deleted in the base repo. +// pr.Head.Ref points in this case not to the head repo branch name, but the base repo ref, +// which stays available to resolve the commit sha. +func FixPullHeadSha(client *gitea.Client, pr *gitea.PullRequest) error { + owner := pr.Base.Repository.Owner.UserName + repo := pr.Base.Repository.Name + if pr.Head != nil && pr.Head.Sha == "" { + refs, _, err := client.GetRepoRefs(owner, repo, pr.Head.Ref) + if err != nil { + return err + } else if len(refs) == 0 { + return fmt.Errorf("unable to resolve PR ref '%s'", pr.Head.Ref) + } + pr.Head.Sha = refs[0].Object.SHA + } + return nil +}