Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package seadrive-fuse for openSUSE:Factory checked in at 2026-06-08 14:23:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/seadrive-fuse (Old) and /work/SRC/openSUSE:Factory/.seadrive-fuse.new.2375 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "seadrive-fuse" Mon Jun 8 14:23:28 2026 rev:11 rq:1357904 version:3.0.23 Changes: -------- --- /work/SRC/openSUSE:Factory/seadrive-fuse/seadrive-fuse.changes 2026-05-12 19:30:17.388092681 +0200 +++ /work/SRC/openSUSE:Factory/.seadrive-fuse.new.2375/seadrive-fuse.changes 2026-06-08 14:28:24.384739166 +0200 @@ -1,0 +2,5 @@ +Mon Jun 8 08:50:47 UTC 2026 - Paolo Stivanin <[email protected]> + +- update to 3.0.23 (no changelog). + +------------------------------------------------------------------- Old: ---- seadrive-fuse-3.0.22.tar.gz New: ---- seadrive-fuse-3.0.23.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ seadrive-fuse.spec ++++++ --- /var/tmp/diff_new_pack.zY31tM/_old 2026-06-08 14:28:25.152771035 +0200 +++ /var/tmp/diff_new_pack.zY31tM/_new 2026-06-08 14:28:25.152771035 +0200 @@ -17,7 +17,7 @@ Name: seadrive-fuse -Version: 3.0.22 +Version: 3.0.23 Release: 0 Summary: SeaDrive daemon with FUSE interface License: GPL-2.0-only ++++++ seadrive-fuse-3.0.22.tar.gz -> seadrive-fuse-3.0.23.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/seadrive-fuse-3.0.22/configure.ac new/seadrive-fuse-3.0.23/configure.ac --- old/seadrive-fuse-3.0.22/configure.ac 2026-05-08 05:21:34.000000000 +0200 +++ new/seadrive-fuse-3.0.23/configure.ac 2026-06-04 04:55:24.000000000 +0200 @@ -2,7 +2,7 @@ AC_PREREQ(2.61) -AC_INIT([seadrive], [3.0.22], [[email protected]]) +AC_INIT([seadrive], [3.0.23], [[email protected]]) AC_CONFIG_HEADER([config.h]) AC_CONFIG_MACRO_DIR([m4]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/seadrive-fuse-3.0.22/debian/changelog new/seadrive-fuse-3.0.23/debian/changelog --- old/seadrive-fuse-3.0.22/debian/changelog 2026-05-08 05:21:34.000000000 +0200 +++ new/seadrive-fuse-3.0.23/debian/changelog 2026-06-04 04:55:24.000000000 +0200 @@ -1,3 +1,9 @@ +seadrive-daemon (3.0.23) unstable; urgency=low + + * new upstream release + + -- Jonathan Xu <[email protected]> Tue, 2 Jun 2026 10:30:00 +0800 + seadrive-daemon (3.0.22) unstable; urgency=low * new upstream release diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/seadrive-fuse-3.0.22/src/fuse-ops.c new/seadrive-fuse-3.0.23/src/fuse-ops.c --- old/seadrive-fuse-3.0.22/src/fuse-ops.c 2026-05-08 05:21:34.000000000 +0200 +++ new/seadrive-fuse-3.0.23/src/fuse-ops.c 2026-06-04 04:55:24.000000000 +0200 @@ -1875,7 +1875,7 @@ seaf_debug ("setxattr: %s %s\n", path, name); // Manual setting of extended properties related to file locking is only supported. - if (g_strcmp0("name", "user.seafile-status") != 0){ + if (g_strcmp0(name, "user.seafile-status") != 0){ return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/seadrive-fuse-3.0.22/src/journal-mgr.c new/seadrive-fuse-3.0.23/src/journal-mgr.c --- old/seadrive-fuse-3.0.22/src/journal-mgr.c 2026-05-08 05:21:34.000000000 +0200 +++ new/seadrive-fuse-3.0.23/src/journal-mgr.c 2026-06-04 04:55:24.000000000 +0200 @@ -146,7 +146,7 @@ goto out; } } else if (type == OP_TYPE_CREATE_FILE || type == OP_TYPE_UPDATE_FILE || - type == OP_TYPE_UPDATE_ATTR) { + type == OP_TYPE_UPDATE_ATTR || type == OP_TYPE_MKDIR) { if (!json_object_has_member (obj, "size")) { seaf_warning ("Invalid operation format: no size.\n"); goto out; @@ -186,7 +186,7 @@ if (op->type == OP_TYPE_RENAME) { json_object_set_string_member (obj, "new_path", op->new_path); } else if (op->type == OP_TYPE_CREATE_FILE || op->type == OP_TYPE_UPDATE_FILE || - op->type == OP_TYPE_UPDATE_ATTR) { + op->type == OP_TYPE_UPDATE_ATTR || op->type == OP_TYPE_MKDIR) { json_object_set_int_member (obj, "size", op->size); json_object_set_int_member (obj, "mtime", op->mtime); json_object_set_int_member (obj, "mode", op->mode); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/seadrive-fuse-3.0.22/src/sync-mgr.c new/seadrive-fuse-3.0.23/src/sync-mgr.c --- old/seadrive-fuse-3.0.22/src/sync-mgr.c 2026-05-08 05:21:34.000000000 +0200 +++ new/seadrive-fuse-3.0.23/src/sync-mgr.c 2026-06-04 04:55:24.000000000 +0200 @@ -154,6 +154,7 @@ typedef struct _SyncTask SyncTask; struct _SyncError { + char *server; char *repo_id; char *repo_name; char *path; @@ -186,6 +187,7 @@ GAsyncQueue *lock_file_job_queue; + GHashTable *server_net_errors; GList *sync_errors; pthread_mutex_t errors_lock; @@ -628,26 +630,40 @@ static void record_sync_error (SeafSyncManager *mgr, + const char *server, const char *repo_id, const char *repo_name, const char *path, int err_id) { GList *errors = mgr->priv->sync_errors, *ptr; SyncError *err, *new_err; gboolean found = FALSE; + int err_level = sync_error_level (err_id); + gboolean skip_notif = FALSE; // record sync error to database. seaf_repo_manager_record_sync_error (seaf->repo_mgr, repo_id, repo_name, path, err_id); pthread_mutex_lock (&mgr->priv->errors_lock); + if (err_level == SYNC_ERROR_LEVEL_NETWORK && server) { + if (g_hash_table_lookup (mgr->priv->server_net_errors, server)) { + skip_notif = TRUE; + } else { + int dummy; + g_hash_table_insert (mgr->priv->server_net_errors, g_strdup(server), &dummy); + } + } + for (ptr = errors; ptr; ptr = ptr->next) { err = ptr->data; - if (g_strcmp0 (err->repo_id, repo_id) == 0 && + if (g_strcmp0 (err->server, server) == 0 && + g_strcmp0 (err->repo_id, repo_id) == 0 && g_strcmp0 (err->path, path) == 0) { found = TRUE; if (err->err_id != err_id) { err->err_id = err_id; - send_sync_error_notification (repo_id, repo_name, path, err_id); + if (!skip_notif) + send_sync_error_notification (repo_id, repo_name, path, err_id); } err->timestamp = (gint64)time(NULL); break; @@ -656,6 +672,7 @@ if (!found) { new_err = g_new0 (SyncError, 1); + new_err->server = g_strdup(server); new_err->repo_id = g_strdup(repo_id); new_err->repo_name = g_strdup(repo_name); new_err->path = g_strdup(path); @@ -663,14 +680,15 @@ new_err->timestamp = (gint64)time(NULL); mgr->priv->sync_errors = g_list_prepend (mgr->priv->sync_errors, new_err); - send_sync_error_notification (repo_id, repo_name, path, err_id); + if (!skip_notif) + send_sync_error_notification (repo_id, repo_name, path, err_id); } pthread_mutex_unlock (&mgr->priv->errors_lock); } static void -remove_sync_error (SeafSyncManager *mgr, const char *repo_id, const char *path) +remove_network_error (SeafSyncManager *mgr, const char *server, const char *repo_id, const char *path) { GList *ptr; SyncError *err; @@ -685,9 +703,14 @@ if (err_level != SYNC_ERROR_LEVEL_NETWORK) { continue; } - if (g_strcmp0 (err->repo_id, repo_id) == 0 && + if (err->server != NULL) { + g_hash_table_remove (mgr->priv->server_net_errors, err->server); + } + if (g_strcmp0 (err->server, server) == 0 && + g_strcmp0 (err->repo_id, repo_id) == 0 && g_strcmp0 (err->path, path) == 0) { mgr->priv->sync_errors = g_list_delete_link (mgr->priv->sync_errors, ptr); + g_free (err->server); g_free (err->repo_id); g_free (err->repo_name); g_free (err->path); @@ -704,6 +727,7 @@ { GList *ptr; SyncError *err; + int err_level = sync_error_level (err_id); pthread_mutex_lock (&mgr->priv->errors_lock); @@ -713,6 +737,10 @@ g_strcmp0 (err->path, path) == 0 && err->err_id == err_id) { mgr->priv->sync_errors = g_list_delete_link (mgr->priv->sync_errors, ptr); + if (err_level == SYNC_ERROR_LEVEL_NETWORK && err->server != NULL) { + g_hash_table_remove (mgr->priv->server_net_errors, err->server); + } + g_free (err->server); g_free (err->repo_id); g_free (err->repo_name); g_free (err->path); @@ -738,6 +766,8 @@ for (ptr = mgr->priv->sync_errors; ptr; ptr = ptr->next) { err = ptr->data; obj = json_object (); + if (err->server) + json_object_set_new (obj, "server", json_string(err->server)); if (err->repo_id) json_object_set_new (obj, "repo_id", json_string(err->repo_id)); if (err->repo_name) @@ -919,8 +949,12 @@ --(task->info->manager->priv->n_running_tasks); update_sync_info_error_state (task, new_state); - if (new_state == SYNC_STATE_DONE) - remove_sync_error (seaf->sync_mgr, task->info->repo_info->id, NULL); + if (new_state == SYNC_STATE_DONE) { + const char *server = NULL; + if (task->repo) + server = task->repo->server; + remove_network_error (seaf->sync_mgr, server, task->info->repo_info->id, NULL); + } if (task->repo) seaf_repo_unref (task->repo); @@ -970,7 +1004,11 @@ sync_error_id = transfer_error_to_error_id (task->tx_error_code); else sync_error_id = SYNC_ERROR_ID_GENERAL_ERROR; + const char *server = NULL; + if (task->repo) + server = task->repo->server; record_sync_error (seaf->sync_mgr, + server, task->info->repo_info->id, task->info->repo_info->name, task->unsyncable_path, @@ -1049,6 +1087,9 @@ mgr->priv->lock_file_job_queue = g_async_queue_new (); + mgr->priv->server_net_errors = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, NULL); + pthread_mutex_init (&mgr->priv->errors_lock, NULL); mgr->priv->cache_file_task_queue = g_async_queue_new (); @@ -1392,7 +1433,7 @@ result->http_status == HTTP_SERVERR_TIMEOUT) { seaf_repo_manager_set_account_server_disconnected (seaf->repo_mgr, account->server, account->username, TRUE); } - record_sync_error (seaf->sync_mgr, NULL, NULL, NULL, + record_sync_error (seaf->sync_mgr, account->server, NULL, NULL, NULL, transfer_error_to_error_id (result->error_code)); g_atomic_int_set (&seaf->sync_mgr->priv->server_disconnected, 1); return; @@ -1403,7 +1444,7 @@ if (account->server_disconnected) { seaf_sync_manager_check_locks_and_folder_perms (seaf->sync_mgr, account->fileserver_addr); } - remove_sync_error (seaf->sync_mgr, NULL, NULL); + remove_network_error (seaf->sync_mgr, account->server, NULL, NULL); g_atomic_int_set (&seaf->sync_mgr->priv->server_disconnected, 0); seaf_repo_manager_set_account_server_disconnected (seaf->repo_mgr, account->server, account->username, FALSE); }
