From ff249e19a25ab41b7c266413380788fa4d78cd5e Mon Sep 17 00:00:00 2001 From: soaringjerry Date: Sun, 29 Jun 2025 14:46:03 +0000 Subject: [PATCH] fix: Replace renameio with natefinch/atomic for Windows compatibility - Remove dependency on google/renameio which doesn't support Windows - Use natefinch/atomic which provides cross-platform atomic file operations - Fixes issue #9: Windows Compatibility This change enables the hnsw library to work on Windows platforms, allowing projects that depend on it to be cross-compiled for Windows. --- encode.go | 21 ++++++++++----------- go.mod | 1 + go.sum | 2 ++ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/encode.go b/encode.go index de3cf83..8ac2432 100644 --- a/encode.go +++ b/encode.go @@ -2,13 +2,14 @@ package hnsw import ( "bufio" + "bytes" "cmp" "encoding/binary" "fmt" "io" "os" - "github.com/google/renameio" + "github.com/natefinch/atomic" ) // errorEncoder is a helper type to encode multiple values @@ -301,14 +302,11 @@ func LoadSavedGraph[K cmp.Ordered](path string) (*SavedGraph[K], error) { // Save writes the graph to the file. func (g *SavedGraph[K]) Save() error { - tmp, err := renameio.TempFile("", g.Path) - if err != nil { - return err - } - defer tmp.Cleanup() - - wr := bufio.NewWriter(tmp) - err = g.Export(wr) + // Create a buffer to write the data + var buf bytes.Buffer + wr := bufio.NewWriter(&buf) + + err := g.Export(wr) if err != nil { return fmt.Errorf("exporting: %w", err) } @@ -318,9 +316,10 @@ func (g *SavedGraph[K]) Save() error { return fmt.Errorf("flushing: %w", err) } - err = tmp.CloseAtomicallyReplace() + // Use atomic.WriteFile to write the buffer contents atomically + err = atomic.WriteFile(g.Path, &buf) if err != nil { - return fmt.Errorf("closing atomically: %w", err) + return fmt.Errorf("writing atomically: %w", err) } return nil diff --git a/go.mod b/go.mod index 9bd856a..2743aef 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require github.com/google/renameio v1.0.1 require ( github.com/chewxy/math32 v1.10.1 // indirect + github.com/natefinch/atomic v1.0.1 // indirect github.com/viterin/partial v1.1.0 // indirect github.com/viterin/vek v0.4.2 // indirect golang.org/x/sys v0.11.0 // indirect diff --git a/go.sum b/go.sum index f571897..08e8a0d 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/renameio v1.0.1 h1:Lh/jXZmvZxb0BBeSY5VKEfidcbcbenKjZFzM/q0fSeU= github.com/google/renameio v1.0.1/go.mod h1:t/HQoYBZSsWSNK35C6CO/TpPLDVWvxOHboWUAweKUpk= +github.com/natefinch/atomic v1.0.1 h1:ZPYKxkqQOx3KZ+RsbnP/YsgvxWQPGxjC0oBt2AhwV0A= +github.com/natefinch/atomic v1.0.1/go.mod h1:N/D/ELrljoqDyT3rZrsUmtsuzvHkeB/wWjHV22AZRbM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=