1package git23import (4 "context"5 "os"6 "path/filepath"7 "runtime"8 "testing"910 "github.com/stretchr/testify/assert"11 "github.com/stretchr/testify/require"12)1314func TestUnescapeChars(t *testing.T) {15 tests := []struct {16 name string17 in string18 want string19 }{20 {21 name: "no escapes",22 in: "normal-filename.txt",23 want: "normal-filename.txt",24 },25 {26 name: "escaped quote",27 in: `Test \"Word\".md`,28 want: `Test "Word".md`,29 },30 {31 name: "escaped backslash",32 in: `path\\to\\file.txt`,33 want: `path\to\file.txt`,34 },35 {36 name: "escaped tab",37 in: `file\twith\ttabs.txt`,38 want: "file\twith\ttabs.txt",39 },40 {41 name: "mixed escapes",42 in: `\"quoted\\path\t.md`,43 want: "\"quoted\\path\t.md",44 },45 }46 for _, tt := range tests {47 t.Run(tt.name, func(t *testing.T) {48 got := UnescapeChars([]byte(tt.in))49 assert.Equal(t, tt.want, string(got))50 })51 }52}5354func TestRepository_LsTree(t *testing.T) {55 ctx := context.Background()56 if runtime.GOOS == "windows" {57 t.Skip(`Windows does not allow '"' in filenames`)58 }5960 path := tempPath()61 defer os.RemoveAll(path)6263 err := Init(ctx, path)64 require.NoError(t, err)6566 specialName := `Test "Wiki" Page.md`67 err = os.WriteFile(filepath.Join(path, specialName), []byte("content"), 0o644)68 require.NoError(t, err)6970 repo, err := Open(path)71 require.NoError(t, err)7273 err = repo.Add(ctx, AddOptions{All: true})74 require.NoError(t, err)7576 err = repo.Commit(ctx, &Signature{Name: "test", Email: "test@test.com"}, "initial commit")77 require.NoError(t, err)7879 commit, err := repo.CatFileCommit(ctx, "HEAD")80 require.NoError(t, err)8182 // Without Verbatim, Git quotes and escapes the filename.83 entries, err := commit.Entries(ctx)84 require.NoError(t, err)85 require.Len(t, entries, 1)86 assert.Equal(t, specialName, entries[0].Name())8788 // With Verbatim, Git outputs the filename as-is.89 entries, err = commit.Entries(ctx, LsTreeOptions{Verbatim: true})90 require.NoError(t, err)91 require.Len(t, entries, 1)92 assert.Equal(t, specialName, entries[0].Name())93}