Skip to content
go-libfossil Artifact [dca1035eaf]
Login

Artifact [dca1035eaf]

Artifact dca1035eaf6844b8f9d6d13298fb0c09d8a08acebfd5e529921f1ee96dd3fb91:


package main

import (
	"strings"
	"testing"
	"time"

	"github.com/danmestas/go-libfossil/internal/blob"
	"github.com/danmestas/go-libfossil/internal/cone"
	"github.com/danmestas/go-libfossil/internal/content"
	"github.com/danmestas/go-libfossil/internal/deck"
	"github.com/danmestas/go-libfossil/internal/manifest"
	"github.com/danmestas/go-libfossil/internal/repo"
)

func TestLogPartialTreeRefusesIncompleteHistory(t *testing.T) {
	path := newSnapshotRepo(t)
	stdout, stderr, code := runCLI(t, "-R", path, "repo", "log", "--path", "missing")
	if code != exitNotFound {
		t.Fatalf("dense unknown history exit=%d stdout=%q stderr=%q, want %d", code, stdout, stderr, exitNotFound)
	}
	r, err := repo.Open(path)
	if err != nil {
		t.Fatal(err)
	}
	defer r.Close()
	put := func(data []byte) string {
		_, uuid, err := blob.Store(r.DB(), data)
		if err != nil {
			t.Fatal(err)
		}
		return uuid
	}
	putDeck := func(d *deck.Deck) string {
		data, err := d.Marshal()
		if err != nil {
			t.Fatal(err)
		}
		return put(data)
	}
	inside := put([]byte("inside"))
	outside := put([]byte("outside"))
	left := putDeck(&deck.Deck{F: []deck.FileCard{{Name: "src/a", UUID: inside}}})
	right := putDeck(&deck.Deck{F: []deck.FileCard{{Name: "vendor/a", UUID: outside}}})
	putDeck(&deck.Deck{C: "partial", D: time.Now().UTC(), U: deck.User("tester"),
		S: []deck.SubmanifestCard{{Name: "src/a", UUID: left}, {Name: "vendor/a", UUID: right}}})
	for _, query := range []string{"UPDATE blob SET size=-1,content=NULL WHERE uuid=?", "INSERT INTO phantom(rid) SELECT rid FROM blob WHERE uuid=?"} {
		if _, err := r.DB().Exec(query, right); err != nil {
			t.Fatal(err)
		}
	}
	c, err := cone.New([]string{"src"}, nil)
	if err != nil {
		t.Fatal(err)
	}
	if err := content.SetStoreCone(r.DB(), c); err != nil {
		t.Fatal(err)
	}
	if _, err := manifest.Crosslink(r); err != nil {
		t.Fatal(err)
	}
	stdout, stderr, code = runCLI(t, "-R", path, "repo", "log", "--json", "--path", "src/a")
	if code == 0 || code == exitNotFound || strings.TrimSpace(stdout) != "" || !strings.Contains(stderr, "derivation is incomplete") {
		t.Fatalf("partial history exit=%d stdout=%q stderr=%q; want incomplete error, not absence", code, stdout, stderr)
	}
}