From fcd0515f91612282aba5f5231a7dd71487e6dd8f Mon Sep 17 00:00:00 2001 From: yuangongji Date: Sat, 5 Sep 2020 16:15:51 +0800 Subject: [PATCH] Support Short-circuit load (#261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ᴜɴᴋɴᴡᴏɴ --- file.go | 3 +++ file_test.go | 2 +- ini.go | 2 ++ ini_test.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/file.go b/file.go index 7eecaca..549c00a 100644 --- a/file.go +++ b/file.go @@ -302,6 +302,9 @@ func (f *File) Reload() (err error) { } return err } + if f.options.ShortCircuit { + return nil + } } return nil } diff --git a/file_test.go b/file_test.go index 02fdfed..9a70d5e 100644 --- a/file_test.go +++ b/file_test.go @@ -449,7 +449,7 @@ bar3 = " val ue3 " var buf bytes.Buffer _, err := f.WriteTo(&buf) So(err, ShouldBeNil) - So(buf.String(),ShouldEqual,`[foo] + So(buf.String(), ShouldEqual, `[foo] bar1 = " val ue1 " bar2 = " val ue2 " bar3 = " val ue3 " diff --git a/ini.go b/ini.go index 80ebf3a..96322b3 100644 --- a/ini.go +++ b/ini.go @@ -81,6 +81,8 @@ type LoadOptions struct { IgnoreInlineComment bool // SkipUnrecognizableLines indicates whether to skip unrecognizable lines that do not conform to key/value pairs. SkipUnrecognizableLines bool + // ShortCircuit indicates whether to ignore other configuration sources after loaded the first available configuration source. + ShortCircuit bool // AllowBooleanKeys indicates whether to allow boolean type keys or treat as value is missing. // This type of keys are mostly used in my.cnf. AllowBooleanKeys bool diff --git a/ini_test.go b/ini_test.go index 94012a9..fb9a681 100644 --- a/ini_test.go +++ b/ini_test.go @@ -1367,6 +1367,55 @@ GITHUB = U;n;k;n;w;o;n } }) }) + + Convey("ShortCircuit", func() { + Convey("Load the first available configuration, ignore other configuration", func() { + f, err := ini.LoadSources(ini.LoadOptions{ShortCircuit: true}, minimalConf, []byte(`key1 = value1`)) + So(f, ShouldNotBeNil) + So(err, ShouldBeNil) + var buf bytes.Buffer + _, err = f.WriteTo(&buf) + So(err, ShouldBeNil) + So(buf.String(), ShouldEqual, `[author] +E-MAIL = u@gogs.io + +`) + }) + + Convey("Return an error when fail to load", func() { + f, err := ini.LoadSources(ini.LoadOptions{ShortCircuit: true}, notFoundConf, minimalConf) + So(f, ShouldBeNil) + So(err, ShouldNotBeNil) + }) + + Convey("Used with Loose to ignore errors that the file does not exist", func() { + f, err := ini.LoadSources(ini.LoadOptions{ShortCircuit: true, Loose: true}, notFoundConf, minimalConf) + So(f, ShouldNotBeNil) + So(err, ShouldBeNil) + var buf bytes.Buffer + _, err = f.WriteTo(&buf) + So(err, ShouldBeNil) + So(buf.String(), ShouldEqual, `[author] +E-MAIL = u@gogs.io + +`) + }) + + Convey("Ensure all sources are loaded without ShortCircuit", func() { + f, err := ini.LoadSources(ini.LoadOptions{ShortCircuit: false}, minimalConf, []byte(`key1 = value1`)) + So(f, ShouldNotBeNil) + So(err, ShouldBeNil) + var buf bytes.Buffer + _, err = f.WriteTo(&buf) + So(err, ShouldBeNil) + So(buf.String(), ShouldEqual, `key1 = value1 + +[author] +E-MAIL = u@gogs.io + +`) + }) + }) }) }