From d22b31470130d670d31f22d275c89e8d5d62129e Mon Sep 17 00:00:00 2001 From: 6543 <6543@obermui.de> Date: Mon, 8 Mar 2021 03:45:50 +0800 Subject: [PATCH] Introduce workaround for missing pull head sha (#340) fix #318 test with `tea pr 58` Co-authored-by: Norwin Roosen Reviewed-on: https://gitea.com/gitea/tea/pulls/340 Reviewed-by: Norwin Reviewed-by: Andrew Thornton Co-authored-by: 6543 <6543@obermui.de> Co-committed-by: 6543 <6543@obermui.de> --- cmd/pulls.go | 4 ++++ modules/task/pull_checkout.go | 5 +++++ modules/task/pull_clean.go | 5 +++++ modules/workaround/pull.go | 30 ++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 modules/workaround/pull.go 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 +}