blob: 8d061f918b5d0b18efc9abb07114b30acbd2f91b [file] [log] [blame]
Tim Windelschmidt6d33a432025-02-04 14:34:25 +01001// Copyright The Monogon Project Authors.
Lorenz Brun878f5f92020-05-12 16:15:39 +02002// SPDX-License-Identifier: Apache-2.0
Lorenz Brun878f5f92020-05-12 16:15:39 +02003
Serge Bazanski216fe7b2021-05-21 18:36:16 +02004// genosrelease provides rudimentary support to generate os-release files
5// following the freedesktop spec from arguments and stamping
6//
7// https://www.freedesktop.org/software/systemd/man/os-release.html
Lorenz Brun878f5f92020-05-12 16:15:39 +02008package main
9
10import (
11 "flag"
12 "fmt"
Lorenz Brun878f5f92020-05-12 16:15:39 +020013 "os"
14 "strings"
15
16 "github.com/joho/godotenv"
17)
18
19var (
20 flagStatusFile = flag.String("status_file", "", "path to bazel workspace status file")
21 flagOutFile = flag.String("out_file", "os-release", "path to os-release output file")
22 flagStampVar = flag.String("stamp_var", "", "variable to use as version from the workspace status file")
23 flagName = flag.String("name", "", "name parameter (see freedesktop spec)")
24 flagID = flag.String("id", "", "id parameter (see freedesktop spec)")
25)
26
27func main() {
28 flag.Parse()
Lorenz Brun764a2de2021-11-22 16:26:36 +010029 statusFileContent, err := os.ReadFile(*flagStatusFile)
Lorenz Brun878f5f92020-05-12 16:15:39 +020030 if err != nil {
31 fmt.Printf("Failed to open bazel workspace status file: %v\n", err)
32 os.Exit(1)
33 }
34 statusVars := make(map[string]string)
35 for _, line := range strings.Split(string(statusFileContent), "\n") {
36 line = strings.TrimSpace(line)
37 parts := strings.Fields(line)
38 if len(parts) != 2 {
39 continue
40 }
41 statusVars[parts[0]] = parts[1]
42 }
43
Serge Bazanski662b5b32020-12-21 13:49:00 +010044 version, ok := statusVars[*flagStampVar]
Lorenz Brun878f5f92020-05-12 16:15:39 +020045 if !ok {
46 fmt.Printf("%v key not set in bazel workspace status file\n", *flagStampVar)
47 os.Exit(1)
48 }
49 // As specified by https://www.freedesktop.org/software/systemd/man/os-release.html
50 osReleaseVars := map[string]string{
51 "NAME": *flagName,
52 "ID": *flagID,
Serge Bazanski662b5b32020-12-21 13:49:00 +010053 "VERSION": version,
54 "VERSION_ID": version,
55 "PRETTY_NAME": *flagName + " " + version,
Lorenz Brun878f5f92020-05-12 16:15:39 +020056 }
57 osReleaseContent, err := godotenv.Marshal(osReleaseVars)
58 if err != nil {
59 fmt.Printf("Failed to encode os-release file: %v\n", err)
60 os.Exit(1)
61 }
Jan Schär2db68732024-10-30 18:25:33 +010062 if err := os.WriteFile(*flagOutFile, []byte(osReleaseContent+"\n"), 0644); err != nil {
Lorenz Brun878f5f92020-05-12 16:15:39 +020063 fmt.Printf("Failed to write os-release file: %v\n", err)
64 os.Exit(1)
65 }
66}