Thread (25 messages) flat view 25 messages, 3 authors, 2017-08-05

Re: [GSoC][PATCH 06/13] submodule: port submodule subcommand 'deinit' from shell to C

From: Prathamesh Chavan <hidden>
Date: 2017-08-01 21:19:25

On Tue, Aug 1, 2017 at 3:12 AM, Stefan Beller [off-list ref] wrote:
On Mon, Jul 31, 2017 at 1:56 PM, Prathamesh Chavan [off-list ref] wrote:
quoted
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 [off-list ref]
Mentored-by: Stefan Beller [off-list ref]
Signed-off-by: Prathamesh Chavan <redacted>
---
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.
quoted
+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?
quoted
+};
+#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)
quoted
+               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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help