On Tue, Aug 1, 2017 at 3:12 AM, Stefan Beller <sbel...@google.com> wrote:
> On Mon, Jul 31, 2017 at 1:56 PM, Prathamesh Chavan <pc44...@gmail.com> 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.cou...@gmail.com>
>> Mentored-by: Stefan Beller <sbel...@google.com>
>> Signed-off-by: Prathamesh Chavan <pc44...@gmail.com>
>> ---
>> 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

Reply via email to