Skip to content

Commit

Permalink
Did alot of things...
Browse files Browse the repository at this point in the history
  • Loading branch information
Gaardsholt committed Oct 8, 2020
1 parent 8b2d2d8 commit f40a911
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 49 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@ require (
github.com/hashicorp/go-version v1.2.1
golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43
)

replace github.com/hashicorp/go-version v1.2.1 => github.com/BESTSELLER/go-version v1.2.4
6 changes: 4 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/BESTSELLER/go-version v1.2.4 h1:vbZHa7E+Tb9jDzRrY6Il5NwkMmTAh7ZD/y+P9kfasdE=
github.com/BESTSELLER/go-version v1.2.4/go.mod h1:kIEnnikGprffCYsIfePinaNlxCt8udBYODNKm/dFBbs=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
Expand Down Expand Up @@ -80,6 +82,7 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k=
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II=
github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI=
Expand All @@ -97,8 +100,6 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
Expand Down Expand Up @@ -278,6 +279,7 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
Expand Down
98 changes: 58 additions & 40 deletions releasediff.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@ import (

// GitHubReleases holds the two releases to compare
type GitHubReleases struct {
Owner string // REQUIRED. Owner of the repo.
Repo string // REQUIRED. Name of the repo.
Release1 string // REQUIRED. Tag name of the release you want to check.
Release2 string // Tag name of the release you want to compare with. If empty, newest version will be used.
Filter string // Regex to to filter releases on. Keep empty if you want all releases.
IncludePreReleases bool // Whether to include pre-releases or not. Default is false.
Client *github.Client // Github client used to make the calls to the github api.
Owner string // REQUIRED. Owner of the repo.
Repo string // REQUIRED. Name of the repo.
Release1 string // REQUIRED. Tag name of the release you want to check.
Release2 string // Tag name of the release you want to compare with. If empty, newest version will be used.
Filter string // Regex to to filter releases on. Keep empty if you want all releases.
IncludePreReleases bool // Whether to include pre-releases or not. Default is false.
Client *github.Client // Github client used to make the calls to the github api.
Versions []*version.Version // Ordered list of all versions
}

// Options is optional stuff that can be sent when calling "New"
Expand All @@ -30,8 +31,22 @@ type Options struct {
VerifyRelease bool // Whether to verify that the provided versions exists as a release.
}

func getVersions(releases []*github.RepositoryRelease) []*version.Version {
versions := make([]*version.Version, len(releases))
for i, raw := range releases {
v, err := version.NewVersion(raw.GetTagName())
if err != nil {
fmt.Println(err)
}
versions[i] = v
}
sort.Sort(version.Collection(versions))

return versions
}

// New creates a new GitHubReleases
func New(client *github.Client, owner string, repo string, release1 string, release2 string, options *Options) (*GitHubReleases, error) {
func New(client *github.Client, owner string, repo string, release1 string, release2 string, options *Options) (*GitHubReleases, *github.Response, error) {
missingFields := []string{}
if owner == "" {
missingFields = append([]string{"Owner"}, missingFields...)
Expand All @@ -43,7 +58,7 @@ func New(client *github.Client, owner string, repo string, release1 string, rele
missingFields = append([]string{"Release1"}, missingFields...)
}
if len(missingFields) > 0 {
return nil, fmt.Errorf("Missing required field(s): %s", missingFields)
return nil, nil, fmt.Errorf("Missing required field(s): %s", missingFields)
}

var verify bool
Expand All @@ -55,22 +70,33 @@ func New(client *github.Client, owner string, repo string, release1 string, rele
filter = options.Filter
}

ctx := context.Background()
releases, response, err := getAllReleases(ctx, client, owner, repo, 1)
if err != nil {
return nil, nil, err
}

if filter != "" {
releases = filterReleases(releases, filter)
}

if !prerelease {
releases = removePreReleases(releases)
}

// Check if Release1 is a valid release
if !isRelase(client, owner, repo, release1, verify) {
return nil, fmt.Errorf("'%s' is not a release on %s/%s", release1, owner, repo)
return nil, nil, fmt.Errorf("'%s' is not a release on %s/%s", release1, owner, repo)
}
versions := getVersions(releases)

// if release2 is empty we will use the latest version
if release2 == "" {
latest, _, err := client.Repositories.GetLatestRelease(context.Background(), owner, repo)
if err != nil {
return nil, err
}
release2 = latest.GetTagName()
release2 = versions[len(versions)-1].Original()
} else {
// Check if Release2 is a valid release
if !isRelase(client, owner, repo, release1, verify) {
return nil, fmt.Errorf("'%s' is not a release on %s/%s", release2, owner, repo)
return nil, nil, fmt.Errorf("'%s' is not a release on %s/%s", release2, owner, repo)
}
}

Expand All @@ -82,45 +108,37 @@ func New(client *github.Client, owner string, repo string, release1 string, rele
Filter: filter,
IncludePreReleases: prerelease,
Client: client,
}, nil
Versions: versions,
}, response, nil
}

// Diff will fetch all releases until a specific release
func (ghr *GitHubReleases) Diff() (int, *github.Response, error) {
ctx := context.Background()
releases, response, err := getAllReleases(ctx, ghr.Client, ghr.Owner, ghr.Repo, 1)

if ghr.Filter != "" {
releases = filterReleases(releases, ghr.Filter)
}

if !ghr.IncludePreReleases {
releases = removePreReleases(releases)
func (ghr *GitHubReleases) Diff() int {
if ghr.Release1 == ghr.Release2 {
return 0
}

versions := make([]*version.Version, len(releases))
for i, raw := range releases {
v, _ := version.NewVersion(raw.GetTagName())
versions[i] = v
}
sort.Sort(version.Collection(versions))

index1, index2 := 0, 0
indexesFound := 0
for i := len(versions) - 1; i > 0; i-- {
index1, index2, indexesFound := 0, 0, 0
for i := len(ghr.Versions) - 1; i > 0; i-- {
if indexesFound == 2 {
break
}
if versions[i].Original() == ghr.Release1 {
if ghr.Versions[i].Original() == ghr.Release1 {
index1 = i
continue
}
if versions[i].Original() == ghr.Release2 {
if ghr.Versions[i].Original() == ghr.Release2 {
index2 = i
continue
}
}

versionsBehind := int(math.Abs(float64(index1 - index2)))
if versionsBehind == len(ghr.Versions)-1 {
versionsBehind--
}

return versionsBehind, response, err
return versionsBehind
}

// getAllReleases will fetch all releases
Expand Down
10 changes: 3 additions & 7 deletions releasediff_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ func TestMain(m *testing.M) {
client := github.NewClient(tc)

repos := make(map[string]string)
repos["harbor"] = "v2.0.2"
repos["harbor-helm"] = "v1.5.0"
repos["ingress-nginx"] = "controller-v0.40.2"

var rate github.Rate
var wg sync.WaitGroup
Expand All @@ -29,15 +28,12 @@ func TestMain(m *testing.M) {
go func(name string, version string) {
defer wg.Done()

ghr, err := New(client, "goharbor", name, version, "", nil)
ghr, resp, err := New(client, "kubernetes", name, "controller-0.31.0", "controller-v0.34.1", &Options{Filter: "^controller-.*$", VerifyRelease: false})
if err != nil {
panic(err)
}

diff, resp, err := ghr.Diff()
if err != nil {
panic(err)
}
diff := ghr.Diff()
fmt.Printf("There are %d releases between %s and %s\n", diff, ghr.Release1, ghr.Release2)
rate = resp.Rate

Expand Down

0 comments on commit f40a911

Please sign in to comment.