github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/packager/create.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // SPDX-FileCopyrightText: 2021-Present The Jackal Authors
     3  
     4  // Package packager contains functions for interacting with, managing and deploying Jackal packages.
     5  package packager
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  
    11  	"github.com/Racer159/jackal/src/config"
    12  	"github.com/Racer159/jackal/src/internal/packager/validate"
    13  	"github.com/Racer159/jackal/src/pkg/layout"
    14  	"github.com/Racer159/jackal/src/pkg/message"
    15  	"github.com/Racer159/jackal/src/pkg/packager/creator"
    16  	"github.com/defenseunicorns/pkg/helpers"
    17  )
    18  
    19  // Create generates a Jackal package tarball for a given PackageConfig and optional base directory.
    20  func (p *Packager) Create() (err error) {
    21  	cwd, err := os.Getwd()
    22  	if err != nil {
    23  		return err
    24  	}
    25  
    26  	if err := os.Chdir(p.cfg.CreateOpts.BaseDir); err != nil {
    27  		return fmt.Errorf("unable to access directory %q: %w", p.cfg.CreateOpts.BaseDir, err)
    28  	}
    29  
    30  	message.Note(fmt.Sprintf("Using build directory %s", p.cfg.CreateOpts.BaseDir))
    31  
    32  	pc := creator.NewPackageCreator(p.cfg.CreateOpts, p.cfg, cwd)
    33  
    34  	if err := helpers.CreatePathAndCopy(layout.JackalYAML, p.layout.JackalYAML); err != nil {
    35  		return err
    36  	}
    37  
    38  	p.cfg.Pkg, p.warnings, err = pc.LoadPackageDefinition(p.layout)
    39  	if err != nil {
    40  		return err
    41  	}
    42  
    43  	// Perform early package validation.
    44  	if err := validate.Run(p.cfg.Pkg); err != nil {
    45  		return fmt.Errorf("unable to validate package: %w", err)
    46  	}
    47  
    48  	if !p.confirmAction(config.JackalCreateStage) {
    49  		return fmt.Errorf("package creation canceled")
    50  	}
    51  
    52  	if err := pc.Assemble(p.layout, p.cfg.Pkg.Components, p.cfg.Pkg.Metadata.Architecture); err != nil {
    53  		return err
    54  	}
    55  
    56  	// cd back for output
    57  	if err := os.Chdir(cwd); err != nil {
    58  		return err
    59  	}
    60  
    61  	return pc.Output(p.layout, &p.cfg.Pkg)
    62  }