mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-10-31 07:41:33 +00:00 
			
		
		
		
	index::nsec: don't expect shit filesystems to not suck
If the underlying filesystem doesn't support better than one second resolution, then don't expect that turning on `GIT_USE_NSEC` does anything magical to change that.
This commit is contained in:
		
							parent
							
								
									6abdf52d6e
								
							
						
					
					
						commit
						565c419972
					
				| @ -24,6 +24,43 @@ void test_index_nsec__cleanup(void) | ||||
| 	cl_git_sandbox_cleanup(); | ||||
| } | ||||
| 
 | ||||
| static bool try_create_file_with_nsec_timestamp(const char *path) | ||||
| { | ||||
| 	struct stat st; | ||||
| 	int try; | ||||
| 
 | ||||
| 	/* retry a few times to avoid nanos *actually* equal 0 race condition */ | ||||
| 	for (try = 0; try < 3; try++) { | ||||
| 		cl_git_mkfile(path, "This is hopefully a file with nanoseconds!"); | ||||
| 
 | ||||
| 		cl_must_pass(p_stat(path, &st)); | ||||
| 
 | ||||
| 		if (st.st_ctime_nsec && st.st_mtime_nsec) | ||||
| 			return true; | ||||
| 	} | ||||
| 
 | ||||
| 	return false; | ||||
| } | ||||
| 
 | ||||
| /* try to determine if the underlying filesystem supports a resolution
 | ||||
|  * higher than a single second.  (i'm looking at you, hfs+) | ||||
|  */ | ||||
| static bool should_expect_nsecs(void) | ||||
| { | ||||
| 	git_buf nsec_path = GIT_BUF_INIT; | ||||
| 	bool expect; | ||||
| 
 | ||||
| 	git_buf_joinpath(&nsec_path, clar_sandbox_path(), "nsec_test"); | ||||
| 
 | ||||
| 	expect = try_create_file_with_nsec_timestamp(nsec_path.ptr); | ||||
| 
 | ||||
| 	p_unlink(nsec_path.ptr); | ||||
| 
 | ||||
| 	git_buf_clear(&nsec_path); | ||||
| 
 | ||||
| 	return expect; | ||||
| } | ||||
| 
 | ||||
| static bool has_nsecs(void) | ||||
| { | ||||
| 	const git_index_entry *entry; | ||||
| @ -50,8 +87,13 @@ void test_index_nsec__has_nanos(void) | ||||
| void test_index_nsec__staging_maintains_other_nanos(void) | ||||
| { | ||||
| 	const git_index_entry *entry; | ||||
| 	bool expect_nsec, test_file_has_nsec; | ||||
| 
 | ||||
|     expect_nsec = should_expect_nsecs(); | ||||
| 	test_file_has_nsec = try_create_file_with_nsec_timestamp("nsecs/a.txt"); | ||||
| 
 | ||||
| 	cl_assert_equal_b(expect_nsec, test_file_has_nsec); | ||||
| 
 | ||||
| 	cl_git_rewritefile("nsecs/a.txt", "This is file A"); | ||||
| 	cl_git_pass(git_index_add_bypath(repo_index, "a.txt")); | ||||
| 	cl_git_pass(git_index_write(repo_index)); | ||||
| 
 | ||||
| @ -63,15 +105,15 @@ void test_index_nsec__staging_maintains_other_nanos(void) | ||||
| 	cl_assert((entry = git_index_get_bypath(repo_index, "a.txt", 0))); | ||||
| 
 | ||||
| 	/* if we are writing nanoseconds to the index, expect them to be
 | ||||
| 	 * nonzero.  if we are *not*, expect that we truncated the entry. | ||||
| 	 * nonzero. | ||||
| 	 */ | ||||
| #ifdef GIT_USE_NSEC | ||||
| 	cl_assert(entry->ctime.nanoseconds != 0); | ||||
| 	cl_assert(entry->mtime.nanoseconds != 0); | ||||
| #else | ||||
| 	cl_assert_equal_i(0, entry->ctime.nanoseconds); | ||||
| 	cl_assert_equal_i(0, entry->mtime.nanoseconds); | ||||
| #endif | ||||
| 	if (expect_nsec) { | ||||
| 		cl_assert(entry->ctime.nanoseconds != 0); | ||||
| 		cl_assert(entry->mtime.nanoseconds != 0); | ||||
| 	} else { | ||||
| 		cl_assert_equal_i(0, entry->ctime.nanoseconds); | ||||
| 		cl_assert_equal_i(0, entry->mtime.nanoseconds); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| void test_index_nsec__status_doesnt_clear_nsecs(void) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Edward Thomson
						Edward Thomson