Skip to content

Commit 1583392

Browse files
authored
Merge pull request #1940 from vvoland/history-fix-long-lines
history: Fix loading very long lines
2 parents 52152da + bbece1b commit 1583392

2 files changed

Lines changed: 32 additions & 13 deletions

File tree

pkg/history/history.go

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package history
22

33
import (
4-
"bufio"
54
"encoding/json"
5+
"io"
66
"os"
77
"path/filepath"
88
"slices"
@@ -215,24 +215,18 @@ func (h *History) load() error {
215215
defer f.Close()
216216

217217
var all []string
218-
scanner := bufio.NewScanner(f)
219-
for scanner.Scan() {
220-
line := scanner.Text()
221-
if line == "" {
222-
continue
223-
}
224-
218+
dec := json.NewDecoder(f)
219+
for {
225220
var message string
226-
if err := json.Unmarshal([]byte(line), &message); err != nil {
221+
if err := dec.Decode(&message); err != nil {
222+
if err == io.EOF {
223+
break
224+
}
227225
continue
228226
}
229227
all = append(all, message)
230228
}
231229

232-
if err := scanner.Err(); err != nil {
233-
return err
234-
}
235-
236230
// Deduplicate keeping the latest occurrence of each message
237231
seen := make(map[string]bool)
238232
for i := len(all) - 1; i >= 0; i-- {

pkg/history/history_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,28 @@ func TestHistory_SetCurrent(t *testing.T) {
417417
h.SetCurrent(2)
418418
assert.Empty(t, h.Next())
419419
}
420+
421+
func TestHistory_VeryLongMessage(t *testing.T) {
422+
tmpDir := t.TempDir()
423+
424+
h, err := New(WithBaseDir(tmpDir))
425+
require.NoError(t, err)
426+
427+
// Create a message longer than bufio.Scanner's default 64KB limit
428+
longMessage := make([]byte, 100*1024) // 100KB
429+
for i := range longMessage {
430+
longMessage[i] = 'a' + byte(i%26)
431+
}
432+
longStr := string(longMessage)
433+
434+
require.NoError(t, h.Add(longStr))
435+
require.NoError(t, h.Add("short message after"))
436+
437+
// Reload history from disk
438+
h2, err := New(WithBaseDir(tmpDir))
439+
require.NoError(t, err)
440+
441+
require.Len(t, h2.Messages, 2)
442+
assert.Equal(t, longStr, h2.Messages[0])
443+
assert.Equal(t, "short message after", h2.Messages[1])
444+
}

0 commit comments

Comments
 (0)