From 645f4bc5ca28d56599c09c3a0526bf444b34ad31 Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 5 Oct 2024 16:33:48 -0600 Subject: [PATCH 1/2] atomic writes --- d2cli/main.go | 15 ++++++++++++--- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/d2cli/main.go b/d2cli/main.go index 4afe5fba5..df66926fa 100644 --- a/d2cli/main.go +++ b/d2cli/main.go @@ -537,7 +537,7 @@ func compile(ctx context.Context, ms *xmain.State, plugins []d2plugin.Plugin, fs if err != nil { return nil, false, err } - err = ms.WritePath(outputPath, out) + err = Write(ms, outputPath, out) if err != nil { return nil, false, err } @@ -621,7 +621,7 @@ func compile(ctx context.Context, ms *xmain.State, plugins []d2plugin.Plugin, fs if err != nil { return nil, false, err } - err = ms.WritePath(outputPath, out) + err = Write(ms, outputPath, out) if err != nil { return nil, false, err } @@ -906,7 +906,7 @@ func _render(ctx context.Context, ms *xmain.State, plugin d2plugin.Plugin, opts if err != nil { return svg, err } - err = ms.WritePath(outputPath, out) + err = Write(ms, outputPath, out) if err != nil { return svg, err } @@ -1369,6 +1369,15 @@ func AnimatePNGs(ms *xmain.State, pngs [][]byte, animIntervalMs int) ([]byte, er return xgif.AnimatePNGs(pngs, animIntervalMs) } +func Write(ms *xmain.State, path string, out []byte) error { + err := ms.AtomicWritePath(path, out) + if err == nil { + return nil + } + ms.Log.Debug.Printf("atomic write failed: %s, trying non-atomic write", err.Error()) + return ms.WritePath(path, out) +} + func init() { log.Init() } diff --git a/go.mod b/go.mod index 040fd6c39..1dce72a30 100644 --- a/go.mod +++ b/go.mod @@ -29,7 +29,7 @@ require ( golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da gonum.org/v1/plot v0.14.0 nhooyr.io/websocket v1.8.17 - oss.terrastruct.com/util-go v0.0.0-20241001213509-2c8848a930fb + oss.terrastruct.com/util-go v0.0.0-20241005222610-44c011a04896 ) require ( diff --git a/go.sum b/go.sum index f94228b1d..ccffe8f68 100644 --- a/go.sum +++ b/go.sum @@ -205,7 +205,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= nhooyr.io/websocket v1.8.17 h1:KEVeLJkUywCKVsnLIDlD/5gtayKp8VoCkksHCGGfT9Y= nhooyr.io/websocket v1.8.17/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= -oss.terrastruct.com/util-go v0.0.0-20241001213509-2c8848a930fb h1:3bvpnAM5gbaqmQYi1kWzNyfEH8p0UM4uCwAWV+/Ph7k= -oss.terrastruct.com/util-go v0.0.0-20241001213509-2c8848a930fb/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4= +oss.terrastruct.com/util-go v0.0.0-20241005222610-44c011a04896 h1:g752s1ECv9FD8GunFOZRGWzjeR0cr/TZdSsjAnFEmL8= +oss.terrastruct.com/util-go v0.0.0-20241005222610-44c011a04896/go.mod h1:eMWv0sOtD9T2RUl90DLWfuShZCYp4NrsqNpI8eqO6U4= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= From 1ba5ff07b9041646678f20d0e94dd16d879869fe Mon Sep 17 00:00:00 2001 From: Alexander Wang Date: Sat, 5 Oct 2024 16:34:53 -0600 Subject: [PATCH 2/2] next --- ci/release/changelogs/next.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/release/changelogs/next.md b/ci/release/changelogs/next.md index df8527fd0..8e21b3c66 100644 --- a/ci/release/changelogs/next.md +++ b/ci/release/changelogs/next.md @@ -3,6 +3,7 @@ #### Improvements 🧹 - Lib: removes a dependency on external slog that was causing troubles with installation [#2137](https://github.com/terrastruct/d2/pull/2137) +- CLI: attempts writing to path atomically, falling back to non-atomic if failed [#2141](https://github.com/terrastruct/d2/pull/2141) #### Bugfixes ⛑️