Since later on we want to port submodule subcommand status, and since
set_name_rev is part of cmd_status, hence this function is ported. It
has been ported to function set_name_rev in C, which calls get_name_rev
to get the revname, and after formatting it, set_name_prints it. And
hence in this way, the command `git submodule--helper set-name-rev
"sm_path" "sha1"` sets value of revname in git-submodule.sh

The function get_name_rev returns the stdout of the git describe
commands. Since there are four different git-describe commands used for
generating the name rev, four child_process are introduced, each successive
child process running only when previous has no stdout. The order of these
four git-describe commands is maintained the same as it was in the function
set_name_rev() before porting.

Mentored-by: Christian Couder <christian.cou...@gmail.com>
Mentored-by: Stefan Beller <sbel...@google.com>
Signed-off-by: Prathamesh Chavan <pc44...@gmail.com>
---
This series of patch is based on gitster/jk/bug-to-abort for untilizing its
BUG() macro.

Since submodule subcommand used set_name_rev function, first this function
was ported before porting the subcommand to C.

Complete build report for this patch is available at:
https://travis-ci.org/pratham-pc/git/builds/
Branch: status
Build #64

Also, I have updated my Github and pushed this work. It can be seen at:
https://github.com/pratham-pc/git/commits/status

 builtin/submodule--helper.c | 65 +++++++++++++++++++++++++++++++++++++++++++++
 git-submodule.sh            | 16 ++---------
 2 files changed, 67 insertions(+), 14 deletions(-)

diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 566a5b6a6..5f0ddd8ad 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -219,6 +219,70 @@ static int resolve_relative_url_test(int argc, const char 
**argv, const char *pr
        return 0;
 }
 
+enum describe_step {
+       step_bare = 0,
+       step_tags,
+       step_contains,
+       step_all_always,
+       step_end
+};
+
+static char *get_name_rev(int argc, const char **argv, const char *prefix)
+{
+       struct child_process cp;
+       struct strbuf sb = STRBUF_INIT;
+       enum describe_step cur_step;
+
+       for (cur_step = step_bare; cur_step < step_end; cur_step++) {
+               child_process_init(&cp);
+               prepare_submodule_repo_env(&cp.env_array);
+               cp.dir = argv[1];
+               cp.no_stderr = 1;
+
+               switch (cur_step) {
+                       case step_bare:
+                               argv_array_pushl(&cp.args, "git", "describe", 
argv[2], NULL);
+                               break;
+                       case step_tags:
+                               argv_array_pushl(&cp.args, "git", "describe", 
"--tags",
+                                                argv[2], NULL);
+                               break;
+                       case step_contains:
+                               argv_array_pushl(&cp.args, "git", "describe",
+                                                "--contains", argv[2], NULL);
+                               break;
+                       case step_all_always:
+                               argv_array_pushl(&cp.args, "git", "describe", 
"--all",
+                                                "--always", argv[2], NULL);
+                               break;
+                       default:
+                               BUG("unknown describe step '%d'", cur_step);
+               }
+
+               if (!capture_command(&cp, &sb, 0) && sb.len) {
+                       strbuf_strip_suffix(&sb, "\n");
+                       return strbuf_detach(&sb, NULL);
+               }
+       }
+
+       strbuf_release(&sb);
+       return NULL;
+}
+
+
+static int set_name_rev(int argc, const char **argv, const char *prefix)
+{
+       char *namerev;
+       if (argc != 3)
+               die("set-name-rev only accepts two arguments: <path> <sha1>");
+
+       namerev = get_name_rev(argc, argv, prefix);
+       if (namerev[0])
+               printf(" (%s)\n", namerev);
+
+       return 0;
+}
+
 struct module_list {
        const struct cache_entry **entries;
        int alloc, nr;
@@ -1212,6 +1276,7 @@ static struct cmd_struct commands[] = {
        {"relative-path", resolve_relative_path, 0},
        {"resolve-relative-url", resolve_relative_url, 0},
        {"resolve-relative-url-test", resolve_relative_url_test, 0},
+       {"set-name-rev", set_name_rev, 0},
        {"init", module_init, SUPPORT_SUPER_PREFIX},
        {"remote-branch", resolve_remote_submodule_branch, 0},
        {"push-check", push_check, 0},
diff --git a/git-submodule.sh b/git-submodule.sh
index c0d0e9a4c..b6eb5bcce 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -758,18 +758,6 @@ cmd_update()
        }
 }
 
-set_name_rev () {
-       revname=$( (
-               sanitize_submodule_env
-               cd "$1" && {
-                       git describe "$2" 2>/dev/null ||
-                       git describe --tags "$2" 2>/dev/null ||
-                       git describe --contains "$2" 2>/dev/null ||
-                       git describe --all --always "$2"
-               }
-       ) )
-       test -z "$revname" || revname=" ($revname)"
-}
 #
 # Show commit summary for submodules in index or working tree
 #
@@ -1041,14 +1029,14 @@ cmd_status()
                fi
                if git diff-files --ignore-submodules=dirty --quiet -- 
"$sm_path"
                then
-                       set_name_rev "$sm_path" "$sha1"
+                       revname=$(git submodule--helper set-name-rev "$sm_path" 
"$sha1")
                        say " $sha1 $displaypath$revname"
                else
                        if test -z "$cached"
                        then
                                sha1=$(sanitize_submodule_env; cd "$sm_path" && 
git rev-parse --verify HEAD)
                        fi
-                       set_name_rev "$sm_path" "$sha1"
+                       revname=$(git submodule--helper set-name-rev "$sm_path" 
"$sha1")
                        say "+$sha1 $displaypath$revname"
                fi
 
-- 
2.11.0

Reply via email to