From dbbd8a7cdc05f7406e65adbbc704b569983bd424 Mon Sep 17 00:00:00 2001 From: Slava Zanko Date: Tue, 24 Feb 2015 17:16:48 +0300 Subject: [PATCH 1/3] Ticket #3235: copy files dosn't work as expected, when copying to a directory with the special symbol in its name Add new test which covers current functionality of 'is_wildcarded' function. Signed-off-by: Slava Zanko --- src/filemanager/filegui.c | 2 +- tests/src/filemanager/Makefile.am | 6 +- tests/src/filemanager/filegui_is_wildcarded.c | 159 ++++++++++++++++++ 3 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 tests/src/filemanager/filegui_is_wildcarded.c diff --git a/src/filemanager/filegui.c b/src/filemanager/filegui.c index 57af8280e..1254174d6 100644 --- a/src/filemanager/filegui.c +++ b/src/filemanager/filegui.c @@ -610,7 +610,7 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode) /* --------------------------------------------------------------------------------------------- */ static gboolean -is_wildcarded (char *p) +is_wildcarded (const char *p) { for (; *p; p++) { diff --git a/tests/src/filemanager/Makefile.am b/tests/src/filemanager/Makefile.am index 0629d39bd..822ba8b10 100644 --- a/tests/src/filemanager/Makefile.am +++ b/tests/src/filemanager/Makefile.am @@ -19,10 +19,11 @@ endif EXTRA_DIST = hints/mc.hint TESTS = \ + cmd__get_random_hint \ do_cd_command \ examine_cd \ exec_get_export_variables_ext \ - cmd__get_random_hint + filegui_is_wildcarded check_PROGRAMS = $(TESTS) @@ -37,3 +38,6 @@ exec_get_export_variables_ext_SOURCES = \ cmd__get_random_hint_SOURCES = \ cmd__get_random_hint.c + +filegui_is_wildcarded_SOURCES = \ + filegui_is_wildcarded.c diff --git a/tests/src/filemanager/filegui_is_wildcarded.c b/tests/src/filemanager/filegui_is_wildcarded.c new file mode 100644 index 000000000..fd3d33a61 --- /dev/null +++ b/tests/src/filemanager/filegui_is_wildcarded.c @@ -0,0 +1,159 @@ +/* + src/filemanager - tests for is_wildcarded() function + + Copyright (C) 2011-2014 + Free Software Foundation, Inc. + + Written by: + Slava Zanko , 2015 + + This file is part of the Midnight Commander. + + The Midnight Commander is free software: you can redistribute it + and/or modify it under the terms of the GNU General Public License as + published by the Free Software Foundation, either version 3 of the License, + or (at your option) any later version. + + The Midnight Commander is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +#define TEST_SUITE_NAME "/src/filemanager" + +#include "tests/mctest.h" + +#include "src/vfs/local/local.c" + +#include "src/filemanager/filegui.c" + + +/* --------------------------------------------------------------------------------------------- */ + +/* @Before */ +static void +setup (void) +{ + str_init_strings (NULL); + + vfs_init (); + init_localfs (); + vfs_setup_work_dir (); +} + +/* --------------------------------------------------------------------------------------------- */ + +/* @After */ +static void +teardown (void) +{ + vfs_shut (); + str_uninit_strings (); +} + +/* --------------------------------------------------------------------------------------------- */ + +/* @DataSource("test_is_wildcarded_ds") */ +/* *INDENT-OFF* */ +static const struct test_is_wildcarded_ds +{ + const char *input_value; + gboolean expected_result; +} test_is_wildcarded_ds[] = +{ + { + "blabla", + FALSE + }, + { + "bla?bla", + FALSE + }, + { + "bla*bla", + TRUE + }, + { + "bla\\*bla", + TRUE + }, + + { + "bla\\\\*bla", + TRUE + }, + { + "bla\\1bla", + TRUE + }, + { + "bla\\\\1bla", + TRUE + }, + { + "bla\\\t\\\\1bla", + TRUE + }, + { + "bla\\\t\\\\\\1bla", + TRUE + }, + { + "bla\\9bla", + TRUE + }, + { + "blabla\\", + FALSE + }, +}; +/* *INDENT-ON* */ + +/* @Test(dataSource = "test_is_wildcarded_ds") */ +/* *INDENT-OFF* */ +START_PARAMETRIZED_TEST (test_is_wildcarded, test_is_wildcarded_ds) +/* *INDENT-ON* */ +{ + /* given */ + gboolean actual_result; + + /* when */ + actual_result = is_wildcarded (data->input_value); + /* then */ + mctest_assert_int_eq (actual_result, data->expected_result); +} +/* *INDENT-OFF* */ +END_PARAMETRIZED_TEST +/* *INDENT-ON* */ + +/* --------------------------------------------------------------------------------------------- */ + +int +main (void) +{ + int number_failed; + + Suite *s = suite_create (TEST_SUITE_NAME); + TCase *tc_core = tcase_create ("Core"); + SRunner *sr; + + tcase_add_checked_fixture (tc_core, setup, teardown); + + /* Add new tests here: *************** */ + mctest_add_parameterized_test (tc_core, test_is_wildcarded, test_is_wildcarded_ds); + /* *********************************** */ + + suite_add_tcase (s, tc_core); + sr = srunner_create (s); + srunner_set_log (sr, "filegui_is_wildcarded.log"); + srunner_run_all (sr, CK_NORMAL); + number_failed = srunner_ntests_failed (sr); + srunner_free (sr); + return (number_failed == 0) ? 0 : 1; +} + +/* --------------------------------------------------------------------------------------------- */ From ec0dd74248a8c3a36479ac0a297f32905af2342d Mon Sep 17 00:00:00 2001 From: Boris Savelev Date: Wed, 25 Feb 2015 12:01:22 +0300 Subject: [PATCH 2/3] Fix for issue: When copying to directory with a name containing special symbol "*" the copy command didn't do it in a right way. Signed-off-by: Slava Zanko --- src/filemanager/filegui.c | 17 ++++++++--- tests/src/filemanager/filegui_is_wildcarded.c | 28 +++++++++---------- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/filemanager/filegui.c b/src/filemanager/filegui.c index 1254174d6..b377b4719 100644 --- a/src/filemanager/filegui.c +++ b/src/filemanager/filegui.c @@ -612,12 +612,21 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode) static gboolean is_wildcarded (const char *p) { + int escaped = 0; for (; *p; p++) { - if (*p == '*') - return TRUE; - if (*p == '\\' && p[1] >= '1' && p[1] <= '9') - return TRUE; + if (*p == '\\') + { + if (p[1] >= '1' && p[1] <= '9' && !escaped) + return TRUE; + escaped = !escaped; + } + else + { + if (*p == '*' && !escaped) + return TRUE; + escaped = 0; + } } return FALSE; } diff --git a/tests/src/filemanager/filegui_is_wildcarded.c b/tests/src/filemanager/filegui_is_wildcarded.c index fd3d33a61..202695f78 100644 --- a/tests/src/filemanager/filegui_is_wildcarded.c +++ b/tests/src/filemanager/filegui_is_wildcarded.c @@ -65,48 +65,48 @@ static const struct test_is_wildcarded_ds gboolean expected_result; } test_is_wildcarded_ds[] = { - { + { /* 0 */ "blabla", FALSE }, - { + { /* 1 */ "bla?bla", FALSE }, - { + { /* 2 */ "bla*bla", TRUE }, - { + { /* 3 */ "bla\\*bla", - TRUE + FALSE }, - { + { /* 4 */ "bla\\\\*bla", TRUE }, - { + { /* 5 */ "bla\\1bla", TRUE }, - { + { /* 6 */ "bla\\\\1bla", - TRUE + FALSE }, - { + { /* 7 */ "bla\\\t\\\\1bla", - TRUE + FALSE }, - { + { /* 8 */ "bla\\\t\\\\\\1bla", TRUE }, - { + { /* 9 */ "bla\\9bla", TRUE }, - { + { /* 10 */ "blabla\\", FALSE }, From 4d2cefa81e316f915d641b46eada4d5a08c82a7e Mon Sep 17 00:00:00 2001 From: Slava Zanko Date: Wed, 25 Feb 2015 12:56:34 +0300 Subject: [PATCH 3/3] Add '?' sign as a possible mark of wildcard. Signed-off-by: Slava Zanko --- src/filemanager/filegui.c | 6 +++--- tests/src/filemanager/filegui_is_wildcarded.c | 10 +++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/filemanager/filegui.c b/src/filemanager/filegui.c index b377b4719..26ecbfe83 100644 --- a/src/filemanager/filegui.c +++ b/src/filemanager/filegui.c @@ -612,7 +612,7 @@ overwrite_query_dialog (file_op_context_t * ctx, enum OperationMode mode) static gboolean is_wildcarded (const char *p) { - int escaped = 0; + gboolean escaped = FALSE; for (; *p; p++) { if (*p == '\\') @@ -623,9 +623,9 @@ is_wildcarded (const char *p) } else { - if (*p == '*' && !escaped) + if ((*p == '*' || *p == '?') && !escaped) return TRUE; - escaped = 0; + escaped = FALSE; } } return FALSE; diff --git a/tests/src/filemanager/filegui_is_wildcarded.c b/tests/src/filemanager/filegui_is_wildcarded.c index 202695f78..95c684181 100644 --- a/tests/src/filemanager/filegui_is_wildcarded.c +++ b/tests/src/filemanager/filegui_is_wildcarded.c @@ -71,7 +71,7 @@ static const struct test_is_wildcarded_ds }, { /* 1 */ "bla?bla", - FALSE + TRUE }, { /* 2 */ "bla*bla", @@ -110,6 +110,14 @@ static const struct test_is_wildcarded_ds "blabla\\", FALSE }, + { /* 11 */ + "blab\\?la", + FALSE + }, + { /* 12 */ + "blab\\\\?la", + TRUE + }, }; /* *INDENT-ON* */