[gnome-builder/wip/chergert/git-oop: 29/34] cache blob for query reuse
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/chergert/git-oop: 29/34] cache blob for query reuse
- Date: Sat, 23 Mar 2019 00:12:05 +0000 (UTC)
commit 95ea5b173232893548d629f62f2ac98fbf5357c5
Author: Christian Hergert <chergert redhat com>
Date: Thu Mar 21 18:21:47 2019 -0700
cache blob for query reuse
src/plugins/git/gbp-git.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
---
diff --git a/src/plugins/git/gbp-git.c b/src/plugins/git/gbp-git.c
index 195714a68..43a150b75 100644
--- a/src/plugins/git/gbp-git.c
+++ b/src/plugins/git/gbp-git.c
@@ -30,9 +30,19 @@
struct _GbpGit
{
GObject parent_instance;
+
+ /* Mutex for field access */
GMutex mutex;
+
+ /* Working directory as set by peer */
GFile *workdir;
+
+ /* Repository we've opened from initialize call */
GgitRepository *repository;
+
+ /* Cached blob so that we can avoid re-looking up file data */
+ gchar *last_blob_path;
+ GgitBlob *last_blob;
};
G_DEFINE_TYPE (GbpGit, gbp_git, G_TYPE_OBJECT)
@@ -44,6 +54,8 @@ gbp_git_finalize (GObject *object)
g_clear_object (&self->workdir);
g_clear_object (&self->repository);
+ g_clear_object (&self->last_blob);
+ g_clear_pointer (&self->last_blob_path, g_free);
g_mutex_clear (&self->mutex);
G_OBJECT_CLASS (gbp_git_parent_class)->finalize (object);
@@ -1042,6 +1054,13 @@ gbp_git_get_changes_worker (GTask *task,
return;
}
+ if (self->last_blob != NULL &&
+ g_strcmp0 (self->last_blob_path, state->path) == 0)
+ {
+ blob = g_object_ref (GGIT_OBJECT (self->last_blob));
+ goto reuse_blob;
+ }
+
if (!(head = ggit_repository_get_head (self->repository, &error)) ||
!(oid = ggit_ref_get_target (head)) ||
!(commit = ggit_repository_lookup (self->repository, oid, GGIT_TYPE_COMMIT, &error)) ||
@@ -1051,6 +1070,8 @@ gbp_git_get_changes_worker (GTask *task,
!(blob = ggit_repository_lookup (self->repository, entry_oid, GGIT_TYPE_BLOB, &error)))
goto cleanup;
+reuse_blob:
+
contents = g_bytes_get_data (state->bytes, &len);
g_assert (GGIT_IS_BLOB (blob));
@@ -1072,6 +1093,12 @@ gbp_git_get_changes_worker (GTask *task,
ranges,
&error);
+ if (g_set_object (&self->last_blob, GGIT_BLOB (blob)))
+ {
+ g_clear_pointer (&self->last_blob_path, g_free);
+ self->last_blob_path = g_strdup (state->path);
+ }
+
if (error != NULL)
goto cleanup;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]