package debtik import ( _ "embed" "fmt" "os" "path/filepath" ) // Embed the helpers so an upgrade launched by a legacy updater also updates // its own tooling when the newly installed server starts. // //go:embed scripts/debtik-update var updateHelper []byte //go:embed scripts/release-version.py var versionHelper []byte // RefreshUpdateHelpers refreshes an existing installation, without creating one // when the server is run from a development checkout. func RefreshUpdateHelpers(dir string) error { if _, err := os.Stat(filepath.Join(dir, "debtik-update")); os.IsNotExist(err) { return nil } else if err != nil { return err } for _, helper := range []struct { name string data []byte }{{"debtik-update", updateHelper}, {"debtik-release-version", versionHelper}} { if err := writeHelper(dir, helper.name, helper.data); err != nil { return err } } return nil } func writeHelper(dir, name string, data []byte) error { f, err := os.CreateTemp(dir, ".debtik-helper-*") if err != nil { return err } defer os.Remove(f.Name()) if err = f.Chmod(0750); err == nil { _, err = f.Write(data) } if err == nil { err = f.Sync() } closeErr := f.Close() if err == nil { err = closeErr } if err == nil { err = os.Rename(f.Name(), filepath.Join(dir, name)) } if err != nil { return fmt.Errorf("install %s: %w", name, err) } return nil }