[gnome-builder/wip/chergert/git-oop] cache blob for query reuse



commit 71b4cdc67a1d6b9aece8f1155ee1c591fbb09f02
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]