57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package devcontainer
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"time"
|
|
)
|
|
|
|
/*
|
|
Dev container provisioning helpers.
|
|
|
|
This file is intentionally small and boring.
|
|
It exists to support idempotency and shared paths
|
|
across dev container runtimes.
|
|
*/
|
|
|
|
const (
|
|
// MarkerDir is where devcontainer state is stored.
|
|
MarkerDir = "/opt/zlh/.zlh"
|
|
|
|
// ReadyMarker is written after a dev container is fully provisioned.
|
|
ReadyMarker = "devcontainer_ready.json"
|
|
)
|
|
|
|
// ReadyMarkerPath returns the absolute path to the ready marker file.
|
|
func ReadyMarkerPath() string {
|
|
return filepath.Join(MarkerDir, ReadyMarker)
|
|
}
|
|
|
|
// IsProvisioned returns true if the dev container has already been installed.
|
|
func IsProvisioned() bool {
|
|
_, err := os.Stat(ReadyMarkerPath())
|
|
return err == nil
|
|
}
|
|
|
|
// WriteReadyMarker records successful dev container provisioning.
|
|
// This should be called by runtime installers AFTER all install steps succeed.
|
|
func WriteReadyMarker(runtime string) error {
|
|
|
|
if err := os.MkdirAll(MarkerDir, 0755); err != nil {
|
|
return err
|
|
}
|
|
|
|
data := map[string]any{
|
|
"runtime": runtime,
|
|
"ready_at": time.Now().UTC().Format(time.RFC3339),
|
|
}
|
|
|
|
raw, err := json.MarshalIndent(data, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return os.WriteFile(ReadyMarkerPath(), raw, 0644)
|
|
}
|