@ -529,27 +529,49 @@ static int append_sha1_to_argv(const unsigned char sha1[20], void *data)
return 0;
return 0;
}
}
static int submodule_needs_pushing(const char *path, const unsigned char sha1[20])
static int check_has_commit(const unsigned char sha1[20], void *data)
{
{
if (add_submodule_odb(path) || !lookup_commit_reference(sha1))
int *has_commit = data;
if (!lookup_commit_reference(sha1))
*has_commit = 0;
return 0;
}
static int submodule_has_commits(const char *path, struct sha1_array *commits)
{
int has_commit = 1;
if (add_submodule_odb(path))
return 0;
sha1_array_for_each_unique(commits, check_has_commit, &has_commit);
return has_commit;
}
static int submodule_needs_pushing(const char *path, struct sha1_array *commits)
{
if (!submodule_has_commits(path, commits))
return 0;
return 0;
if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
if (for_each_remote_ref_submodule(path, has_remote, NULL) > 0) {
struct child_process cp = CHILD_PROCESS_INIT;
struct child_process cp = CHILD_PROCESS_INIT;
const char *argv[] = {"rev-list", NULL, "--not", "--remotes", "-n", "1" , NULL};
struct strbuf buf = STRBUF_INIT;
struct strbuf buf = STRBUF_INIT;
int needs_pushing = 0;
int needs_pushing = 0;
argv[1] = sha1_to_hex(sha1);
argv_array_push(&cp.args, "rev-list");
cp.argv = argv;
sha1_array_for_each_unique(commits, append_sha1_to_argv, &cp.args);
argv_array_pushl(&cp.args, "--not", "--remotes", "-n", "1" , NULL);
prepare_submodule_repo_env(&cp.env_array);
prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1;
cp.git_cmd = 1;
cp.no_stdin = 1;
cp.no_stdin = 1;
cp.out = -1;
cp.out = -1;
cp.dir = path;
cp.dir = path;
if (start_command(&cp))
if (start_command(&cp))
die("Could not run 'git rev-list %s --not --remotes -n 1' command in submodule %s",
die("Could not run 'git rev-list <commits> --not --remotes -n 1' command in submodule %s",
sha1_to_hex(sha1), path);
path);
if (strbuf_read(&buf, cp.out, 41))
if (strbuf_read(&buf, cp.out, 41))
needs_pushing = 1;
needs_pushing = 1;
finish_command(&cp);
finish_command(&cp);
@ -604,22 +626,6 @@ static void find_unpushed_submodule_commits(struct commit *commit,
diff_tree_combined_merge(commit, 1, &rev);
diff_tree_combined_merge(commit, 1, &rev);
}
}
struct collect_submodule_from_sha1s_data {
char *submodule_path;
struct string_list *needs_pushing;
};
static int collect_submodules_from_sha1s(const unsigned char sha1[20],
void *data)
{
struct collect_submodule_from_sha1s_data *me = data;
if (submodule_needs_pushing(me->submodule_path, sha1))
string_list_insert(me->needs_pushing, me->submodule_path);
return 0;
}
static void free_submodules_sha1s(struct string_list *submodules)
static void free_submodules_sha1s(struct string_list *submodules)
{
{
struct string_list_item *item;
struct string_list_item *item;
@ -656,12 +662,10 @@ int find_unpushed_submodules(struct sha1_array *commits,
argv_array_clear(&argv);
argv_array_clear(&argv);
for_each_string_list_item(submodule, &submodules) {
for_each_string_list_item(submodule, &submodules) {
struct collect_submodule_from_sha1s_data data;
struct sha1_array *commits = (struct sha1_array *) submodule->util;
data.submodule_path = submodule->string;
data.needs_pushing = needs_pushing;
if (submodule_needs_pushing(submodule->string, commits))
sha1_array_for_each_unique((struct sha1_array *) submodule->util,
string_list_insert(needs_pushing, submodule->string);
collect_submodules_from_sha1s,
&data);
}
}
free_submodules_sha1s(&submodules);
free_submodules_sha1s(&submodules);