Skip to content

Commit 5ea8771

Browse files
committed
Fix sync-tags handling of dependency tags
On-behalf-of: @SAP [email protected] Signed-off-by: Marko Mudrinić <[email protected]>
1 parent dc535dc commit 5ea8771

File tree

2 files changed

+71
-23
lines changed

2 files changed

+71
-23
lines changed

cmd/sync-tags/gomod.go

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import (
3434

3535
// updateGomodWithTaggedDependencies gets the dependencies at the given tag and fills go.mod and go.sum.
3636
// If anything is changed, it commits the changes. Returns true if go.mod changed.
37-
func updateGomodWithTaggedDependencies(tag string, depsRepo []string, semverTag bool) (bool, error) {
37+
func updateGomodWithTaggedDependencies(searchTag string, depsRepo []string, semverTag bool) (bool, error) {
3838
found := map[string]bool{}
3939
changed := false
4040

@@ -55,12 +55,59 @@ func updateGomodWithTaggedDependencies(tag string, depsRepo []string, semverTag
5555
return changed, fmt.Errorf("failed to get package at %s: %w", depPath, err)
5656
}
5757

58-
commit, commitTime, err := localOrPublishedTaggedCommitHashAndTime(dr, tag)
58+
commit, commitTime, err := localOrPublishedTaggedCommitHashAndTime(dr, searchTag)
5959
if err != nil {
60-
return changed, fmt.Errorf("failed to get tag %s for %q: %w", tag, depPkg, err)
60+
return changed, fmt.Errorf("failed to get tag %s for %q: %w", searchTag, depPkg, err)
6161
}
6262
rev := commit.String()
63-
pseudoVersionOrTag := fmt.Sprintf("v0.0.0-%s-%s", commitTime.UTC().Format("20060102150405"), rev[:12])
63+
64+
moduleMajor := uint64(0)
65+
tag := ""
66+
if semverTag {
67+
iter, err := dr.Tags()
68+
if err != nil {
69+
return changed, fmt.Errorf("failed to get tags for repo %s: %w", dep, err)
70+
}
71+
72+
var tags []string
73+
err = iter.ForEach(func(ref *plumbing.Reference) error {
74+
if tagObj, err := dr.TagObject(ref.Hash()); err == nil {
75+
if tagObj.Target == commit && strings.HasPrefix(strings.TrimPrefix(ref.Name().Short(), "origin/"), "v") {
76+
tags = append(tags, ref.Name().Short())
77+
}
78+
}
79+
80+
return nil
81+
})
82+
if err != nil {
83+
return changed, fmt.Errorf("failed to find semver tag for given search tag: %w", err)
84+
}
85+
iter.Close()
86+
87+
if len(tags) == 0 {
88+
return changed, fmt.Errorf("no semver tag found for given search tag %s", searchTag)
89+
}
90+
91+
// pick the highest semver tag
92+
semvers := make([]semver.Version, 0, len(tags))
93+
for _, t := range tags {
94+
sv, err := semver.Parse(strings.TrimPrefix(t, "v"))
95+
if err != nil {
96+
return changed, fmt.Errorf("failed to parse semver tag %s: %w", t, err)
97+
}
98+
semvers = append(semvers, sv)
99+
}
100+
semver.Sort(semvers)
101+
102+
latestSemver := semvers[len(semvers)-1]
103+
moduleMajor = latestSemver.Major
104+
if moduleMajor == 1 {
105+
moduleMajor = 0
106+
}
107+
tag = fmt.Sprintf("v%s", latestSemver.String())
108+
}
109+
110+
pseudoVersionOrTag := fmt.Sprintf("v%d.0.0-%s-%s", moduleMajor, commitTime.UTC().Format("20060102150405"), rev[:12])
64111

65112
// TODO(xmudrii): We are configured to always hit this case because we have --publish-semver-tags set to true,
66113
// so pseudo-version is not important. At some point, it would be nice to fix this.
@@ -126,7 +173,7 @@ func updateGomodWithTaggedDependencies(tag string, depsRepo []string, semverTag
126173
if err := tidyCommand.Run(); err != nil {
127174
return changed, fmt.Errorf("unable to run go mod tidy: %w", err)
128175
}
129-
fmt.Printf("Completed running go mod tidy for %s.\n", tag)
176+
fmt.Printf("Completed running go mod tidy for %s.\n", searchTag)
130177

131178
return changed, nil
132179
}

cmd/sync-tags/main.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -257,19 +257,24 @@ func main() {
257257
}
258258
rev := commit.String()
259259

260-
pseudoSemver, err := semver.Parse(strings.TrimPrefix(name, "v"))
260+
// The Go mod cache is built upon the target tag name,
261+
// not the source tag name, so we use generated tag name here.
262+
// Only if it doesn't exist for some reason, we fall back to
263+
// the original tag name.
264+
pseudoSemverString := strings.TrimPrefix(semverTag, "v")
265+
if pseudoSemverString == "" {
266+
pseudoSemverString = strings.TrimPrefix(name, "v")
267+
}
268+
pseudoSemver, err := semver.Parse(pseudoSemverString)
261269
if err != nil {
262270
glog.Fatalf("error parsing pseudo-version: %v", err)
263271
}
264-
265-
pseudoVersion := fmt.Sprintf("v0.0.0-%s-%s", commitTime.UTC().Format("20060102150405"), rev[:12])
266-
if pseudoSemver.Major >= 2 {
267-
if len(pseudoSemver.Pre) == 0 {
268-
pseudoVersion = fmt.Sprintf("v%d.%d.%d-0.%s-%s", pseudoSemver.Major, pseudoSemver.Minor, pseudoSemver.Patch+1, commitTime.UTC().Format("20060102150405"), rev[:12])
269-
} else {
270-
pseudoVersion = fmt.Sprintf("v%s.0.%s-%s", strings.TrimPrefix(name, "v"), commitTime.UTC().Format("20060102150405"), rev[:12])
271-
}
272+
// Both v0 and v1 use v0 in pseudo-version.
273+
moduleMajor := pseudoSemver.Major
274+
if moduleMajor == 1 {
275+
moduleMajor = 0
272276
}
277+
pseudoVersion := fmt.Sprintf("v%d.0.0-%s-%s", moduleMajor, commitTime.UTC().Format("20060102150405"), rev[:12])
273278

274279
fmt.Printf("Clearing cache for local tag %s.\n", pseudoVersion)
275280
if err := cleanCacheForTag(pseudoVersion); err != nil {
@@ -346,11 +351,7 @@ func main() {
346351
var changed bool
347352
_, err = os.Stat("go.mod")
348353
if err == nil {
349-
if publishSemverTag {
350-
changed = updateGoMod(semverTag, dependentRepos, true)
351-
} else {
352-
changed = updateGoMod(bName, dependentRepos, false)
353-
}
354+
changed = updateGoMod(bName, dependentRepos, publishSemverTag)
354355
}
355356

356357
if changed {
@@ -538,11 +539,11 @@ func checkoutBranchTagCommit(r *gogit.Repository, bh plumbing.Hash, dependentRep
538539
return wt
539540
}
540541

541-
func updateGoMod(tag string, dependentRepos []string, publishSemverTags bool) bool {
542-
fmt.Printf("Updating go.mod and go.sum to point to %s tag.\n", tag)
543-
changed, err := updateGomodWithTaggedDependencies(tag, dependentRepos, publishSemverTags)
542+
func updateGoMod(searchTag string, dependentRepos []string, publishSemverTags bool) bool {
543+
fmt.Printf("Updating go.mod and go.sum to point to %s tag.\n", searchTag)
544+
changed, err := updateGomodWithTaggedDependencies(searchTag, dependentRepos, publishSemverTags)
544545
if err != nil {
545-
glog.Fatalf("Failed to update go.mod and go.sum for tag %s: %v", tag, err)
546+
glog.Fatalf("Failed to update go.mod and go.sum for tag %s: %v", searchTag, err)
546547
}
547548
return changed
548549
}

0 commit comments

Comments
 (0)