feat(manifest): allow version override during compile
Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
parent
2f599eb6d5
commit
de94350f13
4 changed files with 78 additions and 7 deletions
|
|
@ -16,6 +16,7 @@ import (
|
||||||
|
|
||||||
func addCompileCommand(parent *cli.Command) {
|
func addCompileCommand(parent *cli.Command) {
|
||||||
var (
|
var (
|
||||||
|
version string
|
||||||
dir string
|
dir string
|
||||||
signKey string
|
signKey string
|
||||||
builtBy string
|
builtBy string
|
||||||
|
|
@ -27,11 +28,12 @@ func addCompileCommand(parent *cli.Command) {
|
||||||
Short: "Compile manifest.yaml into core.json",
|
Short: "Compile manifest.yaml into core.json",
|
||||||
Long: "Read .core/manifest.yaml, attach build metadata (commit, tag), and write core.json to the project root or a custom output path.",
|
Long: "Read .core/manifest.yaml, attach build metadata (commit, tag), and write core.json to the project root or a custom output path.",
|
||||||
RunE: func(cmd *cli.Command, args []string) error {
|
RunE: func(cmd *cli.Command, args []string) error {
|
||||||
return runCompile(dir, signKey, builtBy, output)
|
return runCompile(dir, version, signKey, builtBy, output)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd.Flags().StringVarP(&dir, "dir", "d", ".", "Project root directory")
|
cmd.Flags().StringVarP(&dir, "dir", "d", ".", "Project root directory")
|
||||||
|
cmd.Flags().StringVar(&version, "version", "", "Override the manifest version")
|
||||||
cmd.Flags().StringVar(&signKey, "sign-key", "", "Hex-encoded ed25519 private key for signing")
|
cmd.Flags().StringVar(&signKey, "sign-key", "", "Hex-encoded ed25519 private key for signing")
|
||||||
cmd.Flags().StringVar(&builtBy, "built-by", "core scm compile", "Builder identity")
|
cmd.Flags().StringVar(&builtBy, "built-by", "core scm compile", "Builder identity")
|
||||||
cmd.Flags().StringVarP(&output, "output", "o", "core.json", "Output path for the compiled manifest")
|
cmd.Flags().StringVarP(&output, "output", "o", "core.json", "Output path for the compiled manifest")
|
||||||
|
|
@ -39,7 +41,7 @@ func addCompileCommand(parent *cli.Command) {
|
||||||
parent.AddCommand(cmd)
|
parent.AddCommand(cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func runCompile(dir, signKeyHex, builtBy, output string) error {
|
func runCompile(dir, version, signKeyHex, builtBy, output string) error {
|
||||||
medium, err := io.NewSandboxed(dir)
|
medium, err := io.NewSandboxed(dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return cli.WrapVerb(err, "open", dir)
|
return cli.WrapVerb(err, "open", dir)
|
||||||
|
|
@ -51,6 +53,7 @@ func runCompile(dir, signKeyHex, builtBy, output string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := manifest.CompileOptions{
|
opts := manifest.CompileOptions{
|
||||||
|
Version: version,
|
||||||
Commit: gitCommit(dir),
|
Commit: gitCommit(dir),
|
||||||
Tag: gitTag(dir),
|
Tag: gitTag(dir),
|
||||||
BuiltBy: builtBy,
|
BuiltBy: builtBy,
|
||||||
|
|
@ -83,7 +86,7 @@ func runCompile(dir, signKeyHex, builtBy, output string) error {
|
||||||
|
|
||||||
cli.Blank()
|
cli.Blank()
|
||||||
cli.Print(" %s %s\n", successStyle.Render("compiled"), valueStyle.Render(m.Code))
|
cli.Print(" %s %s\n", successStyle.Render("compiled"), valueStyle.Render(m.Code))
|
||||||
cli.Print(" %s %s\n", dimStyle.Render("version:"), valueStyle.Render(m.Version))
|
cli.Print(" %s %s\n", dimStyle.Render("version:"), valueStyle.Render(cm.Version))
|
||||||
if opts.Commit != "" {
|
if opts.Commit != "" {
|
||||||
cli.Print(" %s %s\n", dimStyle.Render("commit:"), valueStyle.Render(opts.Commit))
|
cli.Print(" %s %s\n", dimStyle.Render("commit:"), valueStyle.Render(opts.Commit))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ import (
|
||||||
|
|
||||||
"dappco.re/go/core/io"
|
"dappco.re/go/core/io"
|
||||||
"dappco.re/go/core/scm/manifest"
|
"dappco.re/go/core/scm/manifest"
|
||||||
|
"forge.lthn.ai/core/cli/pkg/cli"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
@ -24,7 +25,7 @@ name: Compile Default
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
`), 0644))
|
`), 0644))
|
||||||
|
|
||||||
err := runCompile(dir, "", "core scm compile", "core.json")
|
err := runCompile(dir, "", "", "core scm compile", "core.json")
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
raw, err := io.Local.Read(filepath.Join(dir, "core.json"))
|
raw, err := io.Local.Read(filepath.Join(dir, "core.json"))
|
||||||
|
|
@ -47,7 +48,7 @@ version: 2.0.0
|
||||||
`), 0644))
|
`), 0644))
|
||||||
|
|
||||||
output := filepath.Join("dist", "core.json")
|
output := filepath.Join("dist", "core.json")
|
||||||
err := runCompile(dir, "", "custom builder", output)
|
err := runCompile(dir, "", "", "custom builder", output)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
raw, err := io.Local.Read(filepath.Join(dir, output))
|
raw, err := io.Local.Read(filepath.Join(dir, output))
|
||||||
|
|
@ -69,7 +70,53 @@ name: Compile Invalid Key
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
`), 0644))
|
`), 0644))
|
||||||
|
|
||||||
err := runCompile(dir, hex.EncodeToString([]byte("short")), "core scm compile", "core.json")
|
err := runCompile(dir, "", hex.EncodeToString([]byte("short")), "core scm compile", "core.json")
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
assert.Contains(t, err.Error(), "invalid private key length")
|
assert.Contains(t, err.Error(), "invalid private key length")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRunCompile_Good_VersionOverride_Good(t *testing.T) {
|
||||||
|
dir := t.TempDir()
|
||||||
|
coreDir := filepath.Join(dir, ".core")
|
||||||
|
require.NoError(t, os.MkdirAll(coreDir, 0755))
|
||||||
|
require.NoError(t, os.WriteFile(filepath.Join(coreDir, "manifest.yaml"), []byte(`
|
||||||
|
code: compile-version
|
||||||
|
name: Compile Version
|
||||||
|
version: 1.0.0
|
||||||
|
`), 0644))
|
||||||
|
|
||||||
|
err := runCompile(dir, "3.2.1", "", "core scm compile", "core.json")
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
raw, err := io.Local.Read(filepath.Join(dir, "core.json"))
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
cm, err := manifest.ParseCompiled([]byte(raw))
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, "3.2.1", cm.Version)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAddScmCommands_Good_CompileVersionFlagRegistered_Good(t *testing.T) {
|
||||||
|
root := &cli.Command{Use: "root"}
|
||||||
|
|
||||||
|
AddScmCommands(root)
|
||||||
|
|
||||||
|
var scmCmd *cli.Command
|
||||||
|
for _, cmd := range root.Commands() {
|
||||||
|
if cmd.Name() == "scm" {
|
||||||
|
scmCmd = cmd
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.NotNil(t, scmCmd)
|
||||||
|
|
||||||
|
var compileCmd *cli.Command
|
||||||
|
for _, cmd := range scmCmd.Commands() {
|
||||||
|
if cmd.Name() == "compile" {
|
||||||
|
compileCmd = cmd
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
require.NotNil(t, compileCmd)
|
||||||
|
assert.NotNil(t, compileCmd.Flags().Lookup("version"))
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ type CompiledManifest struct {
|
||||||
|
|
||||||
// CompileOptions controls how Compile populates the build metadata.
|
// CompileOptions controls how Compile populates the build metadata.
|
||||||
type CompileOptions struct {
|
type CompileOptions struct {
|
||||||
|
Version string // Optional override for the manifest version
|
||||||
Commit string // Git commit hash
|
Commit string // Git commit hash
|
||||||
Tag string // Git tag (e.g. v1.0.0)
|
Tag string // Git tag (e.g. v1.0.0)
|
||||||
BuiltBy string // Builder identity (e.g. "core build")
|
BuiltBy string // Builder identity (e.g. "core build")
|
||||||
|
|
@ -47,6 +48,10 @@ func Compile(m *Manifest, opts CompileOptions) (*CompiledManifest, error) {
|
||||||
return nil, coreerr.E("manifest.Compile", "missing version", nil)
|
return nil, coreerr.E("manifest.Compile", "missing version", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if opts.Version != "" {
|
||||||
|
m.Version = opts.Version
|
||||||
|
}
|
||||||
|
|
||||||
// Sign if a key is supplied.
|
// Sign if a key is supplied.
|
||||||
if opts.SignKey != nil {
|
if opts.SignKey != nil {
|
||||||
if err := Sign(m, opts.SignKey); err != nil {
|
if err := Sign(m, opts.SignKey); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ func TestCompile_Good(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
cm, err := Compile(m, CompileOptions{
|
cm, err := Compile(m, CompileOptions{
|
||||||
|
Version: "2.0.0",
|
||||||
Commit: "abc1234",
|
Commit: "abc1234",
|
||||||
Tag: "v1.2.3",
|
Tag: "v1.2.3",
|
||||||
BuiltBy: "core build",
|
BuiltBy: "core build",
|
||||||
|
|
@ -30,7 +31,7 @@ func TestCompile_Good(t *testing.T) {
|
||||||
|
|
||||||
assert.Equal(t, "my-widget", cm.Code)
|
assert.Equal(t, "my-widget", cm.Code)
|
||||||
assert.Equal(t, "My Widget", cm.Name)
|
assert.Equal(t, "My Widget", cm.Name)
|
||||||
assert.Equal(t, "1.2.3", cm.Version)
|
assert.Equal(t, "2.0.0", cm.Version)
|
||||||
assert.Equal(t, "abc1234", cm.Commit)
|
assert.Equal(t, "abc1234", cm.Commit)
|
||||||
assert.Equal(t, "v1.2.3", cm.Tag)
|
assert.Equal(t, "v1.2.3", cm.Tag)
|
||||||
assert.Equal(t, "core build", cm.BuiltBy)
|
assert.Equal(t, "core build", cm.BuiltBy)
|
||||||
|
|
@ -181,3 +182,18 @@ func TestCompile_Good_MinimalOptions_Good(t *testing.T) {
|
||||||
assert.Empty(t, cm.BuiltBy)
|
assert.Empty(t, cm.BuiltBy)
|
||||||
assert.NotEmpty(t, cm.BuiltAt)
|
assert.NotEmpty(t, cm.BuiltAt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCompile_Good_WithVersionOverride_Good(t *testing.T) {
|
||||||
|
m := &Manifest{
|
||||||
|
Code: "override",
|
||||||
|
Name: "Override",
|
||||||
|
Version: "0.0.1",
|
||||||
|
}
|
||||||
|
|
||||||
|
cm, err := Compile(m, CompileOptions{
|
||||||
|
Version: "9.9.9",
|
||||||
|
})
|
||||||
|
require.NoError(t, err)
|
||||||
|
assert.Equal(t, "9.9.9", cm.Version)
|
||||||
|
assert.Equal(t, "9.9.9", m.Version)
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue