From 74ed64aadbb4d5a316b233f3469219202b25efeb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Aug 2026 09:56:44 +0000 Subject: [PATCH 1/2] Initial plan From cab72e184a8994aed19353ec3099728dff29f02d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 5 Aug 2026 09:58:48 +0000 Subject: [PATCH 2/2] Fix write mode file truncation Co-authored-by: ccamel <9574336+ccamel@users.noreply.github.com> --- engine/builtin_test.go | 19 ++++++++----------- engine/stream.go | 4 ++-- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/engine/builtin_test.go b/engine/builtin_test.go index 7a947ed..21052fb 100644 --- a/engine/builtin_test.go +++ b/engine/builtin_test.go @@ -3703,8 +3703,10 @@ func TestOpen(t *testing.T) { defer func() { assert.NoError(t, os.Remove(n)) }() + assert.NoError(t, os.WriteFile(n, []byte("longer existing payload"), 0o644)) v := NewVariable() + var s *Stream ok, err := Open(&vm, NewAtom(n), atomWrite, v, List(&compound{ functor: atomAlias, @@ -3712,7 +3714,7 @@ func TestOpen(t *testing.T) { }), func(env *Env) *Promise { ref, ok := env.lookup(v) assert.True(t, ok) - s, ok := ref.(*Stream) + s, ok = ref.(*Stream) assert.True(t, ok) l, ok := vm.streams.lookup(atomOutput) @@ -3722,20 +3724,15 @@ func TestOpen(t *testing.T) { _, err := fmt.Fprintf(s.sink, "test\n") assert.NoError(t, err) - f, err := os.Open(n) - assert.NoError(t, err) - defer func() { - assert.NoError(t, f.Close()) - }() - - b, err := io.ReadAll(f) - assert.NoError(t, err) - assert.Equal(t, "test\n", string(b)) - return Bool(true) }, nil).Force(context.Background()) assert.NoError(t, err) assert.True(t, ok) + assert.NoError(t, s.Close()) + + b, err := os.ReadFile(n) + assert.NoError(t, err) + assert.Equal(t, "test\n", string(b)) }) t.Run("read_write", func(t *testing.T) { diff --git a/engine/stream.go b/engine/stream.go index c6fe303..646a36e 100644 --- a/engine/stream.go +++ b/engine/stream.go @@ -468,9 +468,9 @@ const ( // ioModeRead means you can read from the stream. ioModeRead = ioMode(os.O_RDONLY) // ioModeWrite means you can write to the stream. - ioModeWrite = ioMode(os.O_CREATE | os.O_WRONLY) + ioModeWrite = ioMode(os.O_CREATE | os.O_WRONLY | os.O_TRUNC) // ioModeAppend means you can append to the stream. - ioModeAppend = ioMode(os.O_APPEND) | ioModeWrite + ioModeAppend = ioMode(os.O_APPEND | os.O_CREATE | os.O_WRONLY) // ioModeReadWrite means you can both read from and write to an existing stream. ioModeReadWrite = ioMode(os.O_RDWR) )