| 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "os" |
| 5 | "os/exec" |
| 6 | "slices" |
| 7 | "testing" |
| 8 | ) |
| 9 | |
| 10 | func TestWorkspaceGitCommitDetailPreservesUnicodeFilenames(t *testing.T) { |
| 11 | if _, err := exec.LookPath("git"); err != nil { |
| 12 | t.Skip("git not installed") |
| 13 | } |
| 14 | orig, err := os.Getwd() |
| 15 | if err != nil { |
| 16 | t.Fatal(err) |
| 17 | } |
| 18 | dir := t.TempDir() |
| 19 | if err := os.Chdir(dir); err != nil { |
| 20 | t.Fatal(err) |
| 21 | } |
| 22 | t.Cleanup(func() { _ = os.Chdir(orig) }) |
| 23 | runGit(t, "init") |
| 24 | runGit(t, "config", "user.email", "test@example.com") |
| 25 | runGit(t, "config", "user.name", "Test User") |
| 26 | runGit(t, "config", "core.quotepath", "true") |
| 27 | |
| 28 | if err := os.WriteFile("seed.txt", []byte("seed\n"), 0o644); err != nil { |
| 29 | t.Fatal(err) |
| 30 | } |
| 31 | runGit(t, "add", "seed.txt") |
| 32 | runGit(t, "commit", "-m", "seed") |
| 33 | |
| 34 | const unicodeFilename = "中文文件名测试.txt" |
| 35 | if err := os.WriteFile("plain.txt", []byte("plain\n"), 0o644); err != nil { |
| 36 | t.Fatal(err) |
| 37 | } |
| 38 | if err := os.WriteFile(unicodeFilename, []byte("unicode\n"), 0o644); err != nil { |
| 39 | t.Fatal(err) |
| 40 | } |
| 41 | runGit(t, "add", "plain.txt", unicodeFilename) |
| 42 | runGit(t, "commit", "-m", "add files") |
| 43 | |
| 44 | detail, err := (&App{}).WorkspaceGitCommitDetail("", gitOutput(t, "rev-parse", "HEAD"), "") |
| 45 | if err != nil { |
| 46 | t.Fatalf("WorkspaceGitCommitDetail err = %v", err) |
| 47 | } |
| 48 | want := []string{"plain.txt", unicodeFilename} |
| 49 | if !slices.Equal(detail.Files, want) { |
| 50 | t.Fatalf("files = %q, want %q", detail.Files, want) |
| 51 | } |
| 52 | } |
| 53 |