diff --git a/delivery_reads_linux_test.go b/delivery_reads_linux_test.go deleted file mode 100644 index ae2fdd4..0000000 --- a/delivery_reads_linux_test.go +++ /dev/null @@ -1,67 +0,0 @@ -package releasekit_test - -import ( - "encoding/binary" - "errors" - "net/http" - "net/http/httptest" - "syscall" - "testing" - - releasekit "go.maximumdirect.net/releasekit" -) - -func TestDeliverReadsLocalBinaryOnceForVerificationAndOnceForUpload(t *testing.T) { - repository, build, expected := newDeliveryBenchmarkFixture(t) - watcher, err := syscall.InotifyInit1(syscall.IN_NONBLOCK | syscall.IN_CLOEXEC) - if err != nil { - t.Fatal(err) - } - defer syscall.Close(watcher) - // Close events separate successive opens so inotify cannot coalesce them. - if _, err := syscall.InotifyAddWatch(watcher, build.Artifacts[0].Path, syscall.IN_OPEN|syscall.IN_CLOSE_NOWRITE); err != nil { - t.Fatal(err) - } - state := &deliveryBenchmarkServer{commit: build.CandidateCommit, assets: expected} - state.reset(false) - server := httptest.NewUnstartedServer(http.HandlerFunc(state.serveHTTP)) - state.baseURL = "http://" + server.Listener.Addr().String() - server.Start() - defer server.Close() - result, err := releasekit.Deliver(t.Context(), releasekit.DeliveryRequest{ - RepositoryDir: repository, Product: "Sample App", Version: build.Version, - Destination: facadeDeliveryDestination(server.URL), Prebuilt: &build, - }) - if err != nil || result.State != releasekit.DeliveryComplete || len(result.Uploaded) != len(expected) { - t.Fatalf("delivery = %#v, error = %v", result, err) - } - state.verifyUploads(t) - opens := 0 - var events [256]byte - for { - n, err := syscall.Read(watcher, events[:]) - if errors.Is(err, syscall.EAGAIN) { - break - } - if errors.Is(err, syscall.EINTR) { - continue - } - if err != nil { - t.Fatal(err) - } - for offset := 0; offset < n; { - mask := binary.NativeEndian.Uint32(events[offset+4:]) - if mask&syscall.IN_Q_OVERFLOW != 0 { - t.Fatal("artifact event queue overflowed") - } - if mask&syscall.IN_OPEN != 0 { - opens++ - } - nameLength := binary.NativeEndian.Uint32(events[offset+12:]) - offset += syscall.SizeofInotifyEvent + int(nameLength) - } - } - if opens != 2 { - t.Fatalf("local binary opened %d times; want one verification read and one upload read", opens) - } -} diff --git a/docs/roadmap/implementation.md b/docs/roadmap/implementation.md index cc0a58e..de53c83 100644 --- a/docs/roadmap/implementation.md +++ b/docs/roadmap/implementation.md @@ -52,7 +52,7 @@ the agent policy; an intermediate compilation dependency is recorded accurately. | 14 | A10 | Complete — bounded and full capture, forwarding, error identity, concurrency, and benchmark modes passed. | | 15 | A13 | Complete — validation ordering, scope, tree lifecycle, diagnostics, and public callback checks passed. | | 16 | A15 | Complete — the full CLI command suite passed after workflow extraction. | -| 17 | Remaining A19, A20 | Pending | +| 17 | Remaining A19, A20 | Complete — Git, identity, and Markdown tests passed; delivery benchmark ran for fresh uploads and matching retries. | | 18 | A11, A17: assessment only | Pending | | 19 | Integrated verification and current documentation | Pending | diff --git a/internal/git/source_test.go b/internal/git/source_test.go index 10881fd..ca3fe15 100644 --- a/internal/git/source_test.go +++ b/internal/git/source_test.go @@ -42,9 +42,6 @@ func TestTagOperationsAcceptFullSlashContainingRefs(t *testing.T) { if err != nil { t.Fatal(err) } - if err := InspectLocalTag(context.Background(), fixture.work, tag, object); err != nil { - t.Fatal(err) - } source, err := InspectTaggedSource(context.Background(), fixture.work, tag) if err != nil { t.Fatal(err) diff --git a/internal/git/tag.go b/internal/git/tag.go index cf443db..54a8aa6 100644 --- a/internal/git/tag.go +++ b/internal/git/tag.go @@ -86,33 +86,6 @@ func inspectCreatedTag(ctx context.Context, repositoryDir, ref, commit string, n return tagObject, nil } -// InspectLocalTag confirms the selected tag still points to the exact -// annotated tag object captured before publication. -func InspectLocalTag(ctx context.Context, repositoryDir, tag, expectedObject string) error { - if err := CheckTagRef(ctx, repositoryDir, tag); err != nil { - return err - } - if !validObjectID(expectedObject) { - return fmt.Errorf("invalid expected tag object identity %q at %q", expectedObject, tag) - } - ref := "refs/tags/" + tag - tagType, err := run(ctx, repositoryDir, nil, "cat-file", "-t", ref) - if err != nil { - return fmt.Errorf("inspect local tag %s: %w", tag, err) - } - if strings.TrimSpace(tagType) != "tag" { - return fmt.Errorf("local tag %s has type %q, want annotated tag", tag, strings.TrimSpace(tagType)) - } - object, err := run(ctx, repositoryDir, nil, "rev-parse", "--verify", ref) - if err != nil { - return fmt.Errorf("read local tag %s: %w", tag, err) - } - if strings.TrimSpace(object) != expectedObject { - return fmt.Errorf("local tag %s identifies %s, want %s", tag, strings.TrimSpace(object), expectedObject) - } - return nil -} - // QueryTag verifies the captured endpoint still resolves to itself, then reads // one exact authoritative version tag and its peeled commit. Failed // verification or reads are unreadable and never interpreted as absence. diff --git a/internal/releaseidentity/identity.go b/internal/releaseidentity/identity.go index 5512be7..5fe6e2c 100644 --- a/internal/releaseidentity/identity.go +++ b/internal/releaseidentity/identity.go @@ -126,12 +126,6 @@ func selectCommittedDirectory(ctx context.Context, resolver git.PathResolver, mo return selection, nil } -// FromCommittedSelection derives identity from a previously resolved module -// selection and the selected module declaration at a captured commit. -func FromCommittedSelection(ctx context.Context, selection Selection, version, commit string) (Identity, error) { - return fromCommittedSelection(ctx, selection, version, commit, git.CommittedPaths(selection.RepositoryDir, commit)) -} - func fromCommittedSelection(ctx context.Context, selection Selection, version, commit string, resolver git.PathResolver) (Identity, error) { identity := Identity{Selection: selection, Version: version} if err := ctx.Err(); err != nil { diff --git a/internal/validation/markdown_test.go b/internal/validation/markdown_test.go index 71ddb04..e91c221 100644 --- a/internal/validation/markdown_test.go +++ b/internal/validation/markdown_test.go @@ -87,7 +87,7 @@ func TestParseMarkdownHeadingAnchors(t *testing.T) { } } -func TestMarkdownCacheSharesParsedDocumentsByBlobObjectID(t *testing.T) { +func TestMarkdownDocumentsParseIdenticalAndDistinctBlobs(t *testing.T) { repository := newTreeRepository(t) shared := []byte("# Guide\n[other](other.md \"title\")\n") writeTreeFile(t, repository, "one/guide.md", shared) @@ -111,20 +111,17 @@ func TestMarkdownCacheSharesParsedDocumentsByBlobObjectID(t *testing.T) { if err != nil { t.Fatal(err) } - if first != second { - t.Fatal("identical Markdown blobs returned different parsed documents") - } other, err := cache.document(context.Background(), "one/other.md") if err != nil { t.Fatal(err) } - if other == first { - t.Fatal("different Markdown blobs shared a parsed document") - } if _, ok := other.anchors["other"]; !ok { t.Fatalf("other document anchors = %#v", other.anchors) } if got := first.links[0]; got.Destination != "other.md" || got.Title != "title" || got.Location.Line != 2 { t.Fatalf("shared Markdown link = %#v, want content-relative destination, title, and location", got) } + if got := second.links[0]; got.Destination != "other.md" || got.Title != "title" || got.Location.Line != 2 { + t.Fatalf("second Markdown link = %#v, want content-relative destination, title, and location", got) + } }