Skip to content

Commit 8867249

Browse files
committed
make Netrc fulfill encoding.TextMarshaler interface
Make sure MarlshalText() output is the same as the input netrc file.
1 parent 5a2aede commit 8867249

File tree

2 files changed

+38
-5
lines changed

2 files changed

+38
-5
lines changed

netrc/netrc.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,21 @@ func (n *Netrc) FindMachine(name string) (*Machine, error) {
5959
return def, nil
6060
}
6161

62+
// MarshalText implements the encoding.TextMarshaler interface to encode a
63+
// Netrc into text format.
64+
func (n *Netrc) MarshalText() (text []byte, err error) {
65+
for i := range n.tokens {
66+
text = append(text, n.tokens[i].rawkind...)
67+
switch n.tokens[i].kind {
68+
case tkMacdef:
69+
text = append(text, ' ')
70+
text = append(text, n.tokens[i].macroName...)
71+
}
72+
text = append(text, n.tokens[i].rawvalue...)
73+
}
74+
return
75+
}
76+
6277
// Machine contains information about a remote machine.
6378
type Machine struct {
6479
Name string
@@ -141,8 +156,8 @@ func scanTokensKeepPrefix(data []byte, atEOF bool) (advance int, token []byte, e
141156
break
142157
}
143158
}
144-
if atEOF && len(data) == 0 {
145-
return 0, nil, nil
159+
if atEOF && len(data) == 0 || start == len(data) {
160+
return len(data), data, nil
146161
}
147162
if len(data) > start && data[start] == '#' {
148163
return scanLinesKeepPrefix(data, atEOF)
@@ -232,7 +247,6 @@ func parse(r io.Reader, pos int) (*Netrc, error) {
232247
// if macro rawvalue + rawb would contain \n\n, then macro def is over
233248
currentMacro.value = string(bytes.TrimLeft(currentMacro.rawvalue, "\r\n"))
234249
nrc.macros[currentMacro.macroName] = currentMacro.value
235-
nrc.tokens = append(nrc.tokens, currentMacro)
236250
currentMacro = nil
237251
}
238252

@@ -288,8 +302,6 @@ func parse(r io.Reader, pos int) (*Netrc, error) {
288302
return nil, &Error{pos, err.Error()}
289303
}
290304
t.value = m.Account
291-
case tkComment:
292-
// read whole line
293305
}
294306

295307
nrc.tokens = append(nrc.tokens, t)

netrc/netrc_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,27 @@ func TestFindMachine(t *testing.T) {
138138
}
139139
}
140140

141+
func TestMarshalText(t *testing.T) {
142+
// load up expected netrc Marshal output
143+
expected, err := ioutil.ReadAll(netrcReader("examples/good.netrc", t))
144+
if err != nil {
145+
t.Fatal(err)
146+
}
147+
148+
n, err := ParseFile("examples/good.netrc")
149+
if err != nil {
150+
t.Fatal(err)
151+
}
152+
153+
result, err := n.MarshalText()
154+
if err != nil {
155+
t.Fatal(err)
156+
}
157+
if string(result) != string(expected) {
158+
t.Errorf("expected:\n%q\ngot:\n%q", string(expected), string(result))
159+
}
160+
}
161+
141162
func netrcReader(filename string, t *testing.T) io.Reader {
142163
b, err := ioutil.ReadFile(filename)
143164
if err != nil {

0 commit comments

Comments
 (0)