зеркало из https://github.com/microsoft/git.git
alternates: provide helper for adding to alternates list
The submodule code wants to temporarily add an alternate object store to our in-memory alt_odb list, but does it manually. Let's provide a helper so it can reuse the code in link_alt_odb_entry(). While we're adding our new add_to_alternates_memory(), let's document add_to_alternates_file(), as the two are related. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
4ea82473aa
Коммит
a5b34d2152
14
cache.h
14
cache.h
|
@ -1389,10 +1389,22 @@ extern struct alternate_object_database {
|
|||
extern void prepare_alt_odb(void);
|
||||
extern void read_info_alternates(const char * relative_base, int depth);
|
||||
extern char *compute_alternate_path(const char *path, struct strbuf *err);
|
||||
extern void add_to_alternates_file(const char *reference);
|
||||
typedef int alt_odb_fn(struct alternate_object_database *, void *);
|
||||
extern int foreach_alt_odb(alt_odb_fn, void*);
|
||||
|
||||
/*
|
||||
* Add the directory to the on-disk alternates file; the new entry will also
|
||||
* take effect in the current process.
|
||||
*/
|
||||
extern void add_to_alternates_file(const char *dir);
|
||||
|
||||
/*
|
||||
* Add the directory to the in-memory list of alternates (along with any
|
||||
* recursive alternates it points to), but do not modify the on-disk alternates
|
||||
* file.
|
||||
*/
|
||||
extern void add_to_alternates_memory(const char *dir);
|
||||
|
||||
struct pack_window {
|
||||
struct pack_window *next;
|
||||
unsigned char *base;
|
||||
|
|
11
sha1_file.c
11
sha1_file.c
|
@ -440,6 +440,17 @@ void add_to_alternates_file(const char *reference)
|
|||
free(alts);
|
||||
}
|
||||
|
||||
void add_to_alternates_memory(const char *reference)
|
||||
{
|
||||
/*
|
||||
* Make sure alternates are initialized, or else our entry may be
|
||||
* overwritten when they are.
|
||||
*/
|
||||
prepare_alt_odb();
|
||||
|
||||
link_alt_odb_entries(reference, strlen(reference), '\n', NULL, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Compute the exact path an alternate is at and returns it. In case of
|
||||
* error NULL is returned and the human readable error is added to `err`
|
||||
|
|
23
submodule.c
23
submodule.c
|
@ -123,9 +123,7 @@ void stage_updated_gitmodules(void)
|
|||
static int add_submodule_odb(const char *path)
|
||||
{
|
||||
struct strbuf objects_directory = STRBUF_INIT;
|
||||
struct alternate_object_database *alt_odb;
|
||||
int ret = 0;
|
||||
size_t alloc;
|
||||
|
||||
ret = strbuf_git_path_submodule(&objects_directory, path, "objects/");
|
||||
if (ret)
|
||||
|
@ -134,26 +132,7 @@ static int add_submodule_odb(const char *path)
|
|||
ret = -1;
|
||||
goto done;
|
||||
}
|
||||
/* avoid adding it twice */
|
||||
prepare_alt_odb();
|
||||
for (alt_odb = alt_odb_list; alt_odb; alt_odb = alt_odb->next)
|
||||
if (alt_odb->name - alt_odb->base == objects_directory.len &&
|
||||
!strncmp(alt_odb->base, objects_directory.buf,
|
||||
objects_directory.len))
|
||||
goto done;
|
||||
|
||||
alloc = st_add(objects_directory.len, 42); /* for "12/345..." sha1 */
|
||||
alt_odb = xmalloc(st_add(sizeof(*alt_odb), alloc));
|
||||
alt_odb->next = alt_odb_list;
|
||||
xsnprintf(alt_odb->base, alloc, "%s", objects_directory.buf);
|
||||
alt_odb->name = alt_odb->base + objects_directory.len;
|
||||
alt_odb->name[2] = '/';
|
||||
alt_odb->name[40] = '\0';
|
||||
alt_odb->name[41] = '\0';
|
||||
alt_odb_list = alt_odb;
|
||||
|
||||
/* add possible alternates from the submodule */
|
||||
read_info_alternates(objects_directory.buf, 0);
|
||||
add_to_alternates_memory(objects_directory.buf);
|
||||
done:
|
||||
strbuf_release(&objects_directory);
|
||||
return ret;
|
||||
|
|
Загрузка…
Ссылка в новой задаче