Allow to use only PR commits #4

Merged
fyrchik merged 5 commits from only-pr-commits into master 2024-09-04 19:51:22 +00:00

51
main.go
View file

@ -1,7 +1,6 @@
package main package main
import ( import (
"errors"
"fmt" "fmt"
"log" "log"
"os" "os"
@ -9,7 +8,9 @@ import (
"strings" "strings"
git "github.com/go-git/go-git/v5" git "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object" "github.com/go-git/go-git/v5/plumbing/object"
"github.com/go-git/go-git/v5/plumbing/storer"
gha "github.com/sethvargo/go-githubactions" gha "github.com/sethvargo/go-githubactions"
) )
@ -25,27 +26,35 @@ func main() {
} }
// Retrieve the commit history. // Retrieve the commit history.
ref, err := r.Head() head, err := r.Head()
if err != nil { if err != nil {
log.Fatalf("Failed to retrieve HEAD reference: %v", err) log.Fatalf("Failed to retrieve HEAD reference: %v", err)
} }
// Create iterator over commits. // Create iterator over commits.
commits, err := r.Log(&git.LogOptions{From: ref.Hash()}) commits, err := r.Log(&git.LogOptions{From: head.Hash()})
if err != nil { if err != nil {
log.Fatalf("Failed to retrieve commit history: %v", err) log.Fatalf("Failed to retrieve commit history: %v", err)
} }
// Limit number of iterations. // Limit number of iterations.
from := gha.GetInput("from") from := gha.GetInput("from")
log.Printf("Resolving revision '%s'", from)
var lca *object.Commit
if from != "" {
lca = getMergeBase(r, head, from)
}
log.Printf("Resolved: %s", lca.Hash)
// Processing result. // Processing result.
var fail bool var fail bool
_ = commits.ForEach(func(c *object.Commit) error { _ = commits.ForEach(func(c *object.Commit) error {
// Stop iterator when limit is reached. // Stop iterator when limit is reached.
if len(from) != 0 && strings.HasPrefix(c.ID().String(), from) { if lca != nil && c.Hash == lca.Hash {
return errors.New("stop") return storer.ErrStop
} }
// Parse commit data. // Parse commit data.
@ -63,16 +72,18 @@ func main() {
header := lines[0] header := lines[0]
if !rxHeader.MatchString(header) { if !rxHeader.MatchString(header) {
fail = true fail = true
fmt.Printf("Error: invalid header %s [%s]\n", header, id) fmt.Printf("Error: invalid header '%s' [%s]\n", header, id)
return nil return nil
} }
// Check commit sign-off. // Check commit sign-off.
if !rxSignOff.MatchString(lines[len(lines)-1]) { if !rxSignOff.MatchString(lines[len(lines)-1]) {
fail = true fail = true
fmt.Printf("Error: missing sign-off %s [%s]\n", header, id) fmt.Printf("Error: missing sign-off '%s' [%s]\n", header, id)
return nil
} }
fmt.Printf("OK: '%s' [%s]\n", header, id)
return nil return nil
}) })
@ -82,3 +93,29 @@ func main() {
} }
} }
func getMergeBase(r *git.Repository, head *plumbing.Reference, from string) *object.Commit {
h, err := r.ResolveRevision(plumbing.Revision(from))
if err != nil {
h, err = r.ResolveRevision(plumbing.Revision(plumbing.NewBranchReferenceName(from)))
if err != nil {
log.Fatalf("Failed to resolve a reference '%s': %v", from, err)
}
}
to, err := r.CommitObject(*h)
if err != nil {
log.Fatalf("Failed to get commit object: %v", err)
}
other, err := r.CommitObject(head.Hash())
if err != nil {
log.Fatalf("Failed to get HEAD commit object: %v", err)
}
cc, err := to.MergeBase(other)
if err != nil {
log.Fatalf("Failed to determine merge-base: %v", err)
}
return cc[0]
}