Revision: 5755 http://geany.svn.sourceforge.net/geany/?rev=5755&view=rev Author: colombanw Date: 2011-05-01 14:38:57 +0000 (Sun, 01 May 2011)
Log Message: ----------- Fix pattern filtering when not searching in subdirectories
grep's --include option doesn't filter files passed explicitly to grep, so when we build the file list to search in, take the filters into account. Also drop the --include options in this case since they aren't useful.
Modified Paths: -------------- trunk/ChangeLog trunk/src/search.c
Modified: trunk/ChangeLog =================================================================== --- trunk/ChangeLog 2011-04-30 21:50:50 UTC (rev 5754) +++ trunk/ChangeLog 2011-05-01 14:38:57 UTC (rev 5755) @@ -1,3 +1,9 @@ +2011-05-01 Colomban Wendling <colomban(at)geany(dot)org> + + * src/search.c: + Fix pattern filtering when not searching in subdirectories. + + 2011-04-30 Colomban Wendling <colomban(at)geany(dot)org>
* src/project.c:
Modified: trunk/src/search.c =================================================================== --- trunk/src/search.c 2011-04-30 21:50:50 UTC (rev 5754) +++ trunk/src/search.c 2011-05-01 14:38:57 UTC (rev 5755) @@ -1642,14 +1642,27 @@ }
+static gboolean pattern_list_match(GSList *patterns, const gchar *str) +{ + GSList *item; + + foreach_slist(item, patterns) + { + if (g_pattern_match_string(item->data, str)) + return TRUE; + } + return FALSE; +} + + /* Creates an argument vector of strings, copying argv_prefix[] values for * the first arguments, then followed by filenames found in dir. * Returns NULL if no files were found, otherwise returned vector should be fully freed. */ static gchar **search_get_argv(const gchar **argv_prefix, const gchar *dir) { - guint prefix_len, list_len, i; + guint prefix_len, list_len, i, j; gchar **argv; - GSList *list, *item; + GSList *list, *item, *patterns = NULL; GError *error = NULL;
g_return_val_if_fail(dir != NULL, NULL); @@ -1667,13 +1680,40 @@
argv = g_new(gchar*, prefix_len + list_len + 1);
- for (i = 0; i < prefix_len; i++) - argv[i] = g_strdup(argv_prefix[i]); + for (i = 0, j = 0; i < prefix_len; i++) + { + if (g_str_has_prefix(argv_prefix[i], "--include=")) + { + const gchar *pat = &(argv_prefix[i][10]); /* the pattern part of the argument */
- foreach_slist(item, list) - argv[i++] = item->data; + patterns = g_slist_prepend(patterns, g_pattern_spec_new(pat)); + } + else + argv[j++] = g_strdup(argv_prefix[i]); + }
- argv[i] = NULL; + if (patterns) + { + GSList *pat; + + foreach_slist(item, list) + { + if (pattern_list_match(patterns, item->data)) + argv[j++] = item->data; + else + g_free(item->data); + } + foreach_slist(pat, patterns) + g_pattern_spec_free(pat->data); + g_slist_free(patterns); + } + else + { + foreach_slist(item, list) + argv[j++] = item->data; + } + + argv[j] = NULL; g_slist_free(list); return argv; }
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.