Changes since v2:
* Mention the small overhead introduced in [2/8] in the commit message.
* Attempt a more descriptive name for the libified dir helper. Add a docstring
to explain it as well.
* Combine the "unconstification of sm_path" patch into the next one.
Atharva Raykar (8):
submodule--helper: add options for compute_submodule_clone_url()
submodule--helper: refactor resolve_relative_url() helper
submodule--helper: remove repeated code in sync_submodule()
dir: libify and export helper functions from clone.c
submodule--helper: convert the bulk of cmd_add() to C
submodule--helper: remove add-clone subcommand
submodule--helper: remove add-config subcommand
submodule--helper: remove resolve-relative-url subcommand
builtin/clone.c | 118 +-------------
builtin/submodule--helper.c | 307 +++++++++++++++++++-----------------
dir.c | 114 +++++++++++++
dir.h | 11 ++
git-submodule.sh | 96 +----------
5 files changed, 291 insertions(+), 355 deletions(-)
Range-diff against v2:
-: ---------- > 1: 75edf24186 submodule--helper: add options for compute_submodule_clone_url()
-: ---------- > 2: 8e7a3e727a submodule--helper: refactor resolve_relative_url() helper
1: d8ee0bc450 ! 3: 82961ddd02 submodule--helper: remove repeated code in sync_submodule()
@@ Commit message
This part of `sync_submodule()` is doing the same thing that
`compute_submodule_clone_url()` is doing. Let's reuse that helper here.
+ Note that this change adds a small overhead where we allocate and free
+ the 'remote' twice, but that is a small price to pay for the higher
+ level of abstraction we get.
+
Signed-off-by: Atharva Raykar <raykar.ath@gmail.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Shourya Shukla <periperidip@gmail.com>
2: 6ac470d86f ! 4: 99d139375d dir: libify and export helper functions from clone.c
@@ Commit message
Signed-off-by: Atharva Raykar <raykar.ath@gmail.com>
Mentored-by: Christian Couder <christian.couder@gmail.com>
- Mentored-by: Shourya Shukla <shouryashukla.oo@gmail.com>
+ Mentored-by: Shourya Shukla <periperidip@gmail.com>
## builtin/clone.c ##
@@ builtin/clone.c: static char *get_repo_path(const char *repo, int *is_bundle)
@@ builtin/clone.c: int cmd_clone(int argc, const char **argv, const char *prefix)
else
- dir = guess_dir_name(repo_name, is_bundle, option_bare);
- strip_trailing_slashes(dir);
-+ dir = guess_dir_name_from_git_url(repo_name, is_bundle, option_bare);
++ dir = guess_target_dir_from_git_url(repo_name, is_bundle, option_bare);
+ strip_dir_trailing_slashes(dir);
dest_exists = path_exists(dir);
@@ dir.c: int is_empty_dir(const char *path)
return ret;
}
-+char *guess_dir_name_from_git_url(const char *repo, int is_bundle, int is_bare)
++char *guess_target_dir_from_git_url(const char *repo, int is_bundle, int is_bare)
+{
+ const char *end = repo + strlen(repo), *start, *ptr;
+ size_t len;
@@ dir.h: static inline int is_dot_or_dotdot(const char *name)
int is_empty_dir(const char *dir);
-+char *guess_dir_name_from_git_url(const char *repo, int is_bundle, int is_bare);
++/*
++ * Retrieve a target directory name by reading "humanish" part of the
++ * given Git URL.
++ *
++ * For example:
++ * /path/to/repo.git => "repo"
++ * host.xz.foo/.git => "foo"
++ */
++char *guess_target_dir_from_git_url(const char *repo, int is_bundle, int is_bare);
+void strip_dir_trailing_slashes(char *dir);
+
void setup_standard_excludes(struct dir_struct *dir);
3: c0b264a4e8 < -: ---------- submodule--helper: remove constness of sm_path
4: f61124327f ! 5: 11eea777ba submodule--helper: convert the bulk of cmd_add() to C
@@ Commit message
Introduce the 'add' subcommand to `submodule--helper.c` that does all
the work 'submodule add' past the parsing of flags.
+ We also remove the constness of the sm_path field of the `add_data`
+ struct. This is needed so that it can be modified by
+ normalize_path_copy().
+
As with the previous conversions, this is meant to be a faithful
conversion with no modification to the behaviour of `submodule add`.
@@ Commit message
Based-on-patch-by: Prathamesh Chavan <pc44800@gmail.com>
## builtin/submodule--helper.c ##
+@@ builtin/submodule--helper.c: struct add_data {
+ const char *prefix;
+ const char *branch;
+ const char *reference_path;
+- const char *sm_path;
++ char *sm_path;
+ const char *sm_name;
+ const char *repo;
+ const char *realrepo;
@@ builtin/submodule--helper.c: static int add_config(int argc, const char **argv, const char *prefix)
return 0;
}
@@ builtin/submodule--helper.c: static int add_config(int argc, const char **argv,
+
+ add_data.repo = argv[0];
+ if (argc == 1)
-+ add_data.sm_path = guess_dir_name_from_git_url(add_data.repo, 0, 0);
++ add_data.sm_path = guess_target_dir_from_git_url(add_data.repo, 0, 0);
+ else
+ add_data.sm_path = xstrdup(argv[1]);
+
@@ builtin/submodule--helper.c: static int add_config(int argc, const char **argv,
+ if ((exit_code = pipe_command(&cp, NULL, 0, NULL, 0, &sb, 0))) {
+ strbuf_complete_line(&sb);
+ fputs(sb.buf, stderr);
++ free(add_data.sm_path);
+ return exit_code;
+ }
+ strbuf_release(&sb);
@@ builtin/submodule--helper.c: static int add_config(int argc, const char **argv,
+ add_data.progress = !!progress;
+ add_data.dissociate = !!dissociate;
+
-+ if (add_submodule(&add_data))
++ if (add_submodule(&add_data)) {
++ free(add_data.sm_path);
+ return 1;
++ }
+ configure_added_submodule(&add_data);
+ free(add_data.sm_path);
+
5: 0c37bf84c3 = 6: 51393cd99b submodule--helper: remove add-clone subcommand
6: d7e0db2565 = 7: 50cedcd8a8 submodule--helper: remove add-config subcommand
7: 6dd7cb1e18 = 8: 02558da532 submodule--helper: remove resolve-relative-url subcommand