Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
git2
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
git2
Commits
eeff96c4
Commit
eeff96c4
authored
Mar 08, 2016
by
Carlos Martín Nieto
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #3655 from ethomson/nanosecond_defaults
Enable nanosecond resolution by default
parents
eee17997
53fb823b
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
58 additions
and
23 deletions
+58
-23
CMakeLists.txt
+1
-1
tests/index/nsec.c
+47
-5
tests/index/racy.c
+8
-15
tests/merge/workdir/dirty.c
+2
-2
No files found.
CMakeLists.txt
View file @
eeff96c4
...
...
@@ -109,7 +109,7 @@ ELSE ()
ENDIF
()
IF
(
HAVE_STRUCT_STAT_NSEC OR WIN32
)
OPTION
(
USE_NSEC
"Care about sub-second file mtimes and ctimes"
O
FF
)
OPTION
(
USE_NSEC
"Care about sub-second file mtimes and ctimes"
O
N
)
ENDIF
()
# This variable will contain the libraries we need to put into
...
...
tests/index/nsec.c
View file @
eeff96c4
...
...
@@ -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
if
(
expect_nsec
)
{
cl_assert
(
entry
->
ctime
.
nanoseconds
!=
0
);
cl_assert
(
entry
->
mtime
.
nanoseconds
!=
0
);
#else
}
else
{
cl_assert_equal_i
(
0
,
entry
->
ctime
.
nanoseconds
);
cl_assert_equal_i
(
0
,
entry
->
mtime
.
nanoseconds
);
#endif
}
}
void
test_index_nsec__status_doesnt_clear_nsecs
(
void
)
...
...
tests/index/racy.c
View file @
eeff96c4
...
...
@@ -105,8 +105,8 @@ static void setup_race(void)
{
git_buf
path
=
GIT_BUF_INIT
;
git_index
*
index
;
const
git_index_entry
*
entry
;
int
i
,
found_race
=
0
;
git_index_entry
*
entry
;
struct
stat
st
;
/* Make sure we do have a timestamp */
cl_git_pass
(
git_repository_index__weakptr
(
&
index
,
g_repo
));
...
...
@@ -114,27 +114,20 @@ static void setup_race(void)
cl_git_pass
(
git_buf_joinpath
(
&
path
,
git_repository_workdir
(
g_repo
),
"A"
));
/* Make sure writing the file, adding and rewriting happen in the same second */
for
(
i
=
0
;
i
<
10
;
i
++
)
{
struct
stat
st
;
cl_git_mkfile
(
path
.
ptr
,
"A"
);
cl_git_pass
(
git_index_add_bypath
(
index
,
"A"
));
cl_git_mkfile
(
path
.
ptr
,
"B"
);
cl_git_pass
(
git_index_write
(
index
));
cl_git_mkfile
(
path
.
ptr
,
""
);
cl_git_pass
(
p_stat
(
path
.
ptr
,
&
st
));
cl_assert
(
entry
=
git_index_get_bypath
(
index
,
"A"
,
0
));
if
(
entry
->
mtime
.
seconds
==
(
int32_t
)
st
.
st_mtime
)
{
found_race
=
1
;
break
;
}
}
if
(
!
found_race
)
cl_fail
(
"failed to find race after 10 attempts"
);
cl_assert
(
entry
=
(
git_index_entry
*
)
git_index_get_bypath
(
index
,
"A"
,
0
));
/* force a race */
entry
->
mtime
.
seconds
=
st
.
st_mtime
;
entry
->
mtime
.
nanoseconds
=
st
.
st_mtime_nsec
;
git_buf_free
(
&
path
);
}
...
...
tests/merge/workdir/dirty.c
View file @
eeff96c4
...
...
@@ -165,8 +165,8 @@ static void hack_index(char *files[])
entry
->
ctime
.
seconds
=
(
int32_t
)
statbuf
.
st_ctime
;
entry
->
mtime
.
seconds
=
(
int32_t
)
statbuf
.
st_mtime
;
#if defined(GIT_USE_NSEC)
entry
->
ctime
.
nanoseconds
=
statbuf
.
st_ctim
.
tv
_nsec
;
entry
->
mtime
.
nanoseconds
=
statbuf
.
st_mtim
.
tv
_nsec
;
entry
->
ctime
.
nanoseconds
=
statbuf
.
st_ctim
e
_nsec
;
entry
->
mtime
.
nanoseconds
=
statbuf
.
st_mtim
e
_nsec
;
#else
entry
->
ctime
.
nanoseconds
=
0
;
entry
->
mtime
.
nanoseconds
=
0
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment