blob: b291376b990029a06cd14de319d73f81536c2218 [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
2// SPDX-License-Identifier: Apache-2.0
3
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +01004package fsspec
5
6import (
7 "fmt"
8 "os"
9
Lorenz Brun65702192023-08-31 16:27:38 +020010 "google.golang.org/protobuf/encoding/prototext"
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +010011)
12
13// ReadMergeSpecs reads FSSpecs from all files in paths and merges them into
14// a single FSSpec.
15func ReadMergeSpecs(paths []string) (*FSSpec, error) {
16 var mergedSpec FSSpec
17 for _, p := range paths {
18 specRaw, err := os.ReadFile(p)
19 if err != nil {
20 return nil, fmt.Errorf("failed to open spec: %w", err)
21 }
22
23 var spec FSSpec
Lorenz Brun65702192023-08-31 16:27:38 +020024 if err := prototext.Unmarshal(specRaw, &spec); err != nil {
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +010025 return nil, fmt.Errorf("failed to parse spec %q: %w", p, err)
26 }
Tim Windelschmidte1acfe32024-04-18 23:02:22 +020027 mergedSpec.File = append(mergedSpec.File, spec.File...)
28 mergedSpec.Directory = append(mergedSpec.Directory, spec.Directory...)
29 mergedSpec.SymbolicLink = append(mergedSpec.SymbolicLink, spec.SymbolicLink...)
30 mergedSpec.SpecialFile = append(mergedSpec.SpecialFile, spec.SpecialFile...)
Lorenz Brunb6a9d3c2022-01-27 18:56:20 +010031 }
32 return &mergedSpec, nil
33}