Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package FreeFileSync for openSUSE:Factory checked in at 2024-01-31 23:54:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/FreeFileSync (Old) and /work/SRC/openSUSE:Factory/.FreeFileSync.new.1815 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "FreeFileSync" Wed Jan 31 23:54:57 2024 rev:21 rq:1142943 version:13.3 Changes: -------- --- /work/SRC/openSUSE:Factory/FreeFileSync/FreeFileSync.changes 2023-11-28 22:20:14.783647194 +0100 +++ /work/SRC/openSUSE:Factory/.FreeFileSync.new.1815/FreeFileSync.changes 2024-01-31 23:55:17.764336296 +0100 @@ -1,0 +2,10 @@ +Wed Jan 31 07:08:15 UTC 2024 - Paolo Stivanin <i...@paolostivanin.com> + +- Update to 13.3: + * Completed CASA security assessment for Google Drive + * Use system temp folder for auto-updating + * Ignore errors when setting directory attributes is unsupported + * Save GUI sync log file even when cancelled + * Fixed Business Edition install over existing installation + +------------------------------------------------------------------- Old: ---- FreeFileSync_13.2_Source.zip New: ---- FreeFileSync_13.3_Source.zip ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ FreeFileSync.spec ++++++ --- /var/tmp/diff_new_pack.jlzxU3/_old 2024-01-31 23:55:20.820446577 +0100 +++ /var/tmp/diff_new_pack.jlzxU3/_new 2024-01-31 23:55:20.836447155 +0100 @@ -1,7 +1,7 @@ # # spec file for package FreeFileSync # -# Copyright (c) 2023 SUSE LLC +# Copyright (c) 2024 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -21,7 +21,7 @@ %endif Name: FreeFileSync -Version: 13.2 +Version: 13.3 Release: 0 Summary: Backup software to synchronize files and folders License: GPL-3.0-or-later ++++++ FreeFileSync-remove_ifdef_exceptions.patch ++++++ --- /var/tmp/diff_new_pack.jlzxU3/_old 2024-01-31 23:55:21.236461590 +0100 +++ /var/tmp/diff_new_pack.jlzxU3/_new 2024-01-31 23:55:21.268462744 +0100 @@ -1,27 +1,31 @@ -diff -ru orig/FreeFileSync/Source/application.cpp mod/FreeFileSync/Source/application.cpp ---- orig/FreeFileSync/Source/application.cpp 2023-10-23 19:11:01.000000000 +0200 -+++ mod/FreeFileSync/Source/application.cpp 2023-11-06 08:28:37.761541047 +0100 -@@ -245,9 +245,6 @@ +Index: FreeFileSync-13.3/FreeFileSync/Source/application.cpp +=================================================================== +--- FreeFileSync-13.3.orig/FreeFileSync/Source/application.cpp ++++ FreeFileSync-13.3/FreeFileSync/Source/application.cpp +@@ -243,10 +243,6 @@ wxLayoutDirection Application::GetLayout + + int Application::OnRun() { - try - { -#if wxUSE_EXCEPTIONS -#error why is wxWidgets uncaught exception handling enabled!? -#endif +- + //exception => Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console [[maybe_unused]] const int rc = wxApp::OnRun(); - } - catch (const std::bad_alloc& e) //the only kind of exception we don't want crash dumps for -diff -ru orig/FreeFileSync/Source/RealTimeSync/application.cpp mod/FreeFileSync/Source/RealTimeSync/application.cpp ---- orig/FreeFileSync/Source/RealTimeSync/application.cpp 2023-10-23 19:11:01.000000000 +0200 -+++ mod/FreeFileSync/Source/RealTimeSync/application.cpp 2023-11-06 10:00:53.809721258 +0100 -@@ -211,9 +211,6 @@ + return static_cast<int>(exitCode_); +Index: FreeFileSync-13.3/FreeFileSync/Source/RealTimeSync/application.cpp +=================================================================== +--- FreeFileSync-13.3.orig/FreeFileSync/Source/RealTimeSync/application.cpp ++++ FreeFileSync-13.3/FreeFileSync/Source/RealTimeSync/application.cpp +@@ -209,10 +209,6 @@ wxLayoutDirection Application::GetLayout + + int Application::OnRun() { - try - { -#if wxUSE_EXCEPTIONS -#error why is wxWidgets uncaught exception handling enabled!? -#endif +- + //exception => Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console [[maybe_unused]] const int rc = wxApp::OnRun(); - } - catch (const std::bad_alloc& e) //the only kind of exception we don't want crash dumps for + return static_cast<int>(FfsExitCode::success); //process exit code ++++++ FreeFileSync_13.2_Source.zip -> FreeFileSync_13.3_Source.zip ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/Changelog.txt new/Changelog.txt --- old/Changelog.txt 2023-11-23 15:11:10.000000000 +0100 +++ new/Changelog.txt 2024-01-07 19:25:40.000000000 +0100 @@ -1,7 +1,16 @@ -FreeFileSync 13.2 +FreeFileSync 13.3 [2024-01-07] +------------------------------ +Completed CASA security assessment for Google Drive +Use system temp folder for auto-updating +Ignore errors when setting directory attributes is unsupported +Save GUI sync log file even when cancelled +Fixed Business Edition install over existing installation + + +FreeFileSync 13.2 [2023-11-23] ------------------------------ Complete high-DPI/Retina display support (macOS) -Prevent versioning files from being moved to versioning recursively +Prevent files from being moved to versioning recursively Fixed tooltip line wrap bug for moved files (Windows) Return first FTP parsing error when trying multiple variants Allow file times from the future for Linux-style FTP listing Binary files old/FreeFileSync/Build/Resources/Icons.zip and new/FreeFileSync/Build/Resources/Icons.zip differ Binary files old/FreeFileSync/Build/Resources/Languages.zip and new/FreeFileSync/Build/Resources/Languages.zip differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Build/Resources/cacert.pem new/FreeFileSync/Build/Resources/cacert.pem --- old/FreeFileSync/Build/Resources/cacert.pem 2023-11-23 15:11:10.000000000 +0100 +++ new/FreeFileSync/Build/Resources/cacert.pem 2024-01-07 19:25:40.000000000 +0100 @@ -1,7 +1,7 @@ ## ## Bundle of CA Root Certificates ## -## Certificate data from Mozilla as of: Tue Aug 22 03:12:04 2023 GMT +## Certificate data from Mozilla as of: Tue Dec 12 04:12:04 2023 GMT ## ## This is a bundle of X.509 certificates of public Certificate Authorities ## (CA). These were automatically extracted from Mozilla's root certificates @@ -14,7 +14,7 @@ ## Just configure this file as the SSLCACertificateFile. ## ## Conversion done with mk-ca-bundle.pl version 1.29. -## SHA256: 0ff137babc6a5561a9cfbe9f29558972e5b528202681b7d3803d03a3e82922bd +## SHA256: 1970dd65858925d68498d2356aea6d03f764422523c5887deca8ce3ba9e1f845 ## @@ -200,27 +200,6 @@ qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= -----END CERTIFICATE----- -Security Communication Root CA -============================== ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP -U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw -8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM -DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX -5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd -DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 -JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw -DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g -0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a -mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ -s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ -6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi -FL39vmwLAw== ------END CERTIFICATE----- - XRamp Global CA Root ==================== -----BEGIN CERTIFICATE----- @@ -669,39 +648,6 @@ kpeDMdmztcpHWD9f -----END CERTIFICATE----- -Autoridad de Certificacion Firmaprofesional CIF A62634068 -========================================================= ------BEGIN CERTIFICATE----- -MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA -BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw -QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB -NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD -Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P -B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY -7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH -ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI -plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX -MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX -LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK -bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU -vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud -EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH -DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp -cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA -bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx -ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx -51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk -R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP -T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f -Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl -osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR -crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR -saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD -KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi -6Et8Vcad+qMUu2WFbm5PEn4KPJ2V ------END CERTIFICATE----- - Izenpe.com ========== -----BEGIN CERTIFICATE----- @@ -3449,3 +3395,140 @@ PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W HYMfRsCbvUOZ58SWLs5fyQ== -----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx +eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot +6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 +Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW +pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M +MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE +SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 +Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 +3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft +nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 +uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq +ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs +vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c +Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif +BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 +lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo +KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH ++VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 +5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM +3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck +jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf +Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W +NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ +o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ +oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc +1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM +6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V +rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx +7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC +e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W +Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp +M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf +hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr +eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE +VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t +Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx +cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF +1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa +MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd +gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O +HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm +YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr +dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ +iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN +lM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/RealTimeSync/application.cpp new/FreeFileSync/Source/RealTimeSync/application.cpp --- old/FreeFileSync/Source/RealTimeSync/application.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/RealTimeSync/application.cpp 2024-01-07 19:25:43.000000000 +0100 @@ -209,18 +209,11 @@ int Application::OnRun() { - try - { #if wxUSE_EXCEPTIONS #error why is wxWidgets uncaught exception handling enabled!? #endif + + //exception => Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console [[maybe_unused]] const int rc = wxApp::OnRun(); - } - catch (const std::bad_alloc& e) //the only kind of exception we don't want crash dumps for - { - notifyAppError(utfTo<std::wstring>(e.what())); - terminateProcess(static_cast<int>(FfsExitCode::exception)); - } - //catch (...) -> Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console return static_cast<int>(FfsExitCode::success); //process exit code } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/afs/abstract.h new/FreeFileSync/Source/afs/abstract.h --- old/FreeFileSync/Source/afs/abstract.h 2023-11-23 15:11:11.000000000 +0100 +++ new/FreeFileSync/Source/afs/abstract.h 2024-01-07 19:25:41.000000000 +0100 @@ -289,14 +289,9 @@ const std::function<void()>& onDeleteTargetFile /*throw X*/, //accummulated delta != file size! consider ADS, sparse, compressed files const zen::IoCallback& notifyUnbufferedIO /*throw X*/); - - struct FolderCopyResult - { - std::optional<zen::FileError> errorAttribs; - }; //already existing: fail //symlink handling: follow - static FolderCopyResult copyNewFolder(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions); //throw FileError + static void copyNewFolder(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions); //throw FileError //already existing: fail static void copySymlink(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions); //throw FileError @@ -425,7 +420,7 @@ //symlink handling: follow //already existing: fail - virtual FolderCopyResult copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const = 0; //throw FileError + virtual void copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const = 0; //throw FileError //already existing: fail virtual void copySymlinkForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const = 0; //throw FileError @@ -557,7 +552,7 @@ inline -AbstractFileSystem::FolderCopyResult AbstractFileSystem::copyNewFolder(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) //throw FileError +void AbstractFileSystem::copyNewFolder(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) //throw FileError { using namespace zen; @@ -566,15 +561,12 @@ //already existing: fail createFolderPlain(targetPath); //throw FileError - FolderCopyResult result; if (copyFilePermissions) - result.errorAttribs = FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(getDisplayPath(targetPath))), + throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(getDisplayPath(targetPath))), _("Operation not supported between different devices.")); - - return result; } else - return sourcePath.afsDevice.ref().copyNewFolderForSameAfsType(sourcePath.afsPath, targetPath, copyFilePermissions); //throw FileError + sourcePath.afsDevice.ref().copyNewFolderForSameAfsType(sourcePath.afsPath, targetPath, copyFilePermissions); //throw FileError } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/afs/ftp.cpp new/FreeFileSync/Source/afs/ftp.cpp --- old/FreeFileSync/Source/afs/ftp.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/afs/ftp.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -402,12 +402,9 @@ setCurlOption({CURLOPT_TCP_KEEPALIVE, 1}); //throw SysError //=> CURLOPT_TCP_KEEPIDLE (=delay) and CURLOPT_TCP_KEEPINTVL both default to 60 sec -warn_static("remove after test") //https://freefilesync.org/forum/viewtopic.php?p=41482#p41482 -#if 0 - setCurlOption({CURLOPT_TCP_KEEPIDLE, 30 /*[sec]*/}); //throw SysError - setCurlOption({CURLOPT_TCP_KEEPINTVL, 30 /*[sec]*/}); //throw SysError -#endif - + //default is 60 sec (sufficient!?): + //setCurlOption({CURLOPT_TCP_KEEPIDLE, 30 /*[sec]*/}); //throw SysError + //setCurlOption({CURLOPT_TCP_KEEPINTVL, 30 /*[sec]*/}); //throw SysError std::optional<SysError> socketException; @@ -558,7 +555,7 @@ long ftpStatusCode = 0; //optional /*const CURLcode rc =*/ ::curl_easy_getinfo(easyHandle_, CURLINFO_RESPONSE_CODE, &ftpStatusCode); //https://en.wikipedia.org/wiki/List_of_FTP_server_return_codes - assert(ftpStatusCode == 0 || 400 <= ftpStatusCode && ftpStatusCode < 600); + assert(rcPerf == CURLE_OPERATION_TIMEDOUT || rcPerf == CURLE_ABORTED_BY_CALLBACK || ftpStatusCode == 0 || 400 <= ftpStatusCode && ftpStatusCode < 600); if (ftpStatusCode != 0) throw SysErrorFtpProtocol(formatSystemError("curl_easy_perform", formatCurlStatusCode(rcPerf), errorMsg), ftpStatusCode); @@ -1900,8 +1897,8 @@ {CURLOPT_WRITEFUNCTION, onBytesReceivedWrapper}, {CURLOPT_IGNORE_CONTENT_LENGTH, 1L}, //skip FTP "SIZE" command before download (=> download until actual EOF if file size changes) - //{CURLOPT_BUFFERSIZE, 256 * 1024} -> defaults is 16 kB which seems to correspond to SSL packet size - //=> setting larget buffers size does nothing (recv still returns only 16 kB) + //{CURLOPT_BUFFERSIZE, 256 * 1024} -> default is 16 kB which seems to correspond to TLS packet size + //=> setting larger buffer size does nothing (recv still returns only 16 kB) }, true /*requestUtf8*/); //throw SysError, SysErrorPassword, SysErrorFtpProtocol }); } @@ -2440,19 +2437,13 @@ //symlink handling: follow //already existing: fail - FolderCopyResult copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError + void copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError { //already existing: fail AFS::createFolderPlain(targetPath); //throw FileError - FolderCopyResult result; - try - { if (copyFilePermissions) throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(targetPath))), _("Operation not supported by device.")); - } - catch (const FileError& e) { result.errorAttribs = e; } - return result; } //already existing: fail diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/afs/gdrive.cpp new/FreeFileSync/Source/afs/gdrive.cpp --- old/FreeFileSync/Source/afs/gdrive.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/afs/gdrive.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -3704,19 +3704,13 @@ //symlink handling: follow //already existing: fail - FolderCopyResult copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError + void copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError { //already existing: 1. fails or 2. creates duplicate (unlikely) AFS::createFolderPlain(targetPath); //throw FileError - FolderCopyResult result; - try - { if (copyFilePermissions) throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(targetPath))), _("Operation not supported by device.")); - } - catch (const FileError& e) { result.errorAttribs = e; } - return result; } //already existing: fail diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/afs/native.cpp new/FreeFileSync/Source/afs/native.cpp --- old/FreeFileSync/Source/afs/native.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/afs/native.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -583,7 +583,7 @@ //symlink handling: follow //already existing: fail - FolderCopyResult copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError + void copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError { initComForThread(); //throw FileError @@ -592,16 +592,14 @@ zen::createDirectory(targetPathNative); //throw FileError, ErrorTargetExisting - FolderCopyResult result; try { copyDirectoryAttributes(sourcePathNative, targetPathNative); //throw FileError + } + catch (FileError&) {} //[!] too unimportant + too frequent for external devices, e.g. "ERROR_INVALID_PARAMETER [SetFileInformationByHandle(FileBasicInfo)]" on Samba share if (copyFilePermissions) copyItemPermissions(sourcePathNative, targetPathNative, ProcSymlink::follow); //throw FileError - } - catch (const FileError& e) { result.errorAttribs = e; } - return result; } //already existing: fail diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/afs/sftp.cpp new/FreeFileSync/Source/afs/sftp.cpp --- old/FreeFileSync/Source/afs/sftp.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/afs/sftp.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -1793,19 +1793,13 @@ //symlink handling: follow //already existing: fail - FolderCopyResult copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError + void copyNewFolderForSameAfsType(const AfsPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions) const override //throw FileError { //already existing: fail AFS::createFolderPlain(targetPath); //throw FileError - FolderCopyResult result; - try - { if (copyFilePermissions) throw FileError(replaceCpy(_("Cannot write permissions of %x."), L"%x", fmtPath(AFS::getDisplayPath(targetPath))), _("Operation not supported by device.")); - } - catch (const FileError& e) { result.errorAttribs = e; } - return result; } //already existing: fail diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/application.cpp new/FreeFileSync/Source/application.cpp --- old/FreeFileSync/Source/application.cpp 2023-11-23 15:11:12.000000000 +0100 +++ new/FreeFileSync/Source/application.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -243,19 +243,12 @@ int Application::OnRun() { - try - { #if wxUSE_EXCEPTIONS #error why is wxWidgets uncaught exception handling enabled!? #endif + + //exception => Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console [[maybe_unused]] const int rc = wxApp::OnRun(); - } - catch (const std::bad_alloc& e) //the only kind of exception we don't want crash dumps for - { - notifyAppError(utfTo<std::wstring>(e.what())); - terminateProcess(static_cast<int>(FfsExitCode::exception)); - } - //catch (...) -> Windows: let it crash and create mini dump!!! Linux/macOS: std::exception::what() logged to console return static_cast<int>(exitCode_); } @@ -624,9 +617,9 @@ if (statusHandler.taskCancelled() && *statusHandler.taskCancelled() == CancelReason::user) ; /* user cancelled => don't run post sync command + => don't run post sync action => don't send email notification - => don't play sound notification - => don't run post sync action */ + => don't play sound notification */ else { //--------------------- post sync command ---------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/base/db_file.cpp new/FreeFileSync/Source/base/db_file.cpp --- old/FreeFileSync/Source/base/db_file.cpp 2023-11-23 15:11:12.000000000 +0100 +++ new/FreeFileSync/Source/base/db_file.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -606,8 +606,7 @@ .right = InSyncDescrFile{file.getLastWriteTime<SelectSide::right>(), file.getFilePrint<SelectSide::right>()}, .cmpVar = activeCmpVar_, .fileSize = file.getFileSize<SelectSide::left>(), - } - ); + }); toPreserve.insert(fileName); } else //not in sync: preserve last synchronous state diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/base/synchronization.cpp new/FreeFileSync/Source/base/synchronization.cpp --- old/FreeFileSync/Source/base/synchronization.cpp 2023-11-23 15:11:12.000000000 +0100 +++ new/FreeFileSync/Source/base/synchronization.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -723,8 +723,8 @@ { parallelScope([sourcePath, targetPath, copyFilePermissions] { AFS::copySymlink(sourcePath, targetPath, copyFilePermissions); /*throw FileError*/ }, singleThread); } inline -AFS::FolderCopyResult copyNewFolder(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions, std::mutex& singleThread) //throw FileError -{ return parallelScope([sourcePath, targetPath, copyFilePermissions] { return AFS::copyNewFolder(sourcePath, targetPath, copyFilePermissions); /*throw FileError*/ }, singleThread); } +void copyNewFolder(const AbstractPath& sourcePath, const AbstractPath& targetPath, bool copyFilePermissions, std::mutex& singleThread) //throw FileError +{ parallelScope([sourcePath, targetPath, copyFilePermissions] { return AFS::copyNewFolder(sourcePath, targetPath, copyFilePermissions); /*throw FileError*/ }, singleThread); } inline void removeFilePlain(const AbstractPath& filePath, std::mutex& singleThread) //throw FileError @@ -2175,10 +2175,7 @@ try { //already existing: fail - AFS::FolderCopyResult result = parallel::copyNewFolder(folder.getAbstractPath<sideSrc>(), targetPath, copyFilePermissions_, singleThread_); //throw FileError - - if (result.errorAttribs) //log only; no popup - acb_.logMessage(result.errorAttribs->toString(), PhaseCallback::MsgType::warning); //throw ThreadStopRequest + parallel::copyNewFolder(folder.getAbstractPath<sideSrc>(), targetPath, copyFilePermissions_, singleThread_); //throw FileError } catch (FileError&) { @@ -2405,10 +2402,7 @@ if (const std::optional<AbstractPath> parentPath = AFS::getParentPath(folderPath)) AFS::createFolderIfMissingRecursion(*parentPath); //throw FileError - AFS::FolderCopyResult result = AFS::copyNewFolder(baseFolder.getAbstractPath<sideSrc>(), folderPath, copyFilePermissions); //throw FileError - - if (result.errorAttribs) //log only; no popup - callback.logMessage(result.errorAttribs->toString(), PhaseCallback::MsgType::warning); //throw X + AFS::copyNewFolder(baseFolder.getAbstractPath<sideSrc>(), folderPath, copyFilePermissions); //throw FileError } else AFS::createFolderIfMissingRecursion(folderPath); //throw FileError diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/base/versioning.cpp new/FreeFileSync/Source/base/versioning.cpp --- old/FreeFileSync/Source/base/versioning.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/base/versioning.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -181,7 +181,7 @@ } -void FileVersioner::checkPathConflict(const AbstractPath& itemPath) const //throw FileError +void FileVersioner::checkPathConflict(const AbstractPath& itemPath, const Zstring& relativePath) const //throw FileError { if (std::optional<PathDependency> pd = getPathDependency(itemPath, versioningFolderPath_)) { @@ -190,7 +190,7 @@ //prevent files from being moved to versioning recursively: throw FileError(trimCpy(replaceCpy(replaceCpy(_("Cannot move %x to %y."), L"%x", L'\n' + fmtPath(AFS::getDisplayPath(itemPath))), - L"%y", L'\n' + fmtPath(AFS::getDisplayPath(versioningFolderPath_)))), + L"%y", L'\n' + fmtPath(AFS::getDisplayPath(generateVersionedPath(relativePath))))), _("Item already located in the versioning folder.")); } } @@ -198,7 +198,7 @@ void FileVersioner::revisionFile(const FileDescriptor& fileDescr, const Zstring& relativePath, const IoCallback& notifyUnbufferedIO /*throw X*/) const //throw FileError, X { - checkPathConflict(fileDescr.path); //throw FileError + checkPathConflict(fileDescr.path, relativePath); //throw FileError if (const std::optional<AFS::ItemType> type = AFS::getItemTypeIfExists(fileDescr.path)) //throw FileError { @@ -241,7 +241,7 @@ void FileVersioner::revisionSymlink(const AbstractPath& linkPath, const Zstring& relativePath) const //throw FileError { - checkPathConflict(linkPath); //throw FileError + checkPathConflict(linkPath, relativePath); //throw FileError if (AFS::itemExists(linkPath)) //throw FileError revisionSymlinkImpl(linkPath, relativePath, nullptr /*onBeforeMove*/); //throw FileError @@ -267,7 +267,7 @@ const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeFolderMove /*throw X*/, const IoCallback& notifyUnbufferedIO /*throw X*/) const { - checkPathConflict(folderPath); //throw FileError + checkPathConflict(folderPath, relativePath); //throw FileError //no error situation if directory is not existing! manual deletion relies on it! if (const std::optional<AFS::ItemType> type = AFS::getItemTypeIfExists(folderPath)) //throw FileError diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/base/versioning.h new/FreeFileSync/Source/base/versioning.h --- old/FreeFileSync/Source/base/versioning.h 2023-11-23 15:11:11.000000000 +0100 +++ new/FreeFileSync/Source/base/versioning.h 2024-01-07 19:25:41.000000000 +0100 @@ -66,7 +66,7 @@ FileVersioner (const FileVersioner&) = delete; FileVersioner& operator=(const FileVersioner&) = delete; - void checkPathConflict(const AbstractPath& itemPath) const; //throw FileError + void checkPathConflict(const AbstractPath& itemPath, const Zstring& relativePath) const; //throw FileError void revisionFileImpl(const FileDescriptor& fileDescr, const Zstring& relativePath, //throw FileError, X const std::function<void(const std::wstring& displayPathFrom, const std::wstring& displayPathTo)>& onBeforeMove, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/main_dlg.cpp new/FreeFileSync/Source/ui/main_dlg.cpp --- old/FreeFileSync/Source/ui/main_dlg.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/ui/main_dlg.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -4867,32 +4867,43 @@ fullSyncLog_->totalTime += r.summary.totalTime; + //"consume" fullSyncLog_, but don't reset: there may be items remaining for manual operations or re-sync! + ProcessSummary fullSummary = r.summary; + fullSummary.startTime = std::exchange(fullSyncLog_->startTime, std::chrono::system_clock::now()); + fullSummary.totalTime = std::exchange(fullSyncLog_->totalTime, {}); + //let's *not* redetermine "ProcessSummary::result", even if errors occured during manual operations! + + ErrorLog fullLog = std::exchange(fullSyncLog_->log, {}); + + auto logMsg2 =[&](const std::wstring& msg, MessageType type) + { + logMsg(fullLog, msg, type); + logMsg(r.errorLog.ref(), msg, type); + }; + + AbstractPath logFolderPath = createAbstractPath(guiCfg.mainCfg.altLogFolderPathPhrase); //optional + if (AFS::isNullPath(logFolderPath)) + logFolderPath = createAbstractPath(globalCfg_.logFolderPhrase); + assert(!AFS::isNullPath(logFolderPath)); //mandatory! but still: let's include fall back + if (AFS::isNullPath(logFolderPath)) + logFolderPath = createAbstractPath(getLogFolderDefaultPath()); + + AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, generateLogFileName(globalCfg_.logFormat, fullSummary)); + //e.g. %AppData%\FreeFileSync\Logs\Backup FreeFileSync 2013-09-15 015052.123 [Error].log + + auto notifyStatusNoThrow = [&](std::wstring&& msg) { try { statusHandler.updateStatus(std::move(msg)); /*throw CancelProcess*/ } catch (CancelProcess&) {} }; + + if (statusHandler.taskCancelled()) /* user cancelled => don't run post sync command + => don't run post sync action => don't send email notification - => don't save log file (=> treat sync attempt like a manual operation) - => don't update last sync stats for the selected cfg files => don't play sound notification - => don't run post sync action */ + (=> DO save log file: sync attempt is more than just a "manual operation") + (=> DO update last sync stats for the selected cfg files) */ assert(statusHandler.taskCancelled() == CancelReason::user); //"stop on first error" is only for ffs_batch else { - //"consume" fullSyncLog_, but don't reset: there may be items remaining for manual operations or re-sync! - ProcessSummary fullSummary = r.summary; - fullSummary.startTime = std::exchange(fullSyncLog_->startTime, std::chrono::system_clock::now()); - fullSummary.totalTime = std::exchange(fullSyncLog_->totalTime, {}); - //let's *not* redetermine "ProcessSummary::result", even if errors occured during manual operations! - - ErrorLog fullLog = std::exchange(fullSyncLog_->log, {}); - - auto logMsg2 =[&](const std::wstring& msg, MessageType type) - { - logMsg(fullLog, msg, type); - logMsg(r.errorLog.ref(), msg, type); - }; - - auto notifyStatusNoThrow = [&](std::wstring&& msg) { try { statusHandler.updateStatus(std::move(msg)); /*throw CancelProcess*/ } catch (CancelProcess&) {} }; - //--------------------- post sync command ---------------------- if (const Zstring cmdLine = trimCpy(expandMacros(guiCfg.mainCfg.postSyncCommand)); !cmdLine.empty()) @@ -4920,16 +4931,6 @@ } //--------------------- email notification ---------------------- - AbstractPath logFolderPath = createAbstractPath(guiCfg.mainCfg.altLogFolderPathPhrase); //optional - if (AFS::isNullPath(logFolderPath)) - logFolderPath = createAbstractPath(globalCfg_.logFolderPhrase); - assert(!AFS::isNullPath(logFolderPath)); //mandatory! but still: let's include fall back - if (AFS::isNullPath(logFolderPath)) - logFolderPath = createAbstractPath(getLogFolderDefaultPath()); - - AbstractPath logFilePath = AFS::appendRelPath(logFolderPath, generateLogFileName(globalCfg_.logFormat, fullSummary)); - //e.g. %AppData%\FreeFileSync\Logs\Backup FreeFileSync 2013-09-15 015052.123 [Error].log - if (const std::string notifyEmail = trimCpy(guiCfg.mainCfg.emailNotifyAddress); !notifyEmail.empty()) if (guiCfg.mainCfg.emailNotifyCondition == ResultsNotification::always || @@ -4944,45 +4945,45 @@ sendLogAsEmail(notifyEmail, fullSummary, fullLog, logFilePath, notifyStatusNoThrow); //throw FileError } catch (const FileError& e) { logMsg2(e.toString(), MSG_TYPE_ERROR); } + } - //--------------------- save log file ---------------------- - try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename - { - //do NOT use tryReportingError()! saving log files should not be cancellable! - saveLogFile(logFilePath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e) - { - logMsg2(e.toString(), MSG_TYPE_ERROR); + //--------------------- save log file ---------------------- + try //create not before destruction: 1. avoid issues with FFS trying to sync open log file 2. include status in log file name without extra rename + { + //do NOT use tryReportingError()! saving log files should not be cancellable! + saveLogFile(logFilePath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e) + { + logMsg2(e.toString(), MSG_TYPE_ERROR); - const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg_.logFormat, fullSummary)); - if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what! - try - { - logFilePath = logFileDefaultPath; - saveLogFile(logFileDefaultPath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError - } - catch (const FileError& e2) { logMsg2(e2.toString(), MSG_TYPE_ERROR); assert(false); } //should never happen!!! - } + const AbstractPath logFileDefaultPath = AFS::appendRelPath(createAbstractPath(getLogFolderDefaultPath()), generateLogFileName(globalCfg_.logFormat, fullSummary)); + if (logFilePath != logFileDefaultPath) //fallback: log file *must* be saved no matter what! + try + { + logFilePath = logFileDefaultPath; + saveLogFile(logFileDefaultPath, fullSummary, fullLog, globalCfg_.logfilesMaxAgeDays, globalCfg_.logFormat, logFilePathsToKeep, notifyStatusNoThrow); //throw FileError + } + catch (const FileError& e2) { logMsg2(e2.toString(), MSG_TYPE_ERROR); assert(false); } //should never happen!!! + } - //--------- update last sync stats for the selected cfg files --------- - const ErrorLogStats& fullLogStats = getStats(fullLog); + //--------- update last sync stats for the selected cfg files --------- + const ErrorLogStats& fullLogStats = getStats(fullLog); - cfggrid::getDataView(*m_gridCfgHistory).setLastRunStats(activeConfigFiles_, - { - logFilePath, - std::chrono::system_clock::to_time_t(fullSummary.startTime), - fullSummary.result, - fullSummary.statsProcessed.items, - fullSummary.statsProcessed.bytes, - fullSummary.totalTime, - fullLogStats.error, - fullLogStats.warning, - }); - //re-apply selection: sort order changed if sorted by last sync time - cfggrid::addAndSelect(*m_gridCfgHistory, activeConfigFiles_, false /*scrollToSelection*/); - //m_gridCfgHistory->Refresh(); <- implicit in last call - } + cfggrid::getDataView(*m_gridCfgHistory).setLastRunStats(activeConfigFiles_, + { + logFilePath, + std::chrono::system_clock::to_time_t(fullSummary.startTime), + fullSummary.result, + fullSummary.statsProcessed.items, + fullSummary.statsProcessed.bytes, + fullSummary.totalTime, + fullLogStats.error, + fullLogStats.warning, + }); + //re-apply selection: sort order changed if sorted by last sync time + cfggrid::addAndSelect(*m_gridCfgHistory, activeConfigFiles_, false /*scrollToSelection*/); + //m_gridCfgHistory->Refresh(); <- implicit in last call //--------------------------------------------------------------------------- setLastOperationLog(r.summary, r.errorLog.ptr()); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/ui/search_grid.cpp new/FreeFileSync/Source/ui/search_grid.cpp --- old/FreeFileSync/Source/ui/search_grid.cpp 2023-11-23 15:11:13.000000000 +0100 +++ new/FreeFileSync/Source/ui/search_grid.cpp 2024-01-07 19:25:42.000000000 +0100 @@ -74,7 +74,7 @@ ptrdiff_t findRow(const Grid& grid, //return -1 if no matching row found const std::wstring& searchString, bool searchAscending, - size_t rowFirst, //specify area to search: + size_t rowFirst, //range to search: size_t rowLast) // [rowFirst, rowLast) { if (auto prov = grid.getDataProvider()) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/FreeFileSync/Source/version/version.h new/FreeFileSync/Source/version/version.h --- old/FreeFileSync/Source/version/version.h 2023-11-23 15:11:11.000000000 +0100 +++ new/FreeFileSync/Source/version/version.h 2024-01-07 19:25:41.000000000 +0100 @@ -3,7 +3,7 @@ namespace fff { -const char ffsVersion[] = "13.2"; //internal linkage! +const char ffsVersion[] = "13.3"; //internal linkage! const char FFS_VERSION_SEPARATOR = '.'; }