Releases: samschott/maestral
v1.4.6
v1.4.5
Added:
- Support CMD+Q keyboard shortcut to quit app on macOS.
Changed:
- Clarified the "merge local folder" option in the GUI's setup dialog.
Fixed:
- Fixed an issue where erroneous file conflicts could occur when a file name contains decomposed unicode characters such as "é" represented by "e" + "́" instead of a single character.
- Fixed an issue where center-aligned text would appear right-aligned on Apple Silicon computers.
Dependencies:
- Bumped desktop-notifier to v3.3.0. This fixes a segfault for non-framework distributions of Python such as Anaconda Python.
v1.4.4
Edit: Updated App bundle for macOS, the previous bundle was built with the wrong version of the toga GUI toolkit.
This release introduces support for tab-completion in the shell, allows you to choose the actual Dropbox folder instead of its parent folder / location from the GUI, and further reduces memory usage during startup indexing. As usual, several bugs have been squashed.
The website has also moved to its own domain at maestral.app. The source still lives in the website
branch of the GitHub repo and contributions are welcome.
Added:
- Added support for shell completion. Completion is available for the commands themselves and for several arguments, notably paths relative to the Dropbox folder and choices from a set of fixed options. Use the command
maestral completion
to generate shell completion scripts for bash, zsh or fish. Seemaestral completion --help
for instructions on enabling shell completion.
Changed:
- Improved error messages when inotify limits are reached on Linux.
- GUI dialogs to select a local Dropbox folder now ask for the actual folder name instead of the location only.
- Local indexing on startup is now carried out without loading the entire folder tree into memory. This further reduces peak memory usage and fragmentation.
- Permission errors when scanning the contents of a local folder during startup indexing are now treated as fatal errors instead of skipping its content. This prevents items from being deleted on the server when they are still present locally but inaccessible.
- Improved logging during daemon startup: Logging is now initialised immediately after the main imports and therefore captures potential errors early during the startup process.
- Loggers are scoped per configuration instead of globally. This enables separating logs for Maestral instances for different configs which are running in the same process.
- Improved performance and appearance of the selective sync dialog. Folder content is no longer pre-fetched but will be loaded on-demand when expanding a folder.
Fixed:
- Fixes a rare issue where throttling of sync threads would be disabled if the "max_cpu_percent" config value would be set to 100% divided by the number of CPU cores (e.g, 25% on a 4-core CPU).
- Fixes an issue where a local permission error would be treated as a fatal error instead of as a sync issue.
- Moving the Dropbox folder between partitions no longer triggers a full resync.
- Fixes an error when running the
diff
CLI command and selecting the local file as the base version. - Fixes download links in the update dialog.
- Fixes an unexpected error which may occur when creating a conflicting copy.
Dependencies:
- Bumped click to >= v8.0.0 to support shell completion.
- Bumped survey to >= v3.4.3 for Python 3.6 support.
v1.4.3
This release improves performance and memory usage by switching from sqlalchamey to our own database interaction layer. It is also the first release with an app bundle that runs natively on Apple Silicon.
Maestral now also has a website with a detailed documentation of the command line interface, released with GitHub pages at https://samschott.github.io/maestral.
Changed:
- We now use our own ORM layer instead of sqlalchemy. This improves both baseline memory usage and peak memory usage during startup and indexing.
- Use a new network session for each thread and clean up network resources before the thread stops.
- The macOS GUI will now show a dock icon if there is an open window.
- The CLI will print full tracebacks to the console in case of unexpected errors.
Fixed:
- Fixed detecting local changes when saving an MS Office on macOS with recent versions of the Office suite.
Dependencies:
- Bumped desktop-notifier to >=3.2.2
- Bumped watchdog to >=2.0.1
- Removed sqlalchemy
- Removed alembic
v1.4.2
v1.4.1
v1.4.0
This release brings significant extensions to the command line interface: It introduces commands to create and manage shared links, to compare older version of a file and print the diff output to the terminal, and commands for direct access to config values (note the warning below). It also adds optional one-way syncing, for instance to keep a mirror of a remote Dropbox folder while ignoring local changes.
Several bugs have been fixed which could occur when resuming the sync activity after the connection had been lost while indexing a remote folder.
Finally, this release removes automatic error reporting via Bugsnag. Please file any bug reports as issues on GitHub where it is possible to follow up.
Added:
- Added a command
maestral diff
to compare different versions of a text file. The resulting diff is printed to the console. Credit goes to @OrangeFran. - Resurrected the command
maestral revs
to list previous versions (revisions) of a file. - Added a command group
maestral sharelink
to create and manage shared links. Subcommands arecreate
to create a shared link for a file or folder,list
to list shared links, either for a specific file or folder or for all items in your Dropbox, andrevoke
to revoke a shared link. - Added a command group
maestral config
to provide direct access to config values. Subcommands areget
andset
to read and write config values, respectively. This provides access to previously inaccessible config values such asreindex_interval
ormax_cpu_percent
. Please refer to a Wiki for an overview of all config values. Use theset
command with caution: setting some config values may leave the daemon in an inconsistent state (e.g., changing the location of the Dropbox folder). Always use the equivalent command from the Settings group (e.g.,maestral move-dir
). - Added the ability to disable a single sync direction, for instance to enable download syncs only. This can be useful when you want to mirror a remote folder while ignoring local changes or when syncing to a file system which does not support inotify. To use this, set the respective config values for
upload
ordownload
to False. Note that conflict resolution remains unaffected. For instance, when an unsynced local change would be overwritten by a remote change, the local file will be moved to a "conflicting copy" first. However, the conflicting copy will not be uploaded.
Changed:
Changes to daemon:
- Avoid scanning of objects matching an
.mignore
pattern (file watches will still be added however). This results in performance improvements during startup and resume. A resulting behavioral change is that maestral will remove files matching an ignore pattern from Dropbox. After this change it will be immaterial if an.mignore
pattern is added before or after having matching files in Dropbox. - If Maestral is quit or interrupted during indexing, for instance due to connection problems, it will later resume from the same position instead of restarting from the beginning.
- Indexing will no longer skip excluded folders. This is necessary for the above change.
- Defer periodic reindexing, typically carried out weekly, if the device is not connected to an AC power supply. This prevents draining the battery when hashing file contents.
- Improved the error message when the user is running out of inotify watches: Recommend default values of
max_user_watches = 524288
andmax_user_instances = 1024
or double the current values, whichever is higher. Advise to apply the changes withsysctl -p
.
Changes to CLI:
- Moved linking and unlinking to a new command group
maestral auth
with subcommandslink
,unlink
andstatus
. - Renamed the command
file-status
tofilestatus
. - Added a
--yes, -Y
flag to theunlink
to command to skip the confirmation prompt. - Renamed the
configs
command to list config files toconfig-files
. - Added an option
--clean
toconfig-files
to remove all stale config files (those without a linked Dropbox account).
Fixed:
- Fixes an issue with the CLI on Python 3.6 where commands that print dates to the console would raise an exception.
- Properly handle a rare OSError "[Errno 41] Protocol wrong type for socket" on macOS, see https://bugs.python.org/issue33450.
- Allow creating local files even if we cannot set their permissions, for instances on some mounted NTFS drives.
- Fixes an issue with the selective sync dialog in the Qt / Linux GUI where the "Update" button could be incorrectly enabled or disabled.
- Fixes an issue where a lost internet connection while starting the sync could lead to a stuck sync thread or an endless indexing cycle.
- Fixes an issue where a lost internet connection during the download of a folder newly included in selective sync could result in the download never being completed.
- Fixes an issue where pausing the sync during the download of a folder newly included in selective sync could result in the download never being completed. Credit goes to @andrewsali.
Removed:
- Removed automatic error reporting via bugsnag.
- Removed the CLI command
maestral restart
. Usestop
andstart
instead. - Removed the CLI command
maestral account-info
. Usemaestral auth status
instead. - Removed the public API methods
Maestral.resume_sync
andMaestral.pause_sync
. UseMaestral.start_sync
andMaestral.stop_sync
instead.
Dependencies:
- Bumped survey to version >=3.2.2,<4.0.
- Bumped keyring to version >=22.
- Bumped watchdog to version >= 2.0.
- Added
desktop-notifier
dependency. This is spin-off project from Maestral, built on the code previously in thenotify
module. - Removed the bugsnag dependency.
v1.3.1
v1.3.0
This release features an overhaul of the command line interface: commands are grouped by sections in the help output, dialogs and output formatting have been improved and many commands have become significantly faster.
This release also significantly reduces the CPU usage when idle and provides a whole series of bug fixes for GUI and daemon.
Added:
- Desktop notifications for sync errors are now clickable and will show the related file or folder either on Dropbox or locally.
- Desktop notifications now have a "Show" button to show a recently changed file.
- Added a public API
Maetral.status_change_longpoll
for frontends to wait for status changes without frequent polling.status_change_longpoll
blocks until there is a change in status and then returnsTrue
. The default timeout is 60 sec.
Changed:
- Significant improvements to the command line interface:
- Overhauled all CLI dialogs with nicer formatting and more interactive prompts using the
survey
package. - Improved output of many CLI commands, including
ls
,activity
, andrestore
. - Increased speed of many CLI commands by importing only necessary modules.
- Shortened help texts for CLI commands.
- Group help output by function.
- Overhauled all CLI dialogs with nicer formatting and more interactive prompts using the
- Reduced the CPU usage of daemon and GUIs in the idle state:
- Increased timeouts for all event queues.
- Decreased the frequency of daemon housekeeping tasks.
- GUIs now use longpoll APIs to wait for state changes instead of frequent polling.
- Improved performance when syncing a large number of remote deletions.
- The
Maestral.include_item()
API now accepts paths which lie inside an excluded folder. When called with such a path, all immediate parents will be included as well. - The
Maestral.excluded_items
property is no longer read-only. - Some refactoring of the
cli
module to prepare for shell completion support.
Fixes:
- Fixes an issue where all newly downloaded files would be created with 755 permissions. They are now created with the user's default permissions for new files instead.
- Fixes an unexpected crash when the list of
pending_downloads
ordownload_errors
would contain an invalid path, i.e., a Dropbox path for which we cannot get any current or deleted metadata. - Fixes an error when a local file name contains bytes which cannot be decoded by the reported file system encoding. This now raises a sync error instead of crashing. All log handlers have also been updated to deal with the resulting surrogate escapes.
- Fixes possible loss of data when excluding an item from syncing while it is being downloaded. This is no longer possible and will raise a
BusyError
instead. - Fixes an issue where
maestral ls
would fail when run with the-l, --long
flag. - Fixes an occasional
IndexError
during a download sync when trying to query past versions of a deleted item. - Fixes an issue which could cause a segfault of the selective sync dialog on macOS.
- Fixes an issue where the selective sync dialog on Linux would not load the contents of more than 10 folders.
- Fixes a regression with the autostart functionality of the Linux GUI. Autostart entries created with v1.2.2 will need be reset by toggling the checkbox "start on login" off and on.
- Fixes an issue where two configs linked to the same Dropbox account would both be unlinked when trying to unlink only one of them.
- Fixes an import error with v11.0 of the Dropbox SDK.
Removed:
- Removed the
maestral rev
command to list old file revisions. Insteadmaestral restore
will list possible revisions to restore.
Deprecated:
- Deprecated the
Maestral.set_excluded_items
API. Use the setter forMaestral.excluded_items
instead.
Development:
- Updated tests and migrated fully to pytest.
- Improved API documentation, including sections on the sync logic and on logging.
- Added contributing guidelines.
Dependencies:
- Require
watchdog<=10.3
because of an unresolved issue in watchdog 0.10.4 on macOS. - Pin
dropbox<12.0
to avoid bad surprises in case of breaking changes. - Add
survey
for an interactive CLI.
v1.2.2
This release focuses on bug fixes and performance improvements. In particular, memory usage has been improved when syncing a Dropbox folder with a large number of items. It also fixes an issue with running the app bundle on macOS High Sierra.
Changes:
maestral file-status
now accepts relative paths.- Runs the daemon in a Python interpreter with -OO flags. This strips docstrings and saves a few MB of memory.
- Moves from
pkg_resources
to locate entry points and other metadata to the faster and more light-weightimportlib.metadata
. - Update scripts are no longer run after a fresh install or for a new config.
- Significantly reduces memory usage during the initial sync of a Dropbox folder with many (> 10,000) items and when downloading a large set of changes. To achieve this, new APIs have been added to
SyncEngine
andDropboxClient
that return iterators over remote changes. Dropbox servers are queried on every iteration and memory is freed after applying each batch of remote changes. Maestral.get_history
now returns only the last 100 sync events by default. This can be increased by setting thelimit
argument manually.- The total sync history kept in out database is limited to the last 1,000 events.
- Switch from PyInstaller to briefcase for packaging on macOS.
Fixes:
- Fixes an issue which would prevent the daemon from starting on macOS when running with Python 3.6.
- Fixes a segfault of the GUI on macOS High Sierra.
- Fixes an issue with the macOS GUI becoming unresponsive when opening the selective sync dialog if one of the displayed folders contains a large number (> 2k) of immediate children.
- Fixes an issue with the Qt GUI crashing when opening the selective sync dialog if one of the folders contains a large number (> 2k) of immediate children.
- Fixes an issue where
Mastral.excluded_status
would return "included" for items inside an excluded folder.