Allow to use only PR commits #4
1 changed files with 44 additions and 7 deletions
51
main.go
51
main.go
|
@ -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]
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue