static gboolean ide_git_vcs_load_monitor (IdeGitVcs *self, GError **error) { gboolean ret = TRUE; g_assert (IDE_IS_GIT_VCS (self)); if (self->monitor == NULL) { g_autoptr(GFile) location = NULL; g_autoptr(GFileMonitor) monitor = NULL; g_autoptr(GFile) heads_dir = NULL; GFileMonitorFlags flags = G_FILE_MONITOR_WATCH_MOUNTS; location = ggit_repository_get_location (self->repository); heads_dir = g_file_get_child (location, "refs/heads"); monitor = g_file_monitor (heads_dir, flags, NULL, error); ret = !!monitor; if (monitor) { IDE_TRACE_MSG ("Git index monitor registered."); g_signal_connect_object (monitor, "changed", G_CALLBACK (ide_git_vcs__monitor_changed_cb), self, G_CONNECT_SWAPPED); self->monitor = g_object_ref (monitor); } } return ret; }
static void ide_git_vcs_list_status_async (IdeVcs *vcs, GFile *directory_or_file, gboolean include_descendants, gint io_priority, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data) { IdeGitVcs *self = (IdeGitVcs *)vcs; g_autoptr(GTask) task = NULL; ListStatus *state; IDE_ENTRY; g_return_if_fail (IDE_IS_GIT_VCS (self)); g_return_if_fail (!directory_or_file || G_IS_FILE (directory_or_file)); g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable)); g_mutex_lock (&self->repository_mutex); state = g_slice_new0 (ListStatus); state->directory_or_file = g_object_ref (directory_or_file); state->repository_location = ggit_repository_get_location (self->repository); state->recursive = !!include_descendants; g_mutex_unlock (&self->repository_mutex); task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, ide_git_vcs_list_status_async); g_task_set_priority (task, io_priority); g_task_set_return_on_cancel (task, TRUE); g_task_set_task_data (task, state, list_status_free); if (state->repository_location == NULL) g_task_return_new_error (task, G_IO_ERROR, G_IO_ERROR_FAILED, "No repository loaded"); else g_task_run_in_thread (task, ide_git_vcs_list_status_worker); IDE_EXIT; }
static gboolean ide_git_vcs_load_monitor_locked (IdeGitVcs *self, GError **error) { gboolean ret = TRUE; g_assert (IDE_IS_GIT_VCS (self)); if (self->monitor == NULL) { g_autoptr(GFile) location = NULL; g_autoptr(GFileMonitor) monitor = NULL; GError *local_error = NULL; location = ggit_repository_get_location (self->repository); monitor = g_file_monitor_directory (location, G_FILE_MONITOR_NONE, NULL, &local_error); if (monitor == NULL) { g_warning ("Failed to establish git monitor: %s", local_error->message); g_propagate_error (error, local_error); ret = FALSE; } else { IDE_TRACE_MSG ("Git index monitor registered."); g_signal_connect_object (monitor, "changed", G_CALLBACK (ide_git_vcs__monitor_changed_cb), self, G_CONNECT_SWAPPED); self->monitor = g_steal_pointer (&monitor); } } return ret; }