[gnome-builder/wip/gtk4-port: 1253/1774] libide/vcs: add validation and clone funcs
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port: 1253/1774] libide/vcs: add validation and clone funcs
- Date: Mon, 11 Jul 2022 22:31:40 +0000 (UTC)
commit 18db068ebd23d56af0be7c413eb98b805a2626bd
Author: Christian Hergert <chergert redhat com>
Date: Tue May 31 23:13:57 2022 -0700
libide/vcs: add validation and clone funcs
I'm really starting to think we need a generic "IdeInputForm" base class
which you can add fields and validators too with GtkBuilder. Then we could
add IdeValidate* types as children to the fields.
Anyway, just a thought which might make binding things to views easier.
src/libide/vcs/ide-vcs-clone-request.c | 133 ++++++++++++++++++++++++++++++++-
src/libide/vcs/ide-vcs-clone-request.h | 55 ++++++++------
2 files changed, 161 insertions(+), 27 deletions(-)
---
diff --git a/src/libide/vcs/ide-vcs-clone-request.c b/src/libide/vcs/ide-vcs-clone-request.c
index 4fc3e1463..5e2bc67a8 100644
--- a/src/libide/vcs/ide-vcs-clone-request.c
+++ b/src/libide/vcs/ide-vcs-clone-request.c
@@ -23,6 +23,7 @@
#include "config.h"
#include <libide-plugins.h>
+#include <libide-threading.h>
#include "ide-vcs-cloner.h"
#include "ide-vcs-clone-request.h"
@@ -543,13 +544,17 @@ ide_vcs_clone_request_validate (IdeVcsCloneRequest *self)
{
const char *path;
- if ((path = ide_vcs_uri_get_path (uri)))
+ if ((path = ide_vcs_uri_get_path (uri)) && !ide_str_empty0 (path))
{
g_autofree char *name = ide_vcs_cloner_get_directory_name (self->cloner, uri);
- g_autoptr(GFile) new_directory = g_file_get_child (self->directory, name);
- if (g_file_query_exists (new_directory, NULL))
- flags |= IDE_VCS_CLONE_REQUEST_INVAL_DIRECTORY;
+ if (!ide_str_empty0 (name))
+ {
+ g_autoptr(GFile) new_directory = g_file_get_child (self->directory, name);
+
+ if (g_file_query_exists (new_directory, NULL))
+ flags |= IDE_VCS_CLONE_REQUEST_INVAL_DIRECTORY;
+ }
}
}
@@ -560,3 +565,123 @@ ide_vcs_clone_request_validate (IdeVcsCloneRequest *self)
return flags;
}
+
+static void
+ide_vcs_clone_request_clone_cb (GObject *object,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ IdeVcsCloner *cloner = (IdeVcsCloner *)object;
+ g_autoptr(IdeTask) task = user_data;
+ g_autoptr(GError) error = NULL;
+ GFile *file;
+
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_VCS_CLONER (cloner));
+ g_assert (G_IS_ASYNC_RESULT (result));
+ g_assert (IDE_IS_TASK (task));
+
+ file = ide_task_get_task_data (task);
+ g_assert (G_IS_FILE (file));
+
+ if (!ide_vcs_cloner_clone_finish (cloner, result, &error))
+ ide_task_return_error (task, g_steal_pointer (&error));
+ else
+ ide_task_return_pointer (task, g_object_ref (file), g_object_unref);
+
+ IDE_EXIT;
+}
+
+void
+ide_vcs_clone_request_clone_async (IdeVcsCloneRequest *self,
+ IdeNotification *notif,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_autoptr(IdeTask) task = NULL;
+ g_autoptr(IdeVcsUri) uri = NULL;
+ g_autoptr(GFile) clone_dir = NULL;
+ g_autofree char *name = NULL;
+ GVariantDict params;
+ const char *uri_str;
+ const char *author_name;
+
+ IDE_ENTRY;
+
+ g_return_if_fail (IDE_IS_VCS_CLONE_REQUEST (self));
+ g_return_if_fail (IDE_IS_NOTIFICATION (notif));
+ g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+ task = ide_task_new (self, cancellable, callback, user_data);
+ ide_task_set_source_tag (task, ide_vcs_clone_request_clone_async);
+
+ if (ide_vcs_clone_request_validate (self) != 0)
+ {
+ ide_task_return_new_error (task,
+ G_IO_ERROR,
+ G_IO_ERROR_INVALID_ARGUMENT,
+ "Cannot clone, invalid arguments for request");
+ IDE_EXIT;
+ }
+
+ author_name = ide_vcs_clone_request_get_author_name (self);
+
+ uri_str = ide_vcs_clone_request_get_uri (self);
+ uri = ide_vcs_uri_new (uri_str);
+ name = ide_vcs_cloner_get_directory_name (self->cloner, uri);
+ clone_dir = g_file_get_child (self->directory, name);
+ ide_task_set_task_data (task, g_object_ref (clone_dir), g_object_unref);
+
+ g_variant_dict_init (¶ms, NULL);
+ if (!ide_str_empty0 (author_name) &&
+ !ide_str_equal0 (author_name, g_get_real_name ()))
+ g_variant_dict_insert (¶ms, "s", "user.name", author_name);
+ if (!ide_str_empty0 (self->author_email))
+ g_variant_dict_insert (¶ms, "s", "user.email", self->author_email);
+ if (!ide_str_empty0 (self->branch_name))
+ g_variant_dict_insert (¶ms, "s", "branch", self->branch_name);
+
+ ide_vcs_cloner_clone_async (self->cloner,
+ uri_str,
+ g_file_peek_path (clone_dir),
+ g_variant_dict_end (¶ms),
+ notif,
+ cancellable,
+ ide_vcs_clone_request_clone_cb,
+ g_steal_pointer (&task));
+
+ IDE_EXIT;
+}
+
+/**
+ * ide_vcs_clone_request_clone_finish:
+ * @self: a #IdeVcsCloneRequest
+ * @result: a #GAsyncResult
+ * @error: a location for a #GError
+ *
+ * Complete a clone request.
+ *
+ * The result of the request is the directory that the clone was
+ * completed within. This is the subdirectory within
+ * #IdeVcsCloneRequest:directory.
+ *
+ * Returns: (transfer full): a #GFile or %NULL and @error is set.
+ */
+GFile *
+ide_vcs_clone_request_clone_finish (IdeVcsCloneRequest *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ GFile *ret;
+
+ IDE_ENTRY;
+
+ g_return_val_if_fail (IDE_IS_VCS_CLONE_REQUEST (self), NULL);
+ g_return_val_if_fail (IDE_IS_TASK (result), NULL);
+
+ ret = ide_task_propagate_pointer (IDE_TASK (result), error);
+
+ IDE_RETURN (ret);
+}
diff --git a/src/libide/vcs/ide-vcs-clone-request.h b/src/libide/vcs/ide-vcs-clone-request.h
index 60c1802ba..68b2d95a9 100644
--- a/src/libide/vcs/ide-vcs-clone-request.h
+++ b/src/libide/vcs/ide-vcs-clone-request.h
@@ -42,42 +42,51 @@ IDE_AVAILABLE_IN_ALL
G_DECLARE_FINAL_TYPE (IdeVcsCloneRequest, ide_vcs_clone_request, IDE, VCS_CLONE_REQUEST, IdeObject)
IDE_AVAILABLE_IN_ALL
-IdeVcsCloneRequest *ide_vcs_clone_request_new (void);
+IdeVcsCloneRequest *ide_vcs_clone_request_new (void);
IDE_AVAILABLE_IN_ALL
-const char *ide_vcs_clone_request_get_module_name (IdeVcsCloneRequest *self);
+const char *ide_vcs_clone_request_get_module_name (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_set_module_name (IdeVcsCloneRequest *self,
- const char *module_name);
+void ide_vcs_clone_request_set_module_name (IdeVcsCloneRequest *self,
+ const char *module_name);
IDE_AVAILABLE_IN_ALL
-const char *ide_vcs_clone_request_get_author_name (IdeVcsCloneRequest *self);
+const char *ide_vcs_clone_request_get_author_name (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_set_author_name (IdeVcsCloneRequest *self,
- const char *author_name);
+void ide_vcs_clone_request_set_author_name (IdeVcsCloneRequest *self,
+ const char *author_name);
IDE_AVAILABLE_IN_ALL
-const char *ide_vcs_clone_request_get_author_email (IdeVcsCloneRequest *self);
+const char *ide_vcs_clone_request_get_author_email (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_set_author_email (IdeVcsCloneRequest *self,
- const char *author_email);
-GListModel *ide_vcs_clone_request_get_branch_model (IdeVcsCloneRequest *self);
+void ide_vcs_clone_request_set_author_email (IdeVcsCloneRequest *self,
+ const char *author_email);
+GListModel *ide_vcs_clone_request_get_branch_model (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-const char *ide_vcs_clone_request_get_branch_name (IdeVcsCloneRequest *self);
+const char *ide_vcs_clone_request_get_branch_name (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_set_branch_name (IdeVcsCloneRequest *self,
- const char *branch_name);
+void ide_vcs_clone_request_set_branch_name (IdeVcsCloneRequest *self,
+ const char *branch_name);
IDE_AVAILABLE_IN_ALL
-const char *ide_vcs_clone_request_get_uri (IdeVcsCloneRequest *self);
+const char *ide_vcs_clone_request_get_uri (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_set_uri (IdeVcsCloneRequest *self,
- const char *uri);
+void ide_vcs_clone_request_set_uri (IdeVcsCloneRequest *self,
+ const char *uri);
IDE_AVAILABLE_IN_ALL
-GFile *ide_vcs_clone_request_get_directory (IdeVcsCloneRequest *self);
+GFile *ide_vcs_clone_request_get_directory (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_set_directory (IdeVcsCloneRequest *self,
- GFile *directory);
+void ide_vcs_clone_request_set_directory (IdeVcsCloneRequest *self,
+ GFile *directory);
IDE_AVAILABLE_IN_ALL
-void ide_vcs_clone_request_populate_branches (IdeVcsCloneRequest *self);
+void ide_vcs_clone_request_populate_branches (IdeVcsCloneRequest *self);
IDE_AVAILABLE_IN_ALL
-IdeVcsCloneRequestValidation
- ide_vcs_clone_request_validate (IdeVcsCloneRequest *self);
+IdeVcsCloneRequestValidation ide_vcs_clone_request_validate (IdeVcsCloneRequest *self);
+IDE_AVAILABLE_IN_ALL
+void ide_vcs_clone_request_clone_async (IdeVcsCloneRequest *self,
+ IdeNotification *notif,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+IDE_AVAILABLE_IN_ALL
+GFile *ide_vcs_clone_request_clone_finish (IdeVcsCloneRequest *self,
+ GAsyncResult *result,
+ GError **error);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]