On Tue, Aug 1, 2017 at 3:12 AM, Stefan Beller <sbeller@xxxxxxxxxx> wrote: > On Mon, Jul 31, 2017 at 1:56 PM, Prathamesh Chavan <pc44800@xxxxxxxxx> wrote: >> The same mechanism is used even for porting this submodule >> subcommand, as used in the ported subcommands till now. >> The function cmd_deinit in split up after porting into three >> functions: module_deinit(), for_each_submodule_list() and >> deinit_submodule(). >> >> Mentored-by: Christian Couder <christian.couder@xxxxxxxxx> >> Mentored-by: Stefan Beller <sbeller@xxxxxxxxxx> >> Signed-off-by: Prathamesh Chavan <pc44800@xxxxxxxxx> >> --- >> In this new version, the following changes have been made: >> * In the function deinit_submodule, since the test is_git_directory() >> adds an additional condition, instead is_directory() is used to check >> if "sm_path/.git" is a directory. > > Thanks for writing these patches. > I wonder if (some of) these notes are best put into the code > as a comment such as > > /* NEEDSWORK: convert to is_submodule_active */ > > such that people reading this code later realize that checking > for a directory may not be the "correct" thing, but a thing which > was easy to express using shell. > >> +struct deinit_cb { >> + const char *prefix; >> + unsigned int quiet: 1; >> + unsigned int force: 1; >> + unsigned int all: 1; > > The value 'all' seems to be unused, i.e. we assign it but never read it? > >> +}; >> +#define DEINIT_CB_INIT { NULL, 0, 0, 0 } >> + >> +static void deinit_submodule(const struct cache_entry *list_item, >> + void *cb_data) >> +{ >> + struct deinit_cb *info = cb_data; >> + const struct submodule *sub; >> + char *displaypath = NULL; >> + struct child_process cp_config = CHILD_PROCESS_INIT; >> + struct strbuf sb_config = STRBUF_INIT; >> + char *sub_git_dir = xstrfmt("%s/.git", list_item->name); >> + mode_t mode = 0777; >> + >> + sub = submodule_from_path(null_sha1, list_item->name); >> + >> + if (!sub || !sub->name) >> + goto cleanup; >> + >> + displaypath = get_submodule_displaypath(list_item->name, info->prefix); >> + >> + /* remove the submodule work tree (unless the user already did it) */ >> + if (is_directory(list_item->name)) { >> + struct stat st; >> + /* protect submodules containing a .git directory */ > > Here may a good place to put: > /* NEEDSWORK: automatically call absorbgitdirs before warning/die. */ > (It was not in the shell version, so feel free to ignore) > >> + if (!info->force) { >> + struct child_process cp_rm = CHILD_PROCESS_INIT; >> + cp_rm.git_cmd = 1; >> + argv_array_pushl(&cp_rm.args, "rm", "-qn", >> + list_item->name, NULL); > > A bug that exists in the shell version as well as here: > What if the submodule has the name '--cached', which happens > to be a valid argument for git-rm? > > The call to git-rm would die claiming that the <file> is missing, > as the file name was miss-interpreted as another flag. > > To solve this problem we would insert a '--' after the options, > before the file name to state that the last argument is a <file>. > > Not sure if we want to fix the bug while we're here or if we rather > want to add > > /* NEEDSWORK: add '--' to confirm <file> argument */ > IMO, I would first port the subcommand, and add an additional comment for pointing the bug out. And then later, we may have a bug-fix patch in this series of patch itself for tackling this bug out. Thanks, Prathamesh Chavan