@@ -10,6 +10,7 @@ void test_repo_hashfile__initialize(void)
1010
1111void test_repo_hashfile__cleanup (void )
1212{
13+ cl_fixture_cleanup ("absolute" );
1314 cl_git_sandbox_cleanup ();
1415 _repo = NULL ;
1516}
@@ -38,10 +39,18 @@ void test_repo_hashfile__simple(void)
3839 git_buf_dispose (& full );
3940}
4041
41- void test_repo_hashfile__filtered (void )
42+ void test_repo_hashfile__filtered_in_workdir (void )
4243{
44+ git_buf root = GIT_BUF_INIT , txt = GIT_BUF_INIT , bin = GIT_BUF_INIT ;
45+ char cwd [GIT_PATH_MAX ];
4346 git_oid a , b ;
4447
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+
4554 cl_repo_set_bool (_repo , "core.autocrlf" , true);
4655
4756 cl_git_append2file ("status/.gitattributes" , "*.txt text\n*.bin binary\n\n" );
@@ -55,21 +64,41 @@ void test_repo_hashfile__filtered(void)
5564 cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_BLOB , NULL ));
5665 cl_assert (git_oid_cmp (& a , & b ));
5766
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+
5872 /* equal hashes because filter is binary */
5973 cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
6074 cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.bin" , GIT_OBJECT_BLOB , NULL ));
6175 cl_assert_equal_oid (& a , & b );
6276
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+
6382 /* equal hashes when 'as_file' points to binary filtering */
6483 cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
6584 cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_BLOB , "foo.bin" ));
6685 cl_assert_equal_oid (& a , & b );
6786
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+
6892 /* not equal hashes when 'as_file' points to text filtering */
6993 cl_git_pass (git_odb_hashfile (& a , "status/testfile.bin" , GIT_OBJECT_BLOB ));
7094 cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.bin" , GIT_OBJECT_BLOB , "foo.txt" ));
7195 cl_assert (git_oid_cmp (& a , & b ));
7296
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+
73102 /* equal hashes when 'as_file' is empty and turns off filtering */
74103 cl_git_pass (git_odb_hashfile (& a , "status/testfile.txt" , GIT_OBJECT_BLOB ));
75104 cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.txt" , GIT_OBJECT_BLOB , "" ));
@@ -79,7 +108,65 @@ void test_repo_hashfile__filtered(void)
79108 cl_git_pass (git_repository_hashfile (& b , _repo , "testfile.bin" , GIT_OBJECT_BLOB , "" ));
80109 cl_assert_equal_oid (& a , & b );
81110
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+
82119 /* some hash type failures */
83120 cl_git_fail (git_odb_hashfile (& a , "status/testfile.txt" , 0 ));
84121 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 );
85172}
0 commit comments