diff options
author | Junio C Hamano <gitster@pobox.com> | 2017-04-20 04:37:14 (GMT) |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2017-04-20 04:37:14 (GMT) |
commit | 872e2cf00a570e9d83e40343579a7bb092307d53 (patch) | |
tree | 5ea827f2490dcff68f25e380213376ecb69acb36 /builtin | |
parent | b1081e4004091947b6c6a806625addd1cbba61b7 (diff) | |
parent | 06bf4ad1db92c32af38e16d9b7f928edbd647780 (diff) | |
download | git-872e2cf00a570e9d83e40343579a7bb092307d53.zip git-872e2cf00a570e9d83e40343579a7bb092307d53.tar.gz git-872e2cf00a570e9d83e40343579a7bb092307d53.tar.bz2 |
Merge branch 'bw/push-options-recursively-to-submodules'
"git push --recurse-submodules --push-option=<string>" learned to
propagate the push option recursively down to pushes in submodules.
* bw/push-options-recursively-to-submodules:
push: propagate remote and refspec with --recurse-submodules
submodule--helper: add push-check subcommand
remote: expose parse_push_refspec function
push: propagate push-options with --recurse-submodules
push: unmark a local variable as static
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/push.c | 5 | ||||
-rw-r--r-- | builtin/submodule--helper.c | 45 |
2 files changed, 48 insertions, 2 deletions
diff --git a/builtin/push.c b/builtin/push.c index 5c22e9f..a597759 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -510,8 +510,8 @@ int cmd_push(int argc, const char **argv, const char *prefix) int push_cert = -1; int rc; const char *repo = NULL; /* default repository */ - static struct string_list push_options = STRING_LIST_INIT_DUP; - static struct string_list_item *item; + struct string_list push_options = STRING_LIST_INIT_DUP; + const struct string_list_item *item; struct option options[] = { OPT__VERBOSITY(&verbosity), @@ -584,6 +584,7 @@ int cmd_push(int argc, const char **argv, const char *prefix) die(_("push options must not have new line characters")); rc = do_push(repo, flags, &push_options); + string_list_clear(&push_options, 0); if (rc == -1) usage_with_options(push_usage, options); else diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c index 85aafe4..6ee9622 100644 --- a/builtin/submodule--helper.c +++ b/builtin/submodule--helper.c @@ -1105,6 +1105,50 @@ static int resolve_remote_submodule_branch(int argc, const char **argv, return 0; } +static int push_check(int argc, const char **argv, const char *prefix) +{ + struct remote *remote; + + if (argc < 2) + die("submodule--helper push-check requires at least 1 argument"); + + /* + * The remote must be configured. + * This is to avoid pushing to the exact same URL as the parent. + */ + remote = pushremote_get(argv[1]); + if (!remote || remote->origin == REMOTE_UNCONFIGURED) + die("remote '%s' not configured", argv[1]); + + /* Check the refspec */ + if (argc > 2) { + int i, refspec_nr = argc - 2; + struct ref *local_refs = get_local_heads(); + struct refspec *refspec = parse_push_refspec(refspec_nr, + argv + 2); + + for (i = 0; i < refspec_nr; i++) { + struct refspec *rs = refspec + i; + + if (rs->pattern || rs->matching) + continue; + + /* + * LHS must match a single ref + * NEEDSWORK: add logic to special case 'HEAD' once + * working with submodules in a detached head state + * ceases to be the norm. + */ + if (count_refspec_match(rs->src, local_refs, NULL) != 1) + die("src refspec '%s' must name a ref", + rs->src); + } + free_refspec(refspec_nr, refspec); + } + + return 0; +} + static int absorb_git_dirs(int argc, const char **argv, const char *prefix) { int i; @@ -1170,6 +1214,7 @@ static struct cmd_struct commands[] = { {"resolve-relative-url-test", resolve_relative_url_test, 0}, {"init", module_init, SUPPORT_SUPER_PREFIX}, {"remote-branch", resolve_remote_submodule_branch, 0}, + {"push-check", push_check, 0}, {"absorb-git-dirs", absorb_git_dirs, SUPPORT_SUPER_PREFIX}, {"is-active", is_active, 0}, }; |