fix: improve \r\n handling

Carlos Alexandro Becker created

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>

Change summary

testscript/script_test.go | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)

Detailed changes

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) {