From b11932524136481a3f80804933de862be5385ef5 Mon Sep 17 00:00:00 2001 From: Quentin McGaw Date: Tue, 19 May 2026 03:03:30 +0000 Subject: [PATCH] hotfix(storage): do not write filepath field for non-manifest files --- internal/storage/flush.go | 5 ++- internal/storage/flush_test.go | 64 ++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 internal/storage/flush_test.go diff --git a/internal/storage/flush.go b/internal/storage/flush.go index e9cdede7..39dc5070 100644 --- a/internal/storage/flush.go +++ b/internal/storage/flush.go @@ -51,9 +51,12 @@ func (s *Storage) flushToFile(manifestPath string) error { return fmt.Errorf("opening servers data file for %s: %w", provider, err) } + encodedProviderServers := providerServers + encodedProviderServers.Filepath = "" + encoder := json.NewEncoder(providerFile) encoder.SetIndent("", " ") - err = encoder.Encode(providerServers) + err = encoder.Encode(encodedProviderServers) if err != nil { _ = providerFile.Close() return fmt.Errorf("encoding servers data for %s: %w", provider, err) diff --git a/internal/storage/flush_test.go b/internal/storage/flush_test.go new file mode 100644 index 00000000..2d1b2104 --- /dev/null +++ b/internal/storage/flush_test.go @@ -0,0 +1,64 @@ +package storage + +import ( + "encoding/json" + "os" + "path/filepath" + "testing" + + "github.com/qdm12/gluetun/internal/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_flushToFile_filepathOnlyInManifest(t *testing.T) { + t.Parallel() + + tempPath := t.TempDir() + providerFilepath := filepath.Join(tempPath, "provider.json") + manifestPath := filepath.Join(tempPath, "manifest.json") + + storage := &Storage{ + mergedServers: models.AllServers{ + Version: 1, + ProviderToServers: map[string]models.Servers{ + "provider": { + Version: 1, + Timestamp: 1, + Filepath: providerFilepath, + }, + }, + }, + } + + err := storage.flushToFile(manifestPath) + require.NoError(t, err) + + providerFile, err := os.Open(providerFilepath) + require.NoError(t, err) + defer providerFile.Close() + + providerContent := make(map[string]json.RawMessage) + err = json.NewDecoder(providerFile).Decode(&providerContent) + require.NoError(t, err) + _, hasFilepath := providerContent["filepath"] + assert.False(t, hasFilepath) + + manifestFile, err := os.Open(manifestPath) + require.NoError(t, err) + defer manifestFile.Close() + + manifestContent := make(map[string]json.RawMessage) + err = json.NewDecoder(manifestFile).Decode(&manifestContent) + require.NoError(t, err) + + providerMetadataRaw, ok := manifestContent["provider"] + require.True(t, ok) + + var providerMetadata struct { + Filepath string `json:"filepath"` + } + err = json.Unmarshal(providerMetadataRaw, &providerMetadata) + require.NoError(t, err) + assert.Equal(t, providerFilepath, providerMetadata.Filepath) +}