[gnome-builder] unsaved-files: remove draft from disk when clearing old drafts
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] unsaved-files: remove draft from disk when clearing old drafts
- Date: Mon, 27 Apr 2015 22:27:19 +0000 (UTC)
commit ee6c5880ceb5f8fe5e32f54f5f4f0d30355c4cb3
Author: Christian Hergert <christian hergert me>
Date: Mon Apr 27 14:35:20 2015 -0700
unsaved-files: remove draft from disk when clearing old drafts
libide/ide-unsaved-files.c | 90 ++++++++++++++++++++++++++++++++++----------
1 files changed, 70 insertions(+), 20 deletions(-)
---
diff --git a/libide/ide-unsaved-files.c b/libide/ide-unsaved-files.c
index 4bdca49..b842492 100644
--- a/libide/ide-unsaved-files.c
+++ b/libide/ide-unsaved-files.c
@@ -32,11 +32,12 @@
typedef struct
{
- gint64 sequence;
- GFile *file;
- GBytes *content;
- gchar *temp_path;
- gint temp_fd;
+ gint64 sequence;
+ GFile *file;
+ GBytes *content;
+ gchar *temp_path;
+ gint temp_fd;
+ IdeUnsavedFiles *backptr;
} UnsavedFile;
typedef struct
@@ -53,6 +54,22 @@ typedef struct
G_DEFINE_TYPE_WITH_PRIVATE (IdeUnsavedFiles, ide_unsaved_files, IDE_TYPE_OBJECT)
+gchar *
+get_drafts_directory (IdeContext *context)
+{
+ IdeProject *project;
+ const gchar *project_name;
+
+ project = ide_context_get_project (context);
+ project_name = ide_project_get_name (project);
+
+ return g_build_filename (g_get_user_data_dir (),
+ ide_get_program_name (),
+ "drafts",
+ project_name,
+ NULL);
+}
+
static void
async_state_free (gpointer data)
{
@@ -73,15 +90,21 @@ unsaved_file_free (gpointer data)
if (uf)
{
- g_object_unref (uf->file);
- g_bytes_unref (uf->content);
- if (uf->temp_path)
+ g_clear_object (&uf->file);
+ g_clear_pointer (&uf->content, g_bytes_unref);
+
+ if (uf->temp_path != NULL)
{
g_unlink (uf->temp_path);
- g_free (uf->temp_path);
+ g_clear_pointer (&uf->temp_path, g_free);
}
- if (uf->temp_fd != 0)
- g_close (uf->temp_fd, NULL);
+
+ if (uf->temp_fd != -1)
+ {
+ g_close (uf->temp_fd, NULL);
+ uf->temp_fd = -1;
+ }
+
g_slice_free (UnsavedFile, uf);
}
}
@@ -202,23 +225,15 @@ static AsyncState *
async_state_new (IdeUnsavedFiles *files)
{
IdeContext *context;
- IdeProject *project;
AsyncState *state;
- const gchar *project_name;
g_assert (IDE_IS_UNSAVED_FILES (files));
context = ide_object_get_context (IDE_OBJECT (files));
- project = ide_context_get_project (context);
- project_name = ide_project_get_name (project);
state = g_slice_new (AsyncState);
state->unsaved_files = g_ptr_array_new_with_free_func (unsaved_file_free);
- state->drafts_directory = g_build_filename (g_get_user_data_dir (),
- ide_get_program_name (),
- "drafts",
- project_name,
- NULL);
+ state->drafts_directory = get_drafts_directory (context);
return state;
}
@@ -281,6 +296,8 @@ ide_unsaved_files_restore_worker (GTask *task,
gsize len;
gsize i;
+ IDE_ENTRY;
+
g_assert (G_IS_TASK (task));
g_assert (IDE_IS_UNSAVED_FILES (source_object));
g_assert (state);
@@ -289,6 +306,8 @@ ide_unsaved_files_restore_worker (GTask *task,
"manifest",
NULL);
+ g_debug ("Loading drafts manifest %s", manifest_path);
+
if (!g_file_test (manifest_path, G_FILE_TEST_IS_REGULAR))
{
g_task_return_boolean (task, TRUE);
@@ -322,6 +341,8 @@ ide_unsaved_files_restore_worker (GTask *task,
hash = hash_uri (lines [i]);
path = g_build_filename (state->drafts_directory, hash, NULL);
+ g_debug ("Loading draft for \"%s\" from \"%s\"", lines [i], path);
+
if (!g_file_get_contents (path, &contents, &len, &error))
{
g_task_return_error (task, error);
@@ -406,6 +427,34 @@ ide_unsaved_files_move_to_front (IdeUnsavedFiles *self,
priv->unsaved_files->pdata[index] = old_front;
}
+static void
+ide_unsaved_files_remove_draft (IdeUnsavedFiles *self,
+ GFile *file)
+{
+ IdeContext *context;
+ g_autofree gchar *drafts_directory = NULL;
+ g_autofree gchar *uri = NULL;
+ g_autofree gchar *hash = NULL;
+ g_autofree gchar *path = NULL;
+
+ IDE_ENTRY;
+
+ g_assert (IDE_IS_UNSAVED_FILES (self));
+ g_assert (G_IS_FILE (file));
+
+ context = ide_object_get_context (IDE_OBJECT (self));
+ drafts_directory = get_drafts_directory (context);
+ uri = g_file_get_uri (file);
+ hash = hash_uri (uri);
+ path = g_build_filename (drafts_directory, hash, NULL);
+
+ g_debug ("Removing draft for \"%s\"", uri);
+
+ g_unlink (path);
+
+ IDE_EXIT;
+}
+
void
ide_unsaved_files_remove (IdeUnsavedFiles *self,
GFile *file)
@@ -424,6 +473,7 @@ ide_unsaved_files_remove (IdeUnsavedFiles *self,
if (g_file_equal (file, unsaved->file))
{
+ ide_unsaved_files_remove_draft (self, file);
g_ptr_array_remove_index_fast (priv->unsaved_files, i);
break;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]