A submodule's object database may be imported to in-core object pool for a quick peek without paying the price of running a separate git command. These databases are marked in for stricter checks later to avoid accidentially refering to a submodule's SHA-1 from main repo (except in gitlinks). Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@xxxxxxxxx> --- cache.h | 4 +++- environment.c | 2 ++ sha1_file.c | 38 +++++++++++++++++++++++++++++--------- submodule.c | 2 +- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/cache.h b/cache.h index 92854ab..b8d5826 100644 --- a/cache.h +++ b/cache.h @@ -561,6 +561,7 @@ extern int fsync_object_files; extern int core_preload_index; extern int core_apply_sparse_checkout; extern int precomposed_unicode; +extern int object_database_contaminated; enum branch_track { BRANCH_TRACK_UNSPECIFIED = -1, @@ -957,11 +958,12 @@ extern void remove_scheduled_dirs(void); extern struct alternate_object_database { struct alternate_object_database *next; + int external; char *name; char base[FLEX_ARRAY]; /* more */ } *alt_odb_list; extern void prepare_alt_odb(void); -extern void read_info_alternates(const char * relative_base, int depth); +extern void read_external_info_alternates(const char * relative_base, int depth); extern void add_to_alternates_file(const char *reference); typedef int alt_odb_fn(struct alternate_object_database *, void *); extern void foreach_alt_odb(alt_odb_fn, void*); diff --git a/environment.c b/environment.c index 85edd7f..3c90d95 100644 --- a/environment.c +++ b/environment.c @@ -65,6 +65,8 @@ unsigned long pack_size_limit_cfg; /* Parallel index stat data preload? */ int core_preload_index = 0; +int object_database_contaminated; + /* This is set by setup_git_dir_gently() and/or git_default_config() */ char *git_work_tree_cfg; static char *work_tree; diff --git a/sha1_file.c b/sha1_file.c index afc7355..af71122 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -58,6 +58,9 @@ static struct cached_object empty_tree = { static struct packed_git *last_found_pack; +static void read_info_alternates(const char * relative_base, + int depth, int external); + static struct cached_object *find_cached_object(const unsigned char *sha1) { int i; @@ -247,7 +250,10 @@ static int git_open_noatime(const char *name); * SHA1, an extra slash for the first level indirection, and the * terminating NUL. */ -static int link_alt_odb_entry(const char *entry, const char *relative_base, int depth) +static int link_alt_odb_entry(const char *entry, + const char *relative_base, + int depth, + int external) { const char *objdir = get_object_directory(); struct alternate_object_database *ent; @@ -277,6 +283,7 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, int memcpy(ent->base, pathbuf.buf, pfxlen); strbuf_release(&pathbuf); + ent->external = external; ent->name = ent->base + pfxlen + 1; ent->base[pfxlen + 3] = '/'; ent->base[pfxlen] = ent->base[entlen-1] = 0; @@ -310,15 +317,19 @@ static int link_alt_odb_entry(const char *entry, const char *relative_base, int ent->next = NULL; /* recursively add alternates */ - read_info_alternates(ent->base, depth + 1); + read_info_alternates(ent->base, depth + 1, 0); ent->base[pfxlen] = '/'; + if (external) + object_database_contaminated = 1; + return 0; } static void link_alt_odb_entries(const char *alt, int len, int sep, - const char *relative_base, int depth) + const char *relative_base, + int depth, int external) { struct string_list entries = STRING_LIST_INIT_NODUP; char *alt_copy; @@ -340,14 +351,16 @@ static void link_alt_odb_entries(const char *alt, int len, int sep, error("%s: ignoring relative alternate object store %s", relative_base, entry); } else { - link_alt_odb_entry(entry, relative_base, depth); + link_alt_odb_entry(entry, relative_base, + depth, external); } } string_list_clear(&entries, 0); free(alt_copy); } -void read_info_alternates(const char * relative_base, int depth) +static void read_info_alternates(const char * relative_base, + int depth, int external) { char *map; size_t mapsz; @@ -371,11 +384,18 @@ void read_info_alternates(const char * relative_base, int depth) map = xmmap(NULL, mapsz, PROT_READ, MAP_PRIVATE, fd, 0); close(fd); - link_alt_odb_entries(map, mapsz, '\n', relative_base, depth); + link_alt_odb_entries(map, mapsz, '\n', relative_base, + depth, external); munmap(map, mapsz); } +void read_external_info_alternates(const char *relative_base, + int depth) +{ + read_info_alternates(relative_base, depth, 1); +} + void add_to_alternates_file(const char *reference) { struct lock_file *lock = xcalloc(1, sizeof(struct lock_file)); @@ -385,7 +405,7 @@ void add_to_alternates_file(const char *reference) if (commit_lock_file(lock)) die("could not close alternates file"); if (alt_odb_tail) - link_alt_odb_entries(alt, strlen(alt), '\n', NULL, 0); + link_alt_odb_entries(alt, strlen(alt), '\n', NULL, 0, 0); } void foreach_alt_odb(alt_odb_fn fn, void *cb) @@ -409,9 +429,9 @@ void prepare_alt_odb(void) if (!alt) alt = ""; alt_odb_tail = &alt_odb_list; - link_alt_odb_entries(alt, strlen(alt), PATH_SEP, NULL, 0); + link_alt_odb_entries(alt, strlen(alt), PATH_SEP, NULL, 0, 0); - read_info_alternates(get_object_directory(), 0); + read_info_alternates(get_object_directory(), 0, 0); } static int has_loose_object_local(const unsigned char *sha1) diff --git a/submodule.c b/submodule.c index 2f55436..8e4e2ec 100644 --- a/submodule.c +++ b/submodule.c @@ -65,7 +65,7 @@ static int add_submodule_odb(const char *path) alt_odb_list = alt_odb; /* add possible alternates from the submodule */ - read_info_alternates(objects_directory.buf, 0); + read_external_info_alternates(objects_directory.buf, 0); prepare_alt_odb(); done: strbuf_release(&objects_directory); -- 1.8.0.rc3.18.g0d9b108 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html