Record publication evidence before tag pushes

This commit is contained in:
2026-11-02 19:08:07 +00:00
parent b11c6d1788
commit 2a04938a96
5 changed files with 87 additions and 10 deletions

View File

@@ -174,6 +174,13 @@ func TestPublishPushesOnlyTheCapturedAnnotatedTag(t *testing.T) {
if result.RepositoryDir != repo.work || result.ModuleDir != repo.work || result.ModulePath != "example.com/releasekit-publish-fixture" || result.Tag != "v1.2.3" || result.CandidateCommit != commit || result.Endpoint != repo.bare || result.TagObject == "" {
t.Fatalf("publication identity = %#v", result)
}
if result.RecordPath == "" || result.RecordError != nil {
t.Fatalf("publication record path=%q error=%v", result.RecordPath, result.RecordError)
}
recorded, err := releasekit.LoadPublicationEvidence(result.RecordPath)
if err != nil || recorded.Endpoint != repo.bare || recorded.Tag != result.Tag || recorded.CandidateCommit != commit || recorded.TagObject != result.TagObject || recorded.RecordedAt == "" {
t.Fatalf("saved publication evidence=%#v, error=%v", recorded, err)
}
refsAfter := gitText(t, repo.bare, "show-ref", "--heads", "--tags")
for _, ref := range strings.Split(refsBefore, "\n") {
@@ -207,6 +214,21 @@ func TestPublishPushesOnlyTheCapturedAnnotatedTag(t *testing.T) {
}
}
func TestPublishKeepsSuccessWhenAttemptRecordCannotBeSaved(t *testing.T) {
repo := newPublishFixture(t)
result, err := releasekit.Publish(context.Background(), releasekit.ReleaseRequest{
RepositoryDir: repo.work, Product: "Sample App", Version: "v1.2.3", PublicationRecordDir: "unignored-records",
AdditionalChecks: func(context.Context, releasekit.Candidate) error { return nil },
})
var recovery *releasekit.PublicationRecoveryError
if err != nil || result.State != releasekit.PublicationPublished {
t.Fatalf("publication=%#v error=%v", result, err)
}
if result.RecordPath != "" || !errors.As(result.RecordError, &recovery) || recovery.Kind != "record_write" {
t.Fatalf("record path=%q error=%v", result.RecordPath, result.RecordError)
}
}
func TestPublishRejectsReplacementDerivedCheckout(t *testing.T) {
repo := newPublishFixture(t)
writeFile(t, repo.work, "broken.go", "package fixture\nfunc broken(\n")
@@ -431,6 +453,10 @@ exec %s "$@"
if !strings.Contains(err.Error(), "refs/tags/v1.2.3") || !strings.Contains(err.Error(), "may remain") {
t.Fatalf("missing local ref evidence: %v", err)
}
evidence, loadErr := releasekit.LoadPublicationEvidence(result.RecordPath)
if loadErr != nil || evidence.Tag != result.Tag || evidence.CandidateCommit != result.CandidateCommit || evidence.TagObject != result.TagObject {
t.Fatalf("tag-inspection record=%#v error=%v", evidence, loadErr)
}
actual, readErr := exec.Command(realGit, "-C", repo.work, "rev-parse", "--verify", "refs/tags/v1.2.3").Output()
if readErr != nil {
t.Fatal(readErr)
@@ -737,6 +763,9 @@ func TestPublishRejectedPushKeepsLocalTagAndReportsNotPublished(t *testing.T) {
if result.State != releasekit.PublicationNotPublished || result.Phase != releasekit.PublicationReconciliation || result.TagObject == "" {
t.Fatalf("publication result = %#v", result)
}
if evidence, loadErr := releasekit.LoadPublicationEvidence(result.RecordPath); loadErr != nil || evidence.TagObject != result.TagObject || evidence.CandidateCommit != result.CandidateCommit {
t.Fatalf("rejected-push record = %#v, %v", evidence, loadErr)
}
if !strings.Contains(err.Error(), "failed to push some refs") || !strings.Contains(err.Error(), "authoritative tag is absent") {
t.Fatalf("push error was not preserved with absence evidence: %v", err)
}
@@ -814,6 +843,9 @@ func TestPublishLostAcknowledgmentWithChangedEndpointRemainsUnknown(t *testing.T
if err == nil || result.State != releasekit.PublicationUnknown || result.Phase != releasekit.PublicationReconciliation {
t.Fatalf("result = %#v, error = %v", result, err)
}
if evidence, loadErr := releasekit.LoadPublicationEvidence(result.RecordPath); loadErr != nil || evidence.TagObject != result.TagObject {
t.Fatalf("unknown-push record = %#v, %v", evidence, loadErr)
}
if !strings.Contains(err.Error(), "scoped URL resolves") || !strings.Contains(err.Error(), "lost acknowledgment") {
t.Fatalf("error does not preserve endpoint verification and push failures: %v", err)
}