Commit Graph

761 Commits

Author SHA1 Message Date
Iva Horn
6ba027c906 feat(file-provider): Integrated localizations from Transifex.
- Introduced TransifexStringCatalogSanitizer command-line utility.
- Introduced dedicated Transifex CLI configuration file for NextcloudIntegration project.

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-10-07 14:28:44 +02:00
Matthieu Gallien
28b0c34548 fix: ignore Qt6 WebEngineCore PDB file that is too big for Wix Toolset 3
we have a limit in file size to 32 bits integer

this file is more than 2 GBs

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
2025-10-02 21:25:13 +02:00
Jyrki Gadinger
98fcb0cffe chore(mac-crafter): default to next blueprint ref by default
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-09-30 12:41:50 +02:00
Jyrki Gadinger
18b62b371a fix(mac-crafter): use correct Craft parameter for appbundleless builds
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-09-30 12:41:50 +02:00
Iva Horn
6c5ee7c14a feat: Replaced Unified Logging System with Custom Solution.
- Removed explicit reference to NextcloudKit dependency which implicitly is pulled in already by NextcloudFileProviderKit.
- Consolidated some source code files into their respective view controllers in the file provider UI extension.

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-09-24 13:23:28 +02:00
Jyrki Gadinger
0259ff4568 fix(msi): ensure the same ProductCode is used for embedded transforms
Using `"*"` will result in a different GUID with each invocation of the
linker (`light.exe`), which can break automated installations when a
localised version of the installer was loaded.

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-08-21 10:58:49 +02:00
István Váradi
7075fb4a2a ci: Remove Debian Bullseye, add Trixie
Signed-off-by: István Váradi <ivaradi@varadiistvan.hu>
2025-08-13 08:30:57 +02:00
Jyrki Gadinger
55b09b00c1 fix(msi): display external version string in installer
e.g. 3.16.82 -> "3.17.0-rc2"; non-rc/daily builds will still read
"3.17.0"

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-08-06 12:14:23 +02:00
Iva Horn
10b86edecb fix(mac-crafter): Do not strip get-task-allow entitlement from developer builds of extensions during code signing.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-08-01 17:48:00 +02:00
Iva Horn
ebdee9aac0 feat(mac-crafter): Added time measurement of build phases to improve on.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-30 11:36:19 +02:00
Jyrki Gadinger
5ca272cb49 fix(mac-crafter): use AsyncParsableCommand everywhere
For some reason using `ParsableCommand` structs as subcommands of an
`AsyncParsableCommand` does not correctly handle all passed CLI
arguments.

The behaviour before this commit was as follows:

```
% mac-crafter create-dmg
Error: Missing expected argument '<app-bundle-path>'
Help:  <app-bundle-path>  Path to the desktop client app bundle.
Usage: mac-crafter create-dmg <app-bundle-path> [--product-path <product-path>] [--build-path <build-path>] [--app-name <app-name>] [--apple-id <apple-id>] [--apple-password <apple-password>] [--apple-team-id <apple-team-id>] [--package-signing-id <package-signing-id>] [--sparkle-package-sign-key <sparkle-package-sign-key>]
  See 'mac-crafter create-dmg --help' for more information.

% mac-crafter create-dmg /tmp/Nextcloud.app
OVERVIEW: Create a DMG for the client.

USAGE: mac-crafter create-dmg <app-bundle-path> [--product-path <product-path>] [--build-path <build-path>] [--app-name <app-name>] [--apple-id <apple-id>] [--apple-password <apple-password>] [--apple-team-id <apple-team-id>] [--package-signing-id <package-signing-id>] [--sparkle-package-sign-key <sparkle-package-sign-key>]

ARGUMENTS:
  <app-bundle-path>       Path to the desktop client app bundle.
[...]
```

After changing every command struct to derive from
`AsyncParsableCommand`:

```
% mac-crafter create-dmg
Error: Missing expected argument '<app-bundle-path>'
Help:  <app-bundle-path>  Path to the desktop client app bundle.
Usage: mac-crafter create-dmg <app-bundle-path> [--product-path <product-path>] [--build-path <build-path>] [--app-name <app-name>] [--apple-id <apple-id>] [--apple-password <apple-password>] [--apple-team-id <apple-team-id>] [--package-signing-id <package-signing-id>] [--sparkle-package-sign-key <sparkle-package-sign-key>]
  See 'mac-crafter create-dmg --help' for more information.

% mac-crafter create-dmg /tmp/Nextcloud.app
Required command "create-dmg" is missing, installing...
[...]
```

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-07-22 09:49:22 +02:00
Iva Horn
99e760363a fix(macOS): Enable debugger to attach to process.
- Disable hardened runtime for debug builds.
- Add required get-task-allow entitlement conditionally.

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-21 14:11:16 +02:00
Jyrki Gadinger
e0ba1db826 ci: change download url of appimagetool
The appimagetool as previously provided from the AppImageKit repo was
deprecated and removed.

The new versions as provided by the appimagetool repository also ship
with an updated runtime which from my understanding improve
compatibility (e.g. libfuse is now statically linked, so systems don't
need to have it present) and seem to slightly reduce the binary size as
well.

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-07-21 13:09:53 +02:00
Iva Horn
472684cf2e fix(mac-crafter): Checked in Package.resolved.
- mac-crafter is an executable application, not a library
- Ensures all developers use identical dependency versions
- Provides reproducible builds across different environments
- Prevents "works on my machine" dependency issues
- Critical for production deployment consistency
- Enables reliable CI/CD builds with same dependency versions
- Helps with debugging by ensuring same versions across dev/test/prod
- Standard practice for applications vs libraries which should remain flexible

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-16 16:15:33 +02:00
Iva Horn
5f3c381617 fix(mac-crafter): Updated .gitignore to not exclude source code files expected to be checked in.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-16 16:15:33 +02:00
Iva Horn
c898525d74 feat(mac-crafter): Added instructions to README on how to run and debug mac-crafter from Xcode.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-16 14:23:25 +02:00
Iva Horn
3e27c5f0f7 feat(mac-crafter): Reorganized commands in dedicated source code files for improved developer experience.
Had to rename Utils/Codesign.swift to Utils/Codesigning.swift to avoid duplicate module name compiler error.

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-16 14:23:25 +02:00
Iva Horn
e93e23f0a7 feat(mac-crafter): Update to Swift 6.1 and Strict Concurrency Checks.
- Isolated global state into an actor.
- Updated declarations and calls to reflect asynchronicity.
- The replacement of the enumerator with subpathsOfDirectory(atPath:) was suggested by Copilot to necessarily avoid the use of synchronous enumeration in an asynchronous context.
- Updated README.

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-16 11:56:55 +02:00
Jyrki Gadinger
ed22111100 ci: switch back to upstream CraftMaster
The fix we needed was merged this week 🎉
https://invent.kde.org/packaging/craftmaster/-/merge_requests/7

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-07-11 19:16:41 +02:00
István Váradi
a954021026 ci: Remove Ubuntu Oracular, add Questing
Signed-off-by: István Váradi <ivaradi@varadiistvan.hu>
2025-07-11 13:28:35 +02:00
Iva Horn
1c96f7fc18 fix(mac-crafter): Updated default CraftMaster repository URL.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-10 10:15:03 +02:00
Iva Horn
f05b37a214 fix(mac-crafter): Outsourced MacCrafterError type into dedicated source code file.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-10 10:15:03 +02:00
Iva Horn
1da444502e fix(mac-crafter): Textual improvements.
Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-10 10:15:03 +02:00
Iva Horn
b631940a1d Fix: mac-crafter installs wget on demand.
wget is used but not automatically installed, if missing.

Signed-off-by: Iva Horn <iva.horn@icloud.com>
2025-07-07 15:24:21 +02:00
Jyrki Gadinger
49e88d6eac fix(msi): set the REBOOT property in the MSI
A value of `ReallySuppress` will not display a reboot prompt whenever
the `ForceReboot` action was run, or whenever a reboot was scheduled
(e.g. by `FilesInUse`).  Apparently this will not reboot the machine on
its own either.

`winget` sets this property in its manifest[0], and according to reports in
issue #5369 this seems to work.

See also: https://learn.microsoft.com/en-us/windows/win32/msi/reboot

[0]: 0b40904d14/manifests/n/Nextcloud/NextcloudDesktop/3.16.5/Nextcloud.NextcloudDesktop.installer.yaml (L16)

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-06-04 10:20:15 +02:00
Claudio Cambra
bc102fc06b fix(cmake): Strip final newline from bundled localisations
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-06-02 15:15:04 +02:00
Claudio Cambra
a2b12cff72 fix(cmake): Build CFBundleLocalizations
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-06-02 15:15:04 +02:00
Jyrki Gadinger
b598f48ce2 fix(AppImage): bundle client translations
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-18 18:23:38 +02:00
Jyrki Gadinger
1001ad10e1 feat(mac-crafter): retry code-signing attempts
This step sometimes fails with an error such as: "A timestamp was
expected but was not found.".  Any code-signing errors will result in
the notarisation step to fail.

Apparently this might be due to intermittent network issues.  Let's just
retry codesigning a couple of times in the case it fails ...

See also: https://developer.apple.com/documentation/security/resolving-common-notarization-issues#Include-a-secure-timestamp

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-16 11:03:23 +02:00
Jyrki Gadinger
a6e9b6fcf0 feat(mac-crafter): also clone KDE blueprints, set a specific git ref for blueprint repos
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-14 12:15:46 +02:00
Jyrki Gadinger
d28b8e325d
feat(msi): do not schedule reboots ourselves
let's have the MSI RestartManager take care of that

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-13 17:21:01 +02:00
Jyrki Gadinger
59f3e774ad
fix(msi): force termination of stuck processes
Stopping the Windows Explorer process does not always work.  Per default
the MSI Restart Manager will display a warning message after a timeout,
and not attempt to restart Explorer afterwards -- resulting in a black
screen if no other window is open.

Setting the property `MSIRMSHUTDOWN` to `1` will force the termination
of the process when the timeout is reached, which finally allows the
Explorer to be restarted.

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-13 17:18:40 +02:00
Jyrki Gadinger
532c5dfdeb
fix(msi): do not completely remove the previous installation when updating
The MSIs we distribute perform so-called "major upgrades".

From the Microsoft docs, we learn that...

> A typical major upgrade **removes a previous version** of an
> application and installs a new version.

Indeed that was the case -- the previous version is uninstalled
completely before the new version gets installed.  Since we install an
extension that's loaded by explorer, the installer will ask the user to
restart Windows Explorer during the uninstallation of the previous
version (and restarting that might not always work as expected).

There is a way to change this behaviour though, using Wix3's
`MajorUpgrade` element.  Through its `Schedule` property it's possible
to define when the removal of the previous version should occur.

The previous value `afterInstallInitialize` is one of two values that
perform a complete uninstall/install sequence.  The new value
`afterInstallExecute` will install new files on top of the previous
installation (depending on the `REINSTALLMODE` I guess) and remove
older files that are not present.
In the case of the extensions this means that the .dlls from the
previous installation will not be touched, as long as the version
embedded in the DLL info didn't change.  This results in the installer
no longer requesting Windows Explorer to restart, which is a big plus :D

I also changed the REINSTALLMODE to `dmus` to allow downgrades as well.

With this change, the request to restart Windows Explorer should
hopefully happen only once an installation was made using an MSI that
contains this change.  Further updates will only request a restart if
the DLL version of these extensions change...

See also:
  - https://learn.microsoft.com/en-us/windows/win32/msi/major-upgrades
  - https://docs.firegiant.com/wix/schema/wxs/majorupgrade/#attributes:~:text=Schedule

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-13 17:18:40 +02:00
Matthieu Gallien
a73733b146
fix(msi): use standard replace mode for MSI installer
shoudl enable replacing files during install happen only when needed
instead of always

will need to take care of migration from older releases

Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-13 17:18:39 +02:00
Jyrki Gadinger
d458c2c620 chore: remove never used crashreporter
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-08 09:52:53 +02:00
Andy Scherzinger
5fe94ea149 docs(reuse): Migrate to SPDX header
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-05-07 09:28:53 +02:00
Andy Scherzinger
7655efa230 docs(reuse): Migrate to SPDX header
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-05-06 09:49:30 +02:00
Jyrki Gadinger
c498cdb7b8 fix(appimage): move VFS plugins to AppDir
This allows the AppImage build to find and load the experimental VFS
plugins, and not crash with:

    [ critical plugins /home/user/src/common/vfs.cpp:250 ]: Could not load plugin: not existent or bad metadata "nextclouddevsync_vfs_suffix"
    [ fatal default /home/user/src/gui/folderman.cpp:326 ]: Could not load plugin
    [1]    72936 IOT instruction (core dumped)  ./nextclouddev-master-x86_64.AppImage

Fixes #7135
Fixes #7194
Fixes #7465

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-05-06 09:45:01 +02:00
Claudio Cambra
4b6df246d2 feat(mac-crafter): Use our default entitlements file during default mac-crafter build run
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-05-06 09:43:55 +02:00
Claudio Cambra
957bf580cc feat(macOS): Add entitlements file
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-05-06 09:43:55 +02:00
Claudio Cambra
7b3099fc44 feat(mac-crafter): Add entitlements path option to codesign command
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-05-06 09:43:55 +02:00
Claudio Cambra
5957169f73 feat(mac-crafter): Add ability to codesign with an entitlements file
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-05-06 09:43:55 +02:00
Andy Scherzinger
49038ade94
docs(reuse): Migrate to SPDX header
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-04-25 17:27:21 +02:00
Andy Scherzinger
00994aa9e8
docs(reuse): Migrate to SPDX header
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-04-16 15:19:26 +02:00
Jyrki Gadinger
88d62aed40 fix(msi): allow custom installation directory
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-04-15 16:18:52 +02:00
Jyrki Gadinger
e6c9c5477a fix: move array to correct value in dict
Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-04-07 14:56:42 +02:00
Claudio Cambra
0ac8eefa52 fix(mac-crafter): Work around broken consecutive shell integration builds
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
2025-04-04 15:32:16 +02:00
Jyrki Gadinger
2bbbacb8dc fix(mac): bump deployment target to 12.0
Qt 6.8 now requires macOS 12.0 as per https://doc.qt.io/qt-6.8/macos.html

for comparison, Qt 6.7 supported 11.0 and newer: https://doc.qt.io/qt-6.7/macos.html

also update the Packages project to refuse to install on anything older
than Monterey (12.0)

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-04-04 12:28:04 +02:00
Jyrki Gadinger
a6a17e324a feat: build installer with translations for DE, FR, IT, ES
building all the translated installers takes about ~1 minute each, so
keep that in mind when adding extra translations ...

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-04-04 11:33:20 +02:00
Jyrki Gadinger
d2474d9f45 feat: build translated MSI installer
the base translations come from WixUI itself

There are still some untranslated strings in Nextcloud.wxs, we need to
take care of them at a later point.  As a first step this is good
enough.

This commit serves as a proof-of-concept, the languages I used here will
change depending on what we want to support.

Signed-off-by: Jyrki Gadinger <nilsding@nilsding.org>
2025-04-04 11:33:20 +02:00