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 }