From 991af0d8574f6f86c3ad4f03c05fbebf6083a267 Mon Sep 17 00:00:00 2001 From: Alex Goodman Date: Mon, 7 Mar 2022 11:34:16 -0500 Subject: [PATCH] Include root path in directory resolve index (#869) --- syft/source/directory_resolver.go | 19 ++++++++++++++++++- syft/source/directory_resolver_test.go | 17 +++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/syft/source/directory_resolver.go b/syft/source/directory_resolver.go index 0691defb4..b735f744e 100644 --- a/syft/source/directory_resolver.go +++ b/syft/source/directory_resolver.go @@ -147,7 +147,7 @@ func (r *directoryResolver) indexPath(path string, info os.FileInfo, err error) } // link cycles could cause a revisit --we should not allow this - if r.fileTree.HasPath(file.Path(path)) { + if r.hasBeenIndexed(path) { return "", nil } @@ -193,6 +193,23 @@ func (r directoryResolver) addPathToIndex(p string, info os.FileInfo) (string, e } } +func (r directoryResolver) hasBeenIndexed(p string) bool { + filePath := file.Path(p) + if !r.fileTree.HasPath(filePath) { + return false + } + + exists, ref, err := r.fileTree.File(filePath) + if err != nil || !exists || ref == nil { + return false + } + + // cases like "/" will be in the tree, but not been indexed yet (a special case). We want to capture + // these cases as new paths to index. + _, exists = r.metadata[ref.ID()] + return exists +} + func (r directoryResolver) addDirectoryToIndex(p string, info os.FileInfo) error { ref, err := r.fileTree.AddDir(file.Path(p)) if err != nil { diff --git a/syft/source/directory_resolver_test.go b/syft/source/directory_resolver_test.go index c791692de..795ef0b79 100644 --- a/syft/source/directory_resolver_test.go +++ b/syft/source/directory_resolver_test.go @@ -848,3 +848,20 @@ func testWithTimeout(t *testing.T, timeout time.Duration, test func(*testing.T)) case <-done: } } + +func Test_IncludeRootPathInIndex(t *testing.T) { + filterFn := func(path string, _ os.FileInfo) bool { + return path != "/" + } + + resolver, err := newDirectoryResolver("/", filterFn) + require.NoError(t, err) + + exists, ref, err := resolver.fileTree.File(file.Path("/")) + require.NoError(t, err) + require.NotNil(t, ref) + assert.True(t, exists) + + _, exists = resolver.metadata[ref.ID()] + require.True(t, exists) +}