[Pkg-xfce-commits] r9568 - in /desktop/trunk/thunar/debian: changelog patches/02_handle-folder-change-events-with-file-info-synchronization.patch patches/series

Yves-Alexis Perez corsac at moszumanska.debian.org
Sat Oct 8 12:32:52 UTC 2016


Author: corsac
Date: Sat Oct  8 12:32:52 2016
New Revision: 9568

URL: http://svn.debian.org/wsvn/pkg-xfce/?sc=1&rev=9568
Log:
* debian/patches:
  - 02_handle-folder-change-events-with-file-info-synchronization added, fix
    thunar segfaults in some cases when moving files.         closes: #818484

Added:
    desktop/trunk/thunar/debian/patches/02_handle-folder-change-events-with-file-info-synchronization.patch
Modified:
    desktop/trunk/thunar/debian/changelog
    desktop/trunk/thunar/debian/patches/series

Modified: desktop/trunk/thunar/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-xfce/desktop/trunk/thunar/debian/changelog?rev=9568&op=diff
==============================================================================
--- desktop/trunk/thunar/debian/changelog	(original)
+++ desktop/trunk/thunar/debian/changelog	Sat Oct  8 12:32:52 2016
@@ -1,3 +1,11 @@
+thunar (1.6.10-3) UNRELEASED; urgency=medium
+
+  * debian/patches:
+    - 02_handle-folder-change-events-with-file-info-synchronization added, fix
+      thunar segfaults in some cases when moving files.         closes: #818484
+
+ -- Yves-Alexis Perez <corsac at debian.org>  Sun, 02 Oct 2016 15:28:58 +0200
+
 thunar (1.6.10-2) unstable; urgency=medium
 
   * debian/thunar-settings.1 added, thanks François Wendling.   closes: #799434

Added: desktop/trunk/thunar/debian/patches/02_handle-folder-change-events-with-file-info-synchronization.patch
URL: http://svn.debian.org/wsvn/pkg-xfce/desktop/trunk/thunar/debian/patches/02_handle-folder-change-events-with-file-info-synchronization.patch?rev=9568&op=file
==============================================================================
--- desktop/trunk/thunar/debian/patches/02_handle-folder-change-events-with-file-info-synchronization.patch	(added)
+++ desktop/trunk/thunar/debian/patches/02_handle-folder-change-events-with-file-info-synchronization.patch	Sat Oct  8 12:32:52 2016
@@ -0,0 +1,300 @@
+From: Roy Richardson <rocketx86>
+Date: Sat, 19 Aug 2016 10:14:48 +0100
+Subject: Handle folder change events with file info synchronization
+Origin: https://bugzilla.xfce.org/attachment.cgi?id=6779
+Upstream-bug: https://bugzilla.xfce.org/show_bug.cgi?id=12264
+
+diff -up a/thunar/thunar-file.c b/thunar/thunar-file.c
+--- a/thunar/thunar-file.c	2015-05-22 13:25:36.000000000 +0000
++++ b/thunar/thunar-file.c	2016-08-20 10:04:15.196666669 +0000
+@@ -121,6 +121,7 @@ static gboolean           thunar_file_sa
+ 
+ G_LOCK_DEFINE_STATIC (file_cache_mutex);
+ G_LOCK_DEFINE_STATIC (file_content_type_mutex);
++G_LOCK_DEFINE_STATIC (file_info_mutex);
+ 
+ 
+ 
+@@ -699,7 +700,7 @@ thunar_file_move_thumbnail_cache_file (G
+ 
+ 
+ static void
+-thunar_file_monitor_moved (ThunarFile *file,
++thunar_file_renamed (ThunarFile *file,
+                            GFile      *renamed_file)
+ {
+   GFile *previous_file;
+@@ -777,12 +778,6 @@ thunar_file_monitor (GFileMonitor     *m
+ 
+   if (g_file_equal (event_path, file->gfile))
+     {
+-      /* the event occurred for the monitored ThunarFile */
+-      if (event_type == G_FILE_MONITOR_EVENT_MOVED)
+-        {
+-          thunar_file_monitor_moved (file, other_path);
+-          return;
+-        }
+ 
+       if (G_LIKELY (event_path))
+           thunar_file_monitor_update (event_path, event_type);
+@@ -792,26 +787,7 @@ thunar_file_monitor (GFileMonitor     *m
+       /* The event did not occur for the monitored ThunarFile, but for
+          a file that is contained in ThunarFile which is actually a
+          directory. */
+-      if (event_type == G_FILE_MONITOR_EVENT_MOVED)
+-        {
+-          /* reload the target file if cached */
+-          other_file = thunar_file_cache_lookup (other_path);
+-          if (other_file)
+-              thunar_file_reload (other_file);
+-          else
+-              other_file = thunar_file_get (other_path, NULL);
+ 
+-          if (!other_file)
+-              return;
+-
+-          /* notify the thumbnail cache that we can now also move the thumbnail */
+-          thunar_file_move_thumbnail_cache_file (event_path, other_path);
+-
+-          /* reload the containing target folder */
+-          thunar_file_reload_parent (other_file);
+-
+-          g_object_unref (other_file);
+-        }
+       return;
+     }
+ }
+@@ -850,8 +826,9 @@ thunar_file_watch_reconnect (ThunarFile
+           g_object_unref (file_watch->monitor);
+         }
+ 
+-      /* create a file or directory monitor */
+-      file_watch->monitor = g_file_monitor (file->gfile, G_FILE_MONITOR_WATCH_MOUNTS | G_FILE_MONITOR_SEND_MOVED, NULL, NULL);
++      /* create a file monitor */
++      file_watch->monitor = g_file_monitor (file->gfile, G_FILE_MONITOR_WATCH_MOUNTS, NULL, NULL);
++      
+       if (G_LIKELY (file_watch->monitor != NULL))
+         {
+           /* watch monitor for file changes */
+@@ -1085,6 +1062,9 @@ thunar_file_get_async_finish (GObject
+ 
+   _thunar_return_if_fail (G_IS_FILE (location));
+   _thunar_return_if_fail (G_IS_ASYNC_RESULT (result));
++  
++  /* setup lock to begin changes to file info */
++  G_LOCK (file_info_mutex);
+ 
+   /* finish querying the file information */
+   file_info = g_file_query_info_finish (location, result, &error);
+@@ -1126,6 +1106,9 @@ thunar_file_get_async_finish (GObject
+   /* release the file, see description in ThunarFileGetFunc */
+   g_object_unref (file);
+ 
++  /* release lock on finished changes to file info */
++  G_UNLOCK (file_info_mutex);
++
+   /* free the error, if there is any */
+   if (error != NULL)
+     g_error_free (error);
+@@ -1164,6 +1147,9 @@ thunar_file_load (ThunarFile   *file,
+   _thunar_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+   _thunar_return_val_if_fail (G_IS_FILE (file->gfile), FALSE);
+ 
++  /* setup lock to begin changes to file info */
++  G_LOCK (file_info_mutex);
++
+   /* reset the file */
+   thunar_file_info_clear (file);
+ 
+@@ -1185,6 +1171,9 @@ thunar_file_load (ThunarFile   *file,
+       g_clear_error (&err);
+    }
+ 
++  /* release lock on finished changes to file info */
++  G_UNLOCK (file_info_mutex);
++
+   if (err != NULL)
+     {
+       g_propagate_error (error, err);
+@@ -1299,6 +1288,9 @@ thunar_file_get_with_info (GFile     *gf
+       file = g_object_new (THUNAR_TYPE_FILE, NULL);
+       file->gfile = g_object_ref (gfile);
+ 
++      /* setup lock to begin changes to file info */
++      G_LOCK (file_info_mutex);
++      
+       /* reset the file */
+       thunar_file_info_clear (file);
+ 
+@@ -1311,6 +1303,9 @@ thunar_file_get_with_info (GFile     *gf
+       /* update the mounted info */
+       if (not_mounted)
+         FLAG_UNSET (file, THUNAR_FILE_FLAG_IS_MOUNTED);
++      
++      /* release lock on finished changes to file info */
++      G_UNLOCK (file_info_mutex);
+ 
+       /* setup lock until the file is inserted */
+       G_LOCK (file_cache_mutex);
+@@ -1932,8 +1927,8 @@ thunar_file_rename (ThunarFile   *file,
+       /* check if we succeeded */
+       if (renamed_file != NULL)
+         {
+-          /* notify the file is renamed */
+-          thunar_file_monitor_moved (file, renamed_file);
++          /* the file is renamed */
++          thunar_file_renamed (file, renamed_file);
+ 
+           g_object_unref (G_OBJECT (renamed_file));
+ 
+@@ -3851,8 +3846,8 @@ thunar_file_watch (ThunarFile *file)
+       file_watch = g_slice_new (ThunarFileWatch);
+       file_watch->watch_count = 1;
+ 
+-      /* create a file or directory monitor */
+-      file_watch->monitor = g_file_monitor (file->gfile, G_FILE_MONITOR_WATCH_MOUNTS | G_FILE_MONITOR_SEND_MOVED, NULL, NULL);
++      /* create a file monitor */
++      file_watch->monitor = g_file_monitor (file->gfile, G_FILE_MONITOR_WATCH_MOUNTS, NULL, NULL);
+       if (G_LIKELY (file_watch->monitor != NULL))
+         {
+           /* watch monitor for file changes */
+diff -up a/thunar/thunar-folder.c b/thunar/thunar-folder.c
+--- a/thunar/thunar-folder.c	2015-05-22 13:25:36.000000000 +0000
++++ b/thunar/thunar-folder.c	2016-08-20 10:01:40.786666669 +0000
+@@ -569,7 +569,7 @@ thunar_folder_finished (ExoJob       *jo
+ 
+   /* add us to the file alteration monitor */
+   folder->monitor = g_file_monitor_directory (thunar_file_get_file (folder->corresponding_file),
+-                                              G_FILE_MONITOR_SEND_MOVED, NULL, NULL);
++                                              G_FILE_MONITOR_WATCH_MOVES, NULL, NULL);
+   if (G_LIKELY (folder->monitor != NULL))
+     g_signal_connect (folder->monitor, "changed", G_CALLBACK (thunar_folder_monitor), folder);
+ 
+@@ -713,6 +713,7 @@ thunar_folder_monitor (GFileMonitor
+   ThunarFolder *folder = THUNAR_FOLDER (user_data);
+   ThunarFile   *file;
+   ThunarFile   *other_parent;
++  ThunarFile   *destroyed;
+   GList        *lp;
+   GList         list;
+   gboolean      restart = FALSE;
+@@ -723,40 +724,47 @@ thunar_folder_monitor (GFileMonitor
+   _thunar_return_if_fail (folder->job == NULL);
+   _thunar_return_if_fail (THUNAR_IS_FILE (folder->corresponding_file));
+   _thunar_return_if_fail (G_IS_FILE (event_file));
+-
++              
+   /* check on which file the event occurred */
++  /* if the event_file is not the folders corresponding file */
+   if (!g_file_equal (event_file, thunar_file_get_file (folder->corresponding_file)))
+     {
+       /* check if we already ship the file */
+       for (lp = folder->files; lp != NULL; lp = lp->next)
+         if (g_file_equal (event_file, thunar_file_get_file (lp->data)))
+-          break;
++          break; 
+ 
+       /* stop the content type collector */
+       if (folder->content_type_idle_id != 0)
+         restart = g_source_remove (folder->content_type_idle_id);
+ 
+-      /* if we don't have it, add it if the event is not an "deleted" event */
+-      if (G_UNLIKELY (lp == NULL && event_type != G_FILE_MONITOR_EVENT_DELETED))
++      /* 
++       * if we don't have the file and event type is created or moved in.
++       */
++      if (lp == NULL)
+         {
+-          /* allocate a file for the path */
+-          file = thunar_file_get (event_file, NULL);
+-          if (G_UNLIKELY (file != NULL))
++          if (event_type == G_FILE_MONITOR_EVENT_CREATED 
++          || event_type == G_FILE_MONITOR_EVENT_MOVED_IN)
+             {
+-              /* prepend it to our internal list */
+-              folder->files = g_list_prepend (folder->files, file);
+-
+-              /* tell others about the new file */
+-              list.data = file; list.next = list.prev = NULL;
+-              g_signal_emit (G_OBJECT (folder), folder_signals[FILES_ADDED], 0, &list);
++            /* allocate a file for the path */
++            file = thunar_file_get (event_file, NULL);
++            
++            if (file != NULL)
++              {
++                /* prepend it to our internal list */
++                folder->files = g_list_prepend (folder->files, file);
++
++                /* tell others about the new file */
++                list.data = file; list.next = list.prev = NULL;
++                g_signal_emit (G_OBJECT (folder), folder_signals[FILES_ADDED], 0, &list);
++              }
+             }
+         }
+-      else if (lp != NULL)
++      else /* lp != NULL we have the file */
+         {
+-          if (event_type == G_FILE_MONITOR_EVENT_DELETED)
++          if (event_type == G_FILE_MONITOR_EVENT_DELETED 
++          || event_type == G_FILE_MONITOR_EVENT_MOVED_OUT)
+             {
+-              ThunarFile *destroyed;
+-
+               /* destroy the file */
+               thunar_file_destroy (lp->data);
+ 
+@@ -768,27 +776,44 @@ thunar_folder_monitor (GFileMonitor
+                   g_object_unref (destroyed);
+                 }
+             }
+-
+-          else if (event_type == G_FILE_MONITOR_EVENT_MOVED)
++          else if (event_type == G_FILE_MONITOR_EVENT_RENAMED)
+             {
+-              /* destroy the old file and update the new one */
++              /* destroy the old file */
+               thunar_file_destroy (lp->data);
++
++              /* if the file has not been destroyed by now, reload it to invalidate it */
++              destroyed = thunar_file_cache_lookup (event_file);
++              if (destroyed != NULL)
++                {
++                  thunar_file_reload (destroyed);
++                  g_object_unref (destroyed);
++                }
++              
++              /* update the new one */
+               file = thunar_file_get(other_file, NULL);
++              
+               if (file != NULL && THUNAR_IS_FILE (file))
+                 {
+                   thunar_file_reload (file);
+ 
+-                  /* if source and target folders are different, also tell
+-                     the target folder to reload for the changes */
++                  /* 
++                   * if source and target folders are different, also tell
++                   * the target folder to reload for the changes 
++                   */
+                   if (thunar_file_has_parent (file))
+                     {
+                       other_parent = thunar_file_get_parent (file, NULL);
+-                      if (other_parent &&
+-                          !g_file_equal (thunar_file_get_file(folder->corresponding_file),
+-                                         thunar_file_get_file(other_parent)))
++                      if (other_parent != NULL)
+                         {
+-                          thunar_file_reload (other_parent);
+-                          g_object_unref (other_parent);
++                          if (!g_file_equal (
++                            thunar_file_get_file (folder->corresponding_file),
++                            thunar_file_get_file (other_parent)))
++                            {
++                              thunar_file_reload (other_parent);
++                            }
++                          
++                          /* drop reference on the other parent */
++                          g_object_unref (other_parent);                           
+                         }
+                     }
+ 

Modified: desktop/trunk/thunar/debian/patches/series
URL: http://svn.debian.org/wsvn/pkg-xfce/desktop/trunk/thunar/debian/patches/series?rev=9568&op=diff
==============================================================================
--- desktop/trunk/thunar/debian/patches/series	(original)
+++ desktop/trunk/thunar/debian/patches/series	Sat Oct  8 12:32:52 2016
@@ -1 +1,2 @@
 01_support-non-multiarch-modules.patch
+02_handle-folder-change-events-with-file-info-synchronization.patch




More information about the Pkg-xfce-commits mailing list