| package fsspec | 
 |  | 
 | import ( | 
 | 	"fmt" | 
 | 	"os" | 
 |  | 
 | 	"github.com/golang/protobuf/proto" | 
 | ) | 
 |  | 
 | // ReadMergeSpecs reads FSSpecs from all files in paths and merges them into | 
 | // a single FSSpec. | 
 | func ReadMergeSpecs(paths []string) (*FSSpec, error) { | 
 | 	var mergedSpec FSSpec | 
 | 	for _, p := range paths { | 
 | 		specRaw, err := os.ReadFile(p) | 
 | 		if err != nil { | 
 | 			return nil, fmt.Errorf("failed to open spec: %w", err) | 
 | 		} | 
 |  | 
 | 		var spec FSSpec | 
 | 		if err := proto.UnmarshalText(string(specRaw), &spec); err != nil { | 
 | 			return nil, fmt.Errorf("failed to parse spec %q: %w", p, err) | 
 | 		} | 
 | 		for _, f := range spec.File { | 
 | 			mergedSpec.File = append(mergedSpec.File, f) | 
 | 		} | 
 | 		for _, d := range spec.Directory { | 
 | 			mergedSpec.Directory = append(mergedSpec.Directory, d) | 
 | 		} | 
 | 		for _, s := range spec.SymbolicLink { | 
 | 			mergedSpec.SymbolicLink = append(mergedSpec.SymbolicLink, s) | 
 | 		} | 
 | 		for _, s := range spec.SpecialFile { | 
 | 			mergedSpec.SpecialFile = append(mergedSpec.SpecialFile, s) | 
 | 		} | 
 | 	} | 
 | 	return &mergedSpec, nil | 
 | } |