diff --git a/cmd/stackpack/stackpack_package.go b/cmd/stackpack/stackpack_package.go index ee260db8..1f8ccf4c 100644 --- a/cmd/stackpack/stackpack_package.go +++ b/cmd/stackpack/stackpack_package.go @@ -2,16 +2,16 @@ package stackpack import ( "archive/zip" + "bytes" "fmt" "io" "os" "path/filepath" - "strings" - "github.com/gurkankaymak/hocon" "github.com/spf13/cobra" "github.com/stackvista/stackstate-cli/internal/common" "github.com/stackvista/stackstate-cli/internal/di" + "gopkg.in/yaml.v3" ) const ( @@ -36,45 +36,31 @@ type StackpackConfigParser interface { Parse(filePath string) (*StackpackInfo, error) } -// HoconParser implements StackpackConfigParser for HOCON format -type HoconParser struct{} +// YamlParser implements StackpackConfigParser for YAML format (future) +type YamlParser struct{} -func (h *HoconParser) Parse(filePath string) (*StackpackInfo, error) { - // Read the file content +func (y *YamlParser) Parse(filePath string) (*StackpackInfo, error) { content, err := os.ReadFile(filePath) if err != nil { return nil, fmt.Errorf("failed to read file: %w", err) } - // Parse stackpack.conf content - conf, err := hocon.ParseString(string(content)) - if err != nil { - return nil, fmt.Errorf("failed to parse stackpack.conf file: %w", err) - } - - name := strings.Trim(conf.GetString("name"), `"`) - version := strings.Trim(conf.GetString("version"), `"`) + dec := yaml.NewDecoder(bytes.NewBuffer(content)) + cfg := &StackpackInfo{} - if name == "" { - return nil, fmt.Errorf("name not found in stackpack.conf") + if err := dec.Decode(&cfg); err != nil { + return nil, fmt.Errorf("failed to parse stackpack.yaml file: %w", err) } - if version == "" { - return nil, fmt.Errorf("version not found in stackpack.conf") + if cfg.Name == "" { + return nil, fmt.Errorf("name not found in stackpack.yaml") } - return &StackpackInfo{ - Name: name, - Version: version, - }, nil -} - -// YamlParser implements StackpackConfigParser for YAML format (future) -type YamlParser struct{} + if cfg.Version == "" { + return nil, fmt.Errorf("version not found in stackpack.yaml") + } -func (y *YamlParser) Parse(filePath string) (*StackpackInfo, error) { - // TODO: Implement YAML parsing when format changes - return nil, fmt.Errorf("YAML format not yet implemented") + return cfg, nil } // Required files and directories for a valid stackpack @@ -82,7 +68,7 @@ var requiredStackpackItems = []string{ "provisioning", "README.md", "resources", - "stackpack.conf", + "stackpack.yaml", } // StackpackPackageCommand creates the package subcommand @@ -97,10 +83,10 @@ Creates a zip file containing all required stackpack files and directories: - provisioning/ (directory) - README.md (file) - resources/ (directory) -- stackpack.conf (file) +- stackpack.yaml (file) The zip file is named -.zip where the name and -version are extracted from stackpack.conf and created in the current directory.`, +version are extracted from stackpack.yaml and created in the current directory.`, Example: `# Package stackpack in current directory sts stackpack package @@ -142,10 +128,10 @@ func RunStackpackPackageCommand(args *PackageArgs) func(cli *di.Deps, cmd *cobra args.StackpackDir = absStackpackDir // Parse stackpack.conf using HOCON parser to get name and version - parser := &HoconParser{} - stackpackInfo, err := parser.Parse(filepath.Join(args.StackpackDir, "stackpack.conf")) + parser := &YamlParser{} + stackpackInfo, err := parser.Parse(filepath.Join(args.StackpackDir, "stackpack.yaml")) if err != nil { - return common.NewRuntimeError(fmt.Errorf("failed to parse stackpack.conf: %w", err)) + return common.NewRuntimeError(fmt.Errorf("failed to parse stackpack.yaml: %w", err)) } // Set default archive file path if not specified diff --git a/cmd/stackpack/stackpack_package_test.go b/cmd/stackpack/stackpack_package_test.go index a4a90b52..bc1995d8 100644 --- a/cmd/stackpack/stackpack_package_test.go +++ b/cmd/stackpack/stackpack_package_test.go @@ -27,15 +27,15 @@ func createTestStackpack(t *testing.T, dir string, name string, version string) // Create stackpack.conf stackpackConf := fmt.Sprintf(`# schemaVersion -- Stackpack specification version. -schemaVersion = "2.0" +schemaVersion: "2.0" # name -- Name of the StackPack. -name = "%s" +name: "%s" # displayName -- Display name of the StackPack. -displayName = "Test %s" +displayName: "Test %s" # version -- Semantic version of the StackPack. -version = "%s" +version: "%s" `, name, name, version) - require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.conf"), []byte(stackpackConf), 0644)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.yaml"), []byte(stackpackConf), 0644)) // Create README.md readme := fmt.Sprintf("# %s\n\nThis is a test stackpack.", name) @@ -196,7 +196,7 @@ func TestStackpackPackageCommand_MissingRequiredFiles(t *testing.T) { setupFunc: func(dir string) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "resources"), 0755)) require.NoError(t, os.WriteFile(filepath.Join(dir, "README.md"), []byte("readme"), 0644)) - require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.conf"), []byte("name = \"test\"\nversion = \"1.0.0\""), 0644)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.yaml"), []byte("name: \"test\"\nversion: \"1.0.0\""), 0644)) }, expectedError: "required stackpack item not found: provisioning", }, @@ -205,7 +205,7 @@ func TestStackpackPackageCommand_MissingRequiredFiles(t *testing.T) { setupFunc: func(dir string) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "provisioning"), 0755)) require.NoError(t, os.MkdirAll(filepath.Join(dir, "resources"), 0755)) - require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.conf"), []byte("name = \"test\"\nversion = \"1.0.0\""), 0644)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.yaml"), []byte("name: \"test\"\nversion: \"1.0.0\""), 0644)) }, expectedError: "required stackpack item not found: README.md", }, @@ -214,18 +214,18 @@ func TestStackpackPackageCommand_MissingRequiredFiles(t *testing.T) { setupFunc: func(dir string) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "provisioning"), 0755)) require.NoError(t, os.WriteFile(filepath.Join(dir, "README.md"), []byte("readme"), 0644)) - require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.conf"), []byte("name = \"test\"\nversion = \"1.0.0\""), 0644)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.yaml"), []byte("name: \"test\"\nversion: \"1.0.0\""), 0644)) }, expectedError: "required stackpack item not found: resources", }, { - name: "missing stackpack.conf file", + name: "missing stackpack.yaml file", setupFunc: func(dir string) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "provisioning"), 0755)) require.NoError(t, os.MkdirAll(filepath.Join(dir, "resources"), 0755)) require.NoError(t, os.WriteFile(filepath.Join(dir, "README.md"), []byte("readme"), 0644)) }, - expectedError: "failed to parse stackpack.conf", + expectedError: "failed to parse stackpack.yaml", }, } @@ -255,37 +255,37 @@ func TestStackpackPackageCommand_InvalidStackpackConf(t *testing.T) { expectedError string }{ { - name: "invalid HOCON syntax", + name: "invalid YAML syntax", confContent: `name = "test" invalid syntax {`, - expectedError: "failed to parse stackpack.conf file", + expectedError: "failed to parse stackpack.yaml file", }, { name: "missing name field", - confContent: `version = "1.0.0"`, - expectedError: "name not found in stackpack.conf", + confContent: `version: "1.0.0"`, + expectedError: "name not found in stackpack.yaml", }, { name: "missing version field", - confContent: `name = "test"`, - expectedError: "version not found in stackpack.conf", + confContent: `name: "test"`, + expectedError: "version not found in stackpack.yaml", }, { name: "empty name field", - confContent: `name = "" -version = "1.0.0"`, - expectedError: "name not found in stackpack.conf", + confContent: `name: "" +version: "1.0.0"`, + expectedError: "name not found in stackpack.yaml", }, { name: "empty version field", - confContent: `name = "test" -version = ""`, - expectedError: "version not found in stackpack.conf", + confContent: `name: "test" +version: ""`, + expectedError: "version not found in stackpack.yaml", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tempDir, err := os.MkdirTemp("", "stackpack-package-hocon-test-*") + tempDir, err := os.MkdirTemp("", "stackpack-package-yaml-test-*") require.NoError(t, err) defer os.RemoveAll(tempDir) @@ -297,8 +297,8 @@ version = ""`, require.NoError(t, os.MkdirAll(filepath.Join(stackpackDir, "resources"), 0755)) require.NoError(t, os.WriteFile(filepath.Join(stackpackDir, "README.md"), []byte("readme"), 0644)) - // Create invalid stackpack.conf - require.NoError(t, os.WriteFile(filepath.Join(stackpackDir, "stackpack.conf"), []byte(tt.confContent), 0644)) + // Create invalid stackpack.yaml + require.NoError(t, os.WriteFile(filepath.Join(stackpackDir, "stackpack.yaml"), []byte(tt.confContent), 0644)) cli, cmd := setupStackPackPackageCmd(t) @@ -314,7 +314,7 @@ func TestStackpackPackageCommand_NonExistentDirectory(t *testing.T) { _, err := di.ExecuteCommandWithContext(&cli.Deps, cmd, "-d", "/non/existent/directory") require.Error(t, err) - assert.Contains(t, err.Error(), "failed to parse stackpack.conf") + assert.Contains(t, err.Error(), "failed to parse stackpack.yaml") assert.Contains(t, err.Error(), "no such file or directory") } @@ -345,7 +345,7 @@ func TestStackpackPackageCommand_CreateOutputDirectory(t *testing.T) { assert.NoError(t, err, "Zip file should be created in nested directory") } -func TestHoconParser_Parse(t *testing.T) { +func TestYamlParser_Parse(t *testing.T) { tests := []struct { name string content string @@ -355,48 +355,48 @@ func TestHoconParser_Parse(t *testing.T) { errorContains string }{ { - name: "valid HOCON with quotes", - content: `name = "my-stackpack" -version = "1.2.3"`, + name: "valid YAML with quotes", + content: `name: "my-stackpack" +version: "1.2.3"`, expectedName: "my-stackpack", expectedVer: "1.2.3", expectError: false, }, { - name: "valid HOCON without quotes", - content: `name = my-stackpack -version = "1.2.3"`, + name: "valid YAML without quotes", + content: `name: my-stackpack +version: "1.2.3"`, expectedName: "my-stackpack", expectedVer: "1.2.3", expectError: false, }, { - name: "HOCON with comments", + name: "YAML with comments", content: `# This is a comment -name = "test-app" +name: "test-app" # Another comment -version = "2.0.0"`, +version: "2.0.0"`, expectedName: "test-app", expectedVer: "2.0.0", expectError: false, }, { name: "missing name", - content: `version = "1.0.0"`, + content: `version: "1.0.0"`, expectError: true, - errorContains: "name not found in stackpack.conf", + errorContains: "name not found in stackpack.yaml", }, { name: "missing version", - content: `name = "test"`, + content: `name: "test"`, expectError: true, - errorContains: "version not found in stackpack.conf", + errorContains: "version not found in stackpack.yaml", }, { - name: "invalid HOCON syntax", - content: `name = "test" { invalid`, + name: "invalid YAML syntax", + content: `name: "test" { invalid`, expectError: true, - errorContains: "failed to parse stackpack.conf file", + errorContains: "failed to parse stackpack.yaml file", }, } @@ -406,10 +406,10 @@ version = "2.0.0"`, require.NoError(t, err) defer os.RemoveAll(tempDir) - confPath := filepath.Join(tempDir, "test.conf") + confPath := filepath.Join(tempDir, "test.yaml") require.NoError(t, os.WriteFile(confPath, []byte(tt.content), 0644)) - parser := &HoconParser{} + parser := &YamlParser{} result, err := parser.Parse(confPath) if tt.expectError { @@ -428,21 +428,12 @@ version = "2.0.0"`, } } -func TestHoconParser_ParseNonExistentFile(t *testing.T) { - parser := &HoconParser{} - result, err := parser.Parse("/non/existent/file.conf") - - require.Error(t, err) - assert.Contains(t, err.Error(), "failed to read file") - assert.Nil(t, result) -} - -func TestYamlParser_Parse(t *testing.T) { +func TestYamlParser_ParseNonExistentFile(t *testing.T) { parser := &YamlParser{} - result, err := parser.Parse("any-path") + result, err := parser.Parse("/non/existent/file.yaml") require.Error(t, err) - assert.Contains(t, err.Error(), "YAML format not yet implemented") + assert.Contains(t, err.Error(), "failed to read file") assert.Nil(t, result) } @@ -459,7 +450,7 @@ func TestValidateStackpackDirectory(t *testing.T) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "provisioning"), 0755)) require.NoError(t, os.MkdirAll(filepath.Join(dir, "resources"), 0755)) require.NoError(t, os.WriteFile(filepath.Join(dir, "README.md"), []byte("readme"), 0644)) - require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.conf"), []byte("conf"), 0644)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.yaml"), []byte("yaml"), 0644)) }, expectError: false, }, @@ -468,7 +459,7 @@ func TestValidateStackpackDirectory(t *testing.T) { setupFunc: func(dir string) { require.NoError(t, os.MkdirAll(filepath.Join(dir, "resources"), 0755)) require.NoError(t, os.WriteFile(filepath.Join(dir, "README.md"), []byte("readme"), 0644)) - require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.conf"), []byte("conf"), 0644)) + require.NoError(t, os.WriteFile(filepath.Join(dir, "stackpack.yaml"), []byte("yaml"), 0644)) }, expectError: true, errorContains: "required stackpack item not found: provisioning", diff --git a/cmd/stackpack/stackpack_test_cmd.go b/cmd/stackpack/stackpack_test_cmd.go index 3570ac28..8ade1537 100644 --- a/cmd/stackpack/stackpack_test_cmd.go +++ b/cmd/stackpack/stackpack_test_cmd.go @@ -18,7 +18,7 @@ import ( ) const ( - stackpackConfigFile = "stackpack.conf" + stackpackConfigFile = "stackpack.yaml" ) // TestArgs contains arguments for stackpack test command @@ -96,7 +96,7 @@ func RunStackpackTestCommand(args *TestArgs) di.CmdWithApiFn { } // Parse stackpack configuration to get original version - parser := &HoconParser{} + parser := &YamlParser{} stackpackConf := filepath.Join(args.StackpackDir, stackpackConfigFile) originalInfo, err := parser.Parse(stackpackConf) if err != nil { @@ -286,7 +286,7 @@ func bumpSnapshotVersionWithBase(configPath, baseVersion string) (string, error) } else { // Invalid format: reset to cli-test.10000 newVersion = fmt.Sprintf("%d.%d.%d-cli-test.10000", version.Major, version.Minor, version.Patch) - return newVersion, updateVersionInHocon(configPath, newVersion) + return newVersion, updateVersionInYaml(configPath, newVersion) } // Rebuild pre-release parts with incremented cli-test number @@ -310,7 +310,7 @@ func bumpSnapshotVersionWithBase(configPath, baseVersion string) (string, error) newVersion = fmt.Sprintf("%d.%d.%d-cli-test.10000", version.Major, version.Minor, version.Patch) } - return newVersion, updateVersionInHocon(configPath, newVersion) + return newVersion, updateVersionInYaml(configPath, newVersion) } // confirmUpload prompts user for confirmation before upload @@ -442,8 +442,8 @@ func copyFile(src, dst string, mode os.FileMode) error { return err } -// updateVersionInHocon updates the version field in a HOCON configuration using regex -func updateVersionInHocon(configPath, newVersion string) error { +// updateVersionInYaml updates the version field in a HOCON configuration using regex +func updateVersionInYaml(configPath, newVersion string) error { // Read the current config content, err := os.ReadFile(configPath) if err != nil { @@ -451,16 +451,16 @@ func updateVersionInHocon(configPath, newVersion string) error { } // Parse as HOCON to validate structure - parser := &HoconParser{} + parser := &YamlParser{} _, err = parser.Parse(configPath) if err != nil { - return fmt.Errorf("failed to parse HOCON config: %w", err) + return fmt.Errorf("failed to parse Yaml config: %w", err) } // Use regex to replace version while preserving HOCON structure // This is more reliable than string replacement as it targets the version field specifically oldContent := string(content) - versionRegex := regexp.MustCompile(`(?m)^(\s*version\s*=\s*)"[^"]*"(.*)$`) + versionRegex := regexp.MustCompile(`(?m)^(\s*version\s*: \s*)"[^"]*"(.*)$`) newContent := versionRegex.ReplaceAllString(oldContent, `${1}"`+newVersion+`"${2}`) if oldContent == newContent { diff --git a/cmd/stackpack/stackpack_test_cmd_test.go b/cmd/stackpack/stackpack_test_cmd_test.go index f3da3ddb..7a0308c3 100644 --- a/cmd/stackpack/stackpack_test_cmd_test.go +++ b/cmd/stackpack/stackpack_test_cmd_test.go @@ -85,10 +85,10 @@ func TestBumpSnapshotVersion(t *testing.T) { require.NoError(t, err) defer os.RemoveAll(tempDir) - configPath := filepath.Join(tempDir, "stackpack.conf") - configContent := fmt.Sprintf(`name = "test-stackpack" -version = "%s" -displayName = "Test StackPack"`, tt.currentVersion) + configPath := filepath.Join(tempDir, "stackpack.yaml") + configContent := fmt.Sprintf(`name: "test-stackpack" +version: "%s" +displayName: "Test StackPack"`, tt.currentVersion) require.NoError(t, os.WriteFile(configPath, []byte(configContent), 0644)) // Test version bumping @@ -97,7 +97,7 @@ displayName = "Test StackPack"`, tt.currentVersion) assert.Equal(t, tt.expectedVersion, newVersion) // Verify config file was updated - parser := &HoconParser{} + parser := &YamlParser{} updatedInfo, err := parser.Parse(configPath) require.NoError(t, err) assert.Equal(t, tt.expectedVersion, updatedInfo.Version) @@ -105,28 +105,28 @@ displayName = "Test StackPack"`, tt.currentVersion) } } -func TestUpdateVersionInHocon(t *testing.T) { +func TestUpdateVersionInYaml(t *testing.T) { // Create temporary config file - tempDir, err := os.MkdirTemp("", "stackpack-hocon-test-*") + tempDir, err := os.MkdirTemp("", "stackpack-yaml-test-*") require.NoError(t, err) defer os.RemoveAll(tempDir) - configPath := filepath.Join(tempDir, "stackpack.conf") + configPath := filepath.Join(tempDir, "stackpack.yaml") originalVersion := "2.0.0" newVersion := "2.0.0-cli-test.1" // Create config with original version - configContent := fmt.Sprintf(`name = "test-stackpack" -version = "%s" -displayName = "Test StackPack"`, originalVersion) + configContent := fmt.Sprintf(`name: "test-stackpack" +version: "%s" +displayName: "Test StackPack"`, originalVersion) require.NoError(t, os.WriteFile(configPath, []byte(configContent), 0644)) // Test version update using HOCON approach - err = updateVersionInHocon(configPath, newVersion) + err = updateVersionInYaml(configPath, newVersion) require.NoError(t, err) // Verify config file was updated and is still valid HOCON - parser := &HoconParser{} + parser := &YamlParser{} updatedInfo, err := parser.Parse(configPath) require.NoError(t, err) assert.Equal(t, newVersion, updatedInfo.Version) @@ -193,10 +193,10 @@ func TestStackpackTestCommand_RequiredFlags(t *testing.T) { assert.Contains(t, err.Error(), tt.errorMessage) } } else if err != nil { - // Note: This will fail due to missing stackpack.conf, but that's expected + // Note: This will fail due to missing stackpack.yaml, but that's expected // We're only testing flag parsing here // Should fail on stackpack.conf parsing, not flag validation - assert.Contains(t, err.Error(), "stackpack.conf") + assert.Contains(t, err.Error(), "stackpack.yaml") } }) } @@ -234,8 +234,8 @@ func TestStackpackTestCommand_DirectoryHandling(t *testing.T) { // Should fail on API calls (upload/install), not on directory or config parsing if err != nil { - // The error should not be about missing stackpack.conf or directory issues - assert.NotContains(t, err.Error(), "stackpack.conf") + // The error should not be about missing stackpack.yaml or directory issues + assert.NotContains(t, err.Error(), "stackpack.yaml") assert.NotContains(t, err.Error(), "no such file or directory") } }) diff --git a/cmd/stackpack/test-stackpack-1.0.0-cli-test.10000.zip b/cmd/stackpack/test-stackpack-1.0.0-cli-test.10000.zip index bab9cd21..4dfd1ba8 100644 Binary files a/cmd/stackpack/test-stackpack-1.0.0-cli-test.10000.zip and b/cmd/stackpack/test-stackpack-1.0.0-cli-test.10000.zip differ diff --git a/flake.lock b/flake.lock index 3d443bce..5844fda8 100644 --- a/flake.lock +++ b/flake.lock @@ -17,15 +17,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1665733862, - "narHash": "sha256-uIcstZ0D5lEi6pDYupfsKLRLgC6ZmwdxsWzCE3li+IQ=", + "lastModified": 1735563628, + "narHash": "sha256-OnSAY7XDSx7CtDoqNh8jwVwh4xNL/2HaJxGjryLWzX8=", "owner": "nixos", "repo": "nixpkgs", - "rev": "4baef62b8eef25c97ac3e00804dce6920b2b850e", + "rev": "b134951a4c9f3c995fd7be05f3243f8ecd65d798", "type": "github" }, "original": { "owner": "nixos", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index f1658f0a..0021e363 100644 --- a/flake.nix +++ b/flake.nix @@ -4,20 +4,20 @@ nixConfig.bash-prompt = "STS CLI 2 $ "; inputs = { - nixpkgs.url = "github:nixos/nixpkgs"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: - let + let pkgs = import nixpkgs { inherit system; overlays = [ ]; }; pkgs-linux = import nixpkgs { system = "x86_64-linux"; overlays = [ ]; }; # Dependencies used for both development and CI/CD sharedDeps = pkgs: (with pkgs; [ bash - go_1_19 + go_1_22 gotools diffutils # Required for golangci-lint golangci-lint @@ -36,7 +36,7 @@ ]); darwinDevShellExtraDeps = pkgs: pkgs.lib.optionals pkgs.stdenv.isDarwin (with pkgs.darwin.apple_sdk_11_0; [ - Libsystem + Libsystem IOKit ]); in { @@ -54,25 +54,16 @@ devShell = self.devShells."${system}".dev; packages = { - sts = pkgs.buildGo119Module { + sts = pkgs.buildGo122Module { pname = "sts"; version = "2.0.0"; src = ./.; - # This hash locks the dependencies of this package. - # Change it to the provided when the go dependencies change. - # See https://www.tweag.io/blog/2021-03-04-gomod2nix/ for details. - # - # NOTE In case if your build fails due to incosistency in vendor modules - # Comment out the real hash and uncomment the fake one then on next `nix build .` run - # you will get a new real hash which can be used here. - # - # vendorSha256 = pkgs.lib.fakeSha256; - vendorSha256 = "sha256-aXTDHT1N+4Qpkuxb8vvBvP2VPyS5ofCgX6XFhJ5smUQ="; + vendorHash = "sha256-2WKvk8eD5nhq1QEgKsZZrRs8yHv1YkbVjoTzrTqvmb4="; postInstall = '' - mv $out/bin/stackstate-cli2 $out/bin/sts + mv $out/bin/stackstate-cli $out/bin/sts ''; }; @@ -109,3 +100,4 @@ }; }); } +