in release/release.go [261:326]
func BuildReleaseManifest(moduleTree *gomod.ModuleTree, id string, modules map[string]*Module, verbose bool, preRelease string) (rm Manifest, err error) {
rm.ID = id
rm.WithReleaseTag = true
rm.Modules = make(map[string]ModuleManifest)
for modulePath, mod := range modules {
if mod.Changes == 0 || mod.ModuleConfig.NoTag {
continue
}
nextVersion, err := CalculateNextVersion(modulePath, mod.Latest, mod.ModuleConfig, mod.ChangeAnnotations, preRelease)
if err != nil {
return Manifest{}, err
}
var fileChanges []string
if verbose {
fileChanges = mod.FileChanges
}
mm := ModuleManifest{
ModulePath: modulePath,
From: mod.Latest,
To: nextVersion,
Changes: mod.Changes,
FileChanges: fileChanges,
Annotations: annotationsToIDs(mod.ChangeAnnotations),
}
rm.Modules[mod.RelativeRepoPath] = mm
moduleTag, err := git.ToModuleTag(mod.RelativeRepoPath, nextVersion)
if err != nil {
return Manifest{}, err
}
rm.Tags = append(rm.Tags, moduleTag)
}
// Once all module next versions have discovered, update manifest if this
// is a single or multi module repository. Only multi-module repositories
// have a release tag created. Single module repositories use the root
// module's version for the release id.
if repoModuleList := moduleTree.List(); len(repoModuleList) == 1 {
var singleModRepoID string
rootChangeModule, ok := rm.Modules[repoModuleList[0].Path()]
if ok {
singleModRepoID = rootChangeModule.To
} else {
rootRepoModule, ok := FindModuleViaRelativeRepoPath(modules, repoModuleList[0].Path())
if !ok {
return Manifest{}, fmt.Errorf("root module metadata not found, %v, %v, %v",
repoModuleList[0].Path(), modules, rm.Modules)
}
singleModRepoID = rootRepoModule.Latest
}
rm.ID = singleModRepoID
rm.WithReleaseTag = false
}
sort.Strings(rm.Tags)
return rm, nil
}