61 lines
960 B
Go
61 lines
960 B
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"io/ioutil"
|
|
"os"
|
|
"sort"
|
|
)
|
|
|
|
var searchList = make([]FS, 0)
|
|
|
|
// read the first file matching path in the search list
|
|
func read(path string) (ba []byte, err error) {
|
|
for _, fs := range searchList {
|
|
var r io.ReadCloser
|
|
r, err = fs.Open(path)
|
|
if os.IsNotExist(err) {
|
|
continue
|
|
}
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
defer r.Close()
|
|
return ioutil.ReadAll(r)
|
|
}
|
|
|
|
err = fmt.Errorf("%s: %w", path, os.ErrNotExist)
|
|
return
|
|
}
|
|
|
|
func listBase(path string) ([]string, error) {
|
|
return fsFS{base}.List(path)
|
|
}
|
|
|
|
func listMerged(path string) (entries []string, err error) {
|
|
seen := map[string]bool{}
|
|
for _, fs := range searchList {
|
|
var fsEnts []string
|
|
fsEnts, err = fs.List(path)
|
|
if os.IsNotExist(err) {
|
|
err = nil
|
|
continue
|
|
}
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, ent := range fsEnts {
|
|
if !seen[ent] {
|
|
entries = append(entries, ent)
|
|
seen[ent] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
sort.Strings(entries)
|
|
return
|
|
}
|