X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=submodule.c;h=0fd10a0fdbf5d1af10819dea808b43f6b13b98a8;hb=82433cdf4d888639cecddeca162d619cf370417e;hp=08756387e207700861cfa6dac039334ecd53c7a1;hpb=c510259c02b46d5edb84568ee9eb0967b25bb75b;p=git.git diff --git a/submodule.c b/submodule.c index 08756387e..0fd10a0fd 100644 --- a/submodule.c +++ b/submodule.c @@ -9,6 +9,7 @@ #include "refs.h" #include "string-list.h" #include "sha1-array.h" +#include "argv-array.h" static struct string_list config_name_for_path; static struct string_list config_fetch_recurse_submodules_for_name; @@ -496,56 +497,26 @@ void check_for_new_submodule_commits(unsigned char new_sha1[20]) sha1_array_append(&ref_tips_after_fetch, new_sha1); } -struct argv_array { - const char **argv; - unsigned int argc; - unsigned int alloc; -}; - -static void init_argv(struct argv_array *array) -{ - array->argv = NULL; - array->argc = 0; - array->alloc = 0; -} - -static void push_argv(struct argv_array *array, const char *value) -{ - ALLOC_GROW(array->argv, array->argc + 2, array->alloc); - array->argv[array->argc++] = xstrdup(value); - array->argv[array->argc] = NULL; -} - -static void clear_argv(struct argv_array *array) -{ - int i; - for (i = 0; i < array->argc; i++) - free((char **)array->argv[i]); - free(array->argv); - init_argv(array); -} - static void add_sha1_to_argv(const unsigned char sha1[20], void *data) { - push_argv(data, sha1_to_hex(sha1)); + argv_array_push(data, sha1_to_hex(sha1)); } static void calculate_changed_submodule_paths(void) { struct rev_info rev; struct commit *commit; - struct argv_array argv; + struct argv_array argv = ARGV_ARRAY_INIT; /* No need to check if there are no submodules configured */ if (!config_name_for_path.nr) return; init_revisions(&rev, NULL); - init_argv(&argv); - push_argv(&argv, "--"); /* argv[0] program name */ + argv_array_push(&argv, "--"); /* argv[0] program name */ sha1_array_for_each_unique(&ref_tips_after_fetch, add_sha1_to_argv, &argv); - push_argv(&argv, "--not"); + argv_array_push(&argv, "--not"); sha1_array_for_each_unique(&ref_tips_before_fetch, add_sha1_to_argv, &argv); setup_revisions(argv.argc, argv.argv, &rev, NULL); @@ -573,7 +544,7 @@ static void calculate_changed_submodule_paths(void) } } - clear_argv(&argv); + argv_array_clear(&argv); sha1_array_clear(&ref_tips_before_fetch); sha1_array_clear(&ref_tips_after_fetch); initialized_fetch_ref_tips = 0; @@ -823,7 +794,7 @@ static void print_commit(struct commit *commit) int merge_submodule(unsigned char result[20], const char *path, const unsigned char base[20], const unsigned char a[20], - const unsigned char b[20]) + const unsigned char b[20], int search) { struct commit *commit_base, *commit_a, *commit_b; int parent_count; @@ -878,6 +849,10 @@ int merge_submodule(unsigned char result[20], const char *path, * user needs to confirm the resolution. */ + /* Skip the search if makes no sense to the calling context. */ + if (!search) + return 0; + /* find commit which merges them */ parent_count = find_first_merges(&merges, path, commit_a, commit_b); switch (parent_count) {