github.com/turbot/steampipe@v1.7.0-rc.0.0.20240517123944-7cef272d4458/pkg/modinstaller/git.go (about)

     1  package modinstaller
     2  
     3  import (
     4  	"fmt"
     5  	"sort"
     6  
     7  	"github.com/Masterminds/semver/v3"
     8  	"github.com/go-git/go-git/v5"
     9  	"github.com/go-git/go-git/v5/config"
    10  	"github.com/go-git/go-git/v5/storage/memory"
    11  )
    12  
    13  func getGitUrl(modName string) string {
    14  	return fmt.Sprintf("https://%s", modName)
    15  }
    16  
    17  func getTags(repo string) ([]string, error) {
    18  	// Create the remote with repository URL
    19  	rem := git.NewRemote(memory.NewStorage(), &config.RemoteConfig{
    20  		Name: "origin",
    21  		URLs: []string{repo},
    22  	})
    23  
    24  	// load remote references
    25  	refs, err := rem.List(&git.ListOptions{})
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  
    30  	// filters the references list and only keeps tags
    31  	var tags []string
    32  	for _, ref := range refs {
    33  		if ref.Name().IsTag() {
    34  			tags = append(tags, ref.Name().Short())
    35  		}
    36  	}
    37  
    38  	return tags, nil
    39  }
    40  
    41  func getTagVersionsFromGit(repo string, includePrerelease bool) (semver.Collection, error) {
    42  	tags, err := getTags(repo)
    43  	if err != nil {
    44  		return nil, err
    45  	}
    46  
    47  	versions := make(semver.Collection, len(tags))
    48  	// handle index manually as we may not add all tags - if we cannot parse them as a version
    49  	idx := 0
    50  	for _, raw := range tags {
    51  		v, err := semver.NewVersion(raw)
    52  		if err != nil {
    53  			continue
    54  		}
    55  
    56  		if !includePrerelease && v.Metadata() != "" || v.Prerelease() != "" {
    57  			continue
    58  		}
    59  		versions[idx] = v
    60  		idx++
    61  	}
    62  	// shrink slice
    63  	versions = versions[:idx]
    64  
    65  	// sort the versions in REVERSE order
    66  	sort.Sort(sort.Reverse(versions))
    67  	return versions, nil
    68  }