返回 DeepSeek-Reasonix
merge_state_test.go
根目录 / internal / worktree / merge_state_test.go
1 package worktree
2
3 import (
4 "context"
5 "os"
6 "path/filepath"
7 "runtime"
8 "testing"
9 )
10
11 func TestWorktreeStateTokenBindsFileContentAndIndex(t *testing.T) {
12 requireGit(t)
13 repo := initRepo(t)
14 path := filepath.Join(repo, "README.md")
15 original, err := worktreeStateToken(context.Background(), repo)
16 if err != nil {
17 t.Fatal(err)
18 }
19 if err := os.WriteFile(path, []byte("changed\n"), 0o644); err != nil {
20 t.Fatal(err)
21 }
22 changed, err := worktreeStateToken(context.Background(), repo)
23 if err != nil {
24 t.Fatal(err)
25 }
26 if changed == original {
27 t.Fatal("filesystem content change did not change the state token")
28 }
29 gitTest(t, repo, "add", "README.md")
30 staged, err := worktreeStateToken(context.Background(), repo)
31 if err != nil {
32 t.Fatal(err)
33 }
34 if staged == changed {
35 t.Fatal("index change did not change the state token")
36 }
37 }
38
39 func TestWorktreeStateTokenBindsSymlinkTargetAndMode(t *testing.T) {
40 if runtime.GOOS == "windows" {
41 t.Skip("symlink and executable-mode semantics differ on Windows")
42 }
43 requireGit(t)
44 repo := initRepo(t)
45 link := filepath.Join(repo, "link")
46 if err := os.Symlink("first", link); err != nil {
47 t.Fatal(err)
48 }
49 first, err := worktreeStateToken(context.Background(), repo)
50 if err != nil {
51 t.Fatal(err)
52 }
53 if err := os.Remove(link); err != nil {
54 t.Fatal(err)
55 }
56 if err := os.Symlink("second", link); err != nil {
57 t.Fatal(err)
58 }
59 second, err := worktreeStateToken(context.Background(), repo)
60 if err != nil {
61 t.Fatal(err)
62 }
63 if second == first {
64 t.Fatal("symlink target change did not change the state token")
65 }
66 if err := os.Remove(link); err != nil {
67 t.Fatal(err)
68 }
69 file := filepath.Join(repo, "mode.txt")
70 if err := os.WriteFile(file, []byte("mode\n"), 0o644); err != nil {
71 t.Fatal(err)
72 }
73 plain, err := worktreeStateToken(context.Background(), repo)
74 if err != nil {
75 t.Fatal(err)
76 }
77 if err := os.Chmod(file, 0o755); err != nil {
78 t.Fatal(err)
79 }
80 executable, err := worktreeStateToken(context.Background(), repo)
81 if err != nil {
82 t.Fatal(err)
83 }
84 if executable == plain {
85 t.Fatal("file mode change did not change the state token")
86 }
87 }
88
88 lines GO