66 lines
2.8 KiB
Go
66 lines
2.8 KiB
Go
// Package trunk is where a catalogue check finds the trunk's copy of a list that may only shrink (novox/hq ADR 0529 clause 2):
|
|
// the file as the catalogue's base commit holds it, to judge a change's list against.
|
|
//
|
|
// The checker fetches the change's own repository at its base commit beside the change, as it fetches a sibling, and says where
|
|
// in MESH_CHECK_BESIDE; the copy is under the repository's name (the same convention the other repositories' tests use). With
|
|
// MESH_CHECK_BESIDE unset, or set without the catalogue's copy in it, the test fails saying NOT COMPARED WITH THE TRUNK and
|
|
// why: the checker places the change's own repository since R4g (issue 1295), so a missing copy is a fault, never a pass. A trunk that holds no such file had
|
|
// none: the list's first copy, which nothing was added to.
|
|
package trunk
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
)
|
|
|
|
// Repository is the catalogue's name beside a check.
|
|
const Repository = "mesh-catalog"
|
|
|
|
// BesideEnv is where a merge check says the clones beside the one checked are.
|
|
const BesideEnv = "MESH_CHECK_BESIDE"
|
|
|
|
// Copy is the trunk's copy of the file at rel (a path from the catalogue's root), written to a file of the test's own: its path,
|
|
// and whether the trunk holds one (false: its first copy). It fails the test when no copy of the catalogue is beside.
|
|
func Copy(t testing.TB, rel string) (string, bool) {
|
|
t.Helper()
|
|
raw, found, err := Read(rel)
|
|
switch {
|
|
case err != nil:
|
|
t.Fatal(err)
|
|
case !found:
|
|
t.Logf("the trunk holds no %s: its first copy", rel)
|
|
return "", false
|
|
}
|
|
path := filepath.Join(t.TempDir(), filepath.Base(rel))
|
|
if err := os.WriteFile(path, raw, 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return path, true
|
|
}
|
|
|
|
// Read is the trunk's copy of rel and whether the trunk holds one. err is a trunk not beside the check (MESH_CHECK_BESIDE unset,
|
|
// or without the catalogue's directory), or a copy unreadable: a comparison that cannot be made is never a pass.
|
|
func Read(rel string) (content []byte, found bool, err error) {
|
|
beside := os.Getenv(BesideEnv)
|
|
if beside == "" {
|
|
return nil, false, fmt.Errorf("NOT COMPARED WITH THE TRUNK: %s is not set, so the trunk's copy of %s is not beside this run; the checker places the change's own repository there (issue 1295)", BesideEnv, rel)
|
|
}
|
|
dir := filepath.Join(beside, Repository)
|
|
if _, err := os.Stat(dir); errors.Is(err, os.ErrNotExist) {
|
|
return nil, false, fmt.Errorf("NOT COMPARED WITH THE TRUNK: %s is not beside this check in %s=%s, so %s is not judged against the trunk's copy; the checker places the change's own repository there at its trunk (issue 1295)", Repository, BesideEnv, beside, rel)
|
|
} else if err != nil {
|
|
return nil, false, err
|
|
}
|
|
raw, err := os.ReadFile(filepath.Join(dir, rel))
|
|
if errors.Is(err, os.ErrNotExist) {
|
|
return nil, false, nil
|
|
}
|
|
if err != nil {
|
|
return nil, false, err
|
|
}
|
|
return raw, true, nil
|
|
}
|