serialize collection of refs that contain submodule changes
We are iterating over each pushed ref and want to check whether it contains changes to submodules. Instead of immediately checking each ref lets first collect them and then do the check for all of them in one revision walk. Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
147394470c
commit
9cfa1c260f
35
submodule.c
35
submodule.c
@ -522,6 +522,13 @@ static int has_remote(const char *refname, const struct object_id *oid,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int append_sha1_to_argv(const unsigned char sha1[20], void *data)
|
||||
{
|
||||
struct argv_array *argv = data;
|
||||
argv_array_push(argv, sha1_to_hex(sha1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int submodule_needs_pushing(const char *path, const unsigned char sha1[20])
|
||||
{
|
||||
if (add_submodule_odb(path) || !lookup_commit_reference(sha1))
|
||||
@ -621,25 +628,24 @@ static void free_submodules_sha1s(struct string_list *submodules)
|
||||
string_list_clear(submodules, 1);
|
||||
}
|
||||
|
||||
int find_unpushed_submodules(unsigned char new_sha1[20],
|
||||
int find_unpushed_submodules(struct sha1_array *commits,
|
||||
const char *remotes_name, struct string_list *needs_pushing)
|
||||
{
|
||||
struct rev_info rev;
|
||||
struct commit *commit;
|
||||
const char *argv[] = {NULL, NULL, "--not", "NULL", NULL};
|
||||
int argc = ARRAY_SIZE(argv) - 1;
|
||||
char *sha1_copy;
|
||||
struct string_list submodules = STRING_LIST_INIT_DUP;
|
||||
struct string_list_item *submodule;
|
||||
struct argv_array argv = ARGV_ARRAY_INIT;
|
||||
|
||||
struct strbuf remotes_arg = STRBUF_INIT;
|
||||
|
||||
strbuf_addf(&remotes_arg, "--remotes=%s", remotes_name);
|
||||
init_revisions(&rev, NULL);
|
||||
sha1_copy = xstrdup(sha1_to_hex(new_sha1));
|
||||
argv[1] = sha1_copy;
|
||||
argv[3] = remotes_arg.buf;
|
||||
setup_revisions(argc, argv, &rev, NULL);
|
||||
|
||||
/* argv.argv[0] will be ignored by setup_revisions */
|
||||
argv_array_push(&argv, "find_unpushed_submodules");
|
||||
sha1_array_for_each_unique(commits, append_sha1_to_argv, &argv);
|
||||
argv_array_push(&argv, "--not");
|
||||
argv_array_pushf(&argv, "--remotes=%s", remotes_name);
|
||||
|
||||
setup_revisions(argv.argc, argv.argv, &rev, NULL);
|
||||
if (prepare_revision_walk(&rev))
|
||||
die("revision walk setup failed");
|
||||
|
||||
@ -647,8 +653,7 @@ int find_unpushed_submodules(unsigned char new_sha1[20],
|
||||
find_unpushed_submodule_commits(commit, &submodules);
|
||||
|
||||
reset_revision_walk();
|
||||
free(sha1_copy);
|
||||
strbuf_release(&remotes_arg);
|
||||
argv_array_clear(&argv);
|
||||
|
||||
for_each_string_list_item(submodule, &submodules) {
|
||||
struct collect_submodule_from_sha1s_data data;
|
||||
@ -685,12 +690,12 @@ static int push_submodule(const char *path)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name)
|
||||
int push_unpushed_submodules(struct sha1_array *commits, const char *remotes_name)
|
||||
{
|
||||
int i, ret = 1;
|
||||
struct string_list needs_pushing = STRING_LIST_INIT_DUP;
|
||||
|
||||
if (!find_unpushed_submodules(new_sha1, remotes_name, &needs_pushing))
|
||||
if (!find_unpushed_submodules(commits, remotes_name, &needs_pushing))
|
||||
return 1;
|
||||
|
||||
for (i = 0; i < needs_pushing.nr; i++) {
|
||||
|
Reference in New Issue
Block a user