From b2cb16567358991e5177a54499229aae0c045375 Mon Sep 17 00:00:00 2001
From: Yongha Hwang <mshrimp@sogang.ac.kr>
Date: Tue, 6 Jul 2021 21:13:11 +0000
Subject: [PATCH] Keep modified time of files copied from foreign locations
 (Issue #218)

Copy G_FILE_ATTRIBUTE_TIME_MODIFIED after copying file contents

Fixes: #218
MR: !127
---
 thunar/thunar-transfer-job.c | 29 +++++++++++++++++++++++++----
 1 file changed, 25 insertions(+), 4 deletions(-)

diff --git a/thunar/thunar-transfer-job.c b/thunar/thunar-transfer-job.c
index 2c8329288..5baa48bfd 100644
--- a/thunar/thunar-transfer-job.c
+++ b/thunar/thunar-transfer-job.c
@@ -411,10 +411,11 @@ ttj_copy_file (ThunarTransferJob *job,
                gboolean           merge_directories,
                GError           **error)
 {
-  GFileType source_type;
-  GFileType target_type;
-  gboolean  target_exists;
-  GError   *err = NULL;
+  GFileInfo *info;
+  GFileType  source_type;
+  GFileType  target_type;
+  gboolean   target_exists;
+  GError    *err = NULL;
 
   _thunar_return_val_if_fail (THUNAR_IS_TRANSFER_JOB (job), FALSE);
   _thunar_return_val_if_fail (G_IS_FILE (source_file), FALSE);
@@ -458,6 +459,26 @@ ttj_copy_file (ThunarTransferJob *job,
                exo_job_get_cancellable (EXO_JOB (job)),
                thunar_transfer_job_progress, job, &err);
 
+  /**
+   * MR !127 notes:
+   * (Discusssion: https://gitlab.xfce.org/xfce/thunar/-/merge_requests/127)
+   *
+   * Proper solution for copying lost metadata requires
+   * `g_file_build_attribute_list_for_copy`, which is
+   * added in Glib 2.68 (which is too recent a version
+   * to add for now) so we leave a comment here. Patch
+   * this when 2.68 is ready.
+   **/
+  if (G_UNLIKELY (err == NULL && !g_file_is_native (source_file)))
+    {
+      info = g_file_query_info (source_file, G_FILE_ATTRIBUTE_TIME_MODIFIED, G_FILE_QUERY_INFO_NONE,
+                                exo_job_get_cancellable (EXO_JOB (job)), &err);
+
+      g_file_set_attributes_from_info (target_file, info, G_FILE_QUERY_INFO_NONE,
+                                       exo_job_get_cancellable (EXO_JOB (job)), &err);
+      g_clear_object (&info);
+    }
+
   /* check if there were errors */
   if (G_UNLIKELY (err != NULL && err->domain == G_IO_ERROR))
     {
-- 
GitLab