@@ -27,6 +27,7 @@ import (
2727 "github.com/go-git/go-git/v5"
2828 "github.com/go-git/go-git/v5/plumbing"
2929 "github.com/go-git/go-git/v5/plumbing/format/diff"
30+ "github.com/go-git/go-git/v5/plumbing/object"
3031)
3132
3233// ComputeModuleBumps looks at the current Git repository and computes
@@ -66,6 +67,21 @@ func ComputeModuleBumps(ctx context.Context) (*ModuleBumps, error) {
6667 fmt .Println ("Current branch:" , currentBranch )
6768 fmt .Println ("Release mode:" , releaseMode )
6869
70+ // Build set of all commits reachable from HEAD.
71+ commitIter , err := repo .Log (& git.LogOptions {From : headRef .Hash ()})
72+ if err != nil {
73+ return nil , fmt .Errorf ("failed to get commit log: %w" , err )
74+ }
75+ defer commitIter .Close ()
76+ reachable := make (map [plumbing.Hash ]struct {})
77+ err = commitIter .ForEach (func (c * object.Commit ) error {
78+ reachable [c .Hash ] = struct {}{}
79+ return nil
80+ })
81+ if err != nil {
82+ return nil , fmt .Errorf ("failed to iterate commits: %w" , err )
83+ }
84+
6985 // Get iterator for tags in the repository.
7086 tagsIter , err := repo .Tags ()
7187 if err != nil {
@@ -77,6 +93,18 @@ func ComputeModuleBumps(ctx context.Context) (*ModuleBumps, error) {
7793 moduleTags := make (map [string ][]* semver.Version )
7894 err = tagsIter .ForEach (func (ref * plumbing.Reference ) error {
7995 tag := ref .Name ().Short ()
96+
97+ // Resolve tag to its target commit and skip if not reachable from HEAD.
98+ var targetHash plumbing.Hash
99+ if tagObj , err := repo .TagObject (ref .Hash ()); err == nil {
100+ targetHash = tagObj .Target
101+ } else {
102+ targetHash = ref .Hash ()
103+ }
104+ if _ , ok := reachable [targetHash ]; ! ok {
105+ return nil
106+ }
107+
80108 for _ , module := range taggables {
81109 prefix := module + "/v"
82110 if ! strings .HasPrefix (tag , prefix ) {
0 commit comments