blob: adb820242d33e0526c8bf191dde0664ac948b374 [file] [log] [blame]
Lorenz Brun878f5f92020-05-12 16:15:39 +02001// Copyright 2020 The Monogon Project Authors.
2//
3// SPDX-License-Identifier: Apache-2.0
4//
5// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
16
Serge Bazanski216fe7b2021-05-21 18:36:16 +020017// genosrelease provides rudimentary support to generate os-release files
18// following the freedesktop spec from arguments and stamping
19//
20// https://www.freedesktop.org/software/systemd/man/os-release.html
Lorenz Brun878f5f92020-05-12 16:15:39 +020021package main
22
23import (
24 "flag"
25 "fmt"
Lorenz Brun878f5f92020-05-12 16:15:39 +020026 "os"
27 "strings"
28
29 "github.com/joho/godotenv"
30)
31
32var (
33 flagStatusFile = flag.String("status_file", "", "path to bazel workspace status file")
34 flagOutFile = flag.String("out_file", "os-release", "path to os-release output file")
35 flagStampVar = flag.String("stamp_var", "", "variable to use as version from the workspace status file")
36 flagName = flag.String("name", "", "name parameter (see freedesktop spec)")
37 flagID = flag.String("id", "", "id parameter (see freedesktop spec)")
38)
39
40func main() {
41 flag.Parse()
Lorenz Brun764a2de2021-11-22 16:26:36 +010042 statusFileContent, err := os.ReadFile(*flagStatusFile)
Lorenz Brun878f5f92020-05-12 16:15:39 +020043 if err != nil {
44 fmt.Printf("Failed to open bazel workspace status file: %v\n", err)
45 os.Exit(1)
46 }
47 statusVars := make(map[string]string)
48 for _, line := range strings.Split(string(statusFileContent), "\n") {
49 line = strings.TrimSpace(line)
50 parts := strings.Fields(line)
51 if len(parts) != 2 {
52 continue
53 }
54 statusVars[parts[0]] = parts[1]
55 }
56
Serge Bazanski662b5b32020-12-21 13:49:00 +010057 version, ok := statusVars[*flagStampVar]
Lorenz Brun878f5f92020-05-12 16:15:39 +020058 if !ok {
59 fmt.Printf("%v key not set in bazel workspace status file\n", *flagStampVar)
60 os.Exit(1)
61 }
62 // As specified by https://www.freedesktop.org/software/systemd/man/os-release.html
63 osReleaseVars := map[string]string{
64 "NAME": *flagName,
65 "ID": *flagID,
Serge Bazanski662b5b32020-12-21 13:49:00 +010066 "VERSION": version,
67 "VERSION_ID": version,
68 "PRETTY_NAME": *flagName + " " + version,
Lorenz Brun878f5f92020-05-12 16:15:39 +020069 }
70 osReleaseContent, err := godotenv.Marshal(osReleaseVars)
71 if err != nil {
72 fmt.Printf("Failed to encode os-release file: %v\n", err)
73 os.Exit(1)
74 }
Lorenz Brun764a2de2021-11-22 16:26:36 +010075 if err := os.WriteFile(*flagOutFile, []byte(osReleaseContent), 0644); err != nil {
Lorenz Brun878f5f92020-05-12 16:15:39 +020076 fmt.Printf("Failed to write os-release file: %v\n", err)
77 os.Exit(1)
78 }
79}