Re: [PATCH v2] Add support for -i/--interactive to git-clean

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Apr 27, 2013 at 12:13 PM, Jiang Xin <worldhello.net@xxxxxxxxx> 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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]