func ArchivePackage()

in archiver/archive.go [26:87]


func ArchivePackage(w io.Writer, properties PackageProperties) (err error) {
	zipWriter := zip.NewWriter(w)
	defer func() {
		var multiErr multierror.Errors

		if err != nil {
			multiErr = append(multiErr, err)
		}

		err = zipWriter.Close()
		if err != nil {
			multiErr = append(multiErr, fmt.Errorf("closing zip writer failed: %w", err))
		}

		if multiErr != nil {
			err = multiErr.Err()
		}
	}()

	rootDir := fmt.Sprintf("%s-%s", properties.Name, properties.Version)
	err = filepath.Walk(properties.Path, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		relativePath, err := filepath.Rel(properties.Path, path)
		if err != nil {
			return fmt.Errorf("finding relative path failed (packagePath: %s, path: %s): %w", properties.Path, path, err)
		}

		if relativePath == "." {
			return nil
		}

		header, err := buildArchiveHeader(info, filepath.Join(rootDir, relativePath))
		if err != nil {
			return fmt.Errorf("building archive header failed (path: %s): %w", relativePath, err)
		}

		w, err = zipWriter.CreateHeader(header)
		if err != nil {
			return fmt.Errorf("writing header failed (path: %s): %w", relativePath, err)
		}

		if !info.IsDir() {
			err = writeFileContentToArchive(path, w)
			if err != nil {
				return fmt.Errorf("archiving file content failed (path: %s): %w", path, err)
			}
		}
		return nil
	})
	if err != nil {
		return fmt.Errorf("processing package path '%s' failed: %w", properties.Path, err)
	}

	err = zipWriter.Flush()
	if err != nil {
		return fmt.Errorf("flushing zip writer failed: %w", err)
	}
	return nil
}