[gitg] Option to delete sources from disk
- From: Alberto Fanjul <albfan src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gitg] Option to delete sources from disk
- Date: Tue, 4 Oct 2022 06:44:20 +0000 (UTC)
commit 0b35180bec255665a780d24133c07fe998def528
Author: Gaurav Agrawal <agrawalgaurav1999 gmail com>
Date: Mon Oct 3 08:37:45 2022 +0200
Option to delete sources from disk
gitg/gitg-dash-view.vala | 18 ++++-
libgitg/gitg-repository-list-box.vala | 122 ++++++++++++++++++++++++++++++++--
2 files changed, 134 insertions(+), 6 deletions(-)
---
diff --git a/gitg/gitg-dash-view.vala b/gitg/gitg-dash-view.vala
index f47868f4..deab2539 100644
--- a/gitg/gitg-dash-view.vala
+++ b/gitg/gitg-dash-view.vala
@@ -173,7 +173,6 @@ class DashView : Gtk.Grid, GitgExt.UIElement, GitgExt.Activity, GitgExt.Selectab
var remove_button = new Gtk.Button.with_mnemonic(_("_Remove"));
remove_button.get_style_context().add_class(Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION);
-
remove_button.sensitive = false;
remove_button.show();
@@ -188,7 +187,24 @@ class DashView : Gtk.Grid, GitgExt.UIElement, GitgExt.Activity, GitgExt.Selectab
d_repository_list_box.bind_property("has-selection", remove_button, "sensitive");
+ var delete_source_button = new Gtk.Button.with_mnemonic(_("_Delete sources"));
+
delete_source_button.get_style_context().add_class(Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION);
+ delete_source_button.sensitive = false;
+ delete_source_button.show();
+
+ delete_source_button.clicked.connect(() => {
+ foreach (var sel in d_repository_list_box.get_selection())
+ {
+ sel.request_delete_source();
+ }
+
+ selectable_mode = GitgExt.SelectionMode.NORMAL;
+ });
+
+ d_repository_list_box.bind_property("has-selection", delete_source_button,
"sensitive");
+
ab.pack_end(remove_button);
+ ab.pack_start(delete_source_button);
return ab;
diff --git a/libgitg/gitg-repository-list-box.vala b/libgitg/gitg-repository-list-box.vala
index f956a05c..01bacbca 100644
--- a/libgitg/gitg-repository-list-box.vala
+++ b/libgitg/gitg-repository-list-box.vala
@@ -25,6 +25,13 @@ namespace Gitg
SELECTION
}
+ public enum DeleteSources
+ {
+ CANCEL,
+ TRASH,
+ DELETE
+ }
+
public class RepositoryListBox : Gtk.ListBox
{
private string? d_filter_text;
@@ -56,6 +63,7 @@ namespace Gitg
private unowned Gtk.Box d_languages_box;
public signal void request_remove();
+ public signal void request_delete_source();
private SelectionMode d_mode;
private string? d_dirname;
@@ -551,6 +559,110 @@ namespace Gitg
return row;
}
+ private void delete_source_clicked(File workdir, string uri, Row row)
+ {
+ var alert_dialog = new Gtk.MessageDialog((Gtk.Window) row.get_toplevel(),
+ Gtk.DialogFlags.MODAL, Gtk.MessageType.ERROR, Gtk.ButtonsType.NONE,
+ _("Deleting repository source files ā%sā will delete them from disk
and cannot be undone. Are you sure?").printf(uri), null);
+ alert_dialog.add_button(_("Cancel"), DeleteSources.CANCEL);
+ alert_dialog.add_button(_("Move to trash"), DeleteSources.TRASH);
+ alert_dialog.add_button(_("Delete permanently"), DeleteSources.DELETE);
+
+ var delete_button = alert_dialog.get_widget_for_response(DeleteSources.DELETE);
+ delete_button.get_style_context().add_class(Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION);
+
+ alert_dialog.response.connect ((id) => {
+ handle_delete_source_response(id, workdir, uri, row);
+ alert_dialog.destroy();
+ });
+
+ alert_dialog.run();
+ }
+
+ private void handle_delete_source_response(int id, File workdir, string uri, Row row)
+ {
+ Cancellable cancellable = new Cancellable();
+
+ if (id == DeleteSources.DELETE) {
+ delete_source.begin(workdir, cancellable, (obj, res) => {
+ try {
+ delete_source.end (res);
+ remove_row(uri, row);
+ } catch (Error e) {
+ warning("%s", e.message);
+ }
+ });
+ } else if (id == DeleteSources.TRASH) {
+ send_to_trash.begin(workdir, cancellable, (obj, res) => {
+ try {
+ send_to_trash.end (res);
+ remove_row(uri, row);
+ } catch (Error e) {
+ warning("%s", e.message);
+ }
+ });
+ }
+ }
+
+ private async void send_to_trash(File file, Cancellable cancellable) throws Error
+ {
+ if (cancellable.is_cancelled()) {
+ return;
+ }
+
+ try {
+ yield file.trash_async ();
+ } catch (Error e) {
+ warning("%s", e.message);
+ cancellable.cancel();
+ throw e;
+ }
+ }
+
+ private async void delete_source(File file, Cancellable cancellable)throws Error
+ {
+ if (cancellable.is_cancelled ()) {
+ return;
+ }
+ var dtype = file.query_file_type(FileQueryInfoFlags.NOFOLLOW_SYMLINKS);
+
+ if (dtype == FileType.DIRECTORY) {
+ try {
+ var dir_in_repository = yield file.enumerate_children_async
(FileAttribute.STANDARD_NAME, 0,Priority.DEFAULT);
+ GLib.List<FileInfo> content_infos;
+ while ((content_infos = yield dir_in_repository.next_files_async (20,
Priority.DEFAULT)) != null) {
+ foreach (var file_cinfo in content_infos) {
+ var files = file.get_child (file_cinfo.get_name());
+ yield delete_source (files, cancellable);
+ }
+ }
+ }
+ catch(Error e) {
+ warning("Warning: %s\n", e.message);
+ cancellable.cancel();
+ throw e;
+ }
+ }
+
+ try {
+ yield file.delete_async ();
+ } catch (Error e) {
+ warning("%s", e.message);
+ cancellable.cancel();
+ throw e;
+ }
+
+ }
+
+ private void remove_row(string uri, Row row)
+ {
+ try {
+ d_bookmark_file.remove_item(uri);
+ } catch {}
+
+ remove(row);
+ }
+
private void connect_repository_row(Row row)
{
var repository = row.repository;
@@ -558,6 +670,7 @@ namespace Gitg
if (workdir != null)
{
+ var uri = workdir.get_uri();
bind_property("mode", row, "mode");
row.notify["selected"].connect(() => {
@@ -565,12 +678,11 @@ namespace Gitg
});
row.request_remove.connect(() => {
- try
- {
- d_bookmark_file.remove_item(workdir.get_uri());
- } catch {}
+ remove_row(uri, row);
+ });
- remove(row);
+ row.request_delete_source.connect(() => {
+ delete_source_clicked(workdir, uri, row);
});
row.can_remove = true;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]