Commit 1a2f9609 by lhchavez

commit-graph: Introduce `git_commit_graph_needs_refresh()`

This change introduces a function that allows the caller to know whether
the `commit-graph` file has not been modified since it was parsed.

Part of: #5757
parent 1f32ed25
......@@ -333,6 +333,40 @@ static int git_commit_graph_entry_get_byindex(
return 0;
}
bool git_commit_graph_needs_refresh(const git_commit_graph_file *cgraph, const char *path)
{
git_file fd = -1;
struct stat st;
ssize_t bytes_read;
git_oid cgraph_checksum = {{0}};
if (path == NULL)
path = git_buf_cstr(&cgraph->filename);
/* TODO: properly open the file without access time using O_NOATIME */
fd = git_futils_open_ro(path);
if (fd < 0)
return true;
if (p_fstat(fd, &st) < 0) {
p_close(fd);
return true;
}
if (!S_ISREG(st.st_mode) || !git__is_sizet(st.st_size)
|| (size_t)st.st_size != cgraph->graph_map.len) {
p_close(fd);
return true;
}
bytes_read = p_pread(fd, cgraph_checksum.id, GIT_OID_RAWSZ, st.st_size - GIT_OID_RAWSZ);
p_close(fd);
if (bytes_read != GIT_OID_RAWSZ)
return true;
return !git_oid_equal(&cgraph_checksum, &cgraph->checksum);
}
int git_commit_graph_entry_find(
git_commit_graph_entry *e,
const git_commit_graph_file *cgraph,
......
......@@ -89,6 +89,14 @@ typedef struct git_commit_graph_entry {
} git_commit_graph_entry;
int git_commit_graph_open(git_commit_graph_file **cgraph_out, const char *path);
/*
* Returns whether the commit_graph_file needs to be reloaded since the
* contents of the commit-graph file have changed on disk. If `path` is NULL,
* the filename stored in `cgraph` will be used.
*/
bool git_commit_graph_needs_refresh(const git_commit_graph_file *cgraph, const char *path);
int git_commit_graph_entry_find(
git_commit_graph_entry *e,
const git_commit_graph_file *cgraph,
......
......@@ -15,6 +15,7 @@ void test_graph_commit_graph__parse(void)
cl_git_pass(git_repository_open(&repo, cl_fixture("testrepo.git")));
cl_git_pass(git_buf_joinpath(&commit_graph_path, git_repository_path(repo), "objects/info/commit-graph"));
cl_git_pass(git_commit_graph_open(&cgraph, git_buf_cstr(&commit_graph_path)));
cl_assert_equal_i(git_commit_graph_needs_refresh(cgraph, git_buf_cstr(&commit_graph_path)), 0);
cl_git_pass(git_oid_fromstr(&id, "5001298e0c09ad9c34e4249bc5801c75e9754fa5"));
cl_git_pass(git_commit_graph_entry_find(&e, cgraph, &id, GIT_OID_HEXSZ));
......
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