blob: f5a45e33fd3040029534a062696c4c41f03bf7de [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 }
Tim Windelschmidte1acfe32024-04-18 23:02:22 +020024 mergedSpec.File = append(mergedSpec.File, spec.File...)
25 mergedSpec.Directory = append(mergedSpec.Directory, spec.Directory...)
26 mergedSpec.SymbolicLink = append(mergedSpec.SymbolicLink, spec.SymbolicLink...)
27 mergedSpec.SpecialFile = append(mergedSpec.SpecialFile, spec.SpecialFile...)
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +010028 }
29 return &mergedSpec, nil
30}