/
releases.go
110 lines (102 loc) · 3.56 KB
/
releases.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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package opts
import (
"bytes"
"fmt"
"io"
"net/http"
"github.com/jenkins-x/jx/v2/pkg/dependencymatrix"
"github.com/jenkins-x/jx/v2/pkg/log"
"sigs.k8s.io/yaml"
"github.com/jenkins-x/jx/v2/pkg/gits/releases"
"github.com/jenkins-x/jx/v2/pkg/gits"
v1 "github.com/jenkins-x/jx/v2/pkg/apis/jenkins.io/v1"
"github.com/pkg/errors"
)
// ParseDependencyUpdateMessage parses commit messages, and if it's a dependency update message parses it
//
// A complete update message looks like:
//
// chore(dependencies): update ((<owner>/)?<repo>|https://<gitHost>/<owner>/<repo>) from <fromVersion> to <toVersion>
//
// <description of update method>
//
// <fromVersion>, <toVersion> and <repo> are required fields. The markdown URL format is optional, and a plain <owner>/<repo>
// can be used.
func (o *CommonOptions) ParseDependencyUpdateMessage(msg string, commitURL string) (*v1.DependencyUpdate, *dependencymatrix.DependencyUpdates, error) {
parsedMessage, err := dependencymatrix.ParseDependencyMessage(msg)
if parsedMessage == nil {
return nil, nil, nil
}
if err != nil {
return nil, nil, errors.WithStack(err)
}
commitInfo, err := gits.ParseGitURL(commitURL)
if err != nil {
return nil, nil, errors.Wrapf(err, "parsing %s", commitURL)
}
if parsedMessage.Owner == "" {
parsedMessage.Owner = commitInfo.Organisation
}
if parsedMessage.Scheme == "" {
parsedMessage.Scheme = commitInfo.Scheme
}
if parsedMessage.Host == "" {
parsedMessage.Host = commitInfo.Host
}
update := &v1.DependencyUpdate{
DependencyUpdateDetails: v1.DependencyUpdateDetails{
Owner: parsedMessage.Owner,
Repo: parsedMessage.Repo,
Host: parsedMessage.Host,
URL: fmt.Sprintf("%s://%s/%s/%s", parsedMessage.Scheme, parsedMessage.Host, parsedMessage.Owner, parsedMessage.Repo),
FromVersion: parsedMessage.FromVersion,
ToVersion: parsedMessage.ToVersion,
Component: parsedMessage.Component,
},
}
provider, _, err := o.CreateGitProviderForURLWithoutKind(update.URL)
if err != nil {
return nil, nil, errors.Wrapf(err, "creating git provider for %s", update.URL)
}
var upstreamUpdates dependencymatrix.DependencyUpdates
toRelease, err := releases.GetRelease(update.ToVersion, update.Owner, update.Repo, provider)
if err != nil {
return nil, nil, errors.WithStack(err)
}
if toRelease != nil {
update.ToReleaseHTMLURL = toRelease.HTMLURL
update.ToReleaseName = toRelease.Name
if toRelease.Assets != nil {
for _, asset := range *toRelease.Assets {
if asset.Name == dependencymatrix.DependencyUpdatesAssetName {
resp, err := http.Get(asset.BrowserDownloadURL)
if err != nil {
return nil, nil, errors.Wrapf(err, "retrieving dependency updates from %s", asset.BrowserDownloadURL)
}
defer resp.Body.Close()
// Write the body
var b bytes.Buffer
_, err = io.Copy(&b, resp.Body)
str := b.String()
log.Logger().Debugf("Dependency update yaml is %s", str)
if err != nil {
return nil, nil, errors.Wrapf(err, "retrieving dependency updates from %s", asset.BrowserDownloadURL)
}
err = yaml.Unmarshal([]byte(str), &upstreamUpdates)
if err != nil {
return nil, nil, errors.Wrapf(err, "unmarshaling dependency updates from %s", asset.BrowserDownloadURL)
}
}
}
}
}
fromRelease, err := releases.GetRelease(update.FromVersion, update.Owner, update.Repo, provider)
if err != nil {
return nil, nil, errors.WithStack(err)
}
if fromRelease != nil {
update.FromReleaseHTMLURL = fromRelease.HTMLURL
update.FromReleaseName = fromRelease.Name
}
return update, &upstreamUpdates, nil
}