github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/scripts/ci/payload-generator/main.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"flag"
     6  	"fmt"
     7  	"os"
     8  	"path/filepath"
     9  
    10  	"github.com/ActiveState/cli/internal/constants"
    11  	"github.com/ActiveState/cli/internal/environment"
    12  	"github.com/ActiveState/cli/internal/fileutils"
    13  	"github.com/ActiveState/cli/internal/installation"
    14  	"github.com/ActiveState/cli/internal/osutils"
    15  )
    16  
    17  var (
    18  	defaultInputDir     = filepath.Join(environment.GetRootPathUnsafe(), "build")
    19  	defaultOutputDir    = filepath.Join(defaultInputDir, "payload", constants.LegacyToplevelInstallArchiveDir)
    20  	defaultOutputBinDir = filepath.Join(defaultOutputDir, "bin")
    21  
    22  	log = func(msg string, vals ...any) {
    23  		fmt.Fprintf(os.Stdout, msg, vals...)
    24  		fmt.Fprintf(os.Stdout, "\n")
    25  	}
    26  	logErr = func(msg string, vals ...any) {
    27  		fmt.Fprintf(os.Stderr, msg, vals...)
    28  		fmt.Fprintf(os.Stderr, "\n")
    29  	}
    30  )
    31  
    32  // The payload-generator is an intentionally very dumb runner that just copies some files around.
    33  // This could just be a bash script if not for the fact that bash can't be linked with our type system.
    34  func main() {
    35  	if err := run(); err != nil {
    36  		logErr("%s", err)
    37  		os.Exit(1)
    38  	}
    39  }
    40  
    41  func run() error {
    42  	var (
    43  		inDir   = defaultInputDir
    44  		outDir  = defaultOutputDir
    45  		binDir  = defaultOutputBinDir
    46  		channel = constants.ChannelName
    47  		version = constants.Version
    48  	)
    49  
    50  	flag.StringVar(&channel, "b", channel, "Override target channel. (Channel to receive update.)")
    51  	flag.StringVar(&version, "v", version, "Override version number for this update.")
    52  	flag.Parse()
    53  
    54  	return generatePayload(inDir, outDir, binDir, channel, version)
    55  }
    56  
    57  func generatePayload(inDir, outDir, binDir, channel, version string) error {
    58  	emsg := "generate payload: %w"
    59  
    60  	if err := fileutils.MkdirUnlessExists(binDir); err != nil {
    61  		return fmt.Errorf(emsg, err)
    62  	}
    63  
    64  	log("Creating install dir marker in %s", outDir)
    65  	if err := createInstallMarker(outDir, channel, version); err != nil {
    66  		return fmt.Errorf(emsg, err)
    67  	}
    68  
    69  	files := map[string]string{
    70  		filepath.Join(inDir, constants.StateInstallerCmd+osutils.ExeExtension): outDir,
    71  		filepath.Join(inDir, constants.StateCmd+osutils.ExeExtension):          binDir,
    72  		filepath.Join(inDir, constants.StateSvcCmd+osutils.ExeExtension):       binDir,
    73  		filepath.Join(inDir, constants.StateExecutorCmd+osutils.ExeExtension):  binDir,
    74  	}
    75  	if err := copyFiles(files); err != nil {
    76  		return fmt.Errorf(emsg, err)
    77  	}
    78  
    79  	return nil
    80  }
    81  
    82  func createInstallMarker(dir, channel, version string) error {
    83  	emsg := "create install marker: %w"
    84  
    85  	markerContents := installation.InstallMarkerMeta{
    86  		Channel: channel,
    87  		Version: version,
    88  	}
    89  	b, err := json.Marshal(markerContents)
    90  	if err != nil {
    91  		return fmt.Errorf(emsg, err)
    92  	}
    93  	b = append(b, '\n')
    94  
    95  	markerPath := filepath.Join(dir, installation.InstallDirMarker)
    96  	if err := fileutils.WriteFile(markerPath, b); err != nil {
    97  		return fmt.Errorf(emsg, err)
    98  	}
    99  
   100  	return nil
   101  }
   102  
   103  // copyFiles will copy the given files with logging.
   104  func copyFiles(files map[string]string) error {
   105  	for src, target := range files {
   106  		log("Copying %s to %s", src, target)
   107  		dest := filepath.Join(target, filepath.Base(src))
   108  
   109  		if err := fileutils.CopyFile(src, dest); err != nil {
   110  			return fmt.Errorf("copy files (%s to %s): %w", src, target, err)
   111  		}
   112  	}
   113  
   114  	return nil
   115  }