Skip to content

Commit 97baea3

Browse files
committed
make pinning works with local flag, enable auto update on fork and non-fork repo
1 parent b94888f commit 97baea3

File tree

5 files changed

+104
-41
lines changed

5 files changed

+104
-41
lines changed

cmd/gorepomod/gorepomod_test.go

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,75 @@
11
package main
22

33
import (
4-
"bytes"
5-
"log"
64
"os/exec"
75
"testing"
6+
7+
"github.com/stretchr/testify/assert"
88
)
99

10-
func TestLoadRepoManager(t *testing.T) {
10+
func TestListCommand(t *testing.T) {
1111
// Assuming gorepomod is installed
12-
path, err := exec.LookPath("gorepomod")
13-
if err != nil {
14-
log.Fatal(err)
15-
}
1612
var testCases = map[string]struct {
17-
cmd *exec.Cmd
13+
isFork bool
14+
cmd string
15+
expected string
1816
}{
19-
"withLocalFlag": {
20-
cmd: exec.Command(path, "list --local"),
17+
"upstreamWithLocalFlag": {
18+
isFork: false,
19+
cmd: "cd ../.. && gorepomod list --local",
20+
},
21+
"upstreamWithNoLocalFlag": {
22+
isFork: false,
23+
cmd: "cd ../.. && gorepomod list",
2124
},
22-
"noLocalFlag": {
23-
cmd: exec.Command(path, "list"),
25+
"forkWithLocalFlag": {
26+
isFork: true,
27+
cmd: "cd ../.. && gorepomod list --local",
28+
},
29+
"forkWithNoLocalFlag": {
30+
isFork: true,
31+
cmd: "cd ../.. && gorepomod list",
2432
},
2533
}
2634

2735
for _, tc := range testCases {
28-
err := tc.cmd.Run()
36+
out, err := exec.Command("bash", "-c", tc.cmd).Output()
37+
if err != nil {
38+
assert.Error(t, err, "exit status 1")
39+
}
40+
assert.Greater(t, len(string(out)), 1)
41+
}
42+
}
2943

30-
var out bytes.Buffer
31-
tc.cmd.Stdout = &out
44+
func TestPinCommand(t *testing.T) {
45+
// Assuming gorepomod is installed
46+
var testCases = map[string]struct {
47+
isFork bool
48+
cmd string
49+
}{
50+
"upstreamWithLocalFlag": {
51+
isFork: false,
52+
cmd: "cd ../.. && gorepomod pin kyaml --local",
53+
},
54+
"upstreamWithNoLocalFlag": {
55+
isFork: false,
56+
cmd: "cd ../.. && gorepomod pin kyaml",
57+
},
58+
"forkWithLocalFlag": {
59+
isFork: true,
60+
cmd: "cd ../.. && gorepomod pin kyaml --local",
61+
},
62+
"forkWithNoLocalFlag": {
63+
isFork: true,
64+
cmd: "cd ../.. && gorepomod pin kyaml",
65+
},
66+
}
3267

68+
for _, tc := range testCases {
69+
out, err := exec.Command("bash", "-c", tc.cmd).Output()
3370
if err != nil {
34-
log.Fatal(err)
71+
assert.Error(t, err, "exit status 1")
3572
}
73+
assert.Greater(t, len(string(out)), 1)
3674
}
3775
}

cmd/gorepomod/internal/edit/editor.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ func (e *Editor) Tidy() error {
5757
func (e *Editor) Pin(target misc.LaModule, oldV, newV semver.SemVer) error {
5858
err := e.run(
5959
"edit",
60-
"-dropreplace="+target.ImportPath(),
61-
"-dropreplace="+target.ImportPath()+"@"+oldV.String(),
62-
"-require="+target.ImportPath()+"@"+newV.String(),
60+
"-dropreplace=sigs.k8s.io/kustomize/"+string(target.ShortName()),
61+
"-dropreplace=sigs.k8s.io/kustomize/"+string(target.ShortName())+"@"+oldV.String(),
62+
"-require=sigs.k8s.io/kustomize/"+string(target.ShortName())+"@"+newV.String(),
6363
)
6464
if err != nil {
6565
return err

cmd/gorepomod/internal/git/runner.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,12 @@ func (gr *Runner) CheckoutMainBranch() error {
261261
// FetchRemote does that.
262262
func (gr *Runner) FetchRemote(remote misc.TrackedRepo) error {
263263
gr.comment("fetching remote")
264-
return gr.runNoOut(noHarmDone, "fetch", string(remote))
264+
err := gr.runNoOut(noHarmDone, "fetch", string(remote))
265+
if err != nil {
266+
// If current repo is fork
267+
return gr.runNoOut(noHarmDone, "fetch", string(remoteUpstream))
268+
}
269+
return err
265270
}
266271

267272
// MergeFromRemoteMain does a fast forward only merge with main branch.
@@ -357,15 +362,19 @@ func (gr *Runner) DeleteTagFromRemote(
357362
func (gr *Runner) GetLatestTag(releaseBranch string) (string, error) {
358363
var latestTag string
359364
// Assuming release branch has this format: release-path/to/module-vX.Y.Z
360-
// and each release branch maintains tags, get latest tag from `releaseBranch`
361-
gr.comment("getting latest tags from release branch")
362-
latestTag, err := gr.run(noHarmDone, "describe", "--tags", "--abbrev=0")
363-
if err != nil {
364-
fmt.Errorf("error getting latest tag for %s: %q", releaseBranch, err.Error())
365-
}
366-
if len(latestTag) < 1 {
365+
// and each release branch maintains tags, extract version from latest `releaseBranch`
366+
gr.comment("extract version from latest release branch")
367+
filteredBranchList, err := gr.run(noHarmDone, "branch", "-a", "--list", "*"+string(releaseBranch)+"*", "--sort=-committerdate")
368+
if len(filteredBranchList) < 1 {
367369
fmt.Errorf("latest tag not found for %s", releaseBranch)
368370
return "", err
369371
}
372+
newestBranch := strings.Split(strings.ReplaceAll(filteredBranchList, "\r\n", "\n"), "\n")
373+
split := strings.Split(newestBranch[0], "-")
374+
latestTag = split[len(split)-1]
375+
if err != nil {
376+
fmt.Errorf("error getting latest tag for %s: %q", releaseBranch, err.Error())
377+
}
378+
370379
return latestTag, nil
371380
}

cmd/gorepomod/internal/repo/manager.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,6 @@ func (mgr *Manager) Tidy(doIt bool) error {
5151

5252
func (mgr *Manager) Pin(
5353
doIt bool, target misc.LaModule, newV semver.SemVer) error {
54-
// Always use latest tag while does not removing manual usage capability
55-
if newV == semver.Zero() {
56-
releaseBranch := fmt.Sprintf("release-%s", target.ShortName())
57-
gr := git.NewLoud(mgr.AbsPath(), doIt, false)
58-
latest, err := gr.GetLatestTag(string(releaseBranch))
59-
if err != nil {
60-
fmt.Errorf("cannot get latest tag for %s", target)
61-
}
62-
newV, err = semver.Parse(latest)
63-
if err != nil {
64-
fmt.Errorf("failed to parse value for %s", latest)
65-
}
66-
}
6754
return mgr.modules.Apply(func(m misc.LaModule) error {
6855
if yes, oldVersion := m.DependsOn(target); yes {
6956
return edit.New(m, doIt).Pin(target, oldVersion, newV)

cmd/gorepomod/main.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import (
88
"os"
99

1010
"sigs.k8s.io/kustomize/cmd/gorepomod/internal/arguments"
11+
"sigs.k8s.io/kustomize/cmd/gorepomod/internal/git"
1112
"sigs.k8s.io/kustomize/cmd/gorepomod/internal/misc"
1213
"sigs.k8s.io/kustomize/cmd/gorepomod/internal/repo"
14+
"sigs.k8s.io/kustomize/cmd/gorepomod/internal/semver"
1315
)
1416

1517
//go:generate go run internal/gen/main.go
@@ -72,10 +74,37 @@ func actualMain() error {
7274
return mgr.Tidy(args.DoIt())
7375
case arguments.Pin:
7476
v := args.Version()
77+
// Update branch history
78+
gr := git.NewQuiet(mgr.AbsPath(), args.DoIt(), false)
79+
gr.FetchRemote("master")
80+
7581
if v.IsZero() {
82+
// Always use latest tag while does not removing manual usage capability
83+
releaseBranch := fmt.Sprintf("release-%s", targetModule.ShortName())
84+
fmt.Printf("new version not specified, fall back to latest version according to release branch: %s-*\n", releaseBranch)
85+
latest, err := gr.GetLatestTag(string(releaseBranch))
86+
if err != nil {
87+
fmt.Errorf("cannot get latest tag for %s, falling back to local version %s", targetModule.ShortName(), targetModule.VersionLocal())
88+
v = targetModule.VersionLocal()
89+
return mgr.Pin(args.DoIt(), targetModule, v)
90+
91+
}
92+
v, err = semver.Parse(latest)
93+
if err != nil {
94+
fmt.Errorf("failed to parse value for %s, falling back to local version %s", latest, targetModule.VersionLocal())
95+
v = targetModule.VersionLocal()
96+
return mgr.Pin(args.DoIt(), targetModule, v)
97+
}
98+
}
99+
100+
// If we can't find revision extracted from latest version specified on release branch
101+
err = mgr.Pin(args.DoIt(), targetModule, v)
102+
if err != nil {
103+
fmt.Errorf("cannot determine latest version existence, retrying with local version %s", targetModule.VersionLocal())
76104
v = targetModule.VersionLocal()
105+
err = mgr.Pin(args.DoIt(), targetModule, v)
77106
}
78-
return mgr.Pin(args.DoIt(), targetModule, v)
107+
return err
79108
case arguments.UnPin:
80109
return mgr.UnPin(args.DoIt(), targetModule, conditionalModule)
81110
case arguments.Release:

0 commit comments

Comments
 (0)