Commit 69b6ffc4 by Russell Belfer

Make a real submodule cache object

This takes the old submodule cache which was just a git_strmap
and makes a real git_submodule_cache object that can contain other
things like a lock and timestamp-ish data to control refreshing of
submodule info.
parent d543d59c
...@@ -93,6 +93,7 @@ void git_repository__cleanup(git_repository *repo) ...@@ -93,6 +93,7 @@ void git_repository__cleanup(git_repository *repo)
git_cache_clear(&repo->objects); git_cache_clear(&repo->objects);
git_attr_cache_flush(repo); git_attr_cache_flush(repo);
git_submodule_cache_free(repo);
set_config(repo, NULL); set_config(repo, NULL);
set_index(repo, NULL); set_index(repo, NULL);
...@@ -108,7 +109,6 @@ void git_repository_free(git_repository *repo) ...@@ -108,7 +109,6 @@ void git_repository_free(git_repository *repo)
git_repository__cleanup(repo); git_repository__cleanup(repo);
git_cache_free(&repo->objects); git_cache_free(&repo->objects);
git_submodule_config_free(repo);
git_diff_driver_registry_free(repo->diff_drivers); git_diff_driver_registry_free(repo->diff_drivers);
repo->diff_drivers = NULL; repo->diff_drivers = NULL;
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
#include "buffer.h" #include "buffer.h"
#include "object.h" #include "object.h"
#include "attrcache.h" #include "attrcache.h"
#include "strmap.h" #include "submodule.h"
#include "diff_driver.h" #include "diff_driver.h"
#define DOT_GIT ".git" #define DOT_GIT ".git"
...@@ -105,10 +105,10 @@ struct git_repository { ...@@ -105,10 +105,10 @@ struct git_repository {
git_refdb *_refdb; git_refdb *_refdb;
git_config *_config; git_config *_config;
git_index *_index; git_index *_index;
git_submodule_cache *_submodules;
git_cache objects; git_cache objects;
git_attr_cache attrcache; git_attr_cache attrcache;
git_strmap *submodules;
git_diff_driver_registry *diff_drivers; git_diff_driver_registry *diff_drivers;
char *path_repository; char *path_repository;
...@@ -149,11 +149,6 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo); ...@@ -149,11 +149,6 @@ int git_repository_index__weakptr(git_index **out, git_repository *repo);
int git_repository__cvar(int *out, git_repository *repo, git_cvar_cached cvar); int git_repository__cvar(int *out, git_repository *repo, git_cvar_cached cvar);
void git_repository__cvar_cache_clear(git_repository *repo); void git_repository__cvar_cache_clear(git_repository *repo);
/*
* Submodule cache
*/
extern void git_submodule_config_free(git_repository *repo);
GIT_INLINE(int) git_repository__ensure_not_bare( GIT_INLINE(int) git_repository__ensure_not_bare(
git_repository *repo, git_repository *repo,
const char *operation_name) const char *operation_name)
......
...@@ -99,6 +99,30 @@ struct git_submodule { ...@@ -99,6 +99,30 @@ struct git_submodule {
git_oid wd_oid; git_oid wd_oid;
}; };
/**
* The git_submodule_cache stores known submodules along with timestamps,
* etc. about when they were loaded
*/
typedef struct {
git_repository *repo;
git_strmap *submodules;
git_mutex lock;
/* cache invalidation data */
git_oid head_id;
git_futils_filestamp index_stamp;
git_buf gitmodules_path;
git_futils_filestamp gitmodules_stamp;
git_oid gitmodules_id;
git_futils_filestamp config_stamp;
} git_submodule_cache;
/* Force revalidation of submodule data cache (alloc as needed) */
extern int git_submodule_cache_refresh(git_repository *repo);
/* Release all submodules */
extern void git_submodule_cache_free(git_repository *repo);
/* Additional flags on top of public GIT_SUBMODULE_STATUS values */ /* Additional flags on top of public GIT_SUBMODULE_STATUS values */
enum { enum {
GIT_SUBMODULE_STATUS__WD_SCANNED = (1u << 20), GIT_SUBMODULE_STATUS__WD_SCANNED = (1u << 20),
...@@ -122,6 +146,10 @@ enum { ...@@ -122,6 +146,10 @@ enum {
/* Internal submodule check does not attempt to refresh cached data */ /* Internal submodule check does not attempt to refresh cached data */
extern bool git_submodule__is_submodule(git_repository *repo, const char *name); extern bool git_submodule__is_submodule(git_repository *repo, const char *name);
/* Internal lookup does not attempt to refresh cached data */
extern int git_submodule__lookup(
git_submodule **out, git_repository *repo, const char *path);
/* Internal status fn returns status and optionally the various OIDs */ /* Internal status fn returns status and optionally the various OIDs */
extern int git_submodule__status( extern int git_submodule__status(
unsigned int *out_status, unsigned int *out_status,
...@@ -143,5 +171,6 @@ extern int git_submodule_parse_update( ...@@ -143,5 +171,6 @@ extern int git_submodule_parse_update(
extern const char *git_submodule_ignore_to_str(git_submodule_ignore_t); extern const char *git_submodule_ignore_to_str(git_submodule_ignore_t);
extern const char *git_submodule_update_to_str(git_submodule_update_t); extern const char *git_submodule_update_to_str(git_submodule_update_t);
extern const char *git_submodule_recurse_to_str(git_submodule_recurse_t);
#endif #endif
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