Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package onedrive for openSUSE:Factory checked in at 2025-11-07 18:22:17 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/onedrive (Old) and /work/SRC/openSUSE:Factory/.onedrive.new.1980 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "onedrive" Fri Nov 7 18:22:17 2025 rev:33 rq:1316091 version:2.5.9 Changes: -------- --- /work/SRC/openSUSE:Factory/onedrive/onedrive.changes 2025-11-06 18:13:31.928242914 +0100 +++ /work/SRC/openSUSE:Factory/.onedrive.new.1980/onedrive.changes 2025-11-07 18:24:28.708539583 +0100 @@ -1,0 +2,13 @@ +Thu Nov 06 08:36:57 UTC 2025 - Johannes Kastl <[email protected]> + +- Update to version 2.5.9: + * Bug Fixes + - Fix Bug: Fix very high CPU & memory utilisation with 2.5.8 + when using --upload-only (#3515) CRITICAL BUGFIX + - Fix Bug: Unexpected deletion of empty nested folders during + first sync with 'sync_list' and --resync (#3513) CRITICAL + BUGFIX + * Other Changes | Fixes + - Updated documentation + +------------------------------------------------------------------- Old: ---- onedrive-2.5.8.obscpio New: ---- onedrive-2.5.9.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ onedrive.spec ++++++ --- /var/tmp/diff_new_pack.1FdQBa/_old 2025-11-07 18:24:29.652579235 +0100 +++ /var/tmp/diff_new_pack.1FdQBa/_new 2025-11-07 18:24:29.652579235 +0100 @@ -28,7 +28,7 @@ %endif Name: onedrive -Version: 2.5.8 +Version: 2.5.9 Release: 0 Summary: Client for One Drive Service for Linux License: GPL-3.0-only ++++++ _service ++++++ --- /var/tmp/diff_new_pack.1FdQBa/_old 2025-11-07 18:24:29.752583434 +0100 +++ /var/tmp/diff_new_pack.1FdQBa/_new 2025-11-07 18:24:29.768584107 +0100 @@ -2,7 +2,7 @@ <service name="obs_scm" mode="manual"> <param name="scm">git</param> <param name="url">https://github.com/abraunegg/onedrive.git</param> - <param name="revision">v2.5.8</param> + <param name="revision">v2.5.9</param> <param name="exclude">onedrive/tests/bad-file-name.tar.xz</param> <param name="versionformat">@PARENT_TAG@</param> <param name="versionrewrite-pattern">v(.*)</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.1FdQBa/_old 2025-11-07 18:24:29.816586123 +0100 +++ /var/tmp/diff_new_pack.1FdQBa/_new 2025-11-07 18:24:29.828586627 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/abraunegg/onedrive.git</param> - <param name="changesrevision">529fb4d85edc71c161527d6260325f443f40a328</param></service></servicedata> + <param name="changesrevision">b5bbf4f292e49a0557c271a73c09cc25ee79239c</param></service></servicedata> (No newline at EOF) ++++++ onedrive-2.5.8.obscpio -> onedrive-2.5.9.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/changelog.md new/onedrive-2.5.9/changelog.md --- old/onedrive-2.5.8/changelog.md 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/changelog.md 2025-11-06 01:00:35.000000000 +0100 @@ -2,6 +2,16 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 2.5.9 - 2025-11-06 + +### Fixed +* Fix Bug: Fix very high CPU & memory utilisation with 2.5.8 when using --upload-only (#3515) (CRITICAL BUGFIX) +* Fix Bug: Unexpected deletion of empty nested folders during first sync with 'sync_list' and --resync (#3513) (CRITICAL BUGFIX) + +### Updated +* Updated documentation + + ## 2.5.8 - 2025-11-05 ### Added diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/configure new/onedrive-2.5.9/configure --- old/onedrive-2.5.8/configure 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/configure 2025-11-06 01:00:35.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for onedrive v2.5.8. +# Generated by GNU Autoconf 2.69 for onedrive v2.5.9. # # Report bugs to <https://github.com/abraunegg/onedrive>. # @@ -579,8 +579,8 @@ # Identity of this package. PACKAGE_NAME='onedrive' PACKAGE_TARNAME='onedrive' -PACKAGE_VERSION='v2.5.8' -PACKAGE_STRING='onedrive v2.5.8' +PACKAGE_VERSION='v2.5.9' +PACKAGE_STRING='onedrive v2.5.9' PACKAGE_BUGREPORT='https://github.com/abraunegg/onedrive' PACKAGE_URL='' @@ -1231,7 +1231,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures onedrive v2.5.8 to adapt to many kinds of systems. +\`configure' configures onedrive v2.5.9 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1292,7 +1292,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of onedrive v2.5.8:";; + short | recursive ) echo "Configuration of onedrive v2.5.9:";; esac cat <<\_ACEOF @@ -1407,7 +1407,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -onedrive configure v2.5.8 +onedrive configure v2.5.9 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1424,7 +1424,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by onedrive $as_me v2.5.8, which was +It was created by onedrive $as_me v2.5.9, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3348,7 +3348,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by onedrive $as_me v2.5.8, which was +This file was extended by onedrive $as_me v2.5.9, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -3401,7 +3401,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -onedrive config.status v2.5.8 +onedrive config.status v2.5.9 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/configure.ac new/onedrive-2.5.9/configure.ac --- old/onedrive-2.5.8/configure.ac 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/configure.ac 2025-11-06 01:00:35.000000000 +0100 @@ -10,7 +10,7 @@ dnl - tag the release AC_PREREQ([2.69]) -AC_INIT([onedrive],[v2.5.8], [https://github.com/abraunegg/onedrive], [onedrive]) +AC_INIT([onedrive],[v2.5.9], [https://github.com/abraunegg/onedrive], [onedrive]) AC_CONFIG_SRCDIR([src/main.d]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/contrib/spec/onedrive.spec.in new/onedrive-2.5.9/contrib/spec/onedrive.spec.in --- old/onedrive-2.5.8/contrib/spec/onedrive.spec.in 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/contrib/spec/onedrive.spec.in 2025-11-06 01:00:35.000000000 +0100 @@ -37,7 +37,7 @@ %endif Name: onedrive -Version: 2.5.8 +Version: 2.5.9 Release: 1%{?dist} Summary: OneDrive Client for Linux Group: System Environment/Network diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/docs/usage.md new/onedrive-2.5.9/docs/usage.md --- old/onedrive-2.5.8/docs/usage.md 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/docs/usage.md 2025-11-06 01:00:35.000000000 +0100 @@ -532,6 +532,7 @@ * `fs.inotify.max_user_watches` To determine what the existing values are on your system, use the following commands: + **open files** ```text ulimit -Sn @@ -561,7 +562,9 @@ ``` To make a change to these variables using your file and folder count, use the following process: + **open files** + You can increase the limits for your current shell session temporarily using: ``` ulimit -n <new_value> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/src/clientSideFiltering.d new/onedrive-2.5.9/src/clientSideFiltering.d --- old/onedrive-2.5.8/src/clientSideFiltering.d 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/src/clientSideFiltering.d 2025-11-06 01:00:35.000000000 +0100 @@ -544,25 +544,36 @@ anywhereRuleStripped = syncListRuleEntry; } - if (canFind(path, anywhereRuleStripped)) { - // we matched the path to the rule - if (debugLogging) {addLogEntry(" - anywhere rule 'canFind' MATCH", ["debug"]);} + // If the input path is exactly the parent root (single segment) and that segment + // matches the rule's first segment, treat it as a match. + if (!ruleSegments.empty && count(pathSegments) == 1 && matchFirstSegmentToPathFirstSegment(ruleSegments, pathSegments)) { + if (debugLogging) { + addLogEntry(" - anywhere rule 'parent root' MATCH with '" ~ ruleSegments[0] ~ "'", ["debug"]); + } anywhereRuleMatched = true; - } else { - // no 'canFind' match, try via regex - if (debugLogging) {addLogEntry(" - anywhere rule 'canFind' NO_MATCH .. trying a regex match", ["debug"]);} - - // create regex from 'syncListRuleEntry' - auto allowedMask = regex(createRegexCompatiblePath(syncListRuleEntry)); - - // perform regex match attempt - if (matchAll(path, allowedMask)) { - // we regex matched the path to the rule - if (debugLogging) {addLogEntry(" - anywhere rule 'matchAll via regex' MATCH", ["debug"]);} + } + + if (!anywhereRuleMatched) { + if (canFind(path, anywhereRuleStripped)) { + // we matched the path to the rule + if (debugLogging) {addLogEntry(" - anywhere rule 'canFind' MATCH", ["debug"]);} anywhereRuleMatched = true; } else { - // no match - if (debugLogging) {addLogEntry(" - anywhere rule 'matchAll via regex' NO_MATCH", ["debug"]);} + // no 'canFind' match, try via regex + if (debugLogging) {addLogEntry(" - anywhere rule 'canFind' NO_MATCH .. trying a regex match", ["debug"]);} + + // create regex from 'syncListRuleEntry' + auto allowedMask = regex(createRegexCompatiblePath(syncListRuleEntry)); + + // perform regex match attempt + if (matchAll(path, allowedMask)) { + // we regex matched the path to the rule + if (debugLogging) {addLogEntry(" - anywhere rule 'matchAll via regex' MATCH", ["debug"]);} + anywhereRuleMatched = true; + } else { + // no match + if (debugLogging) {addLogEntry(" - anywhere rule 'matchAll via regex' NO_MATCH", ["debug"]);} + } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/src/main.d new/onedrive-2.5.9/src/main.d --- old/onedrive-2.5.8/src/main.d 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/src/main.d 2025-11-06 01:00:35.000000000 +0100 @@ -1353,99 +1353,86 @@ } } - // If we are doing --upload-only however .. we need to 'ignore' online change + // Adjust sleepTime based on webhook/websocket only when NOT upload_only if (!appConfig.getValueBool("upload_only")) { - - // Processing of online changes in near real-time .. update sleep time if (webhookEnabled) { - // If onedrive webhook is enabled - // Update sleep time based on renew interval Duration nextWebhookCheckDuration = oneDriveWebhook.getNextExpirationCheckDuration(); - if (nextWebhookCheckDuration < sleepTime) { - sleepTime = nextWebhookCheckDuration; - if (debugLogging) {addLogEntry("Update sleeping time (based on webhook next expiration check) to " ~ to!string(sleepTime), ["debug"]);} - } - // Webhook Notification reset to false for this loop + if (nextWebhookCheckDuration < sleepTime) sleepTime = nextWebhookCheckDuration; notificationReceived = false; - } else { - // Did the user configure to disable 'websocket' support? - if (!appConfig.getValueBool("disable_websocket_support")) { - // WebSocket support is enabled by default, but only if the version of libcurl supports it - if (appConfig.curlSupportsWebSockets) { - // Update sleep time based on renew interval - Duration nextWebsocketCheckDuration = oneDriveSocketIo.getNextExpirationCheckDuration(); - if (nextWebsocketCheckDuration < sleepTime) { - sleepTime = nextWebsocketCheckDuration; - if (debugLogging) {addLogEntry("Update sleeping time (based on WebSocket next expiration check) to " ~ to!string(sleepTime), ["debug"]);} - } - } - } + } else if (!appConfig.getValueBool("disable_websocket_support") && appConfig.curlSupportsWebSockets) { + Duration nextWebsocketCheckDuration = oneDriveSocketIo.getNextExpirationCheckDuration(); + if (nextWebsocketCheckDuration < sleepTime) sleepTime = nextWebsocketCheckDuration; } - - // Process signals from 'WebSockets' or 'Webhook' source - int res = 1; - // Process incoming notifications if any. - auto signalExists = receiveTimeout(sleepTime, (int msg) {res = msg;},(ulong _) {notificationReceived = true;}); - - // Debug values - if (debugLogging) { - addLogEntry("signalExists = " ~ to!string(signalExists), ["debug"]); - addLogEntry("worker status = " ~ to!string(res), ["debug"]); - addLogEntry("notificationReceived = " ~ to!string(notificationReceived), ["debug"]); + } + + // ALWAYS wait for FS worker, but only track webhook/websocket if NOT '--upload-only' + int res = 1; + bool onlineSignal = false; + + if (appConfig.getValueBool("upload_only")) { + receiveTimeout(sleepTime, (int msg) { res = msg; }); + } else { + receiveTimeout(sleepTime, (int msg) { res = msg; }, (ulong _) { onlineSignal = true; }); + } + + // Debug logging of worker status + if (debugLogging) { + addLogEntry("worker status = " ~ to!string(res), ["debug"]); + if (!appConfig.getValueBool("upload_only")) { + addLogEntry("notificationReceived = " ~ to!string(onlineSignal), ["debug"]); } + } - // Empirical evidence shows that Microsoft often sends multiple - // notifications for one single change, so we need a loop to exhaust - // all signals that were queued up by the webhook. The notifications - // do not contain any actual changes, and we will always rely do the - // delta endpoint to sync to latest. Therefore, only one sync run is - // good enough to catch up for multiple notifications. - if (notificationReceived) { - int signalCount = 1; - - while (true) { - signalExists = receiveTimeout(dur!"seconds"(-1), (ulong _) {}); - if (signalExists) { - signalCount++; - } else { - // Local change 'echo' debounce check - auto now = MonoTime.currTime(); - auto sinceLocal = now - lastLocalWrite; - - if (sinceLocal < localEchoDebounce) { - if (debugLogging) { - addLogEntry( - "Debounced online refresh signal (" ~ - to!string(sinceLocal.total!"msecs"()) ~ " ms since local write; threshold " ~ - to!string(localEchoDebounce.total!"msecs"()) ~ " ms)", - ["debug"] - ); - } - - // Ignore this reflection; skip the immediate online scan. - // Next push or the regular monitor cadence will pick up genuine remote changes. - break; - } - - // Not a debounce .. most likely a legitimate online change - if (webhookEnabled) { - addLogEntry("Received " ~ to!string(signalCount) ~ " refresh signal(s) from the Microsoft Graph API Webhook Endpoint"); - } else { - addLogEntry("Received " ~ to!string(signalCount) ~ " refresh signal(s) from the Microsoft Graph API WebSocket Endpoint"); + // Empirical evidence shows that Microsoft often sends multiple + // notifications for one single change, so we need a loop to exhaust + // all signals that were queued up by the webhook. The notifications + // do not contain any actual changes, and we will always rely do the + // delta endpoint to sync to latest. Therefore, only one sync run is + // good enough to catch up for multiple notifications. + + // Only process online notifications if NOT '--upload-only' + if (!appConfig.getValueBool("upload_only") && onlineSignal) { + int signalCount = 1; + while (true) { + auto more = receiveTimeout(dur!"seconds"(-1), (ulong _) {}); + if (more) { + signalCount++; + } else { + auto now = MonoTime.currTime(); + auto sinceLocal = now - lastLocalWrite; + if (sinceLocal < localEchoDebounce) { + if (debugLogging) { + addLogEntry( + "Debounced online refresh signal (" ~ + to!string(sinceLocal.total!"msecs"()) ~ " ms since local write; threshold " ~ + to!string(localEchoDebounce.total!"msecs"()) ~ " ms)", + ["debug"] + ); } - // Perform the online scan callback - oneDriveOnlineCallback(); + // Ignore this reflection; skip the immediate online scan. + // Next push or the regular monitor cadence will pick up genuine remote changes. break; } + + if (webhookEnabled) { + addLogEntry("Received " ~ to!string(signalCount) ~ " signal(s) from Webhook"); + } else { + addLogEntry("Received " ~ to!string(signalCount) ~ " signal(s) from WebSocket"); + } + + // Perform online callback action + oneDriveOnlineCallback(); + break; } } + } - if(res == -1) { - addLogEntry("ERROR: Monitor worker failed."); - monitorFailures = true; - performFileSystemMonitoring = false; - } + // Worker failure remains outside '--upload-only' filter + if (res == -1) { + addLogEntry("ERROR: Monitor worker failed."); + monitorFailures = true; + performFileSystemMonitoring = false; } } else { // no hooks available, nothing to check diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/onedrive-2.5.8/src/sync.d new/onedrive-2.5.9/src/sync.d --- old/onedrive-2.5.8/src/sync.d 2025-11-05 01:35:04.000000000 +0100 +++ new/onedrive-2.5.9/src/sync.d 2025-11-06 01:00:35.000000000 +0100 @@ -2630,6 +2630,13 @@ string existingItemPath = computeItemPath(queryDriveID, queryParentID) ~ "/" ~ existingDatabaseItem.name; if (debugLogging) {addLogEntry("existingItemPath calculated full path is: " ~ existingItemPath, ["debug"]);} + // Ensure that this path exists if this is an 'existing' database item + if (existingDatabaseItem.type == ItemType.dir) { + if (!exists(existingItemPath)) { + handleLocalDirectoryCreation(existingDatabaseItem, existingItemPath, onedriveJSONItem); + } + } + // Attempt to apply this changed item applyPotentiallyChangedItem(existingDatabaseItem, existingItemPath, newDatabaseItem, newItemPath, onedriveJSONItem); ++++++ onedrive.obsinfo ++++++ --- /var/tmp/diff_new_pack.1FdQBa/_old 2025-11-07 18:24:30.588618549 +0100 +++ /var/tmp/diff_new_pack.1FdQBa/_new 2025-11-07 18:24:30.600619053 +0100 @@ -1,5 +1,5 @@ name: onedrive -version: 2.5.8 -mtime: 1762302904 -commit: 529fb4d85edc71c161527d6260325f443f40a328 +version: 2.5.9 +mtime: 1762387235 +commit: b5bbf4f292e49a0557c271a73c09cc25ee79239c
