Function set_name_rev() is ported from git-submodule to the
submodule--helper builtin. The function get_name_rev() generates the
value of the revision name as required, and the function
print_name_rev() handles the formating and printing of the obtained
revision name.

Mentored-by: Christian Couder <christian.cou...@gmail.com>
Mentored-by: Stefan Beller <sbel...@google.com>
Signed-off-by: Prathamesh Chavan <pc44...@gmail.com>
---
 builtin/submodule--helper.c | 63 +++++++++++++++++++++++++++++++++++++++++++++
 git-submodule.sh            | 16 ++----------
 2 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 7803457ba..a4bff3f38 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -244,6 +244,68 @@ static char *get_submodule_displaypath(const char *path, 
const char *prefix)
        }
 }
 
+static char *get_name_rev(const char *sub_path, const char* object_id)
+{
+       struct strbuf sb = STRBUF_INIT;
+       const char ***d;
+
+       static const char *describe_bare[] = {
+               NULL
+       };
+
+       static const char *describe_tags[] = {
+               "--tags", NULL
+       };
+
+       static const char *describe_contains[] = {
+               "--contains", NULL
+       };
+
+       static const char *describe_all_always[] = {
+               "--all", "--always", NULL
+       };
+
+       static const char **describe_argv[] = {
+               describe_bare, describe_tags, describe_contains,
+               describe_all_always, NULL
+       };
+
+       for (d = describe_argv; *d; d++) {
+               struct child_process cp = CHILD_PROCESS_INIT;
+               prepare_submodule_repo_env(&cp.env_array);
+               cp.dir = sub_path;
+               cp.git_cmd = 1;
+               cp.no_stderr = 1;
+
+               argv_array_push(&cp.args, "describe");
+               argv_array_pushv(&cp.args, *d);
+               argv_array_push(&cp.args, object_id);
+
+               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 print_name_rev(int argc, const char **argv, const char *prefix)
+{
+       char *namerev;
+       if (argc != 3)
+               die("print-name-rev only accepts two arguments: <path> <sha1>");
+
+       namerev = get_name_rev(argv[1], argv[2]);
+       if (namerev && namerev[0])
+               printf(" (%s)", namerev);
+       printf("\n");
+
+       free(namerev);
+       return 0;
+}
+
 struct module_list {
        const struct cache_entry **entries;
        int alloc, nr;
@@ -1242,6 +1304,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},
+       {"print-name-rev", print_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 e131760ee..e988167e0 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -759,18 +759,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
 #
@@ -1042,14 +1030,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 print-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 print-name-rev 
"$sm_path" "$sha1")
                        say "+$sha1 $displaypath$revname"
                fi
 
-- 
2.13.0

Reply via email to