func BuildReleaseManifest()

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
}