A bundle stands on the toolchain it is compiled in (hq issue 211)
A manifest names its toolchain by language, not in build.on, so the planner did not know a bundle depends on the module that publishes its toolchain and built the two in one tier: the bundle against the old toolchain, recorded as built from the new commit. The edge is read from the manifest, so it holds before any build recorded it, and a toolchain that moves rebuilds every bundle compiled in it.
This commit is contained in:
@@ -62,3 +62,41 @@ func TestDependenciesAreOneRelationWithTheirKinds(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// novox/hq 04-ISSUES/211: a bundle stands on the toolchain it is compiled in, so a merge moving both
|
||||
// builds the toolchain first — read from the manifest, before any build recorded it.
|
||||
func TestABundleStandsOnTheToolchainItIsCompiledIn(t *testing.T) {
|
||||
entries := []Entry{
|
||||
{Manifest: catalogue.Manifest{Module: "mesh-tools"}, Source: Source{Repository: "novox/mesh-tools"}},
|
||||
{Manifest: catalogue.Manifest{Module: "mesh-tools-go"}, Source: Source{Repository: "novox/mesh-tools-go"}},
|
||||
{Manifest: catalogue.Manifest{Module: "node-tools", Build: &catalogue.Build{Artifacts: []catalogue.Artifact{
|
||||
{Name: "runtime", Kind: catalogue.ArtifactBundle, Language: "go", System: "arch", From: "cmd/node-tools"}}}},
|
||||
Source: Source{Repository: "novox/mesh-tools"}},
|
||||
{Manifest: catalogue.Manifest{Module: "nftables", Build: &catalogue.Build{Artifacts: []catalogue.Artifact{
|
||||
{Name: "tools", Kind: catalogue.ArtifactBundle, Language: "typescript", Entrypoints: []string{"tools/index.js"}}}}},
|
||||
Source: Source{Repository: "novox/mesh-catalog"}},
|
||||
{Manifest: catalogue.Manifest{Module: "photos", Build: &catalogue.Build{Artifacts: []catalogue.Artifact{
|
||||
{Name: "server", Kind: catalogue.ArtifactImage, From: "Dockerfile"}}}},
|
||||
Source: Source{Repository: "novox/photos"}},
|
||||
}
|
||||
edges := dependenciesOf(entries, nil, nil)
|
||||
has := func(from, to string) bool {
|
||||
for _, e := range edges {
|
||||
if e.From == from && e.To == to && e.Kind == EdgeStandsOn {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
if !has("nftables", "mesh-tools") {
|
||||
t.Errorf("a TypeScript bundle does not stand on the TypeScript toolchain: %v", edges)
|
||||
}
|
||||
if !has("node-tools", "mesh-tools-go") {
|
||||
t.Errorf("a Go bundle does not stand on the Go toolchain: %v", edges)
|
||||
}
|
||||
for _, e := range edges {
|
||||
if e.From == "photos" && e.Kind == EdgeStandsOn {
|
||||
t.Errorf("an image stands on a toolchain it is not compiled in: %v", e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user