From 831b6afc87426a7150875d3d623cf6e093aab250b3caa38b4d6c8387854f5776 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 29 Sep 2013 16:55:36 +0000 Subject: [PATCH 1/2] Accepting request 201374 from home:Zaitor:branches:GNOME:Factory Add patch to make untaring work again, + some other minor modifications. Wanted for 13.1 OBS-URL: https://build.opensuse.org/request/show/201374 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/file-roller?expand=0&rev=176 --- ...ert-restore-folder-modification-time.patch | 350 ++++++++++++++++++ file-roller.changes | 11 + file-roller.spec | 9 +- 3 files changed, 367 insertions(+), 3 deletions(-) create mode 100644 file-roller-revert-restore-folder-modification-time.patch diff --git a/file-roller-revert-restore-folder-modification-time.patch b/file-roller-revert-restore-folder-modification-time.patch new file mode 100644 index 0000000..445c5e6 --- /dev/null +++ b/file-roller-revert-restore-folder-modification-time.patch @@ -0,0 +1,350 @@ +From 047b195c61a23dd3ec8b69dff43c1a21792ce4b6 Mon Sep 17 00:00:00 2001 +From: Paolo Bacchilega +Date: Wed, 04 Sep 2013 10:02:11 +0000 +Subject: libarchive: restore the folders modification time correctly + +when honoring the skip_older and overwrite flags ignore the +directories created during the extraction process. + +[bug #697756] +--- +diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c +index 3b73c48..37e3008 100644 +--- a/src/fr-archive-libarchive.c ++++ b/src/fr-archive-libarchive.c +@@ -33,6 +33,7 @@ + #include "file-utils.h" + #include "fr-error.h" + #include "fr-archive-libarchive.h" ++#include "gio-utils.h" + #include "glib-utils.h" + #include "typedefs.h" + +@@ -547,6 +548,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + LoadData *load_data; + GHashTable *checked_folders; + GHashTable *created_folders; ++ GHashTable *folders_created_during_extraction; + struct archive *a; + struct archive_entry *entry; + int r; +@@ -556,6 +558,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + + checked_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); + created_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, g_object_unref); ++ folders_created_during_extraction = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); + fr_archive_progress_set_total_files (load_data->archive, extract_data->n_files_to_extract); + + a = archive_read_new (); +@@ -590,11 +593,14 @@ extract_archive_thread (GSimpleAsyncResult *result, + archive_read_data_skip (a); + continue; + } ++ + file = g_file_get_child (extract_data->destination, relative_path); + + /* honor the skip_older and overwrite options */ + +- if (extract_data->skip_older || ! extract_data->overwrite) { ++ if ((g_hash_table_lookup (folders_created_during_extraction, file) == NULL) ++ && (extract_data->skip_older || ! extract_data->overwrite)) ++ { + GFileInfo *info; + + info = g_file_query_info (file, +@@ -652,7 +658,18 @@ extract_archive_thread (GSimpleAsyncResult *result, + && (g_hash_table_lookup (checked_folders, parent) == NULL) + && ! g_file_query_exists (parent, cancellable)) + { +- if (g_file_make_directory_with_parents (parent, cancellable, &load_data->error)) { ++ if (! _g_file_make_directory_with_parents (parent, ++ folders_created_during_extraction, ++ cancellable, ++ &local_error)) ++ { ++ if (! g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_EXISTS)) ++ load_data->error = local_error; ++ else ++ g_clear_error (&local_error); ++ } ++ ++ if (load_data->error == NULL) { + GFile *grandparent; + + grandparent = g_object_ref (parent); +@@ -736,7 +753,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + load_data->error = g_error_copy (local_error); + g_error_free (local_error); + } +- else { ++ if (load_data->error == NULL) { + GFileInfo *info; + + info = _g_file_info_create_from_entry (entry, extract_data); +@@ -803,6 +820,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + if (load_data->error != NULL) + g_simple_async_result_set_from_error (result, load_data->error); + ++ g_hash_table_unref (folders_created_during_extraction); + g_hash_table_unref (created_folders); + g_hash_table_unref (checked_folders); + archive_read_free (a); +diff --git a/src/gio-utils.c b/src/gio-utils.c +index 9d9f708..b317694 100644 +--- a/src/gio-utils.c ++++ b/src/gio-utils.c +@@ -1483,3 +1483,73 @@ _g_file_load_buffer_finish (GFile *file, + + return TRUE; + } ++ ++ ++static gboolean ++_g_file_make_directory_and_add_to_created_folders (GFile *file, ++ GHashTable *created_folders, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ gboolean result; ++ ++ result = g_file_make_directory (file, cancellable, error); ++ if (result && (g_hash_table_lookup (created_folders, file) == NULL)) ++ g_hash_table_insert (created_folders, g_object_ref (file), GINT_TO_POINTER (1)); ++ ++ return result; ++} ++ ++ ++gboolean ++_g_file_make_directory_with_parents (GFile *file, ++ GHashTable *created_folders, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GError *local_error = NULL; ++ GFile *work_file = NULL; ++ GList *list = NULL, *l; ++ ++ g_return_val_if_fail (G_IS_FILE (file), FALSE); ++ ++ _g_file_make_directory_and_add_to_created_folders (file, created_folders, cancellable, &local_error); ++ if ((local_error == NULL) || (local_error->code != G_IO_ERROR_NOT_FOUND)) { ++ if (local_error != NULL) ++ g_propagate_error (error, local_error); ++ return local_error == NULL; ++ } ++ ++ work_file = g_object_ref (file); ++ while ((local_error != NULL) && (local_error->code == G_IO_ERROR_NOT_FOUND)) { ++ GFile *parent_file; ++ ++ parent_file = g_file_get_parent (work_file); ++ if (parent_file == NULL) ++ break; ++ ++ g_clear_error (&local_error); ++ _g_file_make_directory_and_add_to_created_folders (parent_file, created_folders, cancellable, &local_error); ++ ++ g_object_unref (work_file); ++ work_file = g_object_ref (parent_file); ++ ++ if ((local_error != NULL) && (local_error->code == G_IO_ERROR_NOT_FOUND)) ++ list = g_list_prepend (list, parent_file); /* Transfer ownership of ref */ ++ else ++ g_object_unref (parent_file); ++ } ++ ++ for (l = list; (local_error == NULL) && (l != NULL); l = l->next) ++ _g_file_make_directory_and_add_to_created_folders ((GFile *) l->data, created_folders, cancellable, &local_error); ++ ++ _g_object_unref (work_file); ++ _g_object_list_unref (list); ++ ++ if (local_error != NULL) { ++ g_propagate_error (error, local_error); ++ return FALSE; ++ } ++ ++ return _g_file_make_directory_and_add_to_created_folders (file, created_folders, cancellable, error); ++} +diff --git a/src/gio-utils.h b/src/gio-utils.h +index f784c41..0d7dd3c 100644 +--- a/src/gio-utils.h ++++ b/src/gio-utils.h +@@ -177,5 +177,10 @@ gboolean _g_file_load_buffer_finish (GFile *file, + char **buffer, + gsize *buffer_size, + GError **error); ++gboolean _g_file_make_directory_with_parents ++ (GFile *file, ++ GHashTable *created_folders, ++ GCancellable *cancellable, ++ GError **error); + + #endif /* _GIO_UTILS_H */ +-- +cgit v0.9.2 + +From 6c831b143dd08f3d6c3d1923ef5751222d21fc86 Mon Sep 17 00:00:00 2001 +From: Paolo Bacchilega +Date: Sat, 17 Aug 2013 10:16:19 +0000 +Subject: libarchive: restore directory modification time when extrating + +[bug #697756] +--- +diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c +index 0817cf8..3b73c48 100644 +--- a/src/fr-archive-libarchive.c ++++ b/src/fr-archive-libarchive.c +@@ -417,14 +417,11 @@ extract_data_get_extraction_requested (ExtractData *extract_data, + } + + +-static void +-_g_file_set_attributes_from_entry (GFile *file, +- struct archive_entry *entry, +- ExtractData *extract_data, +- GCancellable *cancellable) ++static GFileInfo * ++_g_file_info_create_from_entry (struct archive_entry *entry, ++ ExtractData *extract_data) + { + GFileInfo *info; +- GError *error = NULL; + + info = g_file_info_new (); + +@@ -478,12 +475,66 @@ _g_file_set_attributes_from_entry (GFile *file, + + g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE, archive_entry_mode (entry)); + +- if (! g_file_set_attributes_from_info (file, info, 0, cancellable, &error)) { +- g_warning ("%s", error->message); +- g_error_free (error); +- } ++ return info; ++} ++ ++ ++static gboolean ++_g_file_set_attributes_from_info (GFile *file, ++ GFileInfo *info, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ return g_file_set_attributes_from_info (file, info, G_FILE_QUERY_INFO_NONE, cancellable, error); ++} ++ ++ ++static gboolean ++_g_file_set_attributes_from_entry (GFile *file, ++ struct archive_entry *entry, ++ ExtractData *extract_data, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GFileInfo *info; ++ gboolean result; ++ ++ info = _g_file_info_create_from_entry (entry, extract_data); ++ result = _g_file_set_attributes_from_info (file, info, cancellable, error); + + g_object_unref (info); ++ ++ return result; ++} ++ ++ ++static gboolean ++restore_modification_time (GHashTable *created_folders, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GHashTableIter iter; ++ gpointer key, value; ++ gboolean result = TRUE; ++ ++ g_hash_table_iter_init (&iter, created_folders); ++ while (result && g_hash_table_iter_next (&iter, &key, &value)) { ++ GFile *file = key; ++ GFileInfo *original_info = value; ++ GFileInfo *info; ++ ++ if (g_file_info_get_attribute_status (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED) != G_FILE_ATTRIBUTE_STATUS_SET) ++ continue; ++ ++ info = g_file_info_new (); ++ g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED, g_file_info_get_attribute_uint64 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED)); ++ g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, g_file_info_get_attribute_uint32 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC)); ++ result = _g_file_set_attributes_from_info (file, info, cancellable, error); ++ ++ g_object_unref (info); ++ } ++ ++ return result; + } + + +@@ -495,6 +546,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + ExtractData *extract_data; + LoadData *load_data; + GHashTable *checked_folders; ++ GHashTable *created_folders; + struct archive *a; + struct archive_entry *entry; + int r; +@@ -503,6 +555,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + load_data = LOAD_DATA (extract_data); + + checked_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); ++ created_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, g_object_unref); + fr_archive_progress_set_total_files (load_data->archive, extract_data->n_files_to_extract); + + a = archive_read_new (); +@@ -683,8 +736,15 @@ extract_archive_thread (GSimpleAsyncResult *result, + load_data->error = g_error_copy (local_error); + g_error_free (local_error); + } +- else +- _g_file_set_attributes_from_entry (file, entry, extract_data, cancellable); ++ else { ++ GFileInfo *info; ++ ++ info = _g_file_info_create_from_entry (entry, extract_data); ++ _g_file_set_attributes_from_info (file, info, cancellable, &load_data->error); ++ g_hash_table_insert (created_folders, g_object_ref (file), g_object_ref (info)); ++ ++ g_object_unref (info); ++ } + archive_read_data_skip (a); + break; + +@@ -703,7 +763,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + if (r != ARCHIVE_EOF) + load_data->error = g_error_new_literal (FR_ERROR, FR_ERROR_COMMAND_ERROR, archive_error_string (a)); + else +- _g_file_set_attributes_from_entry (file, entry, extract_data, cancellable); ++ _g_file_set_attributes_from_entry (file, entry, extract_data, cancellable, &load_data->error); + break; + + case AE_IFLNK: +@@ -733,6 +793,9 @@ extract_archive_thread (GSimpleAsyncResult *result, + } + } + ++ if (load_data->error == NULL) ++ restore_modification_time (created_folders, cancellable, &load_data->error); ++ + if ((load_data->error == NULL) && (r != ARCHIVE_EOF)) + load_data->error = g_error_new_literal (FR_ERROR, FR_ERROR_COMMAND_ERROR, archive_error_string (a)); + if (load_data->error == NULL) +@@ -740,6 +803,7 @@ extract_archive_thread (GSimpleAsyncResult *result, + if (load_data->error != NULL) + g_simple_async_result_set_from_error (result, load_data->error); + ++ g_hash_table_unref (created_folders); + g_hash_table_unref (checked_folders); + archive_read_free (a); + extract_data_free (extract_data); +-- +cgit v0.9.2 diff --git a/file-roller.changes b/file-roller.changes index 3e99121..125e9c1 100644 --- a/file-roller.changes +++ b/file-roller.changes @@ -1,3 +1,14 @@ +------------------------------------------------------------------- +Sun Sep 29 13:06:25 UTC 2013 - zaitor@opensuse.org + +- Add file-roller-revert-restore-folder-modification-time.patch, + reverting 2 commits as these made extraction of tar files fail + with file-roller (bgo#697756, bgo#709035). +- Remove V=1 from make as it only fills up the obs buildlog to no + use, debugging is done locally anyway. +- Add lzip and lzop to suggested packages, as these are now + available in openSUSE. + ------------------------------------------------------------------- Mon Sep 23 20:12:10 UTC 2013 - dimstar@opensuse.org diff --git a/file-roller.spec b/file-roller.spec index 47b1579..2af6454 100644 --- a/file-roller.spec +++ b/file-roller.spec @@ -28,6 +28,8 @@ Source: http://download.gnome.org/sources/file-roller/3.10/%{name}-%{ver Patch0: file-roller-3.4-change-archiver-priority.patch # PATCH-FEATURE-OPENSUSE file-roller-pkg-match.patch bnc#696530 dimstar@opensuse.org -- List package match names for automatic installation using PK. Patch1: file-roller-pkg-match.patch +# PATCH-FIX-UPSTREAM file-roller-revert-restore-folder-modification-time.patch bgo#697756, bgo#709035 zaitor@opensuse.org -- Reverting 2 commits as these made extraction of tar files fail. +Patch2: file-roller-revert-restore-folder-modification-time.patch # Needed for directory ownership BuildRequires: dbus-1 BuildRequires: fdupes @@ -59,6 +61,8 @@ Recommends: xz Recommends: zip # Additional formats that are supported Suggests: lha +Suggests: lzip +Suggests: lzop Suggests: rzip Suggests: zoo BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -67,8 +71,6 @@ DocDir: %{_defaultdocdir} # we could package. #Suggests: arj #Suggests: lrzip -#Suggests: lzip -#Suggests: lzop #Suggests: ncompress #Suggests: rar #Suggests: theunarchiver @@ -100,13 +102,14 @@ This package contains a plugin to integrate File Roller into Nautilus. %setup -q %patch0 %patch1 -p1 +%patch2 -p1 -R translation-update-upstream %build %configure\ --disable-scrollkeeper \ --enable-magic -make %{?_smp_mflags} V=1 +make %{?_smp_mflags} %install %make_install From 7e54608267a7c88272cd746a07e6c0a2507f7c1ce4910c53be82e1cb1b66c505 Mon Sep 17 00:00:00 2001 From: Dominique Leuenberger Date: Sun, 29 Sep 2013 18:05:43 +0000 Subject: [PATCH 2/2] Accepting request 201399 from home:Zaitor:branches:GNOME:Factory Add patch to fix untaring of tar files + some other minor modifications. Wanted for 13.1 OBS-URL: https://build.opensuse.org/request/show/201399 OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/file-roller?expand=0&rev=177 --- file-roller-fix-tar-extraction.patch | 43 +++ ...ert-restore-folder-modification-time.patch | 350 ------------------ file-roller.changes | 9 +- file-roller.spec | 10 +- 4 files changed, 52 insertions(+), 360 deletions(-) create mode 100644 file-roller-fix-tar-extraction.patch delete mode 100644 file-roller-revert-restore-folder-modification-time.patch diff --git a/file-roller-fix-tar-extraction.patch b/file-roller-fix-tar-extraction.patch new file mode 100644 index 0000000..2447275 --- /dev/null +++ b/file-roller-fix-tar-extraction.patch @@ -0,0 +1,43 @@ +From d05bdc3b60d928f1f40338208419f0ffa41195f6 Mon Sep 17 00:00:00 2001 +From: Paolo Bacchilega +Date: Sun, 29 Sep 2013 16:30:29 +0000 +Subject: libarchive: fixed failure when extracting some tar archives + +do not try to restore the creation time; +do not set the G_FILE_ATTRIBUTE_TIME_CREATED_USEC attribute + +[bug #709035] +--- +diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c +index 42673df..44aaad2 100644 +--- a/src/fr-archive-libarchive.c ++++ b/src/fr-archive-libarchive.c +@@ -428,15 +428,8 @@ _g_file_info_create_from_entry (struct archive_entry *entry, + + /* times */ + +- if (archive_entry_ctime_is_set (entry)) { +- g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_CREATED, archive_entry_ctime (entry)); +- g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_TIME_CREATED_USEC, archive_entry_ctime_nsec (entry)); +- } +- +- if (archive_entry_mtime_is_set (entry)) { ++ if (archive_entry_mtime_is_set (entry)) + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED, archive_entry_mtime (entry)); +- g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, archive_entry_mtime_nsec (entry)); +- } + + /* username */ + +@@ -529,7 +522,8 @@ restore_modification_time (GHashTable *created_folders, + + info = g_file_info_new (); + g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED, g_file_info_get_attribute_uint64 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED)); +- g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, g_file_info_get_attribute_uint32 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC)); ++ if (g_file_info_get_attribute_status (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC) == G_FILE_ATTRIBUTE_STATUS_SET) ++ g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, g_file_info_get_attribute_uint32 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC)); + result = _g_file_set_attributes_from_info (file, info, cancellable, error); + + g_object_unref (info); +-- +cgit v0.9.2 diff --git a/file-roller-revert-restore-folder-modification-time.patch b/file-roller-revert-restore-folder-modification-time.patch deleted file mode 100644 index 445c5e6..0000000 --- a/file-roller-revert-restore-folder-modification-time.patch +++ /dev/null @@ -1,350 +0,0 @@ -From 047b195c61a23dd3ec8b69dff43c1a21792ce4b6 Mon Sep 17 00:00:00 2001 -From: Paolo Bacchilega -Date: Wed, 04 Sep 2013 10:02:11 +0000 -Subject: libarchive: restore the folders modification time correctly - -when honoring the skip_older and overwrite flags ignore the -directories created during the extraction process. - -[bug #697756] ---- -diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c -index 3b73c48..37e3008 100644 ---- a/src/fr-archive-libarchive.c -+++ b/src/fr-archive-libarchive.c -@@ -33,6 +33,7 @@ - #include "file-utils.h" - #include "fr-error.h" - #include "fr-archive-libarchive.h" -+#include "gio-utils.h" - #include "glib-utils.h" - #include "typedefs.h" - -@@ -547,6 +548,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - LoadData *load_data; - GHashTable *checked_folders; - GHashTable *created_folders; -+ GHashTable *folders_created_during_extraction; - struct archive *a; - struct archive_entry *entry; - int r; -@@ -556,6 +558,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - - checked_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); - created_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, g_object_unref); -+ folders_created_during_extraction = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); - fr_archive_progress_set_total_files (load_data->archive, extract_data->n_files_to_extract); - - a = archive_read_new (); -@@ -590,11 +593,14 @@ extract_archive_thread (GSimpleAsyncResult *result, - archive_read_data_skip (a); - continue; - } -+ - file = g_file_get_child (extract_data->destination, relative_path); - - /* honor the skip_older and overwrite options */ - -- if (extract_data->skip_older || ! extract_data->overwrite) { -+ if ((g_hash_table_lookup (folders_created_during_extraction, file) == NULL) -+ && (extract_data->skip_older || ! extract_data->overwrite)) -+ { - GFileInfo *info; - - info = g_file_query_info (file, -@@ -652,7 +658,18 @@ extract_archive_thread (GSimpleAsyncResult *result, - && (g_hash_table_lookup (checked_folders, parent) == NULL) - && ! g_file_query_exists (parent, cancellable)) - { -- if (g_file_make_directory_with_parents (parent, cancellable, &load_data->error)) { -+ if (! _g_file_make_directory_with_parents (parent, -+ folders_created_during_extraction, -+ cancellable, -+ &local_error)) -+ { -+ if (! g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_EXISTS)) -+ load_data->error = local_error; -+ else -+ g_clear_error (&local_error); -+ } -+ -+ if (load_data->error == NULL) { - GFile *grandparent; - - grandparent = g_object_ref (parent); -@@ -736,7 +753,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - load_data->error = g_error_copy (local_error); - g_error_free (local_error); - } -- else { -+ if (load_data->error == NULL) { - GFileInfo *info; - - info = _g_file_info_create_from_entry (entry, extract_data); -@@ -803,6 +820,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - if (load_data->error != NULL) - g_simple_async_result_set_from_error (result, load_data->error); - -+ g_hash_table_unref (folders_created_during_extraction); - g_hash_table_unref (created_folders); - g_hash_table_unref (checked_folders); - archive_read_free (a); -diff --git a/src/gio-utils.c b/src/gio-utils.c -index 9d9f708..b317694 100644 ---- a/src/gio-utils.c -+++ b/src/gio-utils.c -@@ -1483,3 +1483,73 @@ _g_file_load_buffer_finish (GFile *file, - - return TRUE; - } -+ -+ -+static gboolean -+_g_file_make_directory_and_add_to_created_folders (GFile *file, -+ GHashTable *created_folders, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ gboolean result; -+ -+ result = g_file_make_directory (file, cancellable, error); -+ if (result && (g_hash_table_lookup (created_folders, file) == NULL)) -+ g_hash_table_insert (created_folders, g_object_ref (file), GINT_TO_POINTER (1)); -+ -+ return result; -+} -+ -+ -+gboolean -+_g_file_make_directory_with_parents (GFile *file, -+ GHashTable *created_folders, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GError *local_error = NULL; -+ GFile *work_file = NULL; -+ GList *list = NULL, *l; -+ -+ g_return_val_if_fail (G_IS_FILE (file), FALSE); -+ -+ _g_file_make_directory_and_add_to_created_folders (file, created_folders, cancellable, &local_error); -+ if ((local_error == NULL) || (local_error->code != G_IO_ERROR_NOT_FOUND)) { -+ if (local_error != NULL) -+ g_propagate_error (error, local_error); -+ return local_error == NULL; -+ } -+ -+ work_file = g_object_ref (file); -+ while ((local_error != NULL) && (local_error->code == G_IO_ERROR_NOT_FOUND)) { -+ GFile *parent_file; -+ -+ parent_file = g_file_get_parent (work_file); -+ if (parent_file == NULL) -+ break; -+ -+ g_clear_error (&local_error); -+ _g_file_make_directory_and_add_to_created_folders (parent_file, created_folders, cancellable, &local_error); -+ -+ g_object_unref (work_file); -+ work_file = g_object_ref (parent_file); -+ -+ if ((local_error != NULL) && (local_error->code == G_IO_ERROR_NOT_FOUND)) -+ list = g_list_prepend (list, parent_file); /* Transfer ownership of ref */ -+ else -+ g_object_unref (parent_file); -+ } -+ -+ for (l = list; (local_error == NULL) && (l != NULL); l = l->next) -+ _g_file_make_directory_and_add_to_created_folders ((GFile *) l->data, created_folders, cancellable, &local_error); -+ -+ _g_object_unref (work_file); -+ _g_object_list_unref (list); -+ -+ if (local_error != NULL) { -+ g_propagate_error (error, local_error); -+ return FALSE; -+ } -+ -+ return _g_file_make_directory_and_add_to_created_folders (file, created_folders, cancellable, error); -+} -diff --git a/src/gio-utils.h b/src/gio-utils.h -index f784c41..0d7dd3c 100644 ---- a/src/gio-utils.h -+++ b/src/gio-utils.h -@@ -177,5 +177,10 @@ gboolean _g_file_load_buffer_finish (GFile *file, - char **buffer, - gsize *buffer_size, - GError **error); -+gboolean _g_file_make_directory_with_parents -+ (GFile *file, -+ GHashTable *created_folders, -+ GCancellable *cancellable, -+ GError **error); - - #endif /* _GIO_UTILS_H */ --- -cgit v0.9.2 - -From 6c831b143dd08f3d6c3d1923ef5751222d21fc86 Mon Sep 17 00:00:00 2001 -From: Paolo Bacchilega -Date: Sat, 17 Aug 2013 10:16:19 +0000 -Subject: libarchive: restore directory modification time when extrating - -[bug #697756] ---- -diff --git a/src/fr-archive-libarchive.c b/src/fr-archive-libarchive.c -index 0817cf8..3b73c48 100644 ---- a/src/fr-archive-libarchive.c -+++ b/src/fr-archive-libarchive.c -@@ -417,14 +417,11 @@ extract_data_get_extraction_requested (ExtractData *extract_data, - } - - --static void --_g_file_set_attributes_from_entry (GFile *file, -- struct archive_entry *entry, -- ExtractData *extract_data, -- GCancellable *cancellable) -+static GFileInfo * -+_g_file_info_create_from_entry (struct archive_entry *entry, -+ ExtractData *extract_data) - { - GFileInfo *info; -- GError *error = NULL; - - info = g_file_info_new (); - -@@ -478,12 +475,66 @@ _g_file_set_attributes_from_entry (GFile *file, - - g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE, archive_entry_mode (entry)); - -- if (! g_file_set_attributes_from_info (file, info, 0, cancellable, &error)) { -- g_warning ("%s", error->message); -- g_error_free (error); -- } -+ return info; -+} -+ -+ -+static gboolean -+_g_file_set_attributes_from_info (GFile *file, -+ GFileInfo *info, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ return g_file_set_attributes_from_info (file, info, G_FILE_QUERY_INFO_NONE, cancellable, error); -+} -+ -+ -+static gboolean -+_g_file_set_attributes_from_entry (GFile *file, -+ struct archive_entry *entry, -+ ExtractData *extract_data, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GFileInfo *info; -+ gboolean result; -+ -+ info = _g_file_info_create_from_entry (entry, extract_data); -+ result = _g_file_set_attributes_from_info (file, info, cancellable, error); - - g_object_unref (info); -+ -+ return result; -+} -+ -+ -+static gboolean -+restore_modification_time (GHashTable *created_folders, -+ GCancellable *cancellable, -+ GError **error) -+{ -+ GHashTableIter iter; -+ gpointer key, value; -+ gboolean result = TRUE; -+ -+ g_hash_table_iter_init (&iter, created_folders); -+ while (result && g_hash_table_iter_next (&iter, &key, &value)) { -+ GFile *file = key; -+ GFileInfo *original_info = value; -+ GFileInfo *info; -+ -+ if (g_file_info_get_attribute_status (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED) != G_FILE_ATTRIBUTE_STATUS_SET) -+ continue; -+ -+ info = g_file_info_new (); -+ g_file_info_set_attribute_uint64 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED, g_file_info_get_attribute_uint64 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED)); -+ g_file_info_set_attribute_uint32 (info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC, g_file_info_get_attribute_uint32 (original_info, G_FILE_ATTRIBUTE_TIME_MODIFIED_USEC)); -+ result = _g_file_set_attributes_from_info (file, info, cancellable, error); -+ -+ g_object_unref (info); -+ } -+ -+ return result; - } - - -@@ -495,6 +546,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - ExtractData *extract_data; - LoadData *load_data; - GHashTable *checked_folders; -+ GHashTable *created_folders; - struct archive *a; - struct archive_entry *entry; - int r; -@@ -503,6 +555,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - load_data = LOAD_DATA (extract_data); - - checked_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, NULL); -+ created_folders = g_hash_table_new_full (g_file_hash, (GEqualFunc) g_file_equal, g_object_unref, g_object_unref); - fr_archive_progress_set_total_files (load_data->archive, extract_data->n_files_to_extract); - - a = archive_read_new (); -@@ -683,8 +736,15 @@ extract_archive_thread (GSimpleAsyncResult *result, - load_data->error = g_error_copy (local_error); - g_error_free (local_error); - } -- else -- _g_file_set_attributes_from_entry (file, entry, extract_data, cancellable); -+ else { -+ GFileInfo *info; -+ -+ info = _g_file_info_create_from_entry (entry, extract_data); -+ _g_file_set_attributes_from_info (file, info, cancellable, &load_data->error); -+ g_hash_table_insert (created_folders, g_object_ref (file), g_object_ref (info)); -+ -+ g_object_unref (info); -+ } - archive_read_data_skip (a); - break; - -@@ -703,7 +763,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - if (r != ARCHIVE_EOF) - load_data->error = g_error_new_literal (FR_ERROR, FR_ERROR_COMMAND_ERROR, archive_error_string (a)); - else -- _g_file_set_attributes_from_entry (file, entry, extract_data, cancellable); -+ _g_file_set_attributes_from_entry (file, entry, extract_data, cancellable, &load_data->error); - break; - - case AE_IFLNK: -@@ -733,6 +793,9 @@ extract_archive_thread (GSimpleAsyncResult *result, - } - } - -+ if (load_data->error == NULL) -+ restore_modification_time (created_folders, cancellable, &load_data->error); -+ - if ((load_data->error == NULL) && (r != ARCHIVE_EOF)) - load_data->error = g_error_new_literal (FR_ERROR, FR_ERROR_COMMAND_ERROR, archive_error_string (a)); - if (load_data->error == NULL) -@@ -740,6 +803,7 @@ extract_archive_thread (GSimpleAsyncResult *result, - if (load_data->error != NULL) - g_simple_async_result_set_from_error (result, load_data->error); - -+ g_hash_table_unref (created_folders); - g_hash_table_unref (checked_folders); - archive_read_free (a); - extract_data_free (extract_data); --- -cgit v0.9.2 diff --git a/file-roller.changes b/file-roller.changes index 125e9c1..d231c75 100644 --- a/file-roller.changes +++ b/file-roller.changes @@ -1,13 +1,16 @@ ------------------------------------------------------------------- Sun Sep 29 13:06:25 UTC 2013 - zaitor@opensuse.org -- Add file-roller-revert-restore-folder-modification-time.patch, - reverting 2 commits as these made extraction of tar files fail - with file-roller (bgo#697756, bgo#709035). +- Add file-roller-fix-tar-extraction.patch, fixes untaring that + failed on some tar files (bgo#697756, bgo#709035). - Remove V=1 from make as it only fills up the obs buildlog to no use, debugging is done locally anyway. - Add lzip and lzop to suggested packages, as these are now available in openSUSE. +- Stop passing --disable-scrollkeeper to configure, neither + recognized nor needed anymore. +- Remove %if conditional for obsolete versions of openSUSE, those + are out of support a long time ago. ------------------------------------------------------------------- Mon Sep 23 20:12:10 UTC 2013 - dimstar@opensuse.org diff --git a/file-roller.spec b/file-roller.spec index 2af6454..938ad5e 100644 --- a/file-roller.spec +++ b/file-roller.spec @@ -28,8 +28,8 @@ Source: http://download.gnome.org/sources/file-roller/3.10/%{name}-%{ver Patch0: file-roller-3.4-change-archiver-priority.patch # PATCH-FEATURE-OPENSUSE file-roller-pkg-match.patch bnc#696530 dimstar@opensuse.org -- List package match names for automatic installation using PK. Patch1: file-roller-pkg-match.patch -# PATCH-FIX-UPSTREAM file-roller-revert-restore-folder-modification-time.patch bgo#697756, bgo#709035 zaitor@opensuse.org -- Reverting 2 commits as these made extraction of tar files fail. -Patch2: file-roller-revert-restore-folder-modification-time.patch +# PATCH-FIX-UPSTREAM file-roller-fix-tar-extraction.patch bgo#697756, bgo#709035 zaitor@opensuse.org -- Fix untaring of that failed for tar files. Taken from upstream git. +Patch2: file-roller-fix-tar-extraction.patch # Needed for directory ownership BuildRequires: dbus-1 BuildRequires: fdupes @@ -102,20 +102,16 @@ This package contains a plugin to integrate File Roller into Nautilus. %setup -q %patch0 %patch1 -p1 -%patch2 -p1 -R +%patch2 -p1 translation-update-upstream %build %configure\ - --disable-scrollkeeper \ --enable-magic make %{?_smp_mflags} %install %make_install -%if 0%{?suse_version} <= 1120 -rm %{buildroot}%{_datadir}/locale/en@shaw/LC_MESSAGES/* -%endif %suse_update_desktop_file %{name} %find_lang %{name} %{?no_lang_C} rm %{buildroot}%{_libdir}/*/*/*.*a