From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jiang Xin Subject: [PATCH v10 10/14] git-clean: add filter by pattern interactive action Date: Thu, 16 May 2013 17:53:41 +0800 Message-ID: <0b37dfa57942d54f73b05675f31d90bd4dff9ab5.1368696028.git.worldhello.net@gmail.com> References: Cc: Jiang Xin To: Junio C Hamano , Eric Sunshine , Matthieu Moy , Git List X-From: git-owner@vger.kernel.org Thu May 16 11:54:45 2013 Return-path: Envelope-to: gcvg-git-2@plane.gmane.org Received: from vger.kernel.org ([209.132.180.67]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UcutY-0001AN-25 for gcvg-git-2@plane.gmane.org; Thu, 16 May 2013 11:54:44 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752076Ab3EPJyf (ORCPT ); Thu, 16 May 2013 05:54:35 -0400 Received: from mail-pa0-f51.google.com ([209.85.220.51]:34904 "EHLO mail-pa0-f51.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752042Ab3EPJyc (ORCPT ); Thu, 16 May 2013 05:54:32 -0400 Received: by mail-pa0-f51.google.com with SMTP id ld10so2350646pab.38 for ; Thu, 16 May 2013 02:54:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:in-reply-to:references; bh=cMFEnuATHGq7LM4oo6HTtBVVO2/1NqzCAxjitYsYyAI=; b=A9EzAajGrO4fSVABVCne/qkcma9ZZDW4oZ4j5ecmcHL72c6zoEBpQfJSLVoDxdc6Es iYIFgvc2LSNCTSgtXX32SdEG5yyUvUydJchArh3OYu5O0mNjkBaNE2sLu5S3pUV8Byxh GlwygknTIUPeqsTVmTxWE4JXuYOrHnI7BxrPOWNR8fJV0XxF+UTkoIc4k3MpU9YiB6FD 1sHptQlR1VTh80ZzxnsTwto7lUbVvmPLrGe5HnCfVS+dOFWaFswVXqeFNUDPuTRSk8DY 8eUXElXXaqYopH8jPljvycP/OPtAu0uitRUb0ZPns0DI5OV2IzHs7VtEc4j5XQ3hv9D9 WRFw== X-Received: by 10.68.40.131 with SMTP id x3mr43050761pbk.216.1368698072086; Thu, 16 May 2013 02:54:32 -0700 (PDT) Received: from localhost.localdomain ([114.248.153.37]) by mx.google.com with ESMTPSA id cd2sm6183092pbd.35.2013.05.16.02.54.28 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 16 May 2013 02:54:31 -0700 (PDT) X-Mailer: git-send-email 1.8.3.rc1.407.g762149a In-Reply-To: In-Reply-To: References: Sender: git-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org Archived-At: Add a new action for interactive git-clean: filter by pattern. When the user chooses this action, user can input space-separated patterns (the same syntax as gitignore), and each clean candidate that matches with one of the patterns will be excluded from cleaning. When the user feels it's OK, presses ENTER and back to the confirmation dialog. Signed-off-by: Jiang Xin Suggested-by: Junio C Hamano --- builtin/clean.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/builtin/clean.c b/builtin/clean.c index f59ed..35b9f3 100644 --- a/builtin/clean.c +++ b/builtin/clean.c @@ -607,6 +607,72 @@ static int clean_cmd(void) return MENU_RETURN_NO_LOOP; } +static int filter_by_patterns_cmd(void) +{ + struct dir_struct dir; + struct strbuf confirm = STRBUF_INIT; + struct strbuf **ignore_list; + struct string_list_item *item; + struct exclude_list *el; + int changed = -1, i; + + for (;;) { + if (!del_list.nr) + break; + + if (changed) + pretty_print_dels(); + + clean_print_color(CLEAN_COLOR_PROMPT); + printf(_("Input ignore patterns>> ")); + clean_print_color(CLEAN_COLOR_RESET); + if (strbuf_getline(&confirm, stdin, '\n') != EOF) + strbuf_trim(&confirm); + else + putchar('\n'); + + /* quit filter_by_pattern mode if press ENTER or Ctrl-D */ + if (!confirm.len) + break; + + memset(&dir, 0, sizeof(dir)); + el = add_exclude_list(&dir, EXC_CMDL, "manual exclude"); + ignore_list = strbuf_split_max(&confirm, ' ', 0); + + for (i = 0; ignore_list[i]; i++) { + strbuf_trim(ignore_list[i]); + if (!ignore_list[i]->len) + continue; + + add_exclude(ignore_list[i]->buf, "", 0, el, -(i+1)); + } + + changed = 0; + for_each_string_list_item(item, &del_list) { + int dtype = DT_UNKNOWN; + + if (is_excluded(&dir, item->string, &dtype)) { + *item->string = '\0'; + changed++; + } + } + + if (changed) { + string_list_remove_empty_items(&del_list, 0); + } else { + clean_print_color(CLEAN_COLOR_ERROR); + printf_ln(_("WARNING: Cannot find items matched by: %s"), confirm.buf); + clean_print_color(CLEAN_COLOR_RESET); + } + + strbuf_list_free(ignore_list); + clear_directory(&dir); + } + + strbuf_release(&confirm); + return 0; +} + static int quit_cmd(void) { string_list_clear(&del_list, 0); @@ -619,6 +685,7 @@ static int help_cmd(void) clean_print_color(CLEAN_COLOR_HELP); printf_ln(_( "clean - start cleaning\n" + "filter by pattern - exclude items from deletion\n" "quit - stop cleaning\n" "help - this screen\n" "? - help for prompt selection" @@ -634,6 +701,7 @@ static void interactive_main_loop(void) struct menu_stuff menu_stuff; struct menu_item menus[] = { {'c', "clean", 0, clean_cmd}, + {'f', "filter by pattern", 0, filter_by_patterns_cmd}, {'q', "quit", 0, quit_cmd}, {'h', "help", 0, help_cmd}, }; -- 1.8.3.rc1.407.g762149a