git-module

git clone git://git.lin.moe/fork/git-module.git

 1package git
 2
 3import (
 4	"context"
 5	"os"
 6	"path/filepath"
 7	"runtime"
 8	"testing"
 9
10	"github.com/stretchr/testify/assert"
11	"github.com/stretchr/testify/require"
12)
13
14func TestUnescapeChars(t *testing.T) {
15	tests := []struct {
16		name string
17		in   string
18		want string
19	}{
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}
53
54func TestRepository_LsTree(t *testing.T) {
55	ctx := context.Background()
56	if runtime.GOOS == "windows" {
57		t.Skip(`Windows does not allow '"' in filenames`)
58	}
59
60	path := tempPath()
61	defer os.RemoveAll(path)
62
63	err := Init(ctx, path)
64	require.NoError(t, err)
65
66	specialName := `Test "Wiki" Page.md`
67	err = os.WriteFile(filepath.Join(path, specialName), []byte("content"), 0o644)
68	require.NoError(t, err)
69
70	repo, err := Open(path)
71	require.NoError(t, err)
72
73	err = repo.Add(ctx, AddOptions{All: true})
74	require.NoError(t, err)
75
76	err = repo.Commit(ctx, &Signature{Name: "test", Email: "test@test.com"}, "initial commit")
77	require.NoError(t, err)
78
79	commit, err := repo.CatFileCommit(ctx, "HEAD")
80	require.NoError(t, err)
81
82	// 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())
87
88	// 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}