Skip to content
go-libfossil Artifact [ae7b513a27]
Login

Artifact [ae7b513a27]

Artifact ae7b513a271df57a9a85a40d811828dc83f676797169b6d8eb88873a5c2e3890:


package checkout

import (
	"testing"

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

func TestSparseCheckoutOpensWithElidedSubtree(t *testing.T) {
	f := newSparseRepo(t, true)
	d, err := manifest.GetManifest(f.repo, f.c1)
	if err != nil {
		t.Fatal(err)
	}
	files, err := manifest.ListFiles(f.repo, f.c1)
	if err != nil {
		t.Fatal(err)
	}
	c, err := cone.New([]string{files[0].Name}, nil)
	if err != nil {
		t.Fatal(err)
	}
	if err := content.SetStoreCone(f.repo.DB(), c); err != nil {
		t.Fatal(err)
	}
	if len(d.S) < 2 {
		t.Fatal("fixture needs at least two leaves")
	}
	outside := d.S[len(d.S)-1].UUID
	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 := f.repo.DB().Exec(query, outside); err != nil {
			t.Fatal(err)
		}
	}
	co := f.open(t, c, f.c1)
	got := onDisk(t, co)
	if len(got) != 1 || got[0] != files[0].Name {
		t.Fatalf("materialized %v, want %s only", got, files[0].Name)
	}
	if _, err := manifest.ListFiles(f.repo, f.c1); err == nil {
		t.Fatal("dense enumeration accepted missing subtree")
	}
	if dense, err := Create(f.repo, t.TempDir(), CreateOpts{}); err == nil {
		dense.Close()
		t.Fatal("dense checkout silently accepted sparse file set")
	}
}