Skip to content

Commit d88a86d

Browse files
committed
unit: try to avoid unit file modification
1 parent 7b2428f commit d88a86d

File tree

4 files changed

+61
-8
lines changed

4 files changed

+61
-8
lines changed

unit/deserialize.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,13 +173,16 @@ func (l *lexer) lexNextSectionOrOptionFunc(section string) lexStep {
173173
if err != nil {
174174
if err == io.EOF {
175175
err = nil
176+
l.optchan <- &UnitOption{Section: section, Name: "", Value: ""}
176177
}
177178
return nil, err
178179
}
179180

180181
if unicode.IsSpace(r) {
182+
l.optchan <- &UnitOption{Section: section, Name: "", Value: fmt.Sprintf("%c", r)}
181183
return l.lexNextSectionOrOptionFunc(section), nil
182184
} else if r == '[' {
185+
l.optchan <- &UnitOption{Section: section, Name: "", Value: ""}
183186
return l.lexSectionName, nil
184187
} else if isComment(r) {
185188
return l.ignoreLineFunc(l.lexNextSectionOrOptionFunc(section)), nil

unit/deserialize_test.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ After=baz.service
3939
&UnitOption{"Unit", "Description", "Bar"},
4040
&UnitOption{"Unit", "Requires", "baz.service"},
4141
&UnitOption{"Unit", "After", "baz.service"},
42+
&UnitOption{"Unit", "", ""},
4243
},
4344
},
4445

@@ -56,8 +57,14 @@ Pants=on
5657
`),
5758
[]*UnitOption{
5859
&UnitOption{"Unit", "Description", "Foo"},
60+
&UnitOption{"Unit", "", "\n"},
61+
&UnitOption{"Unit", "", ""},
5962
&UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"},
63+
&UnitOption{"Service", "", "\n"},
64+
&UnitOption{"Service", "", ""},
6065
&UnitOption{"X-Third-Party", "Pants", "on"},
66+
&UnitOption{"X-Third-Party", "", "\n"},
67+
&UnitOption{"X-Third-Party", "", ""},
6168
},
6269
},
6370

@@ -67,7 +74,11 @@ Pants=on
6774
[Service]
6875
[X-Third-Party]
6976
`),
70-
[]*UnitOption{},
77+
[]*UnitOption{
78+
&UnitOption{"Unit", "", ""},
79+
&UnitOption{"Service", "", ""},
80+
&UnitOption{"X-Third-Party", "", ""},
81+
},
7182
},
7283

7384
// multiple values not special-cased
@@ -77,6 +88,7 @@ Environment= "FOO=BAR" "BAZ=QUX"
7788
`),
7889
[]*UnitOption{
7990
&UnitOption{"Service", "Environment", "\"FOO=BAR\" \"BAZ=QUX\""},
91+
&UnitOption{"Service", "", ""},
8092
},
8193
},
8294

@@ -89,6 +101,7 @@ Description= Unnecessarily wrapped \
89101
[]*UnitOption{
90102
&UnitOption{"Unit", "Description", `Unnecessarily wrapped \
91103
words here`},
104+
&UnitOption{"Unit", "", ""},
92105
},
93106
},
94107

@@ -106,6 +119,7 @@ Description=Bar
106119
`),
107120
[]*UnitOption{
108121
&UnitOption{"Unit", "Description", "Bar"},
122+
&UnitOption{"Unit", "", ""},
109123
},
110124
},
111125

@@ -121,7 +135,9 @@ Baz
121135
`),
122136
[]*UnitOption{
123137
&UnitOption{"Unit", "Description", "Bar\\\n# comment alpha"},
138+
&UnitOption{"Unit", "", "\n"},
124139
&UnitOption{"Unit", "Description", "Bar\\\n# comment bravo \\\nBaz"},
140+
&UnitOption{"Unit", "", ""},
125141
},
126142
},
127143

@@ -133,6 +149,7 @@ Description=Bar
133149
`),
134150
[]*UnitOption{
135151
&UnitOption{"Unit", "Description", "Bar"},
152+
&UnitOption{"Unit", "", ""},
136153
},
137154
},
138155

@@ -144,6 +161,7 @@ Description=Bar
144161
`),
145162
[]*UnitOption{
146163
&UnitOption{"Unit", "Description", "Bar"},
164+
&UnitOption{"Unit", "", ""},
147165
},
148166
},
149167

@@ -154,6 +172,7 @@ Description=Bar
154172
`),
155173
[]*UnitOption{
156174
&UnitOption{"Unit", "<<<<<<<<", "Bar"},
175+
&UnitOption{"Unit", "", ""},
157176
},
158177
},
159178

@@ -164,6 +183,7 @@ Some Thing = Bar
164183
`),
165184
[]*UnitOption{
166185
&UnitOption{"Unit", "Some Thing", "Bar"},
186+
&UnitOption{"Unit", "", ""},
167187
},
168188
},
169189

@@ -173,6 +193,7 @@ Some Thing = Bar
173193
Description=Bar`),
174194
[]*UnitOption{
175195
&UnitOption{"Unit", "Description", "Bar"},
196+
&UnitOption{"Unit", "", ""},
176197
},
177198
},
178199

@@ -182,6 +203,7 @@ Description=Bar`),
182203
Description=Bar \`),
183204
[]*UnitOption{
184205
&UnitOption{"Unit", "Description", "Bar \\"},
206+
&UnitOption{"Unit", "", ""},
185207
},
186208
},
187209

@@ -191,6 +213,7 @@ Description=Bar \`),
191213
µ☃=ÇôrèÕ$`),
192214
[]*UnitOption{
193215
&UnitOption{"©", "µ☃", "ÇôrèÕ$"},
216+
&UnitOption{"©", "", ""},
194217
},
195218
},
196219

@@ -200,7 +223,9 @@ Description=Bar \`),
200223
Description =words here
201224
`),
202225
[]*UnitOption{
226+
&UnitOption{"Unit", "", " "},
203227
&UnitOption{"Unit", "Description", "words here"},
228+
&UnitOption{"Unit", "", ""},
204229
},
205230
},
206231

@@ -210,6 +235,7 @@ Description=Bar \`),
210235
Description= words here `),
211236
[]*UnitOption{
212237
&UnitOption{"Unit", "Description", "words here"},
238+
&UnitOption{"Unit", "", ""},
213239
},
214240
},
215241

@@ -220,6 +246,7 @@ Description= words here \
220246
`),
221247
[]*UnitOption{
222248
&UnitOption{"Unit", "Description", "words here \\\n"},
249+
&UnitOption{"Unit", "", ""},
223250
},
224251
},
225252

@@ -230,6 +257,7 @@ ExecStart=/bin/bash -c "while true; do echo \"ping\"; sleep 1; done"
230257
`),
231258
[]*UnitOption{
232259
&UnitOption{"Service", "ExecStart", `/bin/bash -c "while true; do echo \"ping\"; sleep 1; done"`},
260+
&UnitOption{"Service", "", ""},
233261
},
234262
},
235263

@@ -239,6 +267,7 @@ ExecStart=/bin/bash -c "while true; do echo \"ping\"; sleep 1; done"
239267
ExecStart=/bin/bash echo poof \ `),
240268
[]*UnitOption{
241269
&UnitOption{"Service", "ExecStart", `/bin/bash echo poof \`},
270+
&UnitOption{"Service", "", ""},
242271
},
243272
},
244273
// a long unit file line that's just equal to the maximum permitted length
@@ -247,6 +276,7 @@ ExecStart=/bin/bash echo poof \ `),
247276
ExecStart=/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`),
248277
[]*UnitOption{
249278
&UnitOption{"Service", "ExecStart", `/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`},
279+
&UnitOption{"Service", "", ""},
250280
},
251281
},
252282
// the same, but with a trailing newline
@@ -258,6 +288,7 @@ Option=value
258288
[]*UnitOption{
259289
&UnitOption{"Service", "ExecStart", `/bin/bash -c "echo ................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................."`},
260290
&UnitOption{"Service", "Option", "value"},
291+
&UnitOption{"Service", "", ""},
261292
},
262293
},
263294
}

unit/serialize.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,19 @@ func Serialize(opts []*UnitOption) io.Reader {
4141
idx[sec] = append(idx[sec], opt)
4242
}
4343

44-
for i, sect := range sections {
44+
for _, sect := range sections {
4545
writeSectionHeader(&buf, sect)
46-
writeNewline(&buf)
4746

4847
opts := idx[sect]
4948
for _, opt := range opts {
50-
writeOption(&buf, opt)
51-
writeNewline(&buf)
52-
}
53-
if i < len(sections)-1 {
54-
writeNewline(&buf)
49+
if len(opt.Name) == 0 && len(opt.Value) > 0 {
50+
buf.WriteString(opt.Value)
51+
} else if len(opt.Name) > 0 && len(opt.Value) > 0 {
52+
writeNewline(&buf)
53+
writeOption(&buf, opt)
54+
} else {
55+
writeNewline(&buf)
56+
}
5557
}
5658
}
5759

unit/serialize_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ func TestSerialize(t *testing.T) {
3535
[]*UnitOption{
3636
&UnitOption{"Unit", "Description", "Foo"},
3737
&UnitOption{"Unit", "BindsTo", "bar.service"},
38+
&UnitOption{"Unit", "", ""},
3839
},
3940
`[Unit]
4041
Description=Foo
@@ -47,6 +48,7 @@ BindsTo=bar.service
4748
[]*UnitOption{
4849
&UnitOption{"Unit", "Description", "Foo"},
4950
&UnitOption{"Unit", "Description", "Bar"},
51+
&UnitOption{"Unit", "", ""},
5052
},
5153
`[Unit]
5254
Description=Foo
@@ -58,7 +60,10 @@ Description=Bar
5860
{
5961
[]*UnitOption{
6062
&UnitOption{"Unit", "Description", "Foo"},
63+
&UnitOption{"Unit", "", "\n"},
64+
&UnitOption{"Unit", "", ""},
6165
&UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"},
66+
&UnitOption{"Service", "", ""},
6267
},
6368
`[Unit]
6469
Description=Foo
@@ -74,6 +79,9 @@ ExecStart=/usr/bin/sleep infinity
7479
&UnitOption{"Unit", "Description", "Foo"},
7580
&UnitOption{"Service", "ExecStart", "/usr/bin/sleep infinity"},
7681
&UnitOption{"Unit", "BindsTo", "bar.service"},
82+
&UnitOption{"Unit", "", "\n"},
83+
&UnitOption{"Unit", "", ""},
84+
&UnitOption{"Service", "", ""},
7785
},
7886
`[Unit]
7987
Description=Foo
@@ -92,7 +100,12 @@ ExecStart=/usr/bin/sleep infinity
92100
&UnitOption{"Unit", "BindsTo", "bar.service"},
93101
&UnitOption{"X-Foo", "Bar", "baz"},
94102
&UnitOption{"Service", "ExecStop", "/usr/bin/sleep 1"},
103+
&UnitOption{"Service", "", "\n"},
104+
&UnitOption{"Service", "", ""},
95105
&UnitOption{"Unit", "Documentation", "https://foo.com"},
106+
&UnitOption{"Unit", "", "\n"},
107+
&UnitOption{"Unit", "", ""},
108+
&UnitOption{"X-Foo", "", ""},
96109
},
97110
`[Unit]
98111
Description=Foo
@@ -112,6 +125,7 @@ Bar=baz
112125
{
113126
[]*UnitOption{
114127
&UnitOption{"©", "µ☃", "ÇôrèÕ$"},
128+
&UnitOption{"©", "", ""},
115129
},
116130
`[©]
117131
µ☃=ÇôrèÕ$
@@ -122,6 +136,7 @@ Bar=baz
122136
{
123137
[]*UnitOption{
124138
&UnitOption{"Un\nit", "Description", "Foo"},
139+
&UnitOption{"Un\nit", "", ""},
125140
},
126141
`[Un
127142
it]
@@ -133,6 +148,7 @@ Description=Foo
133148
{
134149
[]*UnitOption{
135150
&UnitOption{"Unit", "Desc\nription", "Foo"},
151+
&UnitOption{"Unit", "", ""},
136152
},
137153
`[Unit]
138154
Desc
@@ -144,6 +160,7 @@ ription=Foo
144160
{
145161
[]*UnitOption{
146162
&UnitOption{"Unit", "Description", "Fo\no"},
163+
&UnitOption{"Unit", "", ""},
147164
},
148165
`[Unit]
149166
Description=Fo

0 commit comments

Comments
 (0)