blob: c51df065294d87958d9b3dc1c2489bcc76b39d87 [file] [log] [blame]
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +01001package fsspec
2
3import (
4 "fmt"
5 "os"
6
Lorenz Brun65702192023-08-31 16:27:38 +02007 "google.golang.org/protobuf/encoding/prototext"
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +01008)
9
10// ReadMergeSpecs reads FSSpecs from all files in paths and merges them into
11// a single FSSpec.
12func ReadMergeSpecs(paths []string) (*FSSpec, error) {
13 var mergedSpec FSSpec
14 for _, p := range paths {
15 specRaw, err := os.ReadFile(p)
16 if err != nil {
17 return nil, fmt.Errorf("failed to open spec: %w", err)
18 }
19
20 var spec FSSpec
Lorenz Brun65702192023-08-31 16:27:38 +020021 if err := prototext.Unmarshal(specRaw, &spec); err != nil {
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +010022 return nil, fmt.Errorf("failed to parse spec %q: %w", p, err)
23 }
24 for _, f := range spec.File {
25 mergedSpec.File = append(mergedSpec.File, f)
26 }
27 for _, d := range spec.Directory {
28 mergedSpec.Directory = append(mergedSpec.Directory, d)
29 }
30 for _, s := range spec.SymbolicLink {
31 mergedSpec.SymbolicLink = append(mergedSpec.SymbolicLink, s)
32 }
33 for _, s := range spec.SpecialFile {
34 mergedSpec.SpecialFile = append(mergedSpec.SpecialFile, s)
35 }
36 }
37 return &mergedSpec, nil
38}