Thread (2 messages) 2 messages, 2 authors, 2017-05-18

Re: [PATCH v3 6/8] clean: teach clean -d to skip dirs containing ignored files

From: Samuel Lijin <hidden>
Date: 2017-05-18 06:33:13

On Wed, May 17, 2017 at 10:34 PM, Junio C Hamano [off-list ref] wrote:
Samuel Lijin [off-list ref] writes:
quoted
@@ -932,7 +935,7 @@ int cmd_clean(int argc, const char **argv, const char *prefix)

      fill_directory(&dir, &pathspec);

-     for (i = 0; i < dir.nr; i++) {
+     for (k = i = 0; i < dir.nr; i++) {
              struct dir_entry *ent = dir.entries[i];
              int matches = 0;
              struct stat st;
@@ -954,10 +957,35 @@ int cmd_clean(int argc, const char **argv, const char *prefix)
                  matches != MATCHED_EXACTLY)
                      continue;

+             // skip any dir.entries which contains a dir.ignored
+             for (; k < dir.ignored_nr; k++) {
+                     if (cmp_dir_entry(&dir.entries[i],
+                                             &dir.ignored[k]) < 0)
+                             break;
It is a bit unfortunate that we do not use the short-hand "ent" we
established for dir.entries[i] at the beginning of this loop here.
quoted
+             }
+             if ((k < dir.ignored_nr) &&
+                             check_dir_entry_contains(dir.entries[i], dir.ignored[k])) {
+                     continue;
+             }
The above logic is not needed when dir.entries[i] is a directory,
right?
Au contraire - this logic only matters when dir.entries[i] is a directory.
quoted
+
+             // current entry does not contain any ignored files
... or the entry may not have been a directory in the first place.
If it's not a directory, it can't contain ignored files ;)
quoted
              rel = relative_path(ent->name, prefix, &buf);
              string_list_append(&del_list, rel);
+
+             // skip untracked contents of an untracked dir
+             for (j = i + 1;
+                      j < dir.nr &&
+                          check_dir_entry_contains(dir.entries[i], dir.entries[j]);
+                      j++);
+             i = j - 1;
      }

+     for (i = 0; i < dir.nr; i++)
+             free(dir.entries[i]);
+
+     for (i = 0; i < dir.ignored_nr; i++)
+             free(dir.ignored[i]);
+
The above logic may not be incorrect per-se, but I have this
suspicion that the resulting code may become cleaner and easier to
understand if we did it in a new separate loop we call immediately
after fill_directory() returns.  Or it could even be a call to a
helper that "post processes" the "dir" thing that was polupated by
fill_directory() that removes elements in the entries[] array that
contains any element in ignored[] array.
Will try it out.
quoted
      if (interactive && del_list.nr > 0)
              interactive_main_loop();
Thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help