]> git.ipfire.org Git - thirdparty/git.git/commitdiff
submodule: port subcommand 'set-branch' from shell to C
authorShourya Shukla <shouryashukla.oo@gmail.com>
Tue, 2 Jun 2020 16:35:23 +0000 (22:05 +0530)
committerJunio C Hamano <gitster@pobox.com>
Tue, 2 Jun 2020 17:51:54 +0000 (10:51 -0700)
Convert submodule subcommand 'set-branch' to a builtin and call it via
'git-submodule.sh'.

Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
Helped-by: Denton Liu <liu.denton@gmail.com>
Helped-by: Eric Sunshine <sunshine@sunshineco.com>
Helped-by: Đoàn Trần Công Danh <congdanhqx@gmail.com>
Signed-off-by: Shourya Shukla <shouryashukla.oo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/submodule--helper.c
git-submodule.sh

index 46c03d2a12671e15296b34d5e194fa837a12cdfb..59c1e1217c95a2aef1ef59b7d29de1b37ce4b082 100644 (file)
@@ -2277,6 +2277,49 @@ static int module_set_url(int argc, const char **argv, const char *prefix)
        return 0;
 }
 
+static int module_set_branch(int argc, const char **argv, const char *prefix)
+{
+       int opt_default = 0, ret;
+       const char *opt_branch = NULL;
+       const char *path;
+       char *config_name;
+
+       /*
+        * We accept the `quiet` option for uniformity across subcommands,
+        * though there is nothing to make less verbose in this subcommand.
+        */
+       struct option options[] = {
+               OPT_NOOP_NOARG('q', "quiet"),
+               OPT_BOOL('d', "default", &opt_default,
+                       N_("set the default tracking branch to master")),
+               OPT_STRING('b', "branch", &opt_branch, N_("branch"),
+                       N_("set the default tracking branch")),
+               OPT_END()
+       };
+       const char *const usage[] = {
+               N_("git submodule--helper set-branch [-q|--quiet] (-d|--default) <path>"),
+               N_("git submodule--helper set-branch [-q|--quiet] (-b|--branch) <branch> <path>"),
+               NULL
+       };
+
+       argc = parse_options(argc, argv, prefix, options, usage, 0);
+
+       if (!opt_branch && !opt_default)
+               die(_("--branch or --default required"));
+
+       if (opt_branch && opt_default)
+               die(_("--branch and --default are mutually exclusive"));
+
+       if (argc != 1 || !(path = argv[0]))
+               usage_with_options(usage, options);
+
+       config_name = xstrfmt("submodule.%s.branch", path);
+       ret = config_set_in_gitmodules_file_gently(config_name, opt_branch);
+
+       free(config_name);
+       return !!ret;
+}
+
 #define SUPPORT_SUPER_PREFIX (1<<0)
 
 struct cmd_struct {
@@ -2308,6 +2351,7 @@ static struct cmd_struct commands[] = {
        {"check-name", check_name, 0},
        {"config", module_config, 0},
        {"set-url", module_set_url, 0},
+       {"set-branch", module_set_branch, 0},
 };
 
 int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
index 39ebdf25b5f7128dee92adda8311c83a3e605b4f..43eb6051d23f90cccc94c1fb4c58ad14d4ece3e6 100755 (executable)
@@ -719,7 +719,7 @@ cmd_update()
 # $@ = requested path
 #
 cmd_set_branch() {
-       unset_branch=false
+       default=
        branch=
 
        while test $# -ne 0
@@ -729,7 +729,7 @@ cmd_set_branch() {
                        # we don't do anything with this but we need to accept it
                        ;;
                -d|--default)
-                       unset_branch=true
+                       default=1
                        ;;
                -b|--branch)
                        case "$2" in '') usage ;; esac
@@ -750,33 +750,7 @@ cmd_set_branch() {
                shift
        done
 
-       if test $# -ne 1
-       then
-               usage
-       fi
-
-       # we can't use `git submodule--helper name` here because internally, it
-       # hashes the path so a trailing slash could lead to an unintentional no match
-       name="$(git submodule--helper list "$1" | cut -f2)"
-       if test -z "$name"
-       then
-               exit 1
-       fi
-
-       test -n "$branch"; has_branch=$?
-       test "$unset_branch" = true; has_unset_branch=$?
-
-       if test $((!$has_branch != !$has_unset_branch)) -eq 0
-       then
-               usage
-       fi
-
-       if test $has_branch -eq 0
-       then
-               git submodule--helper config submodule."$name".branch "$branch"
-       else
-               git submodule--helper config --unset submodule."$name".branch
-       fi
+       git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper set-branch ${GIT_QUIET:+--quiet} ${branch:+--branch "$branch"} ${default:+--default} -- "$@"
 }
 
 #