This repository has been archived by the owner on Jan 28, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
common.go
94 lines (74 loc) · 1.8 KB
/
common.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package stable
import (
"fmt"
"github.com/mcuadros/go-version"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/transport"
"gopkg.in/src-d/go-git.v4/storage/memory"
)
// Package represent a golang package
type Package struct {
Name string
Repository transport.Endpoint
Constrain string
Versions Versions
}
type Versions map[string]*plumbing.Reference
func NewVersions(refs memory.ReferenceStorage) Versions {
versions := make(Versions, 0)
for _, ref := range refs {
if !ref.IsTag() && !ref.IsBranch() {
continue
}
versions[ref.Name().Short()] = ref
}
return versions
}
func (v Versions) Match(needed string) []*plumbing.Reference {
c := newConstrain(needed)
var names []string
for _, ref := range v {
name := ref.Name().Short()
if c.Match(version.Normalize(name)) {
names = append(names, name)
}
}
version.Sort(names)
var matched []*plumbing.Reference
for n := len(names) - 1; n >= 0; n-- {
matched = append(matched, v[names[n]])
}
return matched
}
func (v Versions) BestMatch(needed string) *plumbing.Reference {
if version, ok := v[needed]; ok {
return version
}
matched := v.Match(needed)
if len(matched) != 0 {
return matched[0]
}
if needed == "v0" {
return v.handleV0()
}
return nil
}
func (v Versions) handleV0() *plumbing.Reference {
return v.BestMatch("master")
}
func (v Versions) Mayor() map[string]*plumbing.Reference {
output := make(map[string]*plumbing.Reference, 0)
for i := 0; i < 100; i++ {
mayor := fmt.Sprintf("v%d", i)
if m := v.BestMatch(mayor); m != nil {
output[mayor] = m
}
}
return output
}
func newConstrain(needed string) *version.ConstraintGroup {
if needed[0] == 'v' && needed[1] >= 28 && needed[1] <= 57 {
needed = needed[1:]
}
return version.NewConstrainGroupFromString(needed + ".*")
}