diff options
author | Ben Straub <bs@github.com> | 2012-09-13 20:08:05 -0700 |
---|---|---|
committer | Ben Straub <bs@github.com> | 2012-09-19 04:41:30 -0700 |
commit | 78216495b0aaca66dc76ae33516a679385495c6a (patch) | |
tree | 3765803c8a0fb5167e47d52012ea95f98cabf597 /src/odb_pack.c | |
parent | 5bb0dc9390edf9f056cd67c12c258b10d0648871 (diff) | |
download | libgit2-78216495b0aaca66dc76ae33516a679385495c6a.tar.gz |
Remove mtime checks from ODB packfile backend
Now forcing refresh on a foreach, and on missed full-oid
or short-oid lookups.
Diffstat (limited to 'src/odb_pack.c')
-rw-r--r-- | src/odb_pack.c | 55 |
1 files changed, 32 insertions, 23 deletions
diff --git a/src/odb_pack.c b/src/odb_pack.c index 5d3f0e6e5..50949bc6b 100644 --- a/src/odb_pack.c +++ b/src/odb_pack.c @@ -24,7 +24,6 @@ struct pack_backend { git_vector packs; struct git_pack_file *last_found; char *pack_folder; - time_t pack_folder_mtime; }; /** @@ -233,7 +232,7 @@ static int packfile_load__cb(void *_data, git_buf *path) return git_vector_insert(&backend->packs, pack); } -static int packfile_refresh_all_maybe(struct pack_backend *backend, bool force) +static int packfile_refresh_all(struct pack_backend *backend) { int error; struct stat st; @@ -245,28 +244,21 @@ static int packfile_refresh_all_maybe(struct pack_backend *backend, bool force) if (p_stat(backend->pack_folder, &st) < 0 || !S_ISDIR(st.st_mode)) return git_odb__error_notfound("failed to refresh packfiles", NULL); - if (force || st.st_mtime != backend->pack_folder_mtime) { - git_buf_sets(&path, backend->pack_folder); + git_buf_sets(&path, backend->pack_folder); - /* reload all packs */ - error = git_path_direach(&path, packfile_load__cb, (void *)backend); + /* reload all packs */ + error = git_path_direach(&path, packfile_load__cb, (void *)backend); - git_buf_free(&path); + git_buf_free(&path); - if (error < 0) - return error; + if (error < 0) + return error; - git_vector_sort(&backend->packs); - backend->pack_folder_mtime = st.st_mtime; - } + git_vector_sort(&backend->packs); return 0; } -static int packfile_refresh_all(struct pack_backend *backend) { - return packfile_refresh_all_maybe(backend, false); -} - static int pack_entry_find_inner(struct git_pack_entry *e, struct pack_backend *backend, const git_oid *oid) @@ -304,7 +296,7 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen if (!pack_entry_find_inner(e, backend, oid)) return 0; - if ((error = packfile_refresh_all_maybe(backend, true)) < 0) + if ((error = packfile_refresh_all(backend)) < 0) return error; if (!pack_entry_find_inner(e, backend, oid)) return 0; @@ -312,11 +304,10 @@ static int pack_entry_find(struct git_pack_entry *e, struct pack_backend *backen return git_odb__error_notfound("failed to find pack entry", oid); } -static int pack_entry_find_prefix( - struct git_pack_entry *e, - struct pack_backend *backend, - const git_oid *short_oid, - size_t len) +static unsigned pack_entry_find_prefix_inner(struct git_pack_entry *e, + struct pack_backend *backend, + const git_oid *short_oid, + size_t len) { int error; unsigned int i; @@ -351,6 +342,25 @@ static int pack_entry_find_prefix( } } + return found; +} + +static int pack_entry_find_prefix( + struct git_pack_entry *e, + struct pack_backend *backend, + const git_oid *short_oid, + size_t len) +{ + unsigned found = 0; + int error; + + if ((found = pack_entry_find_prefix_inner(e, backend, short_oid, len)) > 0) + goto cleanup; + if ((error = packfile_refresh_all(backend)) < 0) + return error; + found = pack_entry_find_prefix_inner(e, backend, short_oid, len); + +cleanup: if (!found) return git_odb__error_notfound("no matching pack entry for prefix", short_oid); else if (found > 1) @@ -535,7 +545,6 @@ int git_odb_backend_pack(git_odb_backend **backend_out, const char *objects_dir) if (git_path_isdir(git_buf_cstr(&path)) == true) { backend->pack_folder = git_buf_detach(&path); - backend->pack_folder_mtime = 0; } backend->parent.read = &pack_backend__read; |