package main import ( "flag" "fmt" "os" "path/filepath" "regexp" "strings" ) type metadataRule struct{ path, pattern, version string } // syncMetadata updates version fields only. Regenerating Wails build templates // during a release used to overwrite customized platform packaging tasks. func syncMetadata(root, version string) error { if !regexp.MustCompile(`^[0-9]+\.[0-9]+\.[0-9]+(?:-[A-Za-z0-9.-]+)?$`).MatchString(version) { return fmt.Errorf("invalid release version") } core := strings.SplitN(version, "-", 2)[0] rules := []metadataRule{ {"build/windows/info.json", `("(?:file_version|product_version|FileVersion|ProductVersion)"\s*:\s*")[^"]*(")`, core}, {"build/windows/wails.exe.manifest", `(]*version=")[^"]*(")`, core + ".0"}, {"build/windows/nsis/wails_tools.nsh", `(!define INFO_PRODUCTVERSION ")[^"]*(")`, core}, {"build/darwin/Info.plist", `(CFBundle(?:ShortVersionString|Version)\s*)[^<]*()`, version}, {"build/darwin/Info.dev.plist", `(CFBundle(?:ShortVersionString|Version)\s*)[^<]*()`, version}, {"build/linux/nfpm/nfpm.yaml", `(?m)(^version:\s*")[^"]*(")`, version}, } updates := make(map[string][]byte) for _, rule := range rules { file := filepath.Join(root, filepath.FromSlash(rule.path)) data, err := os.ReadFile(file) if err != nil { return err } pattern := regexp.MustCompile(rule.pattern) if !pattern.Match(data) { return fmt.Errorf("missing version field in %s", rule.path) } updates[file] = pattern.ReplaceAll(data, []byte("${1}"+rule.version+"${2}")) } for file, data := range updates { info, err := os.Stat(file) if err != nil { return err } if err = os.WriteFile(file, data, info.Mode().Perm()); err != nil { return err } } return nil } func runMetadata(args []string) { flags := flag.NewFlagSet("sync-metadata", flag.ExitOnError) root := flags.String("root", ".", "project root") _ = flags.Parse(args) version, err := readVersion(filepath.Join(*root, "build", "config.yml")) if err != nil { exitErr(err) } if err = syncMetadata(*root, version); err != nil { exitErr(err) } }