diff --git a/internal/state/documents.go b/internal/state/documents.go index 93082ab31..cfcd21481 100644 --- a/internal/state/documents.go +++ b/internal/state/documents.go @@ -148,7 +148,7 @@ func (s *DocumentStore) CloseDocument(dh document.Handle) error { func (s *DocumentStore) ListDocumentsInDir(dirHandle document.DirHandle) ([]*document.Document, error) { txn := s.db.Txn(false) - it, err := txn.Get(s.tableName, "id_prefix", dirHandle) + it, err := txn.Get(s.tableName, "dir", dirHandle) if err != nil { return nil, err } @@ -176,7 +176,7 @@ func (s *DocumentStore) IsDocumentOpen(dh document.Handle) (bool, error) { func (s *DocumentStore) HasOpenDocuments(dirHandle document.DirHandle) (bool, error) { txn := s.db.Txn(false) - obj, err := txn.First(s.tableName, "id_prefix", dirHandle) + obj, err := txn.First(s.tableName, "dir", dirHandle) if err != nil { return false, err } diff --git a/internal/state/documents_test.go b/internal/state/documents_test.go index d38e5f2cf..04f0fc29d 100644 --- a/internal/state/documents_test.go +++ b/internal/state/documents_test.go @@ -187,6 +187,48 @@ func TestDocumentStore_ListDocumentsInDir(t *testing.T) { } } +func TestDocumentStore_ListDocumentsInDir_parentDir(t *testing.T) { + s, err := NewStateStore() + if err != nil { + t.Fatal(err) + } + + s.DocumentStore.TimeProvider = testTimeProvider + + testHandle1 := document.HandleFromURI("file:///dir/test1.tf") + err = s.DocumentStore.OpenDocument(testHandle1, "terraform", 0, []byte("foobar")) + if err != nil { + t.Fatal(err) + } + + testHandle2 := document.HandleFromURI("file:///dir/sub/test2.tf") + err = s.DocumentStore.OpenDocument(testHandle2, "terraform", 0, []byte("foobar")) + if err != nil { + t.Fatal(err) + } + + dirHandle := document.DirHandleFromURI("file:///dir") + docs, err := s.DocumentStore.ListDocumentsInDir(dirHandle) + if err != nil { + t.Fatal(err) + } + + expectedDocs := []*document.Document{ + { + Dir: dirHandle, + Filename: "test1.tf", + ModTime: testTimeProvider(), + LanguageID: "terraform", + Version: 0, + Text: []byte("foobar"), + Lines: source.MakeSourceLines("test1.tf", []byte("foobar")), + }, + } + if diff := cmp.Diff(expectedDocs, docs); diff != "" { + t.Fatalf("unexpected docs: %s", diff) + } +} + func TestDocumentStore_IsDocumentOpen(t *testing.T) { s, err := NewStateStore() if err != nil { @@ -250,7 +292,30 @@ func TestDocumentStore_HasOpenDocuments(t *testing.T) { if hasOpenDocs { t.Fatal("expected to find no open documents") } +} + +func TestDocumentStore_HasOpenDocuments_parentDir(t *testing.T) { + s, err := NewStateStore() + if err != nil { + t.Fatal(err) + } + s.DocumentStore.TimeProvider = testTimeProvider + + testHandle := document.HandleFromURI("file:///dir/sub/test2.tf") + err = s.DocumentStore.OpenDocument(testHandle, "terraform", 0, []byte("foobar")) + if err != nil { + t.Fatal(err) + } + + dirHandle := document.DirHandleFromURI("file:///dir") + hasOpenDocs, err := s.DocumentStore.HasOpenDocuments(dirHandle) + if err != nil { + t.Fatal(err) + } + if hasOpenDocs { + t.Fatal("expected to find no open documents") + } } func testTimeProvider() time.Time { diff --git a/internal/state/jobs.go b/internal/state/jobs.go index a54acb484..5e7429c27 100644 --- a/internal/state/jobs.go +++ b/internal/state/jobs.go @@ -335,7 +335,7 @@ func (js *JobStore) FinishJob(id job.ID, jobErr error, deferredJobIds ...job.ID) return fmt.Errorf("failed to copy a job: %w", err) } - js.logger.Printf("JOBS: Finishing job %q: %q for %q (err = %#v, deferredJobs: %q)", + js.logger.Printf("JOBS: Finishing job %q: %q for %q (err = %s, deferredJobs: %q)", sj.ID, sj.Type, sj.Dir, jobErr, deferredJobIds) _, err = txn.DeleteAll(js.tableName, "id", id) diff --git a/internal/state/state.go b/internal/state/state.go index d65aab115..383009be2 100644 --- a/internal/state/state.go +++ b/internal/state/state.go @@ -38,6 +38,10 @@ var dbSchema = &memdb.DBSchema{ }, }, }, + "dir": { + Name: "dir", + Indexer: &DirHandleFieldIndexer{Field: "Dir"}, + }, }, }, jobsTableName: {