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 }