From 345162d000deebd1fc68c43475b290f950090fb8 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Thu, 7 Sep 2023 18:00:50 +0200 Subject: [PATCH 1/3] copy symlink files when calling the CopyDirTo --- _testdata/folder_containing_symlinks/file | 1 + _testdata/folder_containing_symlinks/file2 | 0 _testdata/folder_containing_symlinks/folder | 1 + paths.go | 41 +++++++++++++++++---- paths_test.go | 38 +++++++++++++++++++ 5 files changed, 73 insertions(+), 8 deletions(-) create mode 120000 _testdata/folder_containing_symlinks/file create mode 100644 _testdata/folder_containing_symlinks/file2 create mode 120000 _testdata/folder_containing_symlinks/folder diff --git a/_testdata/folder_containing_symlinks/file b/_testdata/folder_containing_symlinks/file new file mode 120000 index 0000000..74bb61d --- /dev/null +++ b/_testdata/folder_containing_symlinks/file @@ -0,0 +1 @@ +../file \ No newline at end of file diff --git a/_testdata/folder_containing_symlinks/file2 b/_testdata/folder_containing_symlinks/file2 new file mode 100644 index 0000000..e69de29 diff --git a/_testdata/folder_containing_symlinks/folder b/_testdata/folder_containing_symlinks/folder new file mode 120000 index 0000000..3dc590e --- /dev/null +++ b/_testdata/folder_containing_symlinks/folder @@ -0,0 +1 @@ +../folder \ No newline at end of file diff --git a/paths.go b/paths.go index 8b07bdc..245924e 100644 --- a/paths.go +++ b/paths.go @@ -76,6 +76,13 @@ func (p *Path) Stat() (os.FileInfo, error) { return os.Stat(p.path) } +// Lstat returns a FileInfo describing the named file. +// If the file is a symbolic link, the returned FileInfo +// describes the symbolic link. Lstat makes no attempt to follow the link. +func (p *Path) Lstat() (os.FileInfo, error) { + return os.Lstat(p.path) +} + // Clone create a copy of the Path object func (p *Path) Clone() *Path { return New(p.path) @@ -311,6 +318,16 @@ func (p *Path) IsDirCheck() (bool, error) { return false, err } +// IsDirCheck return true if the path exists and is a symlink. In all the other +// cases (and also in case of any error) false is returned. +func (p *Path) IsSymlink() (bool, error) { + info, err := p.Lstat() + if err != nil { + return false, fmt.Errorf("getting lstat info for %s: %s", p.path, err) + } + return info.Mode()&os.ModeSymlink != 0, nil +} + // CopyTo copies the contents of the file named src to the file named // by dst. The file will be created if it does not already exist. If the // destination file exists, all it's contents will be replaced by the contents @@ -382,22 +399,30 @@ func (p *Path) CopyDirTo(dst *Path) error { } for _, srcPath := range srcFiles { - srcPathInfo, err := srcPath.Stat() + srcPathInfo, err := srcPath.Lstat() if err != nil { - return fmt.Errorf("getting stat info for %s: %s", srcPath, err) + return fmt.Errorf("getting lstat info for %s: %s", srcPath, err) } dstPath := dst.Join(srcPath.Base()) - if srcPathInfo.IsDir() { - if err := srcPath.CopyDirTo(dstPath); err != nil { - return fmt.Errorf("copying %s to %s: %s", srcPath, dstPath, err) + // In case is a symlink, copy the symlink + if srcPathInfo.Mode()&os.ModeSymlink != 0 { + namedLink, err := os.Readlink(srcPath.path) + if err != nil { + return fmt.Errorf("could not read symlink: %s", err.Error()) + } + + if err := os.Symlink(namedLink, dstPath.path); err != nil { + return fmt.Errorf("creating symlink (%s) of %s to %s: %s", namedLink, srcPath, dstPath, err) } + continue } - // Skip symlinks. - if srcPathInfo.Mode()&os.ModeSymlink != 0 { - // TODO + if srcPathInfo.IsDir() { + if err := srcPath.CopyDirTo(dstPath); err != nil { + return fmt.Errorf("copying %s to %s: %s", srcPath, dstPath, err) + } continue } diff --git a/paths_test.go b/paths_test.go index 116131f..1112d84 100644 --- a/paths_test.go +++ b/paths_test.go @@ -30,6 +30,7 @@ package paths import ( + "os" "path/filepath" "runtime" "strings" @@ -243,6 +244,43 @@ func TestCopyDir(t *testing.T) { err = src.Join("file").CopyDirTo(tmp.Join("dest2")) require.Error(t, err, "copying file as dir") + + // Check if the file is a symlink + isSymlink, err := tmp.Join("dest", "folder_containing_symlinks", "file").IsSymlink() + require.True(t, isSymlink) + require.NoError(t, err) + + // Check if the folder is a symlink + isSymlink, err = tmp.Join("dest", "folder_containing_symlinks", "folder").IsSymlink() + require.True(t, isSymlink) + require.NoError(t, err) + + // Broken symlink is copied + { + // create broken folder containing the broken symlink file + tmpDestFolder := New(tmp.Join("broken").String()) + require.NoError(t, tmpDestFolder.Mkdir()) + + // Create a symlink that will raise a too many levels of symblic links error + err = os.Symlink("broken_symlink", tmpDestFolder.Join("broken_symlink").String()) + require.NoError(t, err) + // Create a symlinking pointing to a not existing file + err = os.Symlink("symlink", tmpDestFolder.Join("broken").String()) + require.NoError(t, err) + + src := tmpDestFolder + err = src.CopyDirTo(tmp.Join("broken_dest")) + require.NoError(t, err) + + exist, err = tmp.Join("broken_dest", "broken_symlink").ExistCheck() + require.False(t, exist) + require.Error(t, err) + require.Contains(t, err.Error(), "too many levels of symbolic links") + + exist, err = tmp.Join("broken_dest", "symlink").ExistCheck() + require.False(t, exist) + require.NoError(t, err) + } } func TestParents(t *testing.T) { From c3afb8e6a6d6c0e636cc49d5ac968d0321d484dd Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Thu, 7 Sep 2023 18:18:58 +0200 Subject: [PATCH 2/3] fix old test, after adding more test files --- paths_test.go | 23 +++--- readdir_test.go | 185 +++++++++++++++++++++++++++++++----------------- 2 files changed, 133 insertions(+), 75 deletions(-) diff --git a/paths_test.go b/paths_test.go index 1112d84..f80319e 100644 --- a/paths_test.go +++ b/paths_test.go @@ -306,19 +306,21 @@ func TestFilterDirs(t *testing.T) { list, err := testPath.ReadDir() require.NoError(t, err) - require.Len(t, list, 6) + require.Len(t, list, 7) pathEqualsTo(t, "_testdata/anotherFile", list[0]) pathEqualsTo(t, "_testdata/file", list[1]) pathEqualsTo(t, "_testdata/folder", list[2]) - pathEqualsTo(t, "_testdata/symlinktofolder", list[3]) - pathEqualsTo(t, "_testdata/test.txt", list[4]) - pathEqualsTo(t, "_testdata/test.txt.gz", list[5]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks", list[3]) + pathEqualsTo(t, "_testdata/symlinktofolder", list[4]) + pathEqualsTo(t, "_testdata/test.txt", list[5]) + pathEqualsTo(t, "_testdata/test.txt.gz", list[6]) list.FilterDirs() - require.Len(t, list, 2) + require.Len(t, list, 3) pathEqualsTo(t, "_testdata/folder", list[0]) - pathEqualsTo(t, "_testdata/symlinktofolder", list[1]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks", list[1]) + pathEqualsTo(t, "_testdata/symlinktofolder", list[2]) } func TestFilterOutDirs(t *testing.T) { @@ -326,14 +328,15 @@ func TestFilterOutDirs(t *testing.T) { list, err := testPath.ReadDir() require.NoError(t, err) - require.Len(t, list, 6) + require.Len(t, list, 7) pathEqualsTo(t, "_testdata/anotherFile", list[0]) pathEqualsTo(t, "_testdata/file", list[1]) pathEqualsTo(t, "_testdata/folder", list[2]) - pathEqualsTo(t, "_testdata/symlinktofolder", list[3]) - pathEqualsTo(t, "_testdata/test.txt", list[4]) - pathEqualsTo(t, "_testdata/test.txt.gz", list[5]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks", list[3]) + pathEqualsTo(t, "_testdata/symlinktofolder", list[4]) + pathEqualsTo(t, "_testdata/test.txt", list[5]) + pathEqualsTo(t, "_testdata/test.txt.gz", list[6]) list.FilterOutDirs() require.Len(t, list, 4) diff --git a/readdir_test.go b/readdir_test.go index aeee7e2..bad180e 100644 --- a/readdir_test.go +++ b/readdir_test.go @@ -42,7 +42,7 @@ func TestReadDirRecursive(t *testing.T) { list, err := testPath.ReadDirRecursive() require.NoError(t, err) - require.Len(t, list, 16) + require.Len(t, list, 25) pathEqualsTo(t, "_testdata/anotherFile", list[0]) pathEqualsTo(t, "_testdata/file", list[1]) @@ -52,14 +52,25 @@ func TestReadDirRecursive(t *testing.T) { pathEqualsTo(t, "_testdata/folder/file3", list[5]) pathEqualsTo(t, "_testdata/folder/subfolder", list[6]) pathEqualsTo(t, "_testdata/folder/subfolder/file4", list[7]) - pathEqualsTo(t, "_testdata/symlinktofolder", list[8]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", list[9]) - pathEqualsTo(t, "_testdata/symlinktofolder/file2", list[10]) - pathEqualsTo(t, "_testdata/symlinktofolder/file3", list[11]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", list[12]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", list[13]) - pathEqualsTo(t, "_testdata/test.txt", list[14]) - pathEqualsTo(t, "_testdata/test.txt.gz", list[15]) + + pathEqualsTo(t, "_testdata/folder_containing_symlinks", list[8]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file", list[9]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file2", list[10]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder", list[11]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/.hidden", list[12]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file2", list[13]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file3", list[14]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder", list[15]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder/file4", list[16]) + + pathEqualsTo(t, "_testdata/symlinktofolder", list[17]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", list[18]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", list[19]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", list[20]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", list[21]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", list[22]) + pathEqualsTo(t, "_testdata/test.txt", list[23]) + pathEqualsTo(t, "_testdata/test.txt.gz", list[24]) } func TestReadDirRecursiveSymLinkLoop(t *testing.T) { @@ -110,7 +121,7 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err := testdata.ReadDirRecursiveFiltered(nil) require.NoError(t, err) l.Sort() - require.Len(t, l, 16) + require.Len(t, l, 25) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) @@ -119,42 +130,62 @@ func TestReadDirRecursiveFiltered(t *testing.T) { pathEqualsTo(t, "_testdata/folder/file3", l[5]) pathEqualsTo(t, "_testdata/folder/subfolder", l[6]) pathEqualsTo(t, "_testdata/folder/subfolder/file4", l[7]) - pathEqualsTo(t, "_testdata/symlinktofolder", l[8]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[9]) - pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[10]) - pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[11]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[12]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[13]) - pathEqualsTo(t, "_testdata/test.txt", l[14]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[15]) + + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[8]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file", l[9]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file2", l[10]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder", l[11]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/.hidden", l[12]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file2", l[13]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file3", l[14]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder", l[15]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder/file4", l[16]) + + pathEqualsTo(t, "_testdata/symlinktofolder", l[17]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[18]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[19]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[20]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[21]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[22]) + pathEqualsTo(t, "_testdata/test.txt", l[23]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[24]) l, err = testdata.ReadDirRecursiveFiltered(FilterOutDirectories()) require.NoError(t, err) l.Sort() - require.Len(t, l, 6) + require.Len(t, l, 7) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) - pathEqualsTo(t, "_testdata/folder", l[2]) // <- this is listed but not traversed - pathEqualsTo(t, "_testdata/symlinktofolder", l[3]) // <- this is listed but not traversed - pathEqualsTo(t, "_testdata/test.txt", l[4]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[5]) + pathEqualsTo(t, "_testdata/folder", l[2]) // <- this is listed but not traversed + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[3]) // <- this is listed but not traversed + pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) // <- this is listed but not traversed + pathEqualsTo(t, "_testdata/test.txt", l[5]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[6]) l, err = testdata.ReadDirRecursiveFiltered(nil, FilterOutDirectories()) require.NoError(t, err) l.Sort() - require.Len(t, l, 12) + require.Len(t, l, 18) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) pathEqualsTo(t, "_testdata/folder/file2", l[3]) pathEqualsTo(t, "_testdata/folder/file3", l[4]) pathEqualsTo(t, "_testdata/folder/subfolder/file4", l[5]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[6]) - pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[7]) - pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[8]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[9]) - pathEqualsTo(t, "_testdata/test.txt", l[10]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[11]) + + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file", l[6]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file2", l[7]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/.hidden", l[8]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file2", l[9]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file3", l[10]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder/file4", l[11]) + + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[12]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[13]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[14]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[15]) + pathEqualsTo(t, "_testdata/test.txt", l[16]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[17]) l, err = testdata.ReadDirRecursiveFiltered(FilterOutDirectories(), FilterOutDirectories()) require.NoError(t, err) @@ -168,80 +199,104 @@ func TestReadDirRecursiveFiltered(t *testing.T) { l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), FilterOutSuffixes("3")) require.NoError(t, err) l.Sort() - require.Len(t, l, 12) + require.Len(t, l, 19) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) pathEqualsTo(t, "_testdata/folder/.hidden", l[3]) pathEqualsTo(t, "_testdata/folder/file2", l[4]) pathEqualsTo(t, "_testdata/folder/subfolder", l[5]) // <- subfolder skipped by Prefix("sub") - pathEqualsTo(t, "_testdata/symlinktofolder", l[6]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[7]) - pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[8]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[9]) // <- subfolder skipped by Prefix("sub") - pathEqualsTo(t, "_testdata/test.txt", l[10]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[11]) + + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[6]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file", l[7]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/file2", l[8]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder", l[9]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/.hidden", l[10]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/file2", l[11]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder", l[12]) // <- subfolder skipped by Prefix("sub") + + pathEqualsTo(t, "_testdata/symlinktofolder", l[13]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[14]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[15]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[16]) // <- subfolder skipped by Prefix("sub") + pathEqualsTo(t, "_testdata/test.txt", l[17]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[18]) l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"))) require.NoError(t, err) l.Sort() - require.Len(t, l, 9) + require.Len(t, l, 13) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/folder", l[1]) pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) pathEqualsTo(t, "_testdata/folder/subfolder", l[3]) - pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6]) - pathEqualsTo(t, "_testdata/test.txt", l[7]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[8]) + + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[4]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder", l[5]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/.hidden", l[6]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder", l[7]) + + pathEqualsTo(t, "_testdata/symlinktofolder", l[8]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[9]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[10]) + pathEqualsTo(t, "_testdata/test.txt", l[11]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[12]) l, err = testdata.ReadDirRecursiveFiltered(FilterOutPrefixes("sub"), AndFilter(FilterOutSuffixes("3"), FilterOutPrefixes("fil"), FilterOutSuffixes(".gz"))) require.NoError(t, err) l.Sort() - require.Len(t, l, 8) + require.Len(t, l, 12) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/folder", l[1]) pathEqualsTo(t, "_testdata/folder/.hidden", l[2]) pathEqualsTo(t, "_testdata/folder/subfolder", l[3]) - pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6]) - pathEqualsTo(t, "_testdata/test.txt", l[7]) + + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[4]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder", l[5]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/.hidden", l[6]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder/subfolder", l[7]) + + pathEqualsTo(t, "_testdata/symlinktofolder", l[8]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[9]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[10]) + pathEqualsTo(t, "_testdata/test.txt", l[11]) l, err = testdata.ReadDirRecursiveFiltered(OrFilter(FilterPrefixes("sub"), FilterSuffixes("tofolder"))) require.NoError(t, err) l.Sort() - require.Len(t, l, 11) + require.Len(t, l, 12) pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) - pathEqualsTo(t, "_testdata/symlinktofolder", l[3]) - pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[4]) - pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[5]) - pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[6]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[7]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[8]) - pathEqualsTo(t, "_testdata/test.txt", l[9]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[10]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[3]) + pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) + pathEqualsTo(t, "_testdata/symlinktofolder/.hidden", l[5]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[6]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[7]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[8]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder/file4", l[9]) + pathEqualsTo(t, "_testdata/test.txt", l[10]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[11]) l, err = testdata.ReadDirRecursiveFiltered(nil, FilterNames("folder")) require.NoError(t, err) l.Sort() - require.Len(t, l, 1) + require.Len(t, l, 2) pathEqualsTo(t, "_testdata/folder", l[0]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks/folder", l[1]) l, err = testdata.ReadDirRecursiveFiltered(FilterNames("symlinktofolder"), FilterOutNames(".hidden")) require.NoError(t, err) - require.Len(t, l, 9) + require.Len(t, l, 10) l.Sort() pathEqualsTo(t, "_testdata/anotherFile", l[0]) pathEqualsTo(t, "_testdata/file", l[1]) pathEqualsTo(t, "_testdata/folder", l[2]) - pathEqualsTo(t, "_testdata/symlinktofolder", l[3]) - pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[4]) - pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[5]) - pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[6]) - pathEqualsTo(t, "_testdata/test.txt", l[7]) - pathEqualsTo(t, "_testdata/test.txt.gz", l[8]) + pathEqualsTo(t, "_testdata/folder_containing_symlinks", l[3]) + pathEqualsTo(t, "_testdata/symlinktofolder", l[4]) + pathEqualsTo(t, "_testdata/symlinktofolder/file2", l[5]) + pathEqualsTo(t, "_testdata/symlinktofolder/file3", l[6]) + pathEqualsTo(t, "_testdata/symlinktofolder/subfolder", l[7]) + pathEqualsTo(t, "_testdata/test.txt", l[8]) + pathEqualsTo(t, "_testdata/test.txt.gz", l[9]) } From d59071b490ba0144fcbc1aff4127d72ba45f54f0 Mon Sep 17 00:00:00 2001 From: Alessio Perugini Date: Thu, 7 Sep 2023 19:01:46 +0200 Subject: [PATCH 3/3] test: skip strict error check on windows --- paths_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/paths_test.go b/paths_test.go index f80319e..95a1127 100644 --- a/paths_test.go +++ b/paths_test.go @@ -275,7 +275,9 @@ func TestCopyDir(t *testing.T) { exist, err = tmp.Join("broken_dest", "broken_symlink").ExistCheck() require.False(t, exist) require.Error(t, err) - require.Contains(t, err.Error(), "too many levels of symbolic links") + if runtime.GOOS != "windows" { + require.Contains(t, err.Error(), "too many levels of symbolic links") + } exist, err = tmp.Join("broken_dest", "symlink").ExistCheck() require.False(t, exist)