func()

in cmd/distrogen/distribution.go [257:329]


func (d *DistributionGenerator) Compare() error {
	wd, err := os.Getwd()
	if err != nil {
		return fmt.Errorf("could not get working directory: %w", err)
	}

	_, err = os.Stat(d.GeneratePath)
	if err != nil {
		if os.IsNotExist(err) {
			panic(fmt.Sprintf("generated directory %s does not exist, if you see this it's a code error in distrogen", d.GeneratePath))
		}
		return wrapExitCodeError(
			unexpectErrExitCode,
			fmt.Errorf("could not stat generated directory: %w", err),
		)
	}
	generateDest := filepath.Join(wd, d.GenerateDirName)

	_, err = os.Stat(generateDest)
	if err != nil {
		if os.IsNotExist(err) {
			return fmt.Errorf("%w: %s", ErrDistroFolderDoesNotExist, generateDest)
		}
		return wrapExitCodeError(
			unexpectErrExitCode,
			fmt.Errorf("could not stat existing distro directory: %w", err),
		)
	}

	logger.Debug("comparing %s to %s", d.GeneratePath, generateDest)

	generatedContent, err := d.getGeneratedFilesInDir()
	if err != nil {
		return wrapExitCodeError(
			unexpectErrExitCode,
			fmt.Errorf("could not get generated files: %w", err),
		)
	}
	existingContent, err := d.getGeneratedFilesInDir()
	if err != nil {
		return wrapExitCodeError(
			unexpectErrExitCode,
			fmt.Errorf("could not get existing files: %w", err),
		)
	}

	errs := make(CollectionError)
	for name, existingFile := range existingContent {
		generatedFile, ok := generatedContent[name]
		if !ok {
			errs[name] = fmt.Errorf("existing file not found in generated distribution")
			continue
		}
		existingFile.checked = true
		generatedFile.checked = true
		diff := cmp.Diff(existingFile.content, generatedFile.content)
		if diff != "" {
			errs[name] = fmt.Errorf("existing file differs from generated distribution:\n%s", diff)
		}
	}

	for name, generatedFile := range generatedContent {
		if !generatedFile.checked {
			errs[name] = fmt.Errorf("generated file not found in existing distribution")
		}
	}

	if len(errs) > 0 {
		return fmt.Errorf("%s: %w:\n\n%v", d.Spec.Name, ErrDistroFolderDiff, errs)
	}

	return nil
}