On Sat, Apr 27, 2013 at 12:13 PM, Jiang Xin <worldhello....@gmail.com> wrote:
> --- a/builtin/clean.c
> +++ b/builtin/clean.c
> @@ -257,26 +261,92 @@ int cmd_clean(int argc, const char **argv, const char 
> *prefix)
>                 }
>
>                 if (S_ISDIR(st.st_mode)) {
> -                       strbuf_addstr(&directory, ent->name);
>                         if (remove_directories || (matches == 
> MATCHED_EXACTLY)) {
> -                               if (remove_dirs(&directory, prefix, rm_flags, 
> dry_run, quiet, &gone))
> -                                       errors++;
> -                               if (gone && !quiet) {
> -                                       qname = 
> quote_path_relative(directory.buf, directory.len, &buf, prefix);
> -                                       printf(dry_run ? _(msg_would_remove) 
> : _(msg_remove), qname);
> -                               }
> +                               string_list_append(&dels, ent->name);
>                         }
> -                       strbuf_reset(&directory);
>                 } else {
>                         if (pathspec && !matches)
>                                 continue;
> -                       res = dry_run ? 0 : unlink(ent->name);
> +                       string_list_append(&dels, ent->name);
> +               }
> +       }
> +
> +       if (interactive && dels.nr > 0 && !dry_run && isatty(0) && isatty(1)) 
> {
> +               struct strbuf confirm = STRBUF_INIT;
> +
> +               while (1) {
> +                       struct strbuf **prefix_list, **prefix_list_head;
> +
> +                       /* dels list may become empty when we run 
> string_list_remove_empty_items latter */

s/latter/later/

> +                       if (!dels.nr)
> +                               break;
> +
> +                       for_each_string_list_item(item, &dels) {
> +                               qname = quote_path_relative(item->string, -1, 
> &buf, prefix);
> +                               printf(_(msg_would_remove), qname);
> +                       }
> +
> +                       printf(_("Remove (press enter to confirm or input 
> items you want to keep)? "));
> +                       strbuf_getline(&confirm, stdin, '\n');
> +                       strbuf_trim(&confirm);
> +
> +                       if (!confirm.len)
> +                               break;
> +
> +                       printf("\n");
> +
> +                       prefix_list_head = strbuf_split_buf(confirm.buf, 
> confirm.len, ' ', 0);
> +                       for (prefix_list = prefix_list_head; *prefix_list; 
> *prefix_list++)
> +                       {
> +                               int prefix_matched = 0;
> +
> +                               strbuf_trim(*prefix_list);
> +                               if (!(*prefix_list)->len)
> +                                       continue;
> +
> +                               for_each_string_list_item(item, &dels) {
> +                                       if (!strncasecmp(item->string, 
> (*prefix_list)->buf, (*prefix_list)->len)) {
> +                                               *item->string = '\0';
> +                                               prefix_matched++;
> +                                       }
> +                               }
> +                               if (!prefix_matched) {
> +                                       warning(_("Cannot find items start 
> with the given prefix: %s"), (*prefix_list)->buf);

s/start/starting/
[...or...]
s/items start with the given prefix/items prefixed by/

> +                                       printf("\n");
> +                               } else {
> +                                       string_list_remove_empty_items(&dels, 
> 0);
> +                               }
> +                       }
> +
> +                       strbuf_reset(&confirm);
> +                       strbuf_list_free(prefix_list_head);
> +               }
> +               strbuf_release(&confirm);
> +       }
> +
> +       for_each_string_list_item(item, &dels) {
> +               struct stat st;
> +
> +               if (lstat(item->string, &st))
> +                       continue;
> +
> +               if (S_ISDIR(st.st_mode)) {
> +                       strbuf_addstr(&directory, item->string);
> +                       if (remove_dirs(&directory, prefix, rm_flags, 
> dry_run, quiet, &gone))
> +                               errors++;
> +                       if (gone && !quiet) {
> +                               qname = quote_path_relative(directory.buf, 
> directory.len, &buf, prefix);
> +                               printf(dry_run ? _(msg_would_remove) : 
> _(msg_remove), qname);
> +                       }
> +                       strbuf_reset(&directory);
> +               } else {
> +                       res = dry_run ? 0 : unlink(item->string);
>                         if (res) {
> -                               qname = quote_path_relative(ent->name, -1, 
> &buf, prefix);
> +                               qname = quote_path_relative(item->string, -1, 
> &buf, prefix);
>                                 warning(_(msg_warn_remove_failed), qname);
>                                 errors++;
>                         } else if (!quiet) {
> -                               qname = quote_path_relative(ent->name, -1, 
> &buf, prefix);
> +                               qname = quote_path_relative(item->string, -1, 
> &buf, prefix);
>                                 printf(dry_run ? _(msg_would_remove) : 
> _(msg_remove), qname);
>                         }
>                 }
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to