@ 260812.1 · fetching

240718.1 · d6ebdd1cdd8e059d8c5ebfe409a7f36345a86e44

fix go 1.20 build and retract v1.0.7

This commit fixes the build for Go 1.20 by removing use of the slices package and retracts the v1.0.7 release.

It also changes the CI to test go1.20 (our minimum supported version) so that this will not happen again in the future.

reading declarations

Changes to internal/fmtdirent/. All files

internal/fmtdirent/fmtdirent_go120.go

new file mode 100644@@ -0,0 +1,31 @@+//go:build !go1.21++package fmtdirent++import "io/fs"++// Backport fs.FormatDirEntry from go1.21++// FormatDirEntry returns a formatted version of dir for human readability.+// Implementations of [DirEntry] can call this from a String method.+// The outputs for a directory named subdir and a file named hello.go are:+//+//	d subdir/+//	- hello.go+func FormatDirEntry(dir fs.DirEntry) string {+	name := dir.Name()+	b := make([]byte, 0, 5+len(name))++	// The Type method does not return any permission bits,+	// so strip them from the string.+	mode := dir.Type().String()+	mode = mode[:len(mode)-9]++	b = append(b, mode...)+	b = append(b, ' ')+	b = append(b, name...)+	if dir.IsDir() {+		b = append(b, '/')+	}+	return string(b)+}

internal/fmtdirent/fmtdirent_go120_test.go

new file mode 100644@@ -0,0 +1,118 @@+//go:build !go1.21++// Copyright 2023 The Go Authors. All rights reserved.+// Use of this source code is governed by a BSD-style+// license that can be found in the LICENSE file.++// Backport fs.FormatDirEntry tests from go1.21. We don't test+// the go1.21+ FormatDirEntry function since it just calls the+// stdlib and we don't want changes in its output to break our+// tests.++package fmtdirent_test++import (+	. "io/fs"+	"testing"+	"time"++	"github.com/charlievieth/fastwalk/internal/fmtdirent"+)++// formatTest implements FileInfo to test FormatFileInfo,+// and implements DirEntry to test FormatDirEntry.+type formatTest struct {+	name    string+	size    int64+	mode    FileMode+	modTime time.Time+	isDir   bool+}++func (fs *formatTest) Name() string {+	return fs.name+}++func (fs *formatTest) Size() int64 {+	return fs.size+}++func (fs *formatTest) Mode() FileMode {+	return fs.mode+}++func (fs *formatTest) ModTime() time.Time {+	return fs.modTime+}++func (fs *formatTest) IsDir() bool {+	return fs.isDir+}++func (fs *formatTest) Sys() any {+	return nil+}++func (fs *formatTest) Type() FileMode {+	return fs.mode.Type()+}++func (fs *formatTest) Info() (FileInfo, error) {+	return fs, nil+}++var formatTests = []struct {+	input        formatTest+	wantDirEntry string+}{+	{+		formatTest{+			name:    "hello.go",+			size:    100,+			mode:    0o644,+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),+			isDir:   false,+		},+		"- hello.go",+	},+	{+		formatTest{+			name:    "home/gopher",+			size:    0,+			mode:    ModeDir | 0o755,+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),+			isDir:   true,+		},+		"d home/gopher/",+	},+	{+		formatTest{+			name:    "big",+			size:    0x7fffffffffffffff,+			mode:    ModeIrregular | 0o644,+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),+			isDir:   false,+		},+		"? big",+	},+	{+		formatTest{+			name:    "small",+			size:    -0x8000000000000000,+			mode:    ModeSocket | ModeSetuid | 0o644,+			modTime: time.Date(1970, time.January, 1, 12, 0, 0, 0, time.UTC),+			isDir:   false,+		},+		"S small",+	},+}++func TestFormatDirEntry(t *testing.T) {+	for i, test := range formatTests {+		got := fmtdirent.FormatDirEntry(&test.input)+		if got != test.wantDirEntry {+			t.Errorf("%d: FormatDirEntry(%#v) = %q, want %q", i, test.input, got, test.wantDirEntry)+		}+	}++}

internal/fmtdirent/fmtdirent_go121.go

new file mode 100644@@ -0,0 +1,15 @@+//go:build go1.21++package fmtdirent++import "io/fs"++// FormatDirEntry returns a formatted version of dir for human readability.+// Implementations of [DirEntry] can call this from a String method.+// The outputs for a directory named subdir and a file named hello.go are:+//+//	d subdir/+//	- hello.go+func FormatDirEntry(dir fs.DirEntry) string {+	return fs.FormatDirEntry(dir)+}