From: Shourya Shukla <shouryashukla.oo@gmail.com>
To: git@vger.kernel.org
Cc: christian.couder@gmail.com, kaartic.sivaraam@gmail.com,
gitster@pobox.com, johannes.schindelin@gmx.de,
liu.denton@gmail.com, Prathamesh Chavan <pc44800@gmail.com>,
Christian Couder <chriscool@tuxfamily.org>,
Stefan Beller <stefanbeller@gmail.com>,
Shourya Shukla <shouryashukla.oo@gmail.com>
Subject: [GSoC][PATCH] submodule: port submodule subcommand 'add' from shell to C
Date: Mon, 24 Aug 2020 14:33:59 +0530 [thread overview]
Message-ID: <20200824090359.403944-1-shouryashukla.oo@gmail.com> (raw)
From: Prathamesh Chavan <pc44800@gmail.com>
Convert submodule subcommand 'add' to a builtin and call it via
'git-submodule.sh'.
Also, since the command die()s out in case of absence of commits in the
submodule and exits with exit status 1 when we try adding a submodule
which is mentioned in .gitignore, the keyword 'fatal' is prefixed in the
error messages. Therefore, prepend the keyword in the expected outputs
of tests t7400.6 and t7400.16.
Mentored-by: Christian Couder <chriscool@tuxfamily.org>
Mentored-by: Stefan Beller <stefanbeller@gmail.com>
Signed-off-by: Prathamesh Chavan <pc44800@gmail.com>
Mentored-by: Kaartic Sivaraam <kaartic.sivaraam@gmail.com>
Signed-off-by: Shourya Shukla <shouryashukla.oo@gmail.com>
---
This is my port of 'git submodule add' from shell to C. I had some
confusion regarding this segment in the shell script:
if test -z "$force"
then
git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
die "$(eval_gettext "'\$sm_path' already exists in the index")"
else
git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 &&
die "$(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")"
fi
This is what I have done in C:
if (!force) {
if (is_directory(path) && submodule_from_path(the_repository, &null_oid, path))
die(_("'%s' already exists in the index"), path);
} else {
int err;
if (index_name_pos(&the_index, path, strlen(path)) >= 0 &&
!is_submodule_populated_gently(path, &err))
die(_("'%s' already exists in the index and is not a "
"submodule"), path);
}
Is this part correct? I am not very sure about this. This particular
part is not covered in any test or test script, so, I do not have a
solid method of knowing the correctness of this segment.
Feedback and reviews are appreciated.
---
builtin/submodule--helper.c | 371 ++++++++++++++++++++++++++++++++++++
git-submodule.sh | 161 +---------------
t/t7400-submodule-basic.sh | 5 +-
3 files changed, 375 insertions(+), 162 deletions(-)
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index df135abbf1..b8189822a3 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -2320,6 +2320,376 @@ static int module_set_branch(int argc, const char **argv, const char *prefix)
return !!ret;
}
+struct add_data {
+ const char *prefix;
+ const char *branch;
+ const char *reference_path;
+ const char *sm_path;
+ const char *sm_name;
+ const char *repo;
+ const char *realrepo;
+ int depth;
+ unsigned int force: 1;
+ unsigned int quiet: 1;
+ unsigned int progress: 1;
+ unsigned int dissociate: 1;
+};
+#define ADD_DATA_INIT { NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0 }
+
+/*
+ * Guess dir name from repository: strip leading '.*[/:]',
+ * strip trailing '[:/]*.git'.
+ */
+static char *guess_dir_name(const char *repo)
+{
+ const char *p, *start, *end, *limit;
+ int after_slash_or_colon;
+
+ after_slash_or_colon = 0;
+ limit = repo + strlen(repo);
+ start = repo;
+ end = limit;
+ for (p = repo; p < limit; p++) {
+ if (starts_with(p, ".git")) {
+ /* strip trailing '[:/]*.git' */
+ if (!after_slash_or_colon)
+ end = p;
+ p += 3;
+ } else if (*p == '/' || *p == ':') {
+ /* strip leading '.*[/:]' */
+ if (end == limit)
+ end = p;
+ after_slash_or_colon = 1;
+ } else if (after_slash_or_colon) {
+ start = p;
+ end = limit;
+ after_slash_or_colon = 0;
+ }
+ }
+ return xstrndup(start, end - start);
+}
+
+static void fprintf_submodule_remote(const char *str)
+{
+ const char *p = str;
+ const char *start;
+ const char *end;
+ char *name, *url;
+
+ start = p;
+ while (*p != ' ')
+ p++;
+ end = p;
+ name = xstrndup(start, end - start);
+
+ while(*p == ' ')
+ p++;
+ start = p;
+ while (*p != ' ')
+ p++;
+ end = p;
+ url = xstrndup(start, end - start);
+
+ fprintf(stderr, " %s\t%s\n", name, url);
+ free(name);
+ free(url);
+}
+
+static void modify_remote_v(struct strbuf *sb)
+{
+ int i;
+ for (i = 0; i < sb->len; i++) {
+ const char *start = sb->buf + i;
+ const char *end = start;
+ while (sb->buf[i++] != '\n')
+ end++;
+ if (!strcmp("fetch", xstrndup(end - 6, 5)))
+ fprintf_submodule_remote(xstrndup(start, end - start - 7));
+ }
+}
+
+static int add_submodule(struct add_data *info)
+{
+ /* perhaps the path exists and is already a git repo, else clone it */
+ if (is_directory(info->sm_path)) {
+ char *sub_git_path = xstrfmt("%s/.git", info->sm_path);
+ if (is_directory(sub_git_path) || file_exists(sub_git_path))
+ printf(_("Adding existing repo at '%s' to the index\n"),
+ info->sm_path);
+ else
+ die(_("'%s' already exists and is not a valid git repo"),
+ info->sm_path);
+ free(sub_git_path);
+ } else {
+ struct strvec clone_args = STRVEC_INIT;
+ struct child_process cp = CHILD_PROCESS_INIT;
+ char *submodule_git_dir = xstrfmt(".git/modules/%s", info->sm_name);
+
+ if (is_directory(submodule_git_dir)) {
+ if (!info->force) {
+ struct child_process cp_rem = CHILD_PROCESS_INIT;
+ struct strbuf sb_rem = STRBUF_INIT;
+ cp_rem.git_cmd = 1;
+ fprintf(stderr, _("A git directory for '%s' is "
+ "found locally with remote(s):\n"),
+ info->sm_name);
+ strvec_pushf(&cp_rem.env_array,
+ "GIT_DIR=%s", submodule_git_dir);
+ strvec_push(&cp_rem.env_array, "GIT_WORK_TREE=.");
+ strvec_pushl(&cp_rem.args, "remote", "-v", NULL);
+ if (!capture_command(&cp_rem, &sb_rem, 0)) {
+ modify_remote_v(&sb_rem);
+ }
+ error(_("If you want to reuse this local git "
+ "directory instead of cloning again from\n "
+ " %s\n"
+ "use the '--force' option. If the local "
+ "git directory is not the correct repo\n"
+ "or you are unsure what this means choose "
+ "another name with the '--name' option."),
+ info->realrepo);
+ return 1;
+ } else {
+ printf(_("Reactivating local git directory for "
+ "submodule '%s'."), info->sm_path);
+ }
+ }
+ free(submodule_git_dir);
+
+ strvec_push(&clone_args, "clone");
+
+ if (info->quiet)
+ strvec_push(&clone_args, "--quiet");
+
+ if (info->progress)
+ strvec_push(&clone_args, "--progress");
+
+ if (info->prefix)
+ strvec_pushl(&clone_args, "--prefix", info->prefix, NULL);
+ strvec_pushl(&clone_args, "--path", info->sm_path, "--name",
+ info->sm_name, "--url", info->realrepo, NULL);
+ if (info->reference_path)
+ strvec_pushl(&clone_args, "--reference",
+ info->reference_path, NULL);
+ if (info->dissociate)
+ strvec_push(&clone_args, "--dissociate");
+
+ if (info->depth >= 0)
+ strvec_pushf(&clone_args, "--depth=%d", info->depth);
+
+ if (module_clone(clone_args.nr, clone_args.v, info->prefix)) {
+ strvec_clear(&clone_args);
+ return -1;
+ }
+
+ prepare_submodule_repo_env(&cp.env_array);
+ cp.git_cmd = 1;
+ cp.dir = info->sm_path;
+ strvec_pushl(&cp.args, "checkout", "-f", "-q", NULL);
+
+ if (info->branch) {
+ strvec_pushl(&cp.args, "-B", info->branch, NULL);
+ strvec_pushf(&cp.args, "origin/%s", info->branch);
+ }
+
+ if (run_command(&cp))
+ die(_("unable to checkout submodule '%s'"), info->sm_path);
+ }
+ return 0;
+}
+
+static void config_added_submodule(struct add_data *info)
+{
+ char *key, *var = NULL;
+ struct child_process cp = CHILD_PROCESS_INIT;
+
+ key = xstrfmt("submodule.%s.url", info->sm_name);
+ git_config_set_gently(key, info->realrepo);
+ free(key);
+
+ cp.git_cmd = 1;
+ strvec_pushl(&cp.args, "add", "--no-warn-embedded-repo", NULL);
+ if (info->force)
+ strvec_push(&cp.args, "--force");
+ strvec_pushl(&cp.args, "--", info->sm_path, ".gitmodules", NULL);
+
+ key = xstrfmt("submodule.%s.path", info->sm_name);
+ git_config_set_in_file_gently(".gitmodules", key, info->sm_path);
+ free(key);
+ key = xstrfmt("submodule.%s.url", info->sm_name);
+ git_config_set_in_file_gently(".gitmodules", key, info->repo);
+ free(key);
+ key = xstrfmt("submodule.%s.branch", info->sm_name);
+ if (info->branch)
+ git_config_set_in_file_gently(".gitmodules", key, info->branch);
+ free(key);
+
+ if (run_command(&cp))
+ die(_("failed to add submodule '%s'"), info->sm_path);
+
+ /*
+ * NEEDSWORK: In a multi-working-tree world, this needs to be
+ * set in the per-worktree config.
+ */
+ if (!git_config_get_string("submodule.active", &var) && var) {
+
+ /*
+ * If the submodule being adding isn't already covered by the
+ * current configured pathspec, set the submodule's active flag
+ */
+ if (!is_submodule_active(the_repository, info->sm_path)) {
+ key = xstrfmt("submodule.%s.active", info->sm_name);
+ git_config_set_gently(key, "true");
+ free(key);
+ }
+ } else {
+ key = xstrfmt("submodule.%s.active", info->sm_name);
+ git_config_set_gently(key, "true");
+ free(key);
+ }
+}
+
+static int module_add(int argc, const char **argv, const char *prefix)
+{
+ const char *branch = NULL, *custom_name = NULL, *realrepo = NULL;
+ const char *reference_path = NULL, *repo = NULL, *name = NULL;
+ char *path;
+ int force = 0, quiet = 0, depth = -1, progress = 0, dissociate = 0;
+ struct add_data info = ADD_DATA_INIT;
+ struct strbuf sb = STRBUF_INIT;
+
+ struct option options[] = {
+ OPT_STRING('b', "branch", &branch, N_("branch"),
+ N_("branch of repository to add as submodule")),
+ OPT_BOOL('f', "force", &force, N_("allow adding an otherwise "
+ "ignored submodule path")),
+ OPT__QUIET(&quiet, N_("print only error messages")),
+ OPT_BOOL(0, "progress", &progress, N_("force cloning progress")),
+ OPT_STRING(0, "reference", &reference_path, N_("repository"),
+ N_("reference repository")),
+ OPT_BOOL(0, "dissociate", &dissociate, N_("borrow the objects from reference repositories")),
+ OPT_STRING(0, "name", &custom_name, N_("name"),
+ N_("sets the submodule’s name to the given string "
+ "instead of defaulting to its path")),
+ OPT_INTEGER(0, "depth", &depth, N_("depth for shallow clones")),
+ OPT_END()
+ };
+
+ const char *const usage[] = {
+ N_("git submodule--helper add [<options>] [--] [<path>]"),
+ NULL
+ };
+
+ argc = parse_options(argc, argv, prefix, options, usage, 0);
+
+ if (!is_writing_gitmodules_ok())
+ die(_("please make sure that the .gitmodules file is in the working tree"));
+
+ if (reference_path && !is_absolute_path(reference_path) && prefix)
+ reference_path = xstrfmt("%s%s", prefix, reference_path);
+
+ if (argc == 0 || argc > 2) {
+ usage_with_options(usage, options);
+ } else if (argc == 1) {
+ repo = argv[0];
+ path = guess_dir_name(repo);
+ } else {
+ repo = argv[0];
+ path = xstrdup(argv[1]);
+ }
+
+ if (!is_absolute_path(path) && prefix)
+ path = xstrfmt("%s%s", prefix, path);
+
+ /* assure repo is absolute or relative to parent */
+ if (starts_with_dot_dot_slash(repo) || starts_with_dot_slash(repo)) {
+ char *remote = get_default_remote();
+ char *remoteurl;
+ struct strbuf sb = STRBUF_INIT;
+
+ if (prefix)
+ die(_("relative path can only be used from the toplevel "
+ "of the working tree"));
+ /* dereference source url relative to parent's url */
+ strbuf_addf(&sb, "remote.%s.url", remote);
+ if (git_config_get_string(sb.buf, &remoteurl))
+ remoteurl = xgetcwd();
+ realrepo = relative_url(remoteurl, repo, NULL);
+
+ free(remoteurl);
+ free(remote);
+ } else if (is_dir_sep(repo[0]) || strchr(repo, ':')) {
+ realrepo = repo;
+ } else {
+ die(_("repo URL: '%s' must be absolute or begin with ./|../"),
+ repo);
+ }
+
+ /*
+ * normalize path:
+ * multiple //; leading ./; /./; /../;
+ */
+ normalize_path_copy(path, path);
+ /* strip trailing '/' */
+ if (is_dir_sep(path[strlen(path) -1]))
+ path[strlen(path) - 1] = '\0';
+
+ if (!force) {
+ if (is_directory(path) && submodule_from_path(the_repository, &null_oid, path))
+ die(_("'%s' already exists in the index"), path);
+ } else {
+ int err;
+ if (index_name_pos(&the_index, path, strlen(path)) >= 0 &&
+ !is_submodule_populated_gently(path, &err))
+ die(_("'%s' already exists in the index and is not a "
+ "submodule"), path);
+ }
+
+ strbuf_addstr(&sb, path);
+ if (is_directory(path)) {
+ struct object_id oid;
+ if (resolve_gitlink_ref(path, "HEAD", &oid) < 0)
+ die(_("'%s' does not have a commit checked out"), path);
+ }
+
+ if (!force) {
+ struct strbuf sb = STRBUF_INIT;
+ struct child_process cp = CHILD_PROCESS_INIT;
+ cp.git_cmd = 1;
+ cp.no_stdout = 1;
+ strvec_pushl(&cp.args, "add", "--dry-run", "--ignore-missing",
+ "--no-warn-embedded-repo", path, NULL);
+ if (pipe_command(&cp, NULL, 0, NULL, 0, &sb, 0))
+ die(_("%s"), sb.buf);
+ strbuf_release(&sb);
+ }
+
+ name = custom_name ? custom_name : path;
+ if (check_submodule_name(name))
+ die(_("'%s' is not a valid submodule name"), name);
+
+ info.prefix = prefix;
+ info.sm_name = name;
+ info.sm_path = path;
+ info.repo = repo;
+ info.realrepo = realrepo;
+ info.reference_path = reference_path;
+ info.branch = branch;
+ info.depth = depth;
+ info.progress = !!progress;
+ info.dissociate = !!dissociate;
+ info.force = !!force;
+ info.quiet = !!quiet;
+
+ if (add_submodule(&info))
+ return 1;
+ config_added_submodule(&info);
+
+ free(path);
+
+ return 0;
+}
+
#define SUPPORT_SUPER_PREFIX (1<<0)
struct cmd_struct {
@@ -2352,6 +2722,7 @@ static struct cmd_struct commands[] = {
{"config", module_config, 0},
{"set-url", module_set_url, 0},
{"set-branch", module_set_branch, 0},
+ {"add", module_add, SUPPORT_SUPER_PREFIX},
};
int cmd_submodule__helper(int argc, const char **argv, const char *prefix)
diff --git a/git-submodule.sh b/git-submodule.sh
index 43eb6051d2..434db338a4 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -171,166 +171,7 @@ cmd_add()
shift
done
- if ! git submodule--helper config --check-writeable >/dev/null 2>&1
- then
- die "$(eval_gettext "please make sure that the .gitmodules file is in the working tree")"
- fi
-
- if test -n "$reference_path"
- then
- is_absolute_path "$reference_path" ||
- reference_path="$wt_prefix$reference_path"
-
- reference="--reference=$reference_path"
- fi
-
- repo=$1
- sm_path=$2
-
- if test -z "$sm_path"; then
- sm_path=$(printf '%s\n' "$repo" |
- sed -e 's|/$||' -e 's|:*/*\.git$||' -e 's|.*[/:]||g')
- fi
-
- if test -z "$repo" || test -z "$sm_path"; then
- usage
- fi
-
- is_absolute_path "$sm_path" || sm_path="$wt_prefix$sm_path"
-
- # assure repo is absolute or relative to parent
- case "$repo" in
- ./*|../*)
- test -z "$wt_prefix" ||
- die "$(gettext "Relative path can only be used from the toplevel of the working tree")"
-
- # dereference source url relative to parent's url
- realrepo=$(git submodule--helper resolve-relative-url "$repo") || exit
- ;;
- *:*|/*)
- # absolute url
- realrepo=$repo
- ;;
- *)
- die "$(eval_gettext "repo URL: '\$repo' must be absolute or begin with ./|../")"
- ;;
- esac
-
- # normalize path:
- # multiple //; leading ./; /./; /../; trailing /
- sm_path=$(printf '%s/\n' "$sm_path" |
- sed -e '
- s|//*|/|g
- s|^\(\./\)*||
- s|/\(\./\)*|/|g
- :start
- s|\([^/]*\)/\.\./||
- tstart
- s|/*$||
- ')
- if test -z "$force"
- then
- git ls-files --error-unmatch "$sm_path" > /dev/null 2>&1 &&
- die "$(eval_gettext "'\$sm_path' already exists in the index")"
- else
- git ls-files -s "$sm_path" | sane_grep -v "^160000" > /dev/null 2>&1 &&
- die "$(eval_gettext "'\$sm_path' already exists in the index and is not a submodule")"
- fi
-
- if test -d "$sm_path" &&
- test -z $(git -C "$sm_path" rev-parse --show-cdup 2>/dev/null)
- then
- git -C "$sm_path" rev-parse --verify -q HEAD >/dev/null ||
- die "$(eval_gettext "'\$sm_path' does not have a commit checked out")"
- fi
-
- if test -z "$force"
- then
- dryerr=$(git add --dry-run --ignore-missing --no-warn-embedded-repo "$sm_path" 2>&1 >/dev/null)
- res=$?
- if test $res -ne 0
- then
- echo >&2 "$dryerr"
- exit $res
- fi
- fi
-
- if test -n "$custom_name"
- then
- sm_name="$custom_name"
- else
- sm_name="$sm_path"
- fi
-
- if ! git submodule--helper check-name "$sm_name"
- then
- die "$(eval_gettext "'$sm_name' is not a valid submodule name")"
- fi
-
- # perhaps the path exists and is already a git repo, else clone it
- if test -e "$sm_path"
- then
- if test -d "$sm_path"/.git || test -f "$sm_path"/.git
- then
- eval_gettextln "Adding existing repo at '\$sm_path' to the index"
- else
- die "$(eval_gettext "'\$sm_path' already exists and is not a valid git repo")"
- fi
-
- else
- if test -d ".git/modules/$sm_name"
- then
- if test -z "$force"
- then
- eval_gettextln >&2 "A git directory for '\$sm_name' is found locally with remote(s):"
- GIT_DIR=".git/modules/$sm_name" GIT_WORK_TREE=. git remote -v | grep '(fetch)' | sed -e s,^," ", -e s,' (fetch)',, >&2
- die "$(eval_gettextln "\
-If you want to reuse this local git directory instead of cloning again from
- \$realrepo
-use the '--force' option. If the local git directory is not the correct repo
-or you are unsure what this means choose another name with the '--name' option.")"
- else
- eval_gettextln "Reactivating local git directory for submodule '\$sm_name'."
- fi
- fi
- git submodule--helper clone ${GIT_QUIET:+--quiet} ${progress:+"--progress"} --prefix "$wt_prefix" --path "$sm_path" --name "$sm_name" --url "$realrepo" ${reference:+"$reference"} ${dissociate:+"--dissociate"} ${depth:+"$depth"} || exit
- (
- sanitize_submodule_env
- cd "$sm_path" &&
- # ash fails to wordsplit ${branch:+-b "$branch"...}
- case "$branch" in
- '') git checkout -f -q ;;
- ?*) git checkout -f -q -B "$branch" "origin/$branch" ;;
- esac
- ) || die "$(eval_gettext "Unable to checkout submodule '\$sm_path'")"
- fi
- git config submodule."$sm_name".url "$realrepo"
-
- git add --no-warn-embedded-repo $force "$sm_path" ||
- die "$(eval_gettext "Failed to add submodule '\$sm_path'")"
-
- git submodule--helper config submodule."$sm_name".path "$sm_path" &&
- git submodule--helper config submodule."$sm_name".url "$repo" &&
- if test -n "$branch"
- then
- git submodule--helper config submodule."$sm_name".branch "$branch"
- fi &&
- git add --force .gitmodules ||
- die "$(eval_gettext "Failed to register submodule '\$sm_path'")"
-
- # NEEDSWORK: In a multi-working-tree world, this needs to be
- # set in the per-worktree config.
- if git config --get submodule.active >/dev/null
- then
- # If the submodule being adding isn't already covered by the
- # current configured pathspec, set the submodule's active flag
- if ! git submodule--helper is-active "$sm_path"
- then
- git config submodule."$sm_name".active "true"
- fi
- else
- git config submodule."$sm_name".active "true"
- fi
+ git ${wt_prefix:+-C "$wt_prefix"} ${prefix:+--super-prefix "$prefix"} submodule--helper add ${force:+--force} ${GIT_QUIET:+--quiet} ${progress:+--progress} ${branch:+--branch "$branch"} ${reference_path:+--reference "$reference_path"} ${dissociate:+--dissociate} ${custom_name:+--name "$custom_name"} ${depth:+"$depth"} -- "$@"
}
#
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index fec7e0299d..f26edddbb8 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -48,7 +48,7 @@ test_expect_success 'submodule update aborts on missing gitmodules url' '
test_expect_success 'add aborts on repository with no commits' '
cat >expect <<-\EOF &&
- '"'repo-no-commits'"' does not have a commit checked out
+ fatal: '"'repo-no-commits'"' does not have a commit checked out
EOF
git init repo-no-commits &&
test_must_fail git submodule add ../a ./repo-no-commits 2>actual &&
@@ -171,11 +171,12 @@ test_expect_success 'submodule add to .gitignored path fails' '
(
cd addtest-ignore &&
cat <<-\EOF >expect &&
- The following paths are ignored by one of your .gitignore files:
+ fatal: The following paths are ignored by one of your .gitignore files:
submod
hint: Use -f if you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"
+
EOF
# Does not use test_commit due to the ignore
echo "*" > .gitignore &&
--
2.28.0
next reply other threads:[~2020-08-24 9:05 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-24 9:03 Shourya Shukla [this message]
2020-08-24 18:35 ` [GSoC][PATCH] submodule: port submodule subcommand 'add' from shell to C Junio C Hamano
2020-08-24 20:30 ` Kaartic Sivaraam
2020-08-24 20:46 ` Junio C Hamano
2020-08-26 9:27 ` Shourya Shukla
2020-08-26 10:54 ` Kaartic Sivaraam
2020-08-26 9:15 ` Shourya Shukla
2020-08-30 19:58 ` Kaartic Sivaraam
2020-08-31 13:04 ` Shourya Shukla
2020-09-01 20:35 ` Kaartic Sivaraam
2020-09-02 12:04 ` Shourya Shukla
2020-09-03 8:46 ` Kaartic Sivaraam
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200824090359.403944-1-shouryashukla.oo@gmail.com \
--to=shouryashukla.oo@gmail.com \
--cc=chriscool@tuxfamily.org \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=johannes.schindelin@gmx.de \
--cc=kaartic.sivaraam@gmail.com \
--cc=liu.denton@gmail.com \
--cc=pc44800@gmail.com \
--cc=stefanbeller@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).