|
1 | 1 | package gitsemver |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "encoding/json" |
4 | 5 | "errors" |
5 | 6 | "fmt" |
6 | 7 | "io" |
| 8 | + "os" |
7 | 9 | "strconv" |
8 | 10 | "strings" |
9 | 11 | ) |
@@ -172,26 +174,52 @@ func (vs *GitSemVer) GetTag(repo string) (tag string, match bool, err error) { |
172 | 174 | return |
173 | 175 | } |
174 | 176 |
|
| 177 | +type gitHubPullRequestEvent struct { |
| 178 | + PullRequest struct { |
| 179 | + Merged bool `json:"merged"` |
| 180 | + } `json:"pull_request"` |
| 181 | +} |
| 182 | + |
| 183 | +func (vs *GitSemVer) isMergedGitHubPullRequest() bool { |
| 184 | + eventName := strings.TrimSpace(vs.Env.Getenv("GITHUB_EVENT_NAME")) |
| 185 | + if eventName == "pull_request" || eventName == "pull_request_target" { |
| 186 | + if eventPath := strings.TrimSpace(vs.Env.Getenv("GITHUB_EVENT_PATH")); eventPath != "" { |
| 187 | + if b, err := os.ReadFile(eventPath); /* #nosec G304 */ err == nil { |
| 188 | + var event gitHubPullRequestEvent |
| 189 | + if err = json.Unmarshal(b, &event); err == nil { |
| 190 | + return event.PullRequest.Merged |
| 191 | + } |
| 192 | + } |
| 193 | + } |
| 194 | + } |
| 195 | + return false |
| 196 | +} |
| 197 | + |
175 | 198 | func (vs *GitSemVer) getBranchGitHub(repo string) (branchName string, err error) { |
176 | 199 | // Pull request events expose the source branch as GITHUB_HEAD_REF. |
177 | 200 | // Prefer this so PR builds are not mistaken for base-branch releases. |
178 | | - if branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_HEAD_REF")); branchName == "" { |
179 | | - if branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_REF_NAME")); branchName != "" { |
180 | | - if strings.TrimSpace(vs.Env.Getenv("GITHUB_REF_TYPE")) == "tag" { |
181 | | - var branches []string |
182 | | - if branches, err = vs.Git.GetBranchesFromTag(repo, branchName); err == nil { |
183 | | - for _, branchName = range branches { |
184 | | - if vs.IsReleaseBranch(branchName) { |
185 | | - return |
186 | | - } |
| 201 | + if branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_HEAD_REF")); branchName != "" { |
| 202 | + // Merged pull_request events should resolve to the target branch. |
| 203 | + if vs.isMergedGitHubPullRequest() { |
| 204 | + branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_BASE_REF")) |
| 205 | + } |
| 206 | + return |
| 207 | + } |
| 208 | + if branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_REF_NAME")); branchName != "" { |
| 209 | + if strings.TrimSpace(vs.Env.Getenv("GITHUB_REF_TYPE")) == "tag" { |
| 210 | + var branches []string |
| 211 | + if branches, err = vs.Git.GetBranchesFromTag(repo, branchName); err == nil { |
| 212 | + for _, branchName = range branches { |
| 213 | + if vs.IsReleaseBranch(branchName) { |
| 214 | + return |
187 | 215 | } |
188 | 216 | } |
189 | | - branchName = "" |
190 | 217 | } |
191 | | - } else { |
192 | | - // Fallback for contexts that only expose a base branch. |
193 | | - branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_BASE_REF")) |
| 218 | + branchName = "" |
194 | 219 | } |
| 220 | + } else { |
| 221 | + // Fallback for contexts that only expose a base branch. |
| 222 | + branchName = strings.TrimSpace(vs.Env.Getenv("GITHUB_BASE_REF")) |
195 | 223 | } |
196 | 224 | return |
197 | 225 | } |
|
0 commit comments