func main()

in cmd/annotatestablegen/main.go [30:122]


func main() {
	cwd, err := os.Getwd()
	if err != nil {
		log.Fatalf("failed to get current working directory: %v", err)
	}

	repoRoot, err := repotools.FindRepoRoot(cwd)
	if err != nil {
		log.Fatalf("failed to get git repo root: %v", err)
	}

	tags, err := git.Tags(repoRoot)
	if err != nil {
		log.Fatalf("failed to get git repository tags: %v", err)
	}

	moduleTags := git.ParseModuleTags(tags)

	discoverer := gomod.NewDiscoverer(repoRoot)

	if err := discoverer.Discover(); err != nil {
		log.Fatalf("failed to discover go modules: %v", err)
	}

	modules := discoverer.Modules()
	if err != nil {
		log.Fatalf("failed to get modules relative to repo: %v", err)
	}

	var toRelease []string

	for it := modules.Iterator(); ; {
		module := it.Next()
		if module == nil {
			break
		}

		fullPath := module.AbsPath()

		isGenerated, err := isGeneratedModule(fullPath)
		if err != nil {
			log.Fatalf("failed to determine if module is generated: %v", err)
		}
		if !isGenerated {
			continue
		}

		stable, err := isGeneratedModuleStable(fullPath)
		if err != nil {
			log.Fatalf("failed to determine if generated module is stable: %v", err)
		}

		latest, ok := moduleTags.Latest(module.Path())
		if !ok && stable {
			toRelease = append(toRelease, module.Path())
		} else if ok && stable && len(semver.Prerelease(latest)) > 0 {
			toRelease = append(toRelease, module.Path())
		}
	}

	if len(toRelease) == 0 {
		log.Printf("[INFO] no generated modules require release annotation")
		return
	}

	var annotation changelog.Annotation

	annotation, err = changelog.LoadAnnotation(repoRoot, reservedChangeID)
	if err != nil && !os.IsNotExist(err) {
		log.Fatalf("failed to load module annotation: %v", err)
	}
	if err != nil {
		annotation, err = changelog.NewAnnotation()
		if err != nil {
			log.Fatalf("failed to generated annotation: %v", err)
		}
		annotation.ID = reservedChangeID
		annotation.Type = changelog.ReleaseChangeType
		annotation.Description = description
	} else if annotation.Type != changelog.ReleaseChangeType {
		log.Fatalf("annotation type does not match the expected type")
	}

	sort.Strings(annotation.Modules)

	for _, modDir := range toRelease {
		annotation.Modules = repotools.AppendIfNotPresent(annotation.Modules, modDir)
	}

	if err := changelog.WriteAnnotation(repoRoot, annotation); err != nil {
		log.Fatalf("failed to write annotation: %v", err)
	}
}