Re: [PATCH v2] Add support for -i/--interactive to git-clean
- From
Eric Sunshine <sunshine@sunshineco.com>
- Date
- Apr 28, 2013, 02:03 UTC
- Message-ID
- <CAPig+cTRqB7pGcxmW_m=AGT_nRWxgR+X8z6FR3PgONJ-0kG2fA@mail.gmail.com>
- In-Reply-To
- <2a68239bfd3e6b9ea1842dd8e468ee3d3217af5b.1367079089.git.worldhello.net@gmail.com>
On Sat, Apr 27, 2013 at 12:13 PM, Jiang Xin <worldhello.net@gmail.com> wrote:
Show 32 quoted lines
> --- 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/
Show 34 quoted lines
> + 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/
Show 40 quoted lines
> + 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);
> }
> }