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@xxxxxxxxx> Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> Mentored-by: Shourya Shukla <periperidip@xxxxxxxxx> 2: 6ac470d86f ! 4: 99d139375d dir: libify and export helper functions from clone.c @@ Commit message Signed-off-by: Atharva Raykar <raykar.ath@xxxxxxxxx> Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> - Mentored-by: Shourya Shukla <shouryashukla.oo@xxxxxxxxx> + Mentored-by: Shourya Shukla <periperidip@xxxxxxxxx> ## 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@xxxxxxxxx> ## 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 -- 2.32.0