[gnome-builder/albfan/grep-filters: 1/2] grep: Add path filters to model
- From: Alberto Fanjul <albfan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/albfan/grep-filters: 1/2] grep: Add path filters to model
- Date: Wed, 11 Sep 2019 19:47:20 +0000 (UTC)
commit c8724a6d14391d2a03b01bcb94ef0fe1a5227f58
Author: Alberto Fanjul <albertofanjul gmail com>
Date: Wed Sep 11 21:46:27 2019 +0200
grep: Add path filters to model
src/plugins/grep/gbp-grep-model.c | 134 ++++++++++++++++++++++++++++++++++++++
src/plugins/grep/gbp-grep-model.h | 80 ++++++++++++-----------
2 files changed, 177 insertions(+), 37 deletions(-)
---
diff --git a/src/plugins/grep/gbp-grep-model.c b/src/plugins/grep/gbp-grep-model.c
index ef0ea9e8a..4a7c16bc9 100644
--- a/src/plugins/grep/gbp-grep-model.c
+++ b/src/plugins/grep/gbp-grep-model.c
@@ -47,6 +47,14 @@ struct _GbpGrepModel
*/
gchar *query;
+ /* The filter text, which we use to select filenames in result.
+ */
+ gchar **file_filter;
+
+ /* The filter text, which we use to ignore dirs in result.
+ */
+ gchar **ignore_filter;
+
/* We need to do client-side processing to extract the exact message
* locations after grep gives us the matching lines. This allows us to
* create IdeTextEdit source ranges later as well as creating the
@@ -93,6 +101,8 @@ enum {
PROP_RECURSIVE,
PROP_USE_REGEX,
PROP_QUERY,
+ PROP_FILE_FILTER,
+ PROP_IGNORE_FILTER,
N_PROPS
};
@@ -281,6 +291,14 @@ gbp_grep_model_get_property (GObject *object,
g_value_set_string (value, gbp_grep_model_get_query (self));
break;
+ case PROP_FILE_FILTER:
+ g_value_set_boxed (value, gbp_grep_model_get_file_filter (self));
+ break;
+
+ case PROP_IGNORE_FILTER:
+ g_value_set_boxed (value, gbp_grep_model_get_ignore_filter (self));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -320,6 +338,14 @@ gbp_grep_model_set_property (GObject *object,
gbp_grep_model_set_query (self, g_value_get_string (value));
break;
+ case PROP_FILE_FILTER:
+ gbp_grep_model_set_file_filter (self, g_value_get_boxed (value));
+ break;
+
+ case PROP_IGNORE_FILTER:
+ gbp_grep_model_set_ignore_filter (self, g_value_get_boxed (value));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
@@ -364,6 +390,14 @@ gbp_grep_model_class_init (GbpGrepModelClass *klass)
g_param_spec_string ("query", NULL, NULL, NULL,
(G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+ properties [PROP_FILE_FILTER] =
+ g_param_spec_boxed ("file-filter", NULL, NULL, G_TYPE_STRV,
+ (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
+ properties [PROP_IGNORE_FILTER] =
+ g_param_spec_boxed ("ignore-filter", NULL, NULL, G_TYPE_STRV,
+ (G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS));
+
g_object_class_install_properties (object_class, N_PROPS, properties);
line_regex = g_regex_new ("([a-zA-Z0-9\\+\\-\\.\\/_]+):(\\d+):(.*)", 0, 0, NULL);
@@ -424,6 +458,22 @@ gbp_grep_model_get_query (GbpGrepModel *self)
return self->query;
}
+const gchar * const *
+gbp_grep_model_get_file_filter (GbpGrepModel *self)
+{
+ g_return_val_if_fail (GBP_IS_GREP_MODEL (self), NULL);
+
+ return (const gchar * const *)self->file_filter;
+}
+
+const gchar * const *
+gbp_grep_model_get_ignore_filter (GbpGrepModel *self)
+{
+ g_return_val_if_fail (GBP_IS_GREP_MODEL (self), NULL);
+
+ return (const gchar * const *)self->ignore_filter;
+}
+
void
gbp_grep_model_set_query (GbpGrepModel *self,
const gchar *query)
@@ -439,6 +489,36 @@ gbp_grep_model_set_query (GbpGrepModel *self,
}
}
+void
+gbp_grep_model_set_ignore_filter (GbpGrepModel *self,
+ const gchar * const *ignore_filter)
+{
+ g_return_if_fail (GBP_IS_GREP_MODEL (self));
+
+ if (self->ignore_filter != (gchar **)ignore_filter)
+ {
+ g_strfreev (self->ignore_filter);
+ self->ignore_filter = g_strdupv ((gchar **)ignore_filter);
+ gbp_grep_model_clear_regex (self);
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_IGNORE_FILTER]);
+ }
+}
+
+void
+gbp_grep_model_set_file_filter (GbpGrepModel *self,
+ const gchar * const *file_filter)
+{
+ g_return_if_fail (GBP_IS_GREP_MODEL (self));
+
+ if (self->file_filter != (gchar **)file_filter)
+ {
+ g_strfreev (self->file_filter);
+ self->file_filter = g_strdupv ((gchar **)file_filter);
+ gbp_grep_model_clear_regex (self);
+ g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_FILE_FILTER]);
+ }
+}
+
/**
* gbp_grep_model_get_directory:
* @self: a #GbpGrepModel
@@ -573,6 +653,9 @@ gbp_grep_model_create_launcher (GbpGrepModel *self)
GFile *workdir;
GType git_vcs;
gboolean use_git_grep = FALSE;
+ gchar **file_filters;
+ gchar **ignore_filters;
+ gsize i;
g_assert (GBP_IS_GREP_MODEL (self));
g_assert (self->query != NULL);
@@ -664,6 +747,57 @@ gbp_grep_model_create_launcher (GbpGrepModel *self)
ide_subprocess_launcher_push_argv (launcher, "^.{0,256}$");
}
+ if (self->file_filter != NULL)
+ {
+ if (use_git_grep)
+ {
+ ide_subprocess_launcher_push_argv (launcher, "--");
+ }
+
+ for (i = 0; self->file_filter [i]; i++)
+ {
+ gchar *file_filter = self->file_filter [i];
+ g_autofree gchar *file_filter_pattern;
+ if (use_git_grep)
+ {
+ file_filter_pattern = g_strconcat ("*/", file_filter, NULL);
+ ide_subprocess_launcher_push_argv (launcher, file_filter_pattern);
+ }
+ else
+ {
+ file_filter_pattern = g_strdup (file_filter);
+ ide_subprocess_launcher_push_argv (launcher, "--include");
+ ide_subprocess_launcher_push_argv (launcher, file_filter);
+ }
+ }
+ }
+
+ if (self->ignore_filter != NULL)
+ {
+ if (use_git_grep && self->file_filter == NULL)
+ {
+ ide_subprocess_launcher_push_argv (launcher, "--");
+ }
+
+ for (i = 0; self->ignore_filter [i]; i++)
+ {
+ gchar *ignore_filter = self->ignore_filter [i];
+
+ g_autofree gchar *ignore_filter_pattern;
+ if (use_git_grep)
+ {
+ ignore_filter_pattern = g_strconcat (":(exclude)", ignore_filter, "/", NULL);
+ ide_subprocess_launcher_push_argv (launcher, ignore_filter_pattern);
+ }
+ else
+ {
+ ignore_filter_pattern = g_strdup (ignore_filter);
+ ide_subprocess_launcher_push_argv (launcher, "--exclude-dir");
+ ide_subprocess_launcher_push_argv (launcher, ignore_filter);
+ }
+ }
+ }
+
if (g_file_test (path, G_FILE_TEST_IS_DIR))
{
ide_subprocess_launcher_set_cwd (launcher, path);
diff --git a/src/plugins/grep/gbp-grep-model.h b/src/plugins/grep/gbp-grep-model.h
index 863934bf6..b639d441c 100644
--- a/src/plugins/grep/gbp-grep-model.h
+++ b/src/plugins/grep/gbp-grep-model.h
@@ -45,42 +45,48 @@ typedef struct
G_DECLARE_FINAL_TYPE (GbpGrepModel, gbp_grep_model, GBP, GREP_MODEL, IdeObject)
-GbpGrepModel *gbp_grep_model_new (IdeContext *context);
-GFile *gbp_grep_model_get_directory (GbpGrepModel *self);
-void gbp_grep_model_set_directory (GbpGrepModel *self,
- GFile *directory);
-gboolean gbp_grep_model_get_use_regex (GbpGrepModel *self);
-void gbp_grep_model_set_use_regex (GbpGrepModel *self,
- gboolean use_regex);
-gboolean gbp_grep_model_get_recursive (GbpGrepModel *self);
-void gbp_grep_model_set_recursive (GbpGrepModel *self,
- gboolean recursive);
-gboolean gbp_grep_model_get_case_sensitive (GbpGrepModel *self);
-void gbp_grep_model_set_case_sensitive (GbpGrepModel *self,
- gboolean case_sensitive);
-gboolean gbp_grep_model_get_at_word_boundaries (GbpGrepModel *self);
-void gbp_grep_model_set_at_word_boundaries (GbpGrepModel *self,
- gboolean at_word_boundaries);
-const gchar *gbp_grep_model_get_query (GbpGrepModel *self);
-void gbp_grep_model_set_query (GbpGrepModel *self,
- const gchar *query);
-GPtrArray *gbp_grep_model_create_edits (GbpGrepModel *self);
-void gbp_grep_model_select_all (GbpGrepModel *self);
-void gbp_grep_model_select_none (GbpGrepModel *self);
-void gbp_grep_model_toggle_mode (GbpGrepModel *self);
-void gbp_grep_model_toggle_row (GbpGrepModel *self,
- GtkTreeIter *iter);
-void gbp_grep_model_get_line (GbpGrepModel *self,
- GtkTreeIter *iter,
- const GbpGrepModelLine **line);
-GFile *gbp_grep_model_get_file (GbpGrepModel *self,
- const gchar *path);
-void gbp_grep_model_scan_async (GbpGrepModel *self,
- GCancellable *cancellable,
- GAsyncReadyCallback callback,
- gpointer user_data);
-gboolean gbp_grep_model_scan_finish (GbpGrepModel *self,
- GAsyncResult *result,
- GError **error);
+GbpGrepModel *gbp_grep_model_new (IdeContext *context);
+GFile *gbp_grep_model_get_directory (GbpGrepModel *self);
+void gbp_grep_model_set_directory (GbpGrepModel *self,
+ GFile *directory);
+gboolean gbp_grep_model_get_use_regex (GbpGrepModel *self);
+void gbp_grep_model_set_use_regex (GbpGrepModel *self,
+ gboolean use_regex);
+gboolean gbp_grep_model_get_recursive (GbpGrepModel *self);
+void gbp_grep_model_set_recursive (GbpGrepModel *self,
+ gboolean recursive);
+gboolean gbp_grep_model_get_case_sensitive (GbpGrepModel *self);
+void gbp_grep_model_set_case_sensitive (GbpGrepModel *self,
+ gboolean case_sensitive);
+gboolean gbp_grep_model_get_at_word_boundaries (GbpGrepModel *self);
+void gbp_grep_model_set_at_word_boundaries (GbpGrepModel *self,
+ gboolean at_word_boundaries);
+const gchar *gbp_grep_model_get_query (GbpGrepModel *self);
+void gbp_grep_model_set_query (GbpGrepModel *self,
+ const gchar *query);
+const gchar * const *gbp_grep_model_get_file_filter (GbpGrepModel *self);
+void gbp_grep_model_set_file_filter (GbpGrepModel *self,
+ const gchar * const *file_filter);
+const gchar * const *gbp_grep_model_get_ignore_filter (GbpGrepModel *self);
+void gbp_grep_model_set_ignore_filter (GbpGrepModel *self,
+ const gchar * const *ignore_filter);
+GPtrArray *gbp_grep_model_create_edits (GbpGrepModel *self);
+void gbp_grep_model_select_all (GbpGrepModel *self);
+void gbp_grep_model_select_none (GbpGrepModel *self);
+void gbp_grep_model_toggle_mode (GbpGrepModel *self);
+void gbp_grep_model_toggle_row (GbpGrepModel *self,
+ GtkTreeIter *iter);
+void gbp_grep_model_get_line (GbpGrepModel *self,
+ GtkTreeIter *iter,
+ const GbpGrepModelLine **line);
+GFile *gbp_grep_model_get_file (GbpGrepModel *self,
+ const gchar *path);
+void gbp_grep_model_scan_async (GbpGrepModel *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+gboolean gbp_grep_model_scan_finish (GbpGrepModel *self,
+ GAsyncResult *result,
+ GError **error);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]