diff --git a/file.go b/file.go index 58beabc..d48438d 100644 --- a/file.go +++ b/file.go @@ -479,7 +479,13 @@ func (f *File) writeToBuffer(indent string) (*bytes.Buffer, error) { } } - for _, val := range shadows { + for i, val := range shadows { + // Indent is written once before the key. Repeat it for + // subsequent shadow keys so they keep the same indent + // (https://github.com/go-ini/ini/issues/367). + if i > 0 && len(indent) > 0 && sname != DefaultSection { + buf.WriteString(indent) + } exitLoop, err := writeKeyValue(val) if err != nil { return nil, err diff --git a/file_test.go b/file_test.go index 306c0c8..f91740a 100644 --- a/file_test.go +++ b/file_test.go @@ -472,6 +472,31 @@ bar3 = " val ue3 " bar1 = " val ue1 " bar2 = " val ue2 " bar3 = " val ue3 " +`, buf.String()) + }) + + t.Run("indent shadow keys the same as the first key", func(t *testing.T) { + f, err := LoadSources(LoadOptions{ + KeyValueDelimiters: " ", + KeyValueDelimiterOnWrite: " ", + AllowShadows: true, + }, []byte(`[FILTER] + whitelist_key _CMDLINE + whitelist_key _EXE + whitelist_key _HOSTNAME + record filename systemd +`)) + require.NoError(t, err) + require.NotNil(t, f) + + var buf bytes.Buffer + _, err = f.WriteToIndent(&buf, " ") + require.NoError(t, err) + assert.Equal(t, `[FILTER] + whitelist_key _CMDLINE + whitelist_key _EXE + whitelist_key _HOSTNAME + record filename systemd `, buf.String()) }) }