Commit 9f4e7c84 by Carlos Martín Nieto

Merge pull request #3638 from ethomson/nsec

USE_NSECS fixes
parents 0d9a7498 3d6a42d1
...@@ -86,17 +86,21 @@ IF (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") ...@@ -86,17 +86,21 @@ IF (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
OPTION( USE_OPENSSL "Link with and use openssl library" ON ) OPTION( USE_OPENSSL "Link with and use openssl library" ON )
ENDIF() ENDIF()
CHECK_STRUCT_HAS_MEMBER ("struct stat" st_atim "sys/types.h;sys/stat.h" CHECK_STRUCT_HAS_MEMBER ("struct stat" st_mtim "sys/types.h;sys/stat.h"
HAVE_STRUCT_STAT_ST_ATIM LANGUAGE C) HAVE_STRUCT_STAT_ST_MTIM LANGUAGE C)
CHECK_STRUCT_HAS_MEMBER ("struct stat" st_atimespec "sys/types.h;sys/stat.h" CHECK_STRUCT_HAS_MEMBER ("struct stat" st_mtimespec "sys/types.h;sys/stat.h"
HAVE_STRUCT_STAT_ST_ATIMESPEC LANGUAGE C) HAVE_STRUCT_STAT_ST_MTIMESPEC LANGUAGE C)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtime_nsec sys/stat.h
IF (HAVE_STRUCT_STAT_ST_ATIM) HAVE_STRUCT_STAT_MTIME_NSEC LANGUAGE C)
IF (HAVE_STRUCT_STAT_ST_MTIM)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec sys/stat.h CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtim.tv_nsec sys/stat.h
HAVE_STRUCT_STAT_NSEC LANGUAGE C) HAVE_STRUCT_STAT_NSEC LANGUAGE C)
ELSEIF (HAVE_STRUCT_STAT_ST_ATIMESPEC) ELSEIF (HAVE_STRUCT_STAT_ST_MTIMESPEC)
CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec sys/stat.h CHECK_STRUCT_HAS_MEMBER("struct stat" st_mtimespec.tv_nsec sys/stat.h
HAVE_STRUCT_STAT_NSEC LANGUAGE C) HAVE_STRUCT_STAT_NSEC LANGUAGE C)
ELSE ()
SET( HAVE_STRUCT_STAT_NSEC ON )
ENDIF() ENDIF()
IF (HAVE_STRUCT_STAT_NSEC OR WIN32) IF (HAVE_STRUCT_STAT_NSEC OR WIN32)
...@@ -539,8 +543,12 @@ IF (USE_NSEC) ...@@ -539,8 +543,12 @@ IF (USE_NSEC)
ADD_DEFINITIONS(-DGIT_USE_NSEC) ADD_DEFINITIONS(-DGIT_USE_NSEC)
ENDIF() ENDIF()
IF (HAVE_STRUCT_STAT_ST_ATIMESPEC) IF (HAVE_STRUCT_STAT_ST_MTIM)
ADD_DEFINITIONS(-DGIT_USE_STAT_ATIMESPEC) ADD_DEFINITIONS(-DGIT_USE_STAT_MTIM)
ELSEIF (HAVE_STRUCT_STAT_ST_MTIMESPEC)
ADD_DEFINITIONS(-DGIT_USE_STAT_MTIMESPEC)
ELSEIF (HAVE_STRUCT_STAT_ST_MTIME_NSEC)
ADD_DEFINITIONS(-DGIT_USE_STAT_MTIME_NSEC)
ENDIF() ENDIF()
ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64) ADD_DEFINITIONS(-D_FILE_OFFSET_BITS=64)
......
...@@ -1034,7 +1034,6 @@ int git_futils_filestamp_check( ...@@ -1034,7 +1034,6 @@ int git_futils_filestamp_check(
git_futils_filestamp *stamp, const char *path) git_futils_filestamp *stamp, const char *path)
{ {
struct stat st; struct stat st;
const struct timespec *statmtime = &st.st_mtim;
/* if the stamp is NULL, then always reload */ /* if the stamp is NULL, then always reload */
if (stamp == NULL) if (stamp == NULL)
...@@ -1043,17 +1042,17 @@ int git_futils_filestamp_check( ...@@ -1043,17 +1042,17 @@ int git_futils_filestamp_check(
if (p_stat(path, &st) < 0) if (p_stat(path, &st) < 0)
return GIT_ENOTFOUND; return GIT_ENOTFOUND;
if (stamp->mtime.tv_sec == statmtime->tv_sec && if (stamp->mtime.tv_sec == st.st_mtime &&
#if defined(GIT_USE_NSEC) #if defined(GIT_USE_NSEC)
stamp->mtime.tv_nsec == statmtime->tv_nsec && stamp->mtime.tv_nsec == st.st_mtime_nsec &&
#endif #endif
stamp->size == (git_off_t)st.st_size && stamp->size == (git_off_t)st.st_size &&
stamp->ino == (unsigned int)st.st_ino) stamp->ino == (unsigned int)st.st_ino)
return 0; return 0;
stamp->mtime.tv_sec = statmtime->tv_sec; stamp->mtime.tv_sec = st.st_mtime;
#if defined(GIT_USE_NSEC) #if defined(GIT_USE_NSEC)
stamp->mtime.tv_nsec = statmtime->tv_nsec; stamp->mtime.tv_nsec = st.st_mtime_nsec;
#endif #endif
stamp->size = (git_off_t)st.st_size; stamp->size = (git_off_t)st.st_size;
stamp->ino = (unsigned int)st.st_ino; stamp->ino = (unsigned int)st.st_ino;
...@@ -1076,11 +1075,11 @@ void git_futils_filestamp_set( ...@@ -1076,11 +1075,11 @@ void git_futils_filestamp_set(
void git_futils_filestamp_set_from_stat( void git_futils_filestamp_set_from_stat(
git_futils_filestamp *stamp, struct stat *st) git_futils_filestamp *stamp, struct stat *st)
{ {
const struct timespec *statmtime = &st->st_mtim;
if (st) { if (st) {
stamp->mtime = *statmtime; stamp->mtime.tv_sec = st->st_mtime;
#if !defined(GIT_USE_NSEC) #if defined(GIT_USE_NSEC)
stamp->mtime.tv_nsec = st->st_mtime_nsec;
#else
stamp->mtime.tv_nsec = 0; stamp->mtime.tv_nsec = 0;
#endif #endif
stamp->size = (git_off_t)st->st_size; stamp->size = (git_off_t)st->st_size;
......
...@@ -829,8 +829,8 @@ void git_index_entry__init_from_stat( ...@@ -829,8 +829,8 @@ void git_index_entry__init_from_stat(
entry->ctime.seconds = (int32_t)st->st_ctime; entry->ctime.seconds = (int32_t)st->st_ctime;
entry->mtime.seconds = (int32_t)st->st_mtime; entry->mtime.seconds = (int32_t)st->st_mtime;
#if defined(GIT_USE_NSEC) #if defined(GIT_USE_NSEC)
entry->mtime.nanoseconds = st->st_mtim.tv_nsec; entry->mtime.nanoseconds = st->st_mtime_nsec;
entry->ctime.nanoseconds = st->st_ctim.tv_nsec; entry->ctime.nanoseconds = st->st_ctime_nsec;
#endif #endif
entry->dev = st->st_rdev; entry->dev = st->st_rdev;
entry->ino = st->st_ino; entry->ino = st->st_ino;
......
...@@ -21,6 +21,18 @@ typedef int GIT_SOCKET; ...@@ -21,6 +21,18 @@ typedef int GIT_SOCKET;
#define p_lstat(p,b) lstat(p,b) #define p_lstat(p,b) lstat(p,b)
#define p_stat(p,b) stat(p, b) #define p_stat(p,b) stat(p, b)
#if defined(GIT_USE_STAT_MTIMESPEC)
# define st_atime_nsec st_atimespec.tv_nsec
# define st_mtime_nsec st_mtimespec.tv_nsec
# define st_ctime_nsec st_ctimespec.tv_nsec
#elif defined(GIT_USE_STAT_MTIM)
# define st_atime_nsec st_atim.tv_nsec
# define st_mtime_nsec st_mtim.tv_nsec
# define st_ctime_nsec st_ctim.tv_nsec
#elif !defined(GIT_USE_STAT_MTIME_NSEC) && defined(GIT_USE_NEC)
# error GIT_USE_NSEC defined but unknown struct stat nanosecond type
#endif
#define p_utimes(f, t) utimes(f, t) #define p_utimes(f, t) utimes(f, t)
#define p_readlink(a, b, c) readlink(a, b, c) #define p_readlink(a, b, c) readlink(a, b, c)
......
...@@ -42,6 +42,9 @@ struct p_stat { ...@@ -42,6 +42,9 @@ struct p_stat {
#define st_atime st_atim.tv_sec #define st_atime st_atim.tv_sec
#define st_mtime st_mtim.tv_sec #define st_mtime st_mtim.tv_sec
#define st_ctime st_ctim.tv_sec #define st_ctime st_ctim.tv_sec
#define st_atime_nsec st_atim.tv_nsec
#define st_mtime_nsec st_mtim.tv_nsec
#define st_ctime_nsec st_ctim.tv_nsec
}; };
#define stat p_stat #define stat p_stat
......
...@@ -61,8 +61,17 @@ void test_index_nsec__staging_maintains_other_nanos(void) ...@@ -61,8 +61,17 @@ void test_index_nsec__staging_maintains_other_nanos(void)
cl_assert_equal_b(true, has_nsecs()); cl_assert_equal_b(true, has_nsecs());
cl_assert((entry = git_index_get_bypath(repo_index, "a.txt", 0))); 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.
*/
#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->ctime.nanoseconds);
cl_assert_equal_i(0, entry->mtime.nanoseconds); cl_assert_equal_i(0, entry->mtime.nanoseconds);
#endif
} }
void test_index_nsec__status_doesnt_clear_nsecs(void) void test_index_nsec__status_doesnt_clear_nsecs(void)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment