Keep committed release note reads offline

This commit is contained in:
2026-10-10 15:20:03 +00:00
parent 80d88a0352
commit 6c7b77970b
5 changed files with 106 additions and 4 deletions

87
source_inspection_test.go Normal file
View File

@@ -0,0 +1,87 @@
package releasekit_test
import (
"errors"
"os"
"os/exec"
"path/filepath"
"strings"
"testing"
releasekit "gitea.maximumdirect.net/eric/ReleaseKit"
)
func TestSourceOperationsRejectUnavailableNoteWithoutTransport(t *testing.T) {
source := newPublishFixture(t)
repository := newFilteredSparseCheckout(t, source.work, "/go.mod", "/fixture_test.go")
commit := gitText(t, repository, "rev-parse", "HEAD")
noteObject := gitText(t, repository, "rev-parse", "HEAD:docs/releases/v1.2.3.md")
before := gitText(t, repository, "cat-file", "--batch-all-objects", "--batch-check=%(objectname)")
if strings.Contains(before, noteObject) {
t.Fatal("fixture already contains the release note blob")
}
buildGit(t, repository, "tag", "v1.2.3")
attempts := forbidInspectionTransport(t, repository)
checked, checkErr := releasekit.Check(t.Context(), releasekit.ReleaseRequest{
RepositoryDir: repository, Product: "Sample App", Version: "v1.2.3",
})
server, remote := newFacadeDeliveryServer(t, repository)
defer server.Close()
delivered, deliveryErr := releasekit.Deliver(t.Context(), releasekit.DeliveryRequest{
RepositoryDir: repository, Product: "Sample App", Version: "v1.2.3",
Destination: facadeDeliveryDestination(server.URL),
})
for _, err := range []error{checkErr, deliveryErr} {
var exitError *exec.ExitError
if !errors.As(err, &exitError) || !strings.Contains(err.Error(), "docs/releases/v1.2.3.md") {
t.Errorf("note inspection error = %v; want note path and Git cause", err)
}
}
if checked.Commit != commit || checked.Tag != "v1.2.3" || delivered.CandidateCommit != commit || delivered.Tag != checked.Tag || delivered.State != releasekit.DeliveryNotAttempted {
t.Fatalf("missing-note evidence: check=%#v, delivery=%#v", checked, delivered)
}
if remote.requests != 0 {
t.Fatalf("missing note caused %d hosted requests", remote.requests)
}
assertInspectionStayedLocal(t, repository, attempts, before)
}
func newFilteredSparseCheckout(t *testing.T, source string, paths ...string) string {
t.Helper()
gitRun(t, source, "config", "uploadpack.allowFilter", "true")
repository := filepath.Join(t.TempDir(), "partial")
gitRun(t, source, "clone", "--filter=blob:none", "--no-checkout", "--no-tags", "file://"+filepath.ToSlash(source), repository)
gitRun(t, repository, "sparse-checkout", "init", "--no-cone")
gitRun(t, repository, append([]string{"sparse-checkout", "set"}, paths...)...)
gitRun(t, repository, "checkout", "main")
if status := gitText(t, repository, "status", "--porcelain"); status != "" {
t.Fatalf("sparse checkout is dirty: %s", status)
}
return repository
}
func forbidInspectionTransport(t *testing.T, repository string) string {
t.Helper()
gitRun(t, repository, "config", "remote.origin.url", "ssh://releasekit-test.invalid/source")
directory := t.TempDir()
transport := filepath.Join(directory, "ssh")
attempts := filepath.Join(directory, "attempts")
if err := os.WriteFile(transport, []byte("#!/bin/sh\nprintf 'remote accessed\\n' >> \"$RELEASEKIT_GIT_ATTEMPTS\"\nexit 1\n"), 0o755); err != nil {
t.Fatal(err)
}
t.Setenv("GIT_SSH_COMMAND", transport)
t.Setenv("RELEASEKIT_GIT_ATTEMPTS", attempts)
t.Setenv("GIT_NO_LAZY_FETCH", "0")
t.Setenv("GIT_ALLOW_PROTOCOL", "ssh")
return attempts
}
func assertInspectionStayedLocal(t *testing.T, repository, attempts, before string) {
t.Helper()
if data, err := os.ReadFile(attempts); !errors.Is(err, os.ErrNotExist) {
t.Fatalf("inspection invoked remote transport: %q, error = %v", data, err)
}
if after := gitText(t, repository, "cat-file", "--batch-all-objects", "--batch-check=%(objectname)"); after != before {
t.Fatal("inspection changed the local object database")
}
}