mirror of https://github.com/artifacthub/hub.git
46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
package repo
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/artifacthub/hub/internal/hub"
|
|
)
|
|
|
|
// OLMOCIExporter provides a mechanism to export the packages available in an
|
|
// OLM repository stored in an OCI registry.
|
|
type OLMOCIExporter struct{}
|
|
|
|
// ExportRepository exports the packages available in a repository stored in a
|
|
// OCI registry using the appregistry manifest format. It returns the temporary
|
|
// directory where the packages will be stored. It's the caller's responsibility
|
|
// to delete it when done.
|
|
func (e *OLMOCIExporter) ExportRepository(ctx context.Context, r *hub.Repository) (string, error) {
|
|
// Setup temporary directory to store content
|
|
tmpDir, err := ioutil.TempDir("", "artifact-hub")
|
|
if err != nil {
|
|
return "", fmt.Errorf("error creating temp dir: %w", err)
|
|
}
|
|
|
|
// Export repository packages using opm (external tool)
|
|
indexRef := strings.TrimPrefix(r.URL, hub.RepositoryOCIPrefix)
|
|
cmd := exec.CommandContext(ctx, "opm", "index", "export", "-i", indexRef, "-f", tmpDir) // #nosec
|
|
var stderr bytes.Buffer
|
|
cmd.Stderr = &stderr
|
|
cmd.Env = []string{
|
|
"PATH=" + os.Getenv("PATH"),
|
|
"USER=" + os.Getenv("USER"),
|
|
"HOME=" + os.Getenv("HOME"),
|
|
}
|
|
if err := cmd.Run(); err != nil {
|
|
return "", fmt.Errorf("error running opm index export (%s): %w: %s", indexRef, err, stderr.String())
|
|
}
|
|
|
|
return tmpDir, nil
|
|
}
|