pidgin/pidgin

Move migration to core, check for errors
xdg-dirs
2017-06-30, qarkai
ea7c40572374
Move migration to core, check for errors
--- a/libpurple/core.c Fri Jun 30 16:12:25 2017 +0300
+++ b/libpurple/core.c Fri Jun 30 17:31:16 2017 +0300
@@ -425,3 +425,30 @@
return ops->get_ui_info();
}
+
+#define MIGRATE_TO_XDG_DIR(xdg_base_dir, legacy_path) do { \
+ gboolean migrate_res; \
+ \
+ migrate_res = purple_move_to_xdg_base_dir(xdg_base_dir, legacy_path); \
+ if (!migrate_res) { \
+ purple_debug_error("core", "Error migrating %s to %s\n", \
+ legacy_path, xdg_base_dir); \
+ return FALSE; \
+ } \
+ } while (0)
+
+gboolean
+purple_core_migrate_to_xdg_base_dirs(void)
+{
+ gboolean xdg_dir_exists;
+
+ xdg_dir_exists = g_file_test(purple_data_dir(), G_FILE_TEST_EXISTS);
+ if (!xdg_dir_exists) {
+ MIGRATE_TO_XDG_DIR(purple_data_dir(), "certificates");
+ MIGRATE_TO_XDG_DIR(purple_cache_dir(), "icons");
+ MIGRATE_TO_XDG_DIR(purple_data_dir(), "logs");
+ MIGRATE_TO_XDG_DIR(purple_data_dir(), "pounces.xml");
+ }
+
+ return TRUE;
+}
--- a/libpurple/core.h Fri Jun 30 16:12:25 2017 +0300
+++ b/libpurple/core.h Fri Jun 30 17:31:16 2017 +0300
@@ -226,6 +226,19 @@
*/
GHashTable* purple_core_get_ui_info(void);
+/**
+ * purple_core_migrate_to_xdg_base_dirs:
+ *
+ * Migrates from legacy directory for libpurple to location following
+ * XDG base dir spec. https://developer.pidgin.im/ticket/10029
+ * NOTE This is not finished yet. Need to decide where other profile files
+ * should be moved.
+ *
+ * Returns: TRUE if migrated successfully, FALSE otherwise. On failure,
+ * the application must display an error to the user and then exit.
+ */
+gboolean purple_core_migrate_to_xdg_base_dirs(void);
+
G_END_DECLS
#endif /* _PURPLE_CORE_H_ */
--- a/libpurple/util.c Fri Jun 30 16:12:25 2017 +0300
+++ b/libpurple/util.c Fri Jun 30 17:31:16 2017 +0300
@@ -48,27 +48,6 @@
static JsonNode *escape_js_node = NULL;
static JsonGenerator *escape_js_gen = NULL;
-/* If legacy directory for libpurple exists, move it to location following
- * xdg base dir spec. https://developer.pidgin.im/ticket/10029
- */
-static void
-migrate_to_xdg_base_dirs(void)
-{
- const char *legacy_purple_dir;
- gboolean dir_exists;
-
- legacy_purple_dir = purple_user_dir();
- dir_exists = g_file_test(legacy_purple_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR);
- if (dir_exists) {
- purple_move_to_xdg_base_dir(purple_data_dir(), "certificates");
- purple_move_to_xdg_base_dir(purple_cache_dir(), "icons");
- purple_move_to_xdg_base_dir(purple_data_dir(), "logs");
- purple_move_to_xdg_base_dir(purple_data_dir(), "pounces.xml");
- }
-
- return;
-}
-
PurpleMenuAction *
purple_menu_action_new(const char *label, PurpleCallback callback, gpointer data,
GList *children)
@@ -168,8 +147,6 @@
escape_js_node = json_node_new(JSON_NODE_VALUE);
escape_js_gen = json_generator_new();
json_node_set_boolean(escape_js_node, FALSE);
-
- migrate_to_xdg_base_dirs();
}
void
@@ -2991,45 +2968,49 @@
return purple_xdg_dir(&data_dir, g_get_user_data_dir(), "data");
}
-void
+gboolean
purple_move_to_xdg_base_dir(const char *purple_xdg_dir, char *path)
{
- char *xdg_path;
+ gint mkdir_res;
+ gchar *xdg_path;
gboolean xdg_path_exists;
- /* Check if destination dir exists, otherwise create it */
- xdg_path_exists = g_file_test(purple_xdg_dir, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR);
- if (!xdg_path_exists) {
- gint mkdir_res;
-
- mkdir_res = purple_build_dir(purple_xdg_dir, S_IRWXU);
- if (mkdir_res == -1) {
- purple_debug_error("util", "Error creating xdg directory %s: %s; failed migration\n",
- purple_xdg_dir, g_strerror(errno));
- return;
- }
+ /* Create destination directory */
+ mkdir_res = purple_build_dir(purple_xdg_dir, S_IRWXU);
+ if (mkdir_res == -1) {
+ purple_debug_error("util", "Error creating xdg directory %s: %s; failed migration\n",
+ purple_xdg_dir, g_strerror(errno));
+ return FALSE;
}
xdg_path = g_build_filename(purple_xdg_dir, path, NULL);
xdg_path_exists = g_file_test(xdg_path, G_FILE_TEST_EXISTS);
if (!xdg_path_exists) {
- char *old_path;
+ gchar *old_path;
gboolean old_path_exists;
old_path = g_build_filename(purple_user_dir(), path, NULL);
old_path_exists = g_file_test(old_path, G_FILE_TEST_EXISTS);
if (old_path_exists) {
- g_rename(old_path, xdg_path);
+ int rename_res;
+
+ rename_res = g_rename(old_path, xdg_path);
+ if (rename_res == -1) {
+ purple_debug_error("util", "Error renaming %s to %s; failed migration\n",
+ old_path, xdg_path);
+ g_free(old_path);
+ g_free(xdg_path);
+
+ return FALSE;
+ }
}
g_free(old_path);
- old_path = NULL;
}
g_free(xdg_path);
- xdg_path = NULL;
-
- return;
+
+ return TRUE;
}
void purple_util_set_user_dir(const char *dir)
--- a/libpurple/util.h Fri Jun 30 16:12:25 2017 +0300
+++ b/libpurple/util.h Fri Jun 30 17:31:16 2017 +0300
@@ -834,8 +834,10 @@
*
* Moves file or directory from legacy user dir to XDG
* based dir.
+ *
+ * Returns: TRUE if moved successfully, FALSE otherwise
*/
-void
+gboolean
purple_move_to_xdg_base_dir(const char *purple_xdg_dir, char *path);
/**