github.com/rcowham/go-libgitfastimport@v0.1.6/backend_test.go (about) 1 // Tests for frontend 2 3 package libfastimport 4 5 import ( 6 "bufio" 7 "bytes" 8 "fmt" 9 "io" 10 "os" 11 "strings" 12 "testing" 13 14 "github.com/stretchr/testify/assert" 15 ) 16 17 type MyWriteCloser struct { 18 *bufio.Writer 19 } 20 21 func (mwc *MyWriteCloser) Close() error { 22 // Noop 23 return nil 24 } 25 26 func TestWriteBasic(t *testing.T) { 27 input := `blob 28 mark :1 29 data 5 30 test 31 reset refs/heads/main 32 commit refs/heads/main 33 mark :2 34 author Robert Cowham <rcowham@perforce.com> 1644399073 +0000 35 committer Robert Cowham <rcowham@perforce.com> 1644399073 +0000 36 data 5 37 test 38 M 100644 :1 test.txt 39 40 ` 41 42 inbuf := strings.NewReader(input) 43 outbuf := new(bytes.Buffer) 44 frontend := NewFrontend(inbuf, nil, nil) 45 bw := bufio.NewWriter(outbuf) 46 mwc := &MyWriteCloser{bw} 47 backend := NewBackend(mwc, nil, nil) 48 for { 49 cmd, err := frontend.ReadCmd() 50 if err != nil { 51 if err != io.EOF { 52 t.Errorf("ERROR: Failed to read cmd: %v\n", err) 53 } 54 break 55 } 56 switch cmd.(type) { 57 case CmdBlob: 58 blob := cmd.(CmdBlob) 59 backend.Do(blob) 60 case CmdReset: 61 r := cmd.(CmdReset) 62 backend.Do(r) 63 case CmdCommit: 64 c := cmd.(CmdCommit) 65 backend.Do(c) 66 case CmdCommitEnd: 67 c := cmd.(CmdCommitEnd) 68 backend.Do(c) 69 case FileModify: 70 f := cmd.(FileModify) 71 backend.Do(f) 72 case FileDelete, FileCopy, FileRename: 73 t.Error("Unexpected") 74 default: 75 t.Errorf("Unexpected cmd: %+v\n", cmd) 76 } 77 } 78 bw.Flush() 79 outstr := outbuf.String() 80 assert.Equal(t, input, outstr) 81 } 82 83 func TestRenameSpaces(t *testing.T) { 84 d := createGitRepo(t) 85 os.Chdir(d) 86 src := "src space.txt" 87 dst := "dst space.txt" 88 writeToFile(src, "contents") 89 runCmd("git add .") 90 runCmd("git commit -m initial") 91 runCmd(fmt.Sprintf("git mv '%s' '%s'", src, dst)) 92 runCmd("git add .") 93 runCmd("git commit -m renamed") 94 export := "export.txt" 95 // fast-export with rename detection implemented 96 output, err := runCmd(fmt.Sprintf("git fast-export --all -M > %s", export)) 97 if err != nil { 98 t.Errorf("ERROR: Failed to git export '%s': %v\n", export, err) 99 } 100 assert.Equal(t, "", output) 101 102 input, err := os.ReadFile(export) 103 if err != nil { 104 t.Errorf("ERROR: Failed to read file '%s': %v\n", export, err) 105 } 106 107 inbuf := strings.NewReader(string(input)) 108 frontend := NewFrontend(inbuf, nil, nil) 109 outbuf := new(bytes.Buffer) 110 bw := bufio.NewWriter(outbuf) 111 mwc := &MyWriteCloser{bw} 112 backend := NewBackend(mwc, nil, nil) 113 for { 114 cmd, err := frontend.ReadCmd() 115 if err != nil { 116 if err != io.EOF { 117 t.Errorf("ERROR: Failed to read cmd: %v\n", err) 118 } 119 break 120 } 121 switch cmd.(type) { 122 case CmdBlob, CmdReset, CmdCommit, CmdCommitEnd, FileModify, FileDelete, FileCopy, FileRename: 123 backend.Do(cmd) 124 default: 125 t.Errorf("Unexpected cmd: %+v\n", cmd) 126 } 127 } 128 bw.Flush() 129 outstr := outbuf.String() 130 assert.Equal(t, string(input), outstr) 131 } 132 133 func TestWriteNoBreakSpace(t *testing.T) { 134 // Handle NBSP writing like Plastic does (should be quoted but isn't) 135 input := fmt.Sprintf(`blob 136 mark :1 137 data 8 138 contents 139 reset refs/heads/main 140 commit refs/heads/main 141 mark :2 142 author Robert Cowham <rcowham@perforce.com> 1687950865 +0100 143 committer Robert Cowham <rcowham@perforce.com> 1687950865 +0100 144 data 8 145 initial 146 M 100644 :1 %s 147 148 commit refs/heads/main 149 mark :3 150 author Robert Cowham <rcowham@perforce.com> 1687950865 +0100 151 committer Robert Cowham <rcowham@perforce.com> 1687950865 +0100 152 data 8 153 renamed 154 from :2 155 R %s dst.txt 156 157 `, "src\u00a0.txt", "src\u00a0.txt") 158 159 inbuf := strings.NewReader(string(input)) 160 frontend := NewFrontend(inbuf, nil, nil) 161 outbuf := new(bytes.Buffer) 162 bw := bufio.NewWriter(outbuf) 163 mwc := &MyWriteCloser{bw} 164 backend := NewBackend(mwc, nil, nil) 165 for { 166 cmd, err := frontend.ReadCmd() 167 if err != nil { 168 if err != io.EOF { 169 t.Errorf("ERROR: Failed to read cmd: %v\n", err) 170 } 171 break 172 } 173 switch cmd.(type) { 174 case CmdBlob, CmdReset, CmdCommit, CmdCommitEnd, FileModify, FileDelete, FileCopy, FileRename: 175 backend.Do(cmd) 176 default: 177 t.Errorf("Unexpected cmd: %+v\n", cmd) 178 } 179 } 180 bw.Flush() 181 outstr := outbuf.String() 182 assert.Equal(t, strings.Split(input, "\n"), strings.Split(outstr, "\n")) 183 }