Skip to content

Commit c827fd4

Browse files
committed
x/exp/cmd/gorelease: suggest a minor version increment if requirements increase
Fixes golang/go#37564 Change-Id: I1aa8a4178adfad99542a478c1cd0fd6a00e23428 Reviewed-on: https://go-review.googlesource.com/c/exp/+/255880 Trust: Jean de Klerk <deklerk@google.com> Trust: Jay Conrod <jayconrod@google.com> Run-TryBot: Jean de Klerk <deklerk@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Jay Conrod <jayconrod@google.com>
1 parent 18d7dbd commit c827fd4

13 files changed

+184
-6
lines changed

cmd/gorelease/gorelease.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,19 @@ func loadDownloadedModule(modPath, version, max string) (m moduleInfo, err error
438438
return moduleInfo{}, err
439439
}
440440

441+
// Attempt to load the mod file, if it exists.
442+
m.goModPath = filepath.Join(m.modRoot, "go.mod")
443+
if m.goModData, err = ioutil.ReadFile(m.goModPath); err != nil && !os.IsNotExist(err) {
444+
return moduleInfo{}, fmt.Errorf("reading go.mod: %v", err)
445+
}
446+
if err == nil {
447+
m.goModFile, err = modfile.ParseLax(m.goModPath, m.goModData, nil)
448+
if err != nil {
449+
return moduleInfo{}, err
450+
}
451+
}
452+
// The modfile might not exist, leading to err != nil. That's OK - continue.
453+
441454
return m, nil
442455
}
443456

cmd/gorelease/report.go

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ func (r *report) suggestVersion() {
231231

232232
if pre != "" {
233233
// suggest non-prerelease version
234-
} else if r.haveCompatibleChanges || (r.haveIncompatibleChanges && major == "0") {
234+
} else if r.haveCompatibleChanges || (r.haveIncompatibleChanges && major == "0") || r.requirementsChanged() {
235235
minor = incDecimal(minor)
236236
patch = "0"
237237
} else {
@@ -240,6 +240,52 @@ func (r *report) suggestVersion() {
240240
setVersion(fmt.Sprintf("v%s.%s.%s", major, minor, patch))
241241
}
242242

243+
// requirementsChanged reports whether requirements have changed from base to
244+
// version.
245+
//
246+
// requirementsChanged reports true for,
247+
// - A requirement was upgraded to a higher minor version.
248+
// - A requirement was added.
249+
// - The version of Go was incremented.
250+
//
251+
// It does not report true when, for example, a requirement was downgraded or
252+
// remove. We care more about the former since that might force dependent
253+
// modules that have the same dependency to upgrade.
254+
func (r *report) requirementsChanged() bool {
255+
if r.base.goModFile == nil {
256+
// There wasn't a modfile before, and now there is.
257+
return true
258+
}
259+
260+
// baseReqs is a map of module path to MajorMinor of the base module
261+
// requirements.
262+
baseReqs := make(map[string]string)
263+
for _, r := range r.base.goModFile.Require {
264+
baseReqs[r.Mod.Path] = r.Mod.Version
265+
}
266+
267+
for _, r := range r.release.goModFile.Require {
268+
if _, ok := baseReqs[r.Mod.Path]; !ok {
269+
// A module@version was added to the "require" block between base
270+
// and release.
271+
return true
272+
}
273+
if semver.Compare(semver.MajorMinor(r.Mod.Version), semver.MajorMinor(baseReqs[r.Mod.Path])) > 0 {
274+
// The version of r.Mod.Path increased from base to release.
275+
return true
276+
}
277+
}
278+
279+
if r.release.goModFile.Go != nil && r.base.goModFile.Go != nil {
280+
if r.release.goModFile.Go.Version > r.base.goModFile.Go.Version {
281+
// The Go version increased from base to release.
282+
return true
283+
}
284+
}
285+
286+
return false
287+
}
288+
243289
// isSuccessful returns true the module appears to be safe to release at the
244290
// proposed or suggested version.
245291
func (r *report) isSuccessful() bool {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
-- go.mod --
2+
module example.com/require
3+
4+
go 1.12
5+
-- require.go --
6+
package require
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
-- go.mod --
2+
module example.com/require
3+
4+
go 1.12
5+
6+
require example.com/basic v1.0.1
7+
-- go.sum --
8+
example.com/basic v1.0.1/go.mod h1:pv9xTX7lhV6R1XNYo1EcI/DQqKxDyhNTN+K1DjHW2Oo=
9+
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
10+
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
11+
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
12+
-- require.go --
13+
package require
14+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- go.mod --
2+
module example.com/require
3+
4+
go 1.12
5+
6+
require example.com/basic v1.1.0
7+
-- go.sum --
8+
example.com/basic v1.1.0/go.mod h1:pv9xTX7lhV6R1XNYo1EcI/DQqKxDyhNTN+K1DjHW2Oo=
9+
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
10+
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
11+
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
12+
-- require.go --
13+
package require
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
This directory contain tests that assert gorelease behavior when module
2+
requirements (and require statements in the go.mod) have changed.
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
mod=example.com/tidy
1+
mod=example.com/require
22
base=v0.0.1
33
-- want --
4-
Suggested version: v0.0.2
4+
Suggested version: v0.1.0
55
-- go.mod --
6-
module example.com/tidy
6+
module example.com/require
77

88
go 1.12
99

@@ -13,5 +13,5 @@ example.com/basic v1.0.1/go.mod h1:pv9xTX7lhV6R1XNYo1EcI/DQqKxDyhNTN+K1DjHW2Oo=
1313
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
1414
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
1515
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
16-
-- tidy.go --
17-
package tidy
16+
-- require.go --
17+
package require
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
mod=example.com/require
2+
base=v0.0.1
3+
-- want --
4+
Suggested version: v0.0.2
5+
-- go.mod --
6+
module example.com/require
7+
8+
go 1.11
9+
-- go.sum --
10+
-- require.go --
11+
package require
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
mod=example.com/require
2+
base=v0.1.1
3+
-- want --
4+
Suggested version: v0.1.2
5+
-- go.mod --
6+
module example.com/require
7+
8+
go 1.12
9+
10+
require example.com/basic v0.0.1
11+
-- go.sum --
12+
example.com/basic v0.0.1/go.mod h1:pv9xTX7lhV6R1XNYo1EcI/DQqKxDyhNTN+K1DjHW2Oo=
13+
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
14+
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
15+
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
16+
-- require.go --
17+
package require
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
mod=example.com/require
2+
base=v0.0.1
3+
-- want --
4+
Suggested version: v0.1.0
5+
-- go.mod --
6+
module example.com/require
7+
8+
go 1.13
9+
-- go.sum --
10+
-- require.go --
11+
package require

0 commit comments

Comments
 (0)