func runCreateCommand()

in cmd/changelog/create.go [65:172]


func runCreateCommand(args []string, repoRoot string) error {
	if err := createFlagSet.Parse(args); err != nil {
		return err
	}

	discoverer := gomod.NewDiscoverer(repoRoot)

	if err := discoverer.Discover(); err != nil {
		return fmt.Errorf("failed to discover repository go modules: %w", err)
	}

	modules := discoverer.Modules()

	if err := validateCreateCommandArguments(createFlagSet.Args(), modules); err != nil {
		return fmt.Errorf("invalid arguments: %w", err)
	}

	modulesToAnnotate := make(map[string]struct{})

	for _, arg := range createFlagSet.Args() {
		modulesToAnnotate[arg] = struct{}{}
	}

	var commitChanges []string

	var err error
	if createCommand.Commit != "" {
		commitChanges, err = git.Changed(repoRoot, createCommand.Commit)
		if err != nil {
			return fmt.Errorf("failed to get changed files for commit: %v", err)
		}
	} else if createCommand.CommitStart != "" && createCommand.CommitEnd != "" {
		commitChanges, err = git.Changes(repoRoot, createCommand.CommitStart, createCommand.CommitEnd)
		if err != nil {
			return fmt.Errorf("failed to get changed files for commit: %v", err)
		}
	}

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

			if changes, err := gomod.FilterModuleFiles(module, commitChanges); err != nil {
				return err
			} else if len(changes) != 0 {
				modulesToAnnotate[module.Path()] = struct{}{}
			}
		}
	}

	annotation, err := changelog.NewAnnotation()
	if err != nil {
		return err
	}

	annotation.Type = changelog.ChangeType(createCommand.Type)
	if annotation.Type == changelog.UnknownChangeType {
		annotation.Type = changelog.BugFixChangeType
	}

	if len(createCommand.DescriptionFile) > 0 {
		if createCommand.DescriptionFile == "-" {
			buff := &bytes.Buffer{}
			_, err := io.Copy(buff, os.Stdin)
			if err != nil {
				return err
			}
			annotation.Description = buff.String()
		} else {
			fileBytes, err := os.ReadFile(createCommand.DescriptionFile)
			if err != nil {
				return err
			}
			annotation.Description = string(fileBytes)
		}
	} else {
		annotation.Description = createCommand.Description
	}

	annotation.Collapse = createCommand.Collapse

	if len(modulesToAnnotate) > 0 {
		for moduleDir := range modulesToAnnotate {
			annotation.Modules = append(annotation.Modules, moduleDir)
		}
	}

	sort.Strings(annotation.Modules)

	if createCommand.NonInteractive {
		if invalid := validateModules(annotation.Modules, modules); len(invalid) > 0 {
			return fmt.Errorf("invalid modules: %v", invalid)
		}

		if err = changelog.Validate(annotation); err != nil {
			return err
		}
	} else {
		if err = interactiveEdit(&annotation, modules); err != nil {
			return err
		}
	}

	return changelog.WriteAnnotation(repoRoot, annotation)
}