@@ -10,6 +10,7 @@ void test_repo_hashfile__initialize(void)
10
10
11
11
void test_repo_hashfile__cleanup (void )
12
12
{
13
+ cl_fixture_cleanup ("absolute" );
13
14
cl_git_sandbox_cleanup ();
14
15
_repo = NULL ;
15
16
}
@@ -38,10 +39,18 @@ void test_repo_hashfile__simple(void)
38
39
git_buf_dispose (& full );
39
40
}
40
41
41
- void test_repo_hashfile__filtered (void )
42
+ void test_repo_hashfile__filtered_in_workdir (void )
42
43
{
44
+ git_buf root = GIT_BUF_INIT , txt = GIT_BUF_INIT , bin = GIT_BUF_INIT ;
45
+ char cwd [GIT_PATH_MAX ];
43
46
git_oid a , b ;
44
47
48
+ cl_must_pass (p_getcwd (cwd , GIT_PATH_MAX ));
49
+ cl_must_pass (p_mkdir ("absolute" , 0777 ));
50
+ cl_git_pass (git_buf_joinpath (& root , cwd , "status" ));
51
+ cl_git_pass (git_buf_joinpath (& txt , root .ptr , "testfile.txt" ));
52
+ cl_git_pass (git_buf_joinpath (& bin , root .ptr , "testfile.bin" ));
53
+
45
54
cl_repo_set_bool (_repo , "core.autocrlf" , true);
46
55
47
56
cl_git_append2file ("status/.gitattributes" , "*.txt text\n*.bin binary\n\n" );
@@ -55,21 +64,41 @@ void test_repo_hashfile__filtered(void)
55
64
cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_BLOB , NULL ));
56
65
cl_assert (git_oid_cmp (& a , & b ));
57
66
67
+ /* not equal hashes because of filtering when specified by absolute path */
68
+ cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
69
+ cl_git_pass (git_repository_hashfile (& b , _repo , txt .ptr , GIT_OBJECT_BLOB , NULL ));
70
+ cl_assert (git_oid_cmp (& a , & b ));
71
+
58
72
/* equal hashes because filter is binary */
59
73
cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
60
74
cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.bin" , GIT_OBJECT_BLOB , NULL ));
61
75
cl_assert_equal_oid (& a , & b );
62
76
77
+ /* equal hashes because filter is binary when specified by absolute path */
78
+ cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
79
+ cl_git_pass (git_repository_hashfile (& b , _repo , bin .ptr , GIT_OBJECT_BLOB , NULL ));
80
+ cl_assert_equal_oid (& a , & b );
81
+
63
82
/* equal hashes when 'as_file' points to binary filtering */
64
83
cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
65
84
cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_BLOB , "foo.bin" ));
66
85
cl_assert_equal_oid (& a , & b );
67
86
87
+ /* equal hashes when 'as_file' points to binary filtering (absolute path) */
88
+ cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
89
+ cl_git_pass (git_repository_hashfile (& b , _repo , txt .ptr , GIT_OBJECT_BLOB , "foo.bin" ));
90
+ cl_assert_equal_oid (& a , & b );
91
+
68
92
/* not equal hashes when 'as_file' points to text filtering */
69
93
cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
70
94
cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.bin" , GIT_OBJECT_BLOB , "foo.txt" ));
71
95
cl_assert (git_oid_cmp (& a , & b ));
72
96
97
+ /* not equal hashes when 'as_file' points to text filtering */
98
+ cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
99
+ cl_git_pass (git_repository_hashfile (& b , _repo , bin .ptr , GIT_OBJECT_BLOB , "foo.txt" ));
100
+ cl_assert (git_oid_cmp (& a , & b ));
101
+
73
102
/* equal hashes when 'as_file' is empty and turns off filtering */
74
103
cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
75
104
cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_BLOB , "" ));
@@ -79,7 +108,65 @@ void test_repo_hashfile__filtered(void)
79
108
cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.bin" , GIT_OBJECT_BLOB , "" ));
80
109
cl_assert_equal_oid (& a , & b );
81
110
111
+ cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
112
+ cl_git_pass (git_repository_hashfile (& b , _repo , txt .ptr , GIT_OBJECT_BLOB , "" ));
113
+ cl_assert_equal_oid (& a , & b );
114
+
115
+ cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
116
+ cl_git_pass (git_repository_hashfile (& b , _repo , bin .ptr , GIT_OBJECT_BLOB , "" ));
117
+ cl_assert_equal_oid (& a , & b );
118
+
82
119
/* some hash type failures */
83
120
cl_git_fail (git_odb_hashfile (& a , "status/testfile.txt" , 0 ));
84
121
cl_git_fail (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_ANY , NULL ));
122
+
123
+ git_buf_dispose (& txt );
124
+ git_buf_dispose (& bin );
125
+ git_buf_dispose (& root );
126
+ }
127
+
128
+ void test_repo_hashfile__filtered_outside_workdir (void )
129
+ {
130
+ git_buf root = GIT_BUF_INIT , txt = GIT_BUF_INIT , bin = GIT_BUF_INIT ;
131
+ char cwd [GIT_PATH_MAX ];
132
+ git_oid a , b ;
133
+
134
+ cl_must_pass (p_getcwd (cwd , GIT_PATH_MAX ));
135
+ cl_must_pass (p_mkdir ("absolute" , 0777 ));
136
+ cl_git_pass (git_buf_joinpath (& root , cwd , "absolute" ));
137
+ cl_git_pass (git_buf_joinpath (& txt , root .ptr , "testfile.txt" ));
138
+ cl_git_pass (git_buf_joinpath (& bin , root .ptr , "testfile.bin" ));
139
+
140
+ cl_repo_set_bool (_repo , "core.autocrlf" , true);
141
+ cl_git_append2file ("status/.gitattributes" , "*.txt text\n*.bin binary\n\n" );
142
+
143
+ /* create some sample content with CRLF in it */
144
+ cl_git_mkfile ("absolute/testfile.txt" , "content\r\n" );
145
+ cl_git_mkfile ("absolute/testfile.bin" , "other\r\nstuff\r\n" );
146
+
147
+ /* not equal hashes because of filtering */
148
+ cl_git_pass (git_odb_hashfile (& a , "absolute/testfile.txt" , GIT_OBJECT_BLOB ));
149
+ cl_git_pass (git_repository_hashfile (& b , _repo , txt .ptr , GIT_OBJECT_BLOB , "testfile.txt" ));
150
+ cl_assert (git_oid_cmp (& a , & b ));
151
+
152
+ /* equal hashes because filter is binary */
153
+ cl_git_pass (git_odb_hashfile (& a , "absolute/testfile.bin" , GIT_OBJECT_BLOB ));
154
+ cl_git_pass (git_repository_hashfile (& b , _repo , bin .ptr , GIT_OBJECT_BLOB , "testfile.bin" ));
155
+ cl_assert_equal_oid (& a , & b );
156
+
157
+ /*
158
+ * equal hashes because no filtering occurs for absolute paths outside the working
159
+ * directory unless as_path is specified
160
+ */
161
+ cl_git_pass (git_odb_hashfile (& a , "absolute/testfile.txt" , GIT_OBJECT_BLOB ));
162
+ cl_git_pass (git_repository_hashfile (& b , _repo , txt .ptr , GIT_OBJECT_BLOB , NULL ));
163
+ cl_assert_equal_oid (& a , & b );
164
+
165
+ cl_git_pass (git_odb_hashfile (& a , "absolute/testfile.bin" , GIT_OBJECT_BLOB ));
166
+ cl_git_pass (git_repository_hashfile (& b , _repo , bin .ptr , GIT_OBJECT_BLOB , NULL ));
167
+ cl_assert_equal_oid (& a , & b );
168
+
169
+ git_buf_dispose (& txt );
170
+ git_buf_dispose (& bin );
171
+ git_buf_dispose (& root );
85
172
}
0 commit comments