|  | // Copyright 2020 The Monogon Project Authors. | 
|  | // | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package main | 
|  |  | 
|  | import ( | 
|  | "bufio" | 
|  | "encoding/json" | 
|  | "flag" | 
|  | "fmt" | 
|  | "io" | 
|  | "os" | 
|  | "strings" | 
|  | ) | 
|  |  | 
|  | var ( | 
|  | inPath  = flag.String("in", "", "Path to input Kconfig") | 
|  | outPath = flag.String("out", "", "Path to output Kconfig") | 
|  | ) | 
|  |  | 
|  | func main() { | 
|  | flag.Parse() | 
|  | if *inPath == "" || *outPath == "" { | 
|  | flag.PrintDefaults() | 
|  | os.Exit(2) | 
|  | } | 
|  | inFile, err := os.Open(*inPath) | 
|  | if err != nil { | 
|  | fmt.Fprintf(os.Stderr, "Failed to open input Kconfig: %v\n", err) | 
|  | os.Exit(1) | 
|  | } | 
|  | outFile, err := os.Create(*outPath) | 
|  | if err != nil { | 
|  | fmt.Fprintf(os.Stderr, "Failed to create output Kconfig: %v\n", err) | 
|  | os.Exit(1) | 
|  | } | 
|  | var config struct { | 
|  | Overrides map[string]string `json:"overrides"` | 
|  | } | 
|  | if err := json.Unmarshal([]byte(flag.Arg(0)), &config); err != nil { | 
|  | fmt.Fprintf(os.Stderr, "Failed to parse overrides: %v\n", err) | 
|  | os.Exit(1) | 
|  | } | 
|  | err = patchKconfig(inFile, outFile, config.Overrides) | 
|  | if err != nil { | 
|  | fmt.Fprintf(os.Stderr, "Failed to patch: %v\n", err) | 
|  | os.Exit(1) | 
|  | } | 
|  | } | 
|  |  | 
|  | func patchKconfig(inFile io.Reader, outFile io.Writer, overrides map[string]string) error { | 
|  | scanner := bufio.NewScanner(inFile) | 
|  | for scanner.Scan() { | 
|  | line := scanner.Text() | 
|  | cleanLine := strings.TrimSpace(line) | 
|  | if strings.HasPrefix(cleanLine, "#") || cleanLine == "" { | 
|  | // Pass through comments and empty lines | 
|  | fmt.Fprintln(outFile, line) | 
|  | } else { | 
|  | // Line contains a configuration option | 
|  | parts := strings.SplitN(line, "=", 2) | 
|  | keyName := parts[0] | 
|  | if overrideVal, ok := overrides[strings.TrimSpace(keyName)]; ok { | 
|  | // Override it | 
|  | if overrideVal == "" { | 
|  | fmt.Fprintf(outFile, "# %v is not set\n", keyName) | 
|  | } else { | 
|  | fmt.Fprintf(outFile, "%v=%v\n", keyName, overrideVal) | 
|  | } | 
|  | delete(overrides, keyName) | 
|  | } else { | 
|  | // Pass through unchanged | 
|  | fmt.Fprintln(outFile, line) | 
|  | } | 
|  | } | 
|  | } | 
|  | // Process left over overrides | 
|  | for key, val := range overrides { | 
|  | fmt.Fprintf(outFile, "%v=%v\n", key, val) | 
|  | } | 
|  | return nil | 
|  | } |