From 6850821652aeeeafaef18cc704c4d98c2693744d Mon Sep 17 00:00:00 2001 From: Carlos Alexandro Becker Date: Thu, 25 May 2023 00:43:17 +0000 Subject: [PATCH] fix: improve \r\n handling Signed-off-by: Carlos Alexandro Becker --- testscript/script_test.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/testscript/script_test.go b/testscript/script_test.go index 468cb4f82ca330ac9914c176e849860cfbc6c98f..a1f2c556962a8d3a5bfbd641f71ca55d5a00aea5 100644 --- a/testscript/script_test.go +++ b/testscript/script_test.go @@ -5,7 +5,6 @@ import ( "context" "flag" "fmt" - "io/ioutil" "net" "os" "path/filepath" @@ -47,8 +46,8 @@ func TestScript(t *testing.T) { Cmds: map[string]func(ts *testscript.TestScript, neg bool, args []string){ "soft": cmdSoft(admin1.Signer()), "git": cmdGit(key), - "mkreadme": cmdMkReadMe, - "unix2dos": cmdUNIX2DOS, + "mkreadme": cmdMkReadme, + "unix2dos": cmdUnix2Dos, }, Setup: func(e *testscript.Env) error { sshPort := test.RandomPort() @@ -154,8 +153,7 @@ func cmdSoft(key ssh.Signer) func(ts *testscript.TestScript, neg bool, args []st } } -// cmdUNIX2DOS converts files from UNIX line endings to DOS line endings. -func cmdUNIX2DOS(ts *testscript.TestScript, neg bool, args []string) { +func cmdUnix2Dos(ts *testscript.TestScript, neg bool, args []string) { if neg { ts.Fatalf("unsupported: ! unix2dos") } @@ -164,13 +162,18 @@ func cmdUNIX2DOS(ts *testscript.TestScript, neg bool, args []string) { } for _, arg := range args { filename := ts.MkAbs(arg) - data, err := ioutil.ReadFile(filename) + data, err := os.ReadFile(filename) if err != nil { ts.Fatalf("%s: %v", filename, err) } - data = bytes.Join(bytes.Split(data, []byte{'\n'}), []byte{'\r', '\n'}) - //nolint:gosec - if err := ioutil.WriteFile(filename, data, 0o666); err != nil { + + // First ensure we don't have any `\r\n` there already then replace all + // `\n` with `\r\n`. + // This should prevent creating `\r\r\n`. + data = bytes.ReplaceAll(data, []byte{'\r', '\n'}, []byte{'\n'}) + data = bytes.ReplaceAll(data, []byte{'\n'}, []byte{'\r', '\n'}) + + if err := os.WriteFile(filename, data, 0o644); err != nil { ts.Fatalf("%s: %v", filename, err) } } @@ -199,11 +202,12 @@ func cmdGit(key string) func(ts *testscript.TestScript, neg bool, args []string) } } -func cmdMkReadMe(ts *testscript.TestScript, neg bool, args []string) { +func cmdMkReadme(ts *testscript.TestScript, neg bool, args []string) { if len(args) != 1 { - ts.Fatalf("must have exactly 1 arg, the filename, got %d", len(args)) + ts.Fatalf("usage: mkreadme path") } - check(ts, os.WriteFile(ts.MkAbs(args[0]), []byte("# example\ntest project"), 0o644), neg) + content := []byte("# example\ntest project") + check(ts, os.WriteFile(ts.MkAbs(args[0]), content, 0o644), neg) } func check(ts *testscript.TestScript, err error, neg bool) {