From d88a86dfa74b0fc417fee076664c8f78d8ac7eb5 Mon Sep 17 00:00:00 2001 From: kayrus Date: Fri, 8 Apr 2016 19:30:45 +0200 Subject: [PATCH] unit: try to avoid unit file modification --- unit/deserialize.go | 3 +++ unit/deserialize_test.go | 33 ++++++++++++++++++++++++++++++++- unit/serialize.go | 16 +++++++++------- unit/serialize_test.go | 17 +++++++++++++++++ 4 files changed, 61 insertions(+), 8 deletions(-) diff --git a/unit/deserialize.go b/unit/deserialize.go index 8a88162f..a0b7a42b 100644 --- a/unit/deserialize.go +++ b/unit/deserialize.go @@ -173,13 +173,16 @@ func (l *lexer) lexNextSectionOrOptionFunc(section string) lexStep { if err != nil { if err == io.EOF { err = nil + l.optchan <- &UnitOption{Section: section, Name: "", Value: ""} } return nil, err } if unicode.IsSpace(r) { + l.optchan <- &UnitOption{Section: section, Name: "", Value: fmt.Sprintf("%c", r)} return l.lexNextSectionOrOptionFunc(section), nil } else if r == '[' { + l.optchan <- &UnitOption{Section: section, Name: "", Value: ""} return l.lexSectionName, nil } else if isComment(r) { return l.ignoreLineFunc(l.lexNextSectionOrOptionFunc(section)), nil diff --git a/unit/deserialize_test.go b/unit/deserialize_test.go index 84b7169f..0ef8ba1d 100644 --- a/unit/deserialize_test.go +++ b/unit/deserialize_test.go @@ -39,6 +39,7 @@ After=baz.service &UnitOption{"Unit", "Description", "Bar"}, &UnitOption{"Unit", "Requires", "baz.service"}, &UnitOption{"Unit", "After", "baz.service"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -56,8 +57,14 @@ Pants=on `), []*UnitOption{ &UnitOption{"Unit", "Description", "Foo"}, + &UnitOption{"Unit", "", "\n"}, + &UnitOption{"Unit", "", ""}, &UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"}, + &UnitOption{"Service", "", "\n"}, + &UnitOption{"Service", "", ""}, &UnitOption{"X-Third-Party", "Pants", "on"}, + &UnitOption{"X-Third-Party", "", "\n"}, + &UnitOption{"X-Third-Party", "", ""}, }, }, @@ -67,7 +74,11 @@ Pants=on [Service] [X-Third-Party] `), - []*UnitOption{}, + []*UnitOption{ + &UnitOption{"Unit", "", ""}, + &UnitOption{"Service", "", ""}, + &UnitOption{"X-Third-Party", "", ""}, + }, }, // multiple values not special-cased @@ -77,6 +88,7 @@ Environment= "FOO=BAR" "BAZ=QUX" `), []*UnitOption{ &UnitOption{"Service", "Environment", "\"FOO=BAR\" \"BAZ=QUX\""}, + &UnitOption{"Service", "", ""}, }, }, @@ -89,6 +101,7 @@ Description= Unnecessarily wrapped \ []*UnitOption{ &UnitOption{"Unit", "Description", `Unnecessarily wrapped \ words here`}, + &UnitOption{"Unit", "", ""}, }, }, @@ -106,6 +119,7 @@ Description=Bar `), []*UnitOption{ &UnitOption{"Unit", "Description", "Bar"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -121,7 +135,9 @@ Baz `), []*UnitOption{ &UnitOption{"Unit", "Description", "Bar\\\n# comment alpha"}, + &UnitOption{"Unit", "", "\n"}, &UnitOption{"Unit", "Description", "Bar\\\n# comment bravo \\\nBaz"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -133,6 +149,7 @@ Description=Bar `), []*UnitOption{ &UnitOption{"Unit", "Description", "Bar"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -144,6 +161,7 @@ Description=Bar `), []*UnitOption{ &UnitOption{"Unit", "Description", "Bar"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -154,6 +172,7 @@ Description=Bar `), []*UnitOption{ &UnitOption{"Unit", "<<<<<<<<", "Bar"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -164,6 +183,7 @@ Some Thing = Bar `), []*UnitOption{ &UnitOption{"Unit", "Some Thing", "Bar"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -173,6 +193,7 @@ Some Thing = Bar Description=Bar`), []*UnitOption{ &UnitOption{"Unit", "Description", "Bar"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -182,6 +203,7 @@ Description=Bar`), Description=Bar \`), []*UnitOption{ &UnitOption{"Unit", "Description", "Bar \\"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -191,6 +213,7 @@ Description=Bar \`), µ☃=ÇôrèÕ$`), []*UnitOption{ &UnitOption{"©", "µ☃", "ÇôrèÕ$"}, + &UnitOption{"©", "", ""}, }, }, @@ -200,7 +223,9 @@ Description=Bar \`), Description =words here `), []*UnitOption{ + &UnitOption{"Unit", "", " "}, &UnitOption{"Unit", "Description", "words here"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -210,6 +235,7 @@ Description=Bar \`), Description= words here `), []*UnitOption{ &UnitOption{"Unit", "Description", "words here"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -220,6 +246,7 @@ Description= words here \ `), []*UnitOption{ &UnitOption{"Unit", "Description", "words here \\\n"}, + &UnitOption{"Unit", "", ""}, }, }, @@ -230,6 +257,7 @@ ExecStart=/bin/bash -c "while true; do echo \"ping\"; sleep 1; done" `), []*UnitOption{ &UnitOption{"Service", "ExecStart", `/bin/bash -c "while true; do echo \"ping\"; sleep 1; done"`}, + &UnitOption{"Service", "", ""}, }, }, @@ -239,6 +267,7 @@ ExecStart=/bin/bash -c "while true; do echo \"ping\"; sleep 1; done" ExecStart=/bin/bash echo poof \ `), []*UnitOption{ &UnitOption{"Service", "ExecStart", `/bin/bash echo poof \`}, + &UnitOption{"Service", "", ""}, }, }, // a long unit file line that's just equal to the maximum permitted length @@ -247,6 +276,7 @@ ExecStart=/bin/bash echo poof \ `), ExecStart=/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`), []*UnitOption{ &UnitOption{"Service", "ExecStart", `/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`}, + &UnitOption{"Service", "", ""}, }, }, // the same, but with a trailing newline @@ -258,6 +288,7 @@ Option=value []*UnitOption{ &UnitOption{"Service", "ExecStart", `/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`}, &UnitOption{"Service", "Option", "value"}, + &UnitOption{"Service", "", ""}, }, }, } diff --git a/unit/serialize.go b/unit/serialize.go index e07799ca..e8ac20b6 100644 --- a/unit/serialize.go +++ b/unit/serialize.go @@ -41,17 +41,19 @@ func Serialize(opts []*UnitOption) io.Reader { idx[sec] = append(idx[sec], opt) } - for i, sect := range sections { + for _, sect := range sections { writeSectionHeader(&buf, sect) - writeNewline(&buf) opts := idx[sect] for _, opt := range opts { - writeOption(&buf, opt) - writeNewline(&buf) - } - if i < len(sections)-1 { - writeNewline(&buf) + if len(opt.Name) == 0 && len(opt.Value) > 0 { + buf.WriteString(opt.Value) + } else if len(opt.Name) > 0 && len(opt.Value) > 0 { + writeNewline(&buf) + writeOption(&buf, opt) + } else { + writeNewline(&buf) + } } } diff --git a/unit/serialize_test.go b/unit/serialize_test.go index bd492b0d..fefe0166 100644 --- a/unit/serialize_test.go +++ b/unit/serialize_test.go @@ -35,6 +35,7 @@ func TestSerialize(t *testing.T) { []*UnitOption{ &UnitOption{"Unit", "Description", "Foo"}, &UnitOption{"Unit", "BindsTo", "bar.service"}, + &UnitOption{"Unit", "", ""}, }, `[Unit] Description=Foo @@ -47,6 +48,7 @@ BindsTo=bar.service []*UnitOption{ &UnitOption{"Unit", "Description", "Foo"}, &UnitOption{"Unit", "Description", "Bar"}, + &UnitOption{"Unit", "", ""}, }, `[Unit] Description=Foo @@ -58,7 +60,10 @@ Description=Bar { []*UnitOption{ &UnitOption{"Unit", "Description", "Foo"}, + &UnitOption{"Unit", "", "\n"}, + &UnitOption{"Unit", "", ""}, &UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"}, + &UnitOption{"Service", "", ""}, }, `[Unit] Description=Foo @@ -74,6 +79,9 @@ ExecStart=/usr/bin/sleep infinity &UnitOption{"Unit", "Description", "Foo"}, &UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"}, &UnitOption{"Unit", "BindsTo", "bar.service"}, + &UnitOption{"Unit", "", "\n"}, + &UnitOption{"Unit", "", ""}, + &UnitOption{"Service", "", ""}, }, `[Unit] Description=Foo @@ -92,7 +100,12 @@ ExecStart=/usr/bin/sleep infinity &UnitOption{"Unit", "BindsTo", "bar.service"}, &UnitOption{"X-Foo", "Bar", "baz"}, &UnitOption{"Service", "ExecStop", "/usr/bin/sleep 1"}, + &UnitOption{"Service", "", "\n"}, + &UnitOption{"Service", "", ""}, &UnitOption{"Unit", "Documentation", "https://foo.com"}, + &UnitOption{"Unit", "", "\n"}, + &UnitOption{"Unit", "", ""}, + &UnitOption{"X-Foo", "", ""}, }, `[Unit] Description=Foo @@ -112,6 +125,7 @@ Bar=baz { []*UnitOption{ &UnitOption{"©", "µ☃", "ÇôrèÕ$"}, + &UnitOption{"©", "", ""}, }, `[©] µ☃=ÇôrèÕ$ @@ -122,6 +136,7 @@ Bar=baz { []*UnitOption{ &UnitOption{"Un\nit", "Description", "Foo"}, + &UnitOption{"Un\nit", "", ""}, }, `[Un it] @@ -133,6 +148,7 @@ Description=Foo { []*UnitOption{ &UnitOption{"Unit", "Desc\nription", "Foo"}, + &UnitOption{"Unit", "", ""}, }, `[Unit] Desc @@ -144,6 +160,7 @@ ription=Foo { []*UnitOption{ &UnitOption{"Unit", "Description", "Fo\no"}, + &UnitOption{"Unit", "", ""}, }, `[Unit] Description=Fo