зеркало из https://github.com/microsoft/git.git
gvfs: allow "virtualizing" objects
The idea is to allow blob objects to be missing from the local repository, and to load them lazily on demand. After discussing this idea on the mailing list, we will rename the feature to "lazy clone" and work more on this. Signed-off-by: Ben Peart <Ben.Peart@microsoft.com>
This commit is contained in:
Родитель
73b32c42ed
Коммит
bad623023e
2
cache.h
2
cache.h
|
@ -982,6 +982,8 @@ int use_optional_locks(void);
|
|||
extern char comment_line_char;
|
||||
extern int auto_comment_line_char;
|
||||
|
||||
extern int core_virtualize_objects;
|
||||
|
||||
enum log_refs_config {
|
||||
LOG_REFS_UNSET = -1,
|
||||
LOG_REFS_NONE = 0,
|
||||
|
|
5
config.c
5
config.c
|
@ -1395,6 +1395,11 @@ static int git_default_core_config(const char *var, const char *value, void *cb)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!strcmp(var, "core.virtualizeobjects")) {
|
||||
core_virtualize_objects = git_config_bool(var, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Add other config variables here and to Documentation/config.txt. */
|
||||
return platform_core_config(var, value, cb);
|
||||
}
|
||||
|
|
|
@ -49,6 +49,8 @@ int check_connected(oid_iterate_fn fn, void *cb_data,
|
|||
*/
|
||||
if (gvfs_config_is_set(GVFS_FETCH_SKIP_REACHABILITY_AND_UPLOADPACK))
|
||||
return 0;
|
||||
if (core_virtualize_objects)
|
||||
return 0;
|
||||
|
||||
if (!opt)
|
||||
opt = &defaults;
|
||||
|
|
|
@ -72,6 +72,7 @@ int core_gvfs;
|
|||
int merge_log_config = -1;
|
||||
int precomposed_unicode = -1; /* see probe_utf8_pathname_composition() */
|
||||
unsigned long pack_size_limit_cfg;
|
||||
int core_virtualize_objects;
|
||||
enum log_refs_config log_all_ref_updates = LOG_REFS_UNSET;
|
||||
|
||||
#ifndef PROTECT_HFS_DEFAULT
|
||||
|
|
22
sha1-file.c
22
sha1-file.c
|
@ -1411,6 +1411,21 @@ static int loose_object_info(struct repository *r,
|
|||
return (status < 0) ? status : 0;
|
||||
}
|
||||
|
||||
static int run_read_object_hook(const struct object_id *oid)
|
||||
{
|
||||
struct argv_array args = ARGV_ARRAY_INIT;
|
||||
int ret;
|
||||
uint64_t start;
|
||||
|
||||
start = getnanotime();
|
||||
argv_array_push(&args, oid_to_hex(oid));
|
||||
ret = run_hook_argv(NULL, "read-object", args.argv);
|
||||
argv_array_clear(&args);
|
||||
trace_performance_since(start, "run_read_object_hook");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int fetch_if_missing = 1;
|
||||
|
||||
int oid_object_info_extended(struct repository *r, const struct object_id *oid,
|
||||
|
@ -1421,6 +1436,7 @@ int oid_object_info_extended(struct repository *r, const struct object_id *oid,
|
|||
int rtype;
|
||||
const struct object_id *real = oid;
|
||||
int already_retried = 0;
|
||||
int tried_hook = 0;
|
||||
|
||||
if (flags & OBJECT_INFO_LOOKUP_REPLACE)
|
||||
real = lookup_replace_object(r, oid);
|
||||
|
@ -1431,6 +1447,7 @@ int oid_object_info_extended(struct repository *r, const struct object_id *oid,
|
|||
if (!oi)
|
||||
oi = &blank_oi;
|
||||
|
||||
retry:
|
||||
if (!(flags & OBJECT_INFO_SKIP_CACHED)) {
|
||||
struct cached_object *co = find_cached_object(real);
|
||||
if (co) {
|
||||
|
@ -1467,6 +1484,11 @@ int oid_object_info_extended(struct repository *r, const struct object_id *oid,
|
|||
reprepare_packed_git(r);
|
||||
if (find_pack_entry(r, real, &e))
|
||||
break;
|
||||
if (core_virtualize_objects && !tried_hook) {
|
||||
tried_hook = 1;
|
||||
if (!run_read_object_hook(oid))
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if it is a missing object */
|
||||
|
|
Загрузка…
Ссылка в новой задаче