summarylogtreecommitdiffstats
path: root/CHANGELOG.md
blob: ab051844803e4bb3808d0cc27b54a15d6826d50c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
## v1.5.3.dev

#### Changed:

* The Dock icon no longer appears while the app is launching in macOS.
* The Dock icon no longer appears when clicking on a desktop notification on macOS.
* Clicking on a desktop notification will now show the file or folder which triggered the
  notification. Previously, only clicking on the "Show" button of the notification
  would open the file browser.
* Removed update notifications by the CLI.
* Proper symlink handling: Remote items which are symlinks will now be synced as symlinks
  instead of empty files. Local symlinks will no longer be followed during indexing or
  silently ignored when syncing. Instead, attempting to upload a symlink will raise an
  error because uploading symlinks is not currently supported by the public Dropbox API.

#### Fixed:

* Fixes a crash of the `maestral activity` CLI command when run from the macOS App Bundle
  due to a missing packaged library.
* Fixes an issue which prevented the `maestral gui` command from working with the macOS
  app bundle.
* Fixes an issue where moving a local file to overwrite another file, for example with mv
  in the terminal, could generate an incorrect conflicting copy during upload sync.
* Properly handle when the local Dropbox directory is renamed by changing the casing only
  on case-insensitive file systems such as APFS on macOS.
* Fixes an issue which could result in sync errors not being cleared after the successful
  sync of an item under some circumstances.
* Relative passed to `maestral move-dir` are now interpreted relative to the working
  directory where the command is run instead of the working directory of the sync daemon.

## v1.5.2

#### Changed:

* Improved dialog flow on Linux when the local Dropbox folder is missing.
* Improved error handling when determining the change time (ctime) of a local file fails.

#### Fixed:

* Fixes an issue where the output of CLI commands would get truncated to 80 characters
  when piped to another command and not attached to an interactive stream such as a
  terminal.
* Fixes Python 3.10 compatibility of Linux (Qt) GUI, thanks to @raffaem.
* Fixes an issue where the CLI fails to install on Apple Silicon Macs.
* Fixes a startup loop of the Linux GUI when the local Dropbox folder is missing.

## v1.5.1

#### Changed:

* Handle Dropbox server errors in the same way as connection errors by retrying the sync
  job.

#### Fixed:

* Fixed issues when trying to abort the CLI setup dialog with ctrl+C.
* Fixes an issue which could under some circumstances result in deleted folder content
  after performing the initial indexing and download. This would mostly occur for shared
  folders.
* Fixes an issue where launchd or systemd might start the sync daemon with a non-UTF-8
  encoding set in the environment.
* Fixes an issue where deleting the local Dropbox folder during startup indexing may
  result in some files being deleted from the remote Dropbox.

## v1.5.0

#### Added:

* Added support for Dropbox Business accounts with a Team Space. Shared folders in a Team
  Space will now be synced at the top level, next to the user's personal folder.

#### Changed:

* Reorganised config file sections.
* Brought back support for macOS High Sierra in the macOS app bundle.

#### Fixed:

* Fixed a crash when running the CLI command `maestral config-file --clean`.

## v1.4.8

#### Added:

* Added automatic updates with Sparkle for the macOS app bundle.

#### Changed:

* Improved performance when processing local file events.
* Improved error messages when the system keyring cannot be accessed despite being
  unlocked, for example because the executable (app bundle or Python) has an invalid
  signature.
* Improved error messages on startup for the macOS app bundle.
* Improved error message in the CLI when setting a config value fails because the new
  value has the wrong type.
* Improved handling of more exotic file system or device related errors when opening
  local files.

#### Fixed:

* Fixed a crash on startup of the daemon when the log level is set to WARNING.
* Fixed an issue which could result in an unresponsive daemon during startup on macOS.
* Fixed an issue which could result in the CLI or GUI to stall indefinitely if the
  daemon process is unresponsive.
* Fixed an issue in the macOS GUI where passing the "missing Dropbox folder" flow by
  selecting a new location would lead to duplicate menu entries in the status bar menu.
* Fixed an issue where the Linux / Qt GUI would hang indefinitely after unlinking.
* Fixed an issue where moving / removing the local Dropbox folder during a download
  could lead to unhandled exceptions instead of useful error messages.
* Fixed handling of 503 and other raw HTTP errors from the Dropbox SDK, for instance
  when Dropbox servers have temporary outages or are undergoing planned maintenance.
* Fixed periodic connection checking for connections over proxy using
  `http_proxy` environment variable.
* Fixed an issue where some uploaded items would not register as synced after aborting
  or pausing during an upload sync.
* Fixed a compatibility issue with watchdog v2.1.4 and higher.

#### Removed:

* Removed an unneeded prompt when revoking a shared link.

## v1.4.6

#### Changed:

* Performance improvements to selective sync dialog in GUI.

#### Fixed:

* Fixed an `IndexError` during conflict resolution when the local item is a non-empty
  folder.

## 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

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](https://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. For bash or zsh, save the returned
  script in a location of you choice and source it in '\~/.bashrc' or '\~/.zshrc',
  respectively. For fish, save the returned script at
  '\~/.config/fish/completions/maestral.fish'. Completion is available for the base
  commands themselves and several arguments, notably paths relative to the Dropbox
  folder and choices from a set of fixed options.

#### 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.

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](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

Fixes an issue where the daemon might restart syncing even though it should be paused
when an internet connection is reestablished.

## v1.4.1

Fixes an issue where the daemon status may incorrectly report "Connecting..." even
though the daemon is connected.

## 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 are:

  * `create`: Create a shared link for a file or folder, optionally with password
    protection and an expiry date on supported accounts (business and professional).
  * `list`: List shared links, either for a specific file or folder or for all items
    in your Dropbox.
  * `revoke`: Revoke a shared link.

* Added a command group `maestral config` to provide direct access to config values.
  Subcommands are:

  * `get`: Gets the config value for a key.
  * `set`: Sets the config value for a key.

  This provides access to previously inaccessible config values such as
  `reindex_interval` or `max_cpu_percent`. Please refer to a Wiki for an overview of all
  config values. Use the `set` 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` or `download` 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 indexing:

  * 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. Credit
    goes to @andrewsali.
  * 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.

* Changes to CLI:

  * Moved linking and unlinking to a new command group `maestral auth` with subcommands
    `link`, `unlink` and `status`.
  * Renamed the command `file-status` to `filestatus`.
  * Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt.
  * Renamed the `configs` command to list config files to `config-files`.
  * Added an option `--clean` to `config-files` to remove all stale config files (those
    without a linked Dropbox account).

* Improved the error message when the user is running out of inotify watches: Recommend
  default values of `max_user_watches = 524288` and `max_user_instances = 1024` or
  double the current values, whichever is higher. Advise to apply the changes with
  `sysctl -p`.

#### 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.

#### Removed:

* Removed automatic error reporting via bugsnag.
* Removed from CLI:

  * The `maestral restart` command. Use `stop` and `start` instead.
  * The `maestral account-info` command. Use `maestral auth status` instead.

* Removed the public API methods `Maestral.resume_sync` and `Maestral.pause_sync`. Use
  `Maestral.start_sync` and `Maestral.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 the `notify` module.
* Removed the bugsnag dependency.

## v1.3.1

#### Fixed:

* Fixes an incorrect entry point for the Qt GUI.

## 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 returns `True`. 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`, and `restore`.
    * Increased speed of many CLI commands by importing only necessary modules.
    * Shortened help texts for CLI commands.
    * Group help output by function.
* 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.
  This change also applies to the `maestral excluded remove`.
* The `Maestral.excluded_items` property is no longer read-only.
* Some refactoring of the `cli` module to prepare for shell completion support.

#### Fixed:

* 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` or `download_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
  reported file system encoding. This now raises a sync error instead of crashing and
  all log handlers have been updated to deal with the resulting surrogate escapes.
* Fixes possible loss of data when excluding an item from syncing while it is
  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. Instead
  `maestral restore` will list possible revisions to restore.

#### Deprecated:

* Deprecated the `Maestral.set_excluded_items` API. Use the setter for
  `Maestral.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>=2.1.0` 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.

#### Changed:

- `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-weight `importlib.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` and `DropboxClient` that return iterators
  over remote changes. Dropbox servers are queried on every iteration.
- `Maestral.get_history` now returns only the last 100 sync events by default. This can
  be increased by setting the `limit` argument manually.
- The total sync history kept in out database is limited to the last 1,000 events.
- Switch from PyInstaller to [briefcase](https://github.com/beeware/briefcase) for
  packaging on macOS.

#### Fixed:

- Fixes an issue which would prevent the daemon from starting on macOS when running with
  Python 3.6.
- Fixes a segfault of the macOS 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.

## v1.2.1

This update provides bug fixes and some improvements to error handling. Major changes
don't regard Maestral itself but its distribution: a Docker image is now available,
thanks to @aries1980, and the macOS app bundle has been rebuilt with the macOS 11 SDK,
providing full compatibility from macOS 10.13 High Sierra to macOS 11.0 Big Sur.

#### Added:

- Added a Docker image, thanks to @aries1980. The docker image is based on Linux and
  does not currently include a GUI.
- Added `-V, --version` option to the command line interface to show the version and
  exit.

#### Changed:

- Improves handling of database related errors such as database integrity, missing read
  / write permissions for the database file, etc.
- Improves handling of errors when the keyring cannot be unlocked to delete credentials
  during an unlink.
- Improves handling of errors when the keyring where Dropbox credentials are stored
  becomes unavailable, e.g., has been uninstalled.
- Never start a subprocess when maestral is run with the `-f, --foreground` option.
  Previously, any required setup such as linking, etc, would still be performed in a
  subprocess.
- Minor tweaks and improvements to the macOS GUI.
- Allow sending desktop notifications in Linux before the daemon's event loop has
  started. This is useful for error messages which occur early during the
  initialization.
- Improves log messages when the connection to Dropbox is lost.
- Performance improvements to `maestral activity` in case of very large sync queues.

#### Fixed:

- Fixes a database integrity error due to an unfulfilled unique constraint.
- Fixes an issue when the daemon is launched with systemd where systemd would
  unexpectedly receive notifications from a subprocess instead of the main process.
- Fixes an issue which would prevent syncing from automatically resuming after moving the
  local Dropbox directory with `maestral move-dir` or through the GUI.
- Fixed a green background for sync issue views in the macOS GUI.
- Fixes an issue where the system tray icon in KDE Plasma could fall back to the regular
  app icon or not show up at all,
- Fixes an issue where the user may be asked to unlock or grant access to the system
  keyring twice on startup if access denied the first time.

#### Dependencies:

- Adds `alembic` dependency for database migrations.

## v1.2.0

The local file index and sync history are now stored in a SQLite database. After the
update, Maestral will first reindex your Dropbox to populate the new index.

This change enables several improvements to the command line interface and GUI: The
command `maestral activity` now shows the progress of individual uploads or downloads.
`maestral history` has been added to list recent sync events. In the GUI, the recent
changes menu now has been replaced by a "Activity" window which shows all sync events of
the past week.

This release also introduces clickable desktop notifications, performance improvements
to indexing of local file changes, and bug fixes and smaller changes listed below.

Finally, this release introduces support for macOS 11 (Big Sur).

#### Added:

- Added an option `-e, --external` to `maestral log show` to open the log in the
  platform's default program instead of showing it in the console.
- Added a CLI command `history` to show all sync events of the past week.
- Added a "Activity" window to show all sync events of the past week.
- Desktop notifications are now clickable: for a single file change, clicking the
  notification will show the file in the platform's file manager. For a deletion, the
  Dropbox website is opened to provide options for restoring the file or folder.
- Use entry points to discover GUI frontends. 3rd party GUIs can register a
  `maestral_gui` entry point to be launched with the `maestral gui` CLI command. If
  installed, `maestral gui` will default to the 1st party `maestral-cocoa` or `maestral-
  qt` GUIs on macOS and Linux, respectively.

#### Changed:

- Transition to short-lived auth tokens for newly linked accounts.
- Transition to OAuth scopes for app permissions.
- Save all sync history and local index in SQLite database.
- Reduce unnecessary path conversions during indexing of local changes.
- Improved performance on case-sensitive file systems.
- Sync remote changes in filename even if they are only a change in casing. Those
  changes where previously ignored.
- Attempt to preserve local file permissions when syncing unless the file id has
  changed. Dropbox servers do store file permissions but don't make them available
  through the public API. We therefore cannot sync file permissions and instead choose
  not to overwrite locally set permissions on every download.
- Changed return type of `Maestral.get_activity` from namedtuple to dict for better
  consistency throughout the API. Every uploading or downloading item will have 'size'
  and 'completed' entries to monitor the progress of syncing individual items.
- The CLI command `maestral activity` now shows the progress of uploads and downloads
  for individual files.
- Introduced type annotations throughout and fixed a few type-related bugs.
- Added a field "Sync threads" to the output of the CLI command `maestral status`.
- The output of `maestral ls` is now printed in a grid, similar to the `ls` command
  included with most platforms.
- The macOS app bundle now uses Python 3.8, leading to some performance improvements
  when moving or copying file system trees.
- Prepared the GUI for changes in macOS Big Sur: use native alerts and dialogs wherever
  possible and refactor loading of libraries.
- Use an asyncio event loop instead of Pyro's event loop to run the daemon. This enables
  integration with the Cocoa run loop and callbacks when clicking notifications.

#### Fixed:

- Fixes a bug where throttling of sync threads would raise an error when we cannot
  determine the CPU count.
- Fixes a bug where sending SIGTERM to the daemon process would raise an error when we
  cannot determine its PID. Now, `Stop.Failed` is returned instead.
- Fixes a bug which would result in incorrect systemd unit files for non-default config
  file names. Please disable and re-enable autostart with `maestral autostart -Y|-N` to
  replace old unit files.
- Fixes a possible race condition when creating the cache directory.
- Fixes error handling when a file is changed while uploading.

#### Removed:

- Support for config names with spaces. Spaces could cause issues with autostart entries
  on some platforms.
- The ability to run the daemon in a separate thread. The daemon must now always be run
  in its own process.

#### Dependencies:

- Replaced `jeepney` dependency on Linux with `dbus-next`.

## v1.1.0

This release expands the CLI functionality and improves the handling of file
modification times during upload and download (used for display purposes only). It also
fixes bugs with the "start on login" functionality of the macOS app bundle. After
updating, please toggle "start on login" in the GUI or `maestral autostart` in the CLI
to replace any old login items.

#### Added:

- Added `--include-deleted` option to `maestral ls`.
- Added `-l, --long` option to `maestral ls` to include metadata in listing.
- Added `maestral revs` command to list revisions of a file.
- Added `maestral restore` command to restore an old revision of a file.

#### Changed:

- Always create config directory if it does not exist.
- Improved performance of converting Dropbox paths to correctly cased local paths.
- Renamed macOS executable inside app bundle from "main" to "Maestral". This results in
  more informative process names.
- Local files are now created with the "last modified" time provided by Dropbox servers.
  This only applies to new downloads. To update existing modified times, you will need
  to delete and redownload your Dropbox folder.

#### Fixed:

- Fixes a thread-safety issue with desktop notifications.
- Fixes a thread-safety issue when two frontends try to start or stop syncing at the
  same time.
- Fixes an issue where Maestral could incorrectly identify a file system as case
  sensitive if the Dropbox folder and temporary directory are on partitions with
  different file systems.
- Fixes incorrect file modification times uploaded to Dropbox for timezones outside of
  UTC. Those times are used for display purposes only.
- Fixes an issue where the `maestral autostart -Y` CLI command would start the GUI on
  on login in case of the macOS app bundle.

## v1.0.3

#### Changed:

- Both "-h" and "--help" can now be used to print help output for a command.
- Show both the daemon and GUI version in the settings window.
- The command line tool bundled with the macOS app now provides proper help output.
- Significantly reduced CPU usage of the GUI on macOS.
- The macOS app now uses a hardened runtime and is properly signed and notarized.

#### Fixed:

- Fixes an issue which could lead to the local Dropbox folder being moved before syncing
  has been paused.
- Fixes an issue where download errors would show a rev number instead of the Dropbox
  path.
- Fixes a race condition when two processes try to start a sync daemon at the same time.
- Fixes an issue in the macOS GUI where updating the displayed sync issues could fail.
- Fixes truncated text in the macOS setup dialog.
- Fixes an issue on fresh macOS installs where creating autostart entries could fail if
  /Library/LaunchAgents does not yet exist.
- Fixes an issue in the macOS app bundle where installing the command line could tool
  would fail if /usr/local/bin is owned by root (as is default on a fresh install). Now,
  the user is asked for permission instead.

#### Dependencies:

- Removed `lockfile` dependency.
- Added `fasteners` dependency.

## v1.0.2

This release fixes bugs in the command line interface.

#### Fixed:

- Fixes a crash of the CLI when an update is available due to incorrect formatting of
  the update message.
- Fixes an error when listing the contents of an empty directory with `maestral ls`.

## v1.0.0

This is the first stable release of Maestral. There have been numerous bug fixes to
error handling and platform integration as well as a few bug fixes to syncing itself.
There are also a few outward facing changes: Pausing Maestral now cancels any pending
sync jobs instead of waiting for them to be completed. The macOS GUI switches from Qt to
using a native Cocoa interface and the macOS app bundle finally includes a full command
line interface.

#### Added:

- Command line tools are now bundled with the macOS app bundle and can be installed from
  the settings window.
- Added support for config names with spaces.
- Switch from Qt to native Cocoa GUI on macOS.
- Expanded test suite to include sync tests.

#### Changed:

- Added '.dropbox' and '.dropbox.cache' to always excluded paths.
- Pausing sync now cancels all pending uploads and downloads.
- Quicker detection of connection problems.
- Faster sync of local deletions.
- The GUI now always launches a separate daemon process instead of an in-process daemon.
- Temporary files during a download are now stored inside the Dropbox directory at
  '.maestral.cache'. This guarantees that temporary files always reside on the same
  partition as the Dropbox folder itself.
- System tray icons are no longer installed in the platform theme in Linux. This is part
  of a workaround for a Qt issue on Linux desktops which causes unnecessarily large
  pixmap transfers over dBus when HiDPI support is enabled. Manually installed icons
  will still be respected.
- Switch from implicit grant to PKCE OAuth2 flow.
- Added public API to link a Dropbox account: `Maestral.get_auth_url` and
  `Maestral.link`. Frontends no longer need to import `maestral.oauth`.
- Moved all command line dialogs from the main API to the CLI module.
- Bumped watchdog requirement to >= 10.0.0 for more consistent error handling.
- Added explicit jeepny dependency for Linux. This is a dependency of keyring but we use
  it by itself as well.
- Improved the reliability of ignoring file system events caused by Maestral itself.

#### Fixed:

- Fixes an issue where a dropped internet connection during startup could result in
  continuous retries until the connection is finally established.
- Fixes an issue where downloads of newly included folders would not resume after being
  interrupted.
- Fixes an issue which could lead to false conflicting copies of folders in some cases.
- Fixes the handling of inofify limit and permission errors when starting a file system
  watch.
- Fixes handling of errors from too long file names.
- Handle errors due to file names which are not allowed on the local file system.
- Fixes handling of some uncaught insufficient disk space errors.
- Fixes incorrect autostart entries on macOS.
- Fixes a crash when running Maestral as a systemd service without python-systemd
  installed.
- Fixes an issue when checking for updates if the list of releases from Github includes
  dev releases.
- Fixes an issue where only remote changes would be listed in 'Recent changes' in the
  GUI.
- Fixes the alignment of comboboxes in the Qt GUI on macOS.
- Fixes a crash on macOS when no notification center is available, for instance in a
  headless session or on Github test runners.
- Fixes a crash on Linux when the command line tool `notify-send` is not available.
- Fixes an issue where sync errors would have incomplete path information.
- Resolves an issue where indexing a large Dropbox folder with > 100,000 items would
  continuously timeout and restart in some cases.

#### Removed:

- Removed migration code for versions < 0.6.3. If you want to update to v1.0.0, please
  make sure to upgrade to at least version 0.6.3 first or unlink your Dropbox before
  updating to v1.0.0.
- Removed u-msgpack dependency.

## v0.6.4

The release provides bug fixes and minor improvements to the command line and graphical
user interfaces. Importantly, it fixes an issue where some files could accidentally
ubecome n-indexed, resulting in incorrect conflict resolution.

#### Added:

- Config option to set the keyring backend. This defaults to 'automatic' but can be used
  to specify a preferred backend such as `keyrings.backends.kwallet.DBusKeyring`. You
  will need to migrate your credentials manually to the new keyring if you change this
  setting.
- Added a `-v, --verbose` flag to `maestral start` and `maestral restart` commands to
  print log output to stdout.
- Added an API documentation for developers, available on
  [Read the Docs](https://maestral-dropbox.readthedocs.io).

#### Changed:

- During initial CLI setup, give the option to sync the entire Dropbox without
  paginating through individual folders to exclude.
- Limit the number of notifications to keep in the notification center. This will only
  work for some desktop environments.
- Fall back to plain text credential storage if neither Gnome Keyring, KWallet or any
  other storage implementing the Secret Service API can be found. A warning is shown
  when plain text storage is used.
- Settings and setup windows are no longer always kept on top in Linux.
- `maestral start --foreground` no longer prints log messages to stdout by default.

#### Fixed:

- Properly handle errors when moving files, for instance for sync conflicts.
- Fixes an issue where some files could accidentally become un-indexed, resulting in
  incorrect conflict resolution.
- Fixes an issue with macOS app bundles where the migration of configuration files was
  omitted after an update. This would result in a failure to start the daemon.
- Correctly specify the required version of `six` to work around an upstream issue in
  Dropbox.
- Fixes an issue where stdout would end up in the systemd journal in addition to the
  structured log messages.
- Fixed a bug where XDG_DATA_HOME was ignored.

## v0.6.3

This release fixes a critical error introduced when updating to v9.5 of the Dropbox
Python SDK which prevented any remote changes from being downloaded.

#### Changed:

- Show release notes from all releases since last update in update dialog.
- Use our own method instead of the `psuitl` package to determine the CPU usage. This
  eliminates the `psuitl` dependency which can be difficult to install on some systems.

#### Fixed:

- Fixes an issue with downloads failing because Dropbox Metadata is longer hashable from
  v9.5 of the Dropbox Python SDK.
- Fixed a StopIteration exception on startup when the location of the maestral CLI
  script cannot be found in the package metadata.
- Fixes an error when restarting the daemon with the "foreground" option.
- Fixed incorrect button labels in the setup dialog when choosing whether to replace or
  keep an old Dropbox folder. The labels "Replace" and "Cancel" where switched.
- Fixes a bug where the option "Unlink & Quit" in the "Revoked Access" error dialog
  would unlink but not quit Maestral.

## v0.6.2

This release enables excluding individual files from syncing and fixes an issue which
led to continuously retrying failed downloads. It also contains significant performance
improvements to indexing, reduces the CPU usage when syncing a large number of files and
introduces weekly re-indexing.

This release also introduces support for an ".mignore" file with the same syntax as
[gitignore](https://git-scm.com/docs/gitignore). This feature is considered 'alpha' and
may change in the future. Feedback is welcome.

#### Added:

- Support excluding files from sync. This uses the same 'selective sync' interface as
  excluding folders. Excluded files will be removed from the local Dropbox folder.
- Introduces an ".mignore" file to specify files that Maestral should ignore. The
  ".mignore" file must be saved in the local Dropbox folder. When excluding files or
  folders with selective sync (`maestral exclude`), they will be removed from the local
  folder and kept in the cloud only. The ".mignore" file enables the reverse: files or
  folders which exist locally will not be uploaded to Dropbox. It uses the same syntax
  as [gitignore files](https://git-scm.com/docs/gitignore) and, similar to gitignore,
  files which are already tracked by Maestral will not be affected. More details are
  given in the [Wiki](https://github.com/SamSchott/maestral-dropbox/wiki/mignore).
- Added a config option "max_cpu_percent" to adjust the target maximum CPU usage per CPU
  core. This defaults to 20%, i.e., 80% total for a quad core CPU. Maestral will aim to
  remain below that percentage but this is not guaranteed.

#### Changed:

- Replaced the `excluded_files` and `excluded_folders` settings from the config file
  with a unified `excluded_items` setting. Entries from `excluded_folders` will be
  migrated to the `excluded_items` setting.
- Renamed methods which exclude / include folders to `exclude_item` etc.
- Speed up creation of local folders.
- When trying to create a file or folder with the same path as an item excluded by
  selective sync, the new item is now renamed by appending "selective sync conflict"
  instead of raising a sync issue. This is closer the behaviour of the official client.
- Significant performance improvements to indexing and file event processing. Indexing a
  remote Dropbox with 20,000 to 30,000 files and comparing it a local folder now takes
  ~ 5 min, depending on on the average file size.
- Introduced periodic reindexing every week. This has been made possible by the above
  performance improvements.

#### Fixed:

- Don't immediately retry when a download fails. Instead, save failed downloads and
  retry only on pause / resume or restart.
- Fixes missing cursor and resulting unexpected `ValidationError` during sync startup.
- Wait until all sync activity has stopped before moving the Dropbox folder. This avoids
  errors when trying to convert local to dropbox paths and vice versa during the move.
- Fixes an issue which would prevent some conflicting copies created by Dropbox from
  being downloaded.
- Correctly handle when a local item is renamed to an always excluded file name such as
  ".DS_STORE": the item is now deleted from Dropbox.
- Fixes an issue where sharing an existing folder from the Dropbox website would result
  in the folder being deleted locally. This is because Dropbox actually removes the
  shared folder from the user's Dropbox and then re-mounts it as a shared drive / file
  system. We handle this correctly now by leaving the local folder alone or deleting and
  re-downloading it, depending on the time elapsed between removal and re-mounting.
- Improves conflict resolution when a folder has been been replaced with a file or vice
  versa and both the local and remote item have un-synced changes.
- Fixes an issue where `maestral stop` would block until all pending syncs have
  completed. This could potentially take a *very* long time for large downloads.
  Instead, any interrupted downloads will be restarted on next launch.

#### Removed:

- Removed the `excluded_files` and `excluded_folders` settings from the config file.

## v0.6.1

This release improves desktop notifications: Notifications will now only appear for
remote file changes and you can chose between different notification levels (CLI only)
and snooze notifications temporarily. It also reintroduces the `maestral autostart`
command to start the sync daemon on login (requires systemd on Linux). This works
independently of the GUI option "Start on login".

There have also been significant changes in package structure: the GUI has been split
off into a separate package `maestral-qt` which will be installed with the gui extra
`pip3 install -U maestral[gui]` or directly with `pip3 install -U maestral-qt`. A native
Cocoa GUI (`maestral-cocoa`) for macOS is currently in testing and will likely be
released with the next update.

Other changes include improved error handling, cleaned up config files and some tweaks
to CLI commands. As always, there are several bug fixes. Thank you for all your
feedback!

#### Added:

- New CLI command `maestral autostart` to start the daemon on login. This requires
  systemd on Linux. The "Start on login" option of the GUI remains independent and the
  GUI will attach to an existing daemon if it finds one.
- Added desktop notifications for errors: Serious errors such as revoked Dropbox access,
  deleted Dropbox folder, etc, were previously only shown in the GUI as an alert window
  or printed as warnings when invoking a CLI command.
- Support for different levels of desktop notifications (CLI only). You can now select
  between FILECHANGE, SYNCISSUE, ERROR and NONE with `maestral notify LEVEL`.
- Added an option to snooze notifications. In the CLI, use `maestral notify snooze N` to
  snooze notifications for N minutes. In the GUI, use the "Snooze Notifications" menu.
- Support using an existing directory when setting up Maestral through the CLI. This was
  previously only supported in the GUI. Files and folders in the existing directory will
  be merged with your Dropbox.
- The CLI command `maestral restart` now supports restarting Maestral into the current
  process instead of spawning a new process. This is enabled by passing the
  `-f, --foreground` option.
- Added a native Cocoa GUI for macOS. This removes the PyQt5 dependency for macOS and
  reduces the size of the bundled app from 50 MB to 15 MB. It also eliminates a few
  inconsistencies in GUI appearance. Especially the sync issues window looks a lot
  better (hopefully you won't see it too often).

#### Changed:

- Split off GUI into separate python packages (`maestral-qt`, `maestral-cocoa`).
- Notify only for remote changes and not for those which originated locally. This
  should significantly reduce the number of unwanted notifications.
- Renamed `maestral notifications` to `maestral notify` for brevity.
- Renamed the `set-dir` command to `move-dir` to emphesize that it moves the local
  Dropbox folder to a new location.
- Configurations are now tied to a Dropbox account:
    - New configurations are now created on-demand when calling `maestral gui` or
      `maestral start` with a new configuration name.
    - A configuration is automatically removed when unlinking a Dropbox account.
    - All configurations can be listed together with the account emails with
      `maestral configs`. This replaces `maestral config list`.
- For app bundles on macOS, you can now pass a config option `-c, --config-name` to the
  bundle's executable ("Maestral.app/Contents/MacOS/main"). It will then use the
  specified configuration if it already exists or to create a new one.
- The GUI no longer restarts after completing the setup dialog.
- Removed sync and application state info from the config file. Sync and application
  states are now  saved separately in '~/.local/share/maestral/CONFIG_NAME.state' on
  Linux and '~/Library/Application Support/maestral/CONFIG_NAME.state' on macOS.
- Use atomic save to prevent corruption of the sync index if Maestral crashes or is
  killed during a save.
- Moved the sync index to the same folder as the application state.
- Improved conflict detection and resolution when changing files which are currently
  being uploaded or downloaded.

#### Fixed:

- Fixes an issue where local changes while maestral was not running could be overwritten
  by remote changes instead of resulting in a conflicting copy.
- Fixes an issue where local file events could be ignored while a download is in
  progress.
- Fixes an issue where a new local file could be incorrectly deleted if it was created
  just after a remote item at the same path was deleted.
- Fixes an issue where `maestral stop` and `maestral restart` would not interrupt
  running sync jobs but instead wait for them to be completed. Now, aborted jobs will be
  resumed when starting Maestral again.
- Correctly handle when a folder is replaced by a file and vice versa.
- Correctly handle additional error types: internal Dropbox server error, insufficient
  space on local drive, file name too long for local file system and out-of-memory
  error.
- Automatically resume upload in case of dropped packages instead of raising a sync
  issue.
- Set the log level for the systemd journal according to user settings instead of always
  using logging.DEBUG.
- Run checks for Dropbox folder location and link status when invoking `maestral
  restart`.
- Notify the user through the GUI when moving the Dropbox directory fails instead of
  silently keeping the old directory.
- Fixes an issue where the environment variable XDG_DATA_DIR would not be respected in
  Linux.

#### Removed:

- Removed "-a" option from `maestral ls`. List all entries by default, even if they
  start with a period.
- Removed the `maestral config` command group. Configurations are now created and
  deleted on-demand and can be listed with `maestral configs`.

## v0.5.2

#### Added:

- Added automatic crash and error reporting with [bugsnag](https://www.bugsnag.com).
  This is *disabled* by default and can be enabled in the Settings pane or with the
  command `maestral analytics -Y`. The information sent with the bug report contains a
  traceback, the Python version, basic platform information (e.g,
  'Darwin-19.2.0-x86_64-i386-64bit') and potentially the version of PyQt5 and the user's
  desktop environment. No personal information will be shared.

#### Changed:

- Improved the code which handles multiple configurations: Explicitly pass the config
  name to classes instead of keeping it as a global variable.
- Improved starting of the daemon: ensure that the right python executable is used.
- Order of commands returned by `maestral --help` by importance instead of
  alphabetically.
- Sync errors will now be listed by `maestral status` if present.
- Live updates to the Settings window when settings are changed from the command line.

#### Fixed:

- Fixed an issue on macOS where some directory deletions could be ignored in case of
  rapid successive deletions.
- Fixed an unexpected exception when attempting to create a directory that already
  exists. Do not rely on the `exists_ok` parameter in `os.makedirs` but catch
  `FileExistsError` explicitly (see https://bugs.python.org/issue13498).
- Fixed an `AttributeError` when a local folder is replaced by file: the Dropbox
  metadata of the folder will not have a content hash. This mostly occurs when modifying
  a folder structure programmatically, for instance with git.
- Fixed an `AttributeError` when a remote file has been replaced by a folder before its
  changes could be downloaded: the Dropbox metadata of the folder will not have a
  content hash.
- Fixed an bug introduced in v0.5.0 which would cause rebuilding the index to block
  indefinitely.
- Fixed a crash of the GUI when closing the settings window shortly after closing the
  "Chose folders to sync..." dialog. This was caused by QThreads being destroyed while
  the threads were still running.
- Fixed an issue where the local revision number of a file could be set to 'folder',
  resulting in an exception from the Dropbox API.
- Fixed a bug when the "relink dialog" (shown when Maestral's Dropbox access has
  expired) might use the wrong Dropbox account when syncing multiple accounts.
- Fixed an issue with imports in Pyro5 5.7 which prevented the daemon from starting.

#### Removed:

- Removed the command `maestral errors` from the CLI.

## v0.5.0

This release improves the sync reliability in case of rapid successive changes to the
local Dropbox folder. It also improves error handling and includes other bug fixes. This
may be considered the first release candidate for a stable v1.0.0.

#### Added:

- Show a small bell on top of system tray icon in case of sync issues.
- Notify the user when the local Dropbox folder contains too many items to watch and
  recommend increasing the maximum number of inotify watches (Linux only).
- Notify the user when an upload fails because a file exceeds the size limit of 350 GB.
- Notify the user when an upload fails due to dropped network packages.
- Adds a command line option `maestral link -r` to relink to an existing account without
  resetting the sync state. This is the equivalent of the GUI 'relink dialog'.

#### Changed:

- Refines some error messages.
- Improves error handling in CLI: avoid printing full Python tracebacks to the console.
  Print concise and actionable error messages instead if possible.
- Improves formatting of `maestral ls` output.
- Improves status notifications for large uploads: dynamically adapt the unit to show up
  to four significant digits (e.g., "16MB/1.6GB" instead of "0/1.6GB").
- Reduces memory footprint of macOS app by stripping doc strings (at least 5MB in
  dropbox package only).

#### Fixed:

- Fixes multiple sync issues and corner cases due to rapid and successive file changes:
  The algorithm which combines successive changes of a local file to a single file event
  (created / deleted / modified / moved) has been simplified and improved.
- Fixes an issue which could cause the watchdog thread to crash silently on case-
  sensitive file systems when saving changes to a file.
- Removes sip import because it may fail depending on how PyQt was installed.
- Fixed an issue where user notifications would not appear for certain implementations
  of 'notify-send'.
- Fixes an error when setting the log level from the CLI.
- Fixes an error when relinking Maestral through the GUI after its Dropbox access has
  been revoked.

## v0.4.4

This updates focuses on bug fixes and performance improvements. Notably, it reduces the
memory usage of the GUI by ~ 30MB. If you are upgrading from v0.2.4 or earlier, please
perform an incremental update to v0.4.3 first (see Removed section).

#### Changed:

- Show a progress dialog while checking for updates when requested by the user.
- Show an error message when the GUI cannot connect to or start a sync daemon.
- Reduces the memory footprint of the GUI by ~ 30 MB by avoiding Dropbox API imports and
  deleting QtWidgets when they are not visible.
- Changing the log level (e.g., `maestral log level DEBUG`) no longer requires a restart
  of the maestral daemon to become effective.
- `maestral set-dir` now takes the new path as an argument: `maestral set-dir PATH`. If
  not given, the user will be prompted to input a path or use the default.
- Migrated from Pyro4 to Pyro5 for communication with sync daemon.

#### Fixed:

- Fixes an unhandled error when trying to upload changes to a file which is not currently
  indexed by Maestral.
- Fixes an unhandled error when attempting to calculate the content hash of a file which
  has been deleted locally. This can occur after Maestral has been notified of remote
  changes to a file which is deleted locally before comparing file contents.
- Fixes a bug which could result in multiple false "conflicting copies" of a file when
  the user modifies the file while it is being uploaded.
- Fixes a regression bug which would prevent the creation and selection of new configs
  for different Dropbox accounts.
- Fixes a bug that would prevent Maestral from properly shutting down a sync daemon
  which was started from the GUI. This was a result of the daemon's sync threads not
  exiting as long as a parent process from the same process group is still alive (the
  GUI in our case). We prevent this by using "double-fork" magic to properly orphan the
  daemon process so that init will perform its cleanup. See Stevens' "Advanced
  Programming in the UNIX Environment" for details (ISBN 0201563177).
- Fixes an issue where the application launcher which is used to start Maestral on login
  in Linux may be untrusted.
- Fixes an issue where `maestral set-dir` would fail if the new directory is the same as
  the old directory.

#### Removed:

- Removed code to migrate config files and sync indices from Maestral versions prior to
  v0.2.5.
- Removed code to migrate authentication keys to the system keyring when upgrading from
  v0.1.2 or earlier.

## v0.4.3

#### Fixed:

- Fixes a bug which would prevent periodic update checks from running.
- Fixes an issue where the system tray icon would not be displayed on Qt 5.13.1 with
  enabled HighDpi support.
- Fixes an issue which would prevent system tray icons from loading on Gnome 3.
- Fixes and issue which would prevent macOS binaries from running due to the team ID
  missing in the a code-signing certificate. Note that, even though the macOS binary is
  code-signed, the certificate is not from Apple's Developer Program. Therefore, to run
  the app, you will have to "right-lick -> Open".

#### Changed:

- Tweaked system tray icon design.
- Use NSUserNotificationCenter when running from Python outside of an app bundle.

#### Removed:

- Removed automatic detection of Gnome screen scaling factors because it caused problems
  on a few desktop environments. Set the environment variable `QT_SCREEN_SCALE_FACTORS`
  instead to enable it manually if required.

## v0.4.2

#### Added:

- Added a command `maestral activity` which gives a live view of all items queued for
  syncing or currently being synced.

#### Fixed:

- Fixes crash of the sync thread when attempting to download a file from Dropbox which
  has been deleted after it has been queued for download but before the actual download
  attempt.
- Fixes crash of the sync thread when attempting to upload a file to Dropbox which has
  been deleted after it has been queued for upload but before the actual upload attempt.
- Fixes a bug where the revision number of a file could be incorrectly set to "folder".
- Fixes a crash of the sync thread while indexing local changes (after a restart) if an
  indexed item has been deleted before we could check if it is a file or a folder.
- Fixes a bug where newly downloaded files could be immediately re-uploaded in some
  cases.
- Fixes a crash on startup when started as systemd service with watchdog.

## v0.4.1

This release focuses on bug fixes and performance improvements. Notable changes are:

- You can now rebuild Maestral's index from the command line with `maestral rebuild-
  index`.
- Communication between the sync daemon and frontend (GUI or CLI) is faster and more
  secure.
- Improved system tray notifications.

Here is the list of all changes:

#### Added:

- Added `maestral rebuild-index` command to CLI.
- Added support for systemd software watchdog (see #55).

#### Changed:

- Renamed command `maestral config new` to `maestral config add`.
- Renamed command `maestral config delete` to `maestral config remove`.
- Improved system tray notifications:
    - Display the name of the user who changed a file
    - Added app-icon and and -name to Linux notifications.
    - Migrated macOS notifications from `NSUserNotificationCenter` (deprecated) to
      `UNUserNotificatioCenter` for macOS Mojave and higher.
- Improved appearance of unlink dialog: show spinning progress indicator and perform
  unlink in the background.
- Show menu entry "No recent files" when there are no recently changed files to display.
- Use Unix domain sockets instead of TCP/IP sockets for communication with daemon. This
  means that communication is lighter, faster and more secure (other users on the same
  PC can no longer connect to your sync daemon).
- Use NSTemporaryDirectory on macOS as runtime dir.
- Simplified code for the initial sync.

#### Fixed:

- Fixes a bug where the CLI setup dialog could fail when choosing to replace an existing
  Dropbox folder.
- Fixes a bug which would cause `maestral start` to hang indefinitely if the daemon is
  not created successfully (see #57).
- Fixes a bug which would cause `maestral unlink` to fail when the Maestral daemon is
  still running.
- Fixes a bug where the Maestral GUI would show a paused icon during the initial sync
  after setup.
- Fixes a bug where the menu bar item "Pause Syncing" would not change to "Resume
  Syncing" when pausing sync through the CLI via `maestral pause` (and vice versa).
- Catch unexpected exceptions in sync threads and display to user instead of crashing.
- Do not upload changes to an excluded folder but raise a sync issue instead.
- Fixes wrong color of system tray / menu bar icon on macOS when clicked in light-mode.
- Fixes a regression bug from v0.4.0 which caused the creation of new configs for
  separate Dropbox accounts to fail silently.
- Fixes a bug which could result in a missing sync cursor when running the Maestral
  thafter e initial setup. This would come from parallel access to the config files from
  tha read spawned by the setup dialog and the Maestral daemon itself. We now make sure
  ththat e setup dialog leaves no threads behind after exiting.
- Fixes a bug which could cause false sync errors when adding a nested folder structure
  to the local Dropbox folder.
- Fixes bug in converting Dropbox `DeleteError`s due to an invalid path to
  `MaestralApiError`s.
- Fixes a bug which would prevent Maestral from detecting local changes to files that are
  part of a batch which is currently being downloaded.
- Fixes a bug where the user may be asked to create a new keyring in a non-default
  wallet if multiple wallets are available on first start (see #56).
  See https://github.com/jaraco/keyring/issues/391 for the current behaviour of Python
  keyring.
- Fixes a bug which could cause the Maestral daemon to be started with a different PATH
  than the invoking command (see #57).
- Fixes a bug where changes to a file which is not synced locally would trigger "file
  added" instead of "file modified" notifications.

## v0.4.0

Main changes are:

- Support the exclusion of subfolders.
- Check and notify if updates are available.
- Decoupled GUI and sync daemon.
- Cleaned up the command line interface. Use `maestral start` instead of
  `maestral daemon start` and `maestral start --foreground` instead of `maestral sync`.
- Bug fixes and performance improvements.

Details are given below.

#### Added:

- Method to get the sync status of individual files or folders. This is also accessible
  through the CLI via `maestral file-status LOCAL_PATH`. In the future, this could be
  used by file manager plugins to overlay the sync status of files.
- Support to exclude subfolders in the main API, CLI and GUI.
- Added a command group `maestral excluded` to view and manage excluded folders.
  Available commands are `add`, `remove` and `show`.
- For case-sensitive file systems: Automatically rename created items which have the
  same name as an existing item, but with a different case. This avoids possible issues
  on case-sensitive file systems since Dropbox itself is not case-sensitive.
- GUI notifications when a new version of Maestral is available, configurable to daily,
  weekly, monthly or never.
- A new "Check for updates..." menu entry.
- Better integration with systemd: When the daemon is started from systemd, status
  updates and ready / stopping signals are sent to systemd and the log is sent to the
  journal instead of stdout. This requires the installation of the systemd extra as
  `pip3 install -U maestral[systemd]`, which will install `sdnotify` and `systemd-
  python`. The latter may require you install additional packages through your system's
  package manager first. See [here](https://github.com/systemd/python-systemd) for
  installation instructions.

#### Changed:

- Separated daemon and CLI code into different modules.
- Simplified CLI:
    - Moved commands from `maestral daemon` to main command group, i.e.,
      `maestral daemon start` is now `maestral start`.
    - Removed `maestral sync`. Use `maestral start --foreground` instead.
- GUI now uses only the main Maestral API which is exposed over sockets.
- Changed returned values of the Maestral API to Python types only for better
  serialisation.
- GUI now starts its own daemon on demand or attaches to an existing one. This daemon
  will run in a separate process, unless started from a macOS App bundle.
- Improved startup time for large folders: Moved indexing of local files after a restart
  to the `upload_thread`.
- Sync engine moved to a submodule.
- Setup dialog no longer returns a Maestral instance on success but just ``True``. It
  is up to the GUI to create or attach to a Maestral daemon.

#### Fixed:

- Fixed an incorrect error being raised for a corrupted rev file, which could lead to a
  crash or misleading error message.
- Fixed a bug which would cause a renamed file with a previously invalid name not to
  sync to Dropbox.
- Fixed a bug in the GUI which would cause clicking on a recently changed file to reveal
  the wrong item in the file manager.
- Fixed a bug which would cause the sync thread to crash when attempting to follow a
  broken symlink (#50). Now, the error will be reported to the user as a sync issue.
  Thanks to @michaelbjames for the fix.
- Fixes a bug where the Dropbox path is not reset when aborting the setup dialog.

#### Removed:

- Removed the CLI command `maestral sync`. Use `maestral start --foreground` instead.


## v0.3.2

This release fixes a bug that could result in only changes of top-level items being
synced. This affects users who carried out the initial linking with Maestral v0.2.5 or
later and selected to exclude folders before the first download. Users affected by this
should rebuild Maestral's index by selecting "Rebuild index..." in the main menu.

Other improvements include expanded command line scripts with more useful output, minor
bug fixes and small tweaks to the UI.

#### Added:

- Added a "status" property to `maestral.main` which shows the last log message.
- Added a command group `maestral log` to view and clear the log as well set the logging
  level. Commands are:
    - `maestral log show`: Shows the logs in terminal.
    - `maestral log clear`: Clears the logs.
    - `maestral log level`: Returns the current log level.
    - `maestral log level [DEBUG|INFO|WARNING|ERROR]`: Sets the log level to the given
       value. Affects both stdout and file logs.
- Added an option "-a" to `maestral ls` to include hidden files.
- Added tooltips for system tray icon when not on macOS.

#### Changed:

- Made log levels persistent between sessions.
- Changed the name of `maestral list` to `maestral ls` and, by default, do not list
  "hidden" items that start with a dot. Added an option "-a" to explicitly list all
  files in a directory.
- Improved output from command line scripts:
    - Wrap all long outputs in empty lines.
    - Show more informative status.
    - Show Dropbox folder location in account-info.
    - Add colours to outputs like "[OK]" and "[FAILED]".
- Set minimum version requirement for click package.
- Reduced the startup time by downloading profile picture in a thread. Periodically
  update in the background (every 20 min).
- Check hashes before uploading modified files. This speeds up re-linking an old folder
  by orders of magnitude.
- Enable the creation of multiple autostart entries for different configurations.
- Fall back to PNG tray icons if the platform may not support our svg format.

#### Fixed:

- Fixed a bug which would not allow running maestral for the first time before
  explicitly adding a configuration with `maestral config new`. Now, a default
  configuration is created automatically on first run.
- Prevent the GUI and a daemon from syncing the same folder at the same time.
- Fixed the creation of multiple daemons. A new daemon will no longer overwrite an old
  one and `maestral daemon start` will do nothing if a daemon for the given
  configuration is already running.
- Automatic allocation of ports for the communication between daemon and client.
- Show the (Dropbox) file path in the string representation of `MaestralApiError`.
  Previously, one could not see from the traceback which file caused the error.
- Fixed a bug that would result in only changes of top-level items being synced. This
  affects users who carrier out the initial linking with Maestral v0.2.5 or later
  (commit 40be316b49f2198a01cc9ce9b804f8e6336e36f8) and selected to exclude folders
  before the initial sync. Users affected by this bug should rebuild Maestral's index by
  selecting "Rebuild index..." in the main menu.

#### Removed:

- No longer install a script "maestral-gui". Use "maestral gui" instead.

## v0.3.1

#### Fixed:

- Fixes a bug when calling the command line script `maestral daemon errors`. This bug
  was the result of an error in pickling our MaestralApiExceptions (see
  [https://bugs.python.org/issue1692335#msg310951](https://bugs.python.org/issue1692335#msg310951)
  for a discussion).

## v0.3.0

This release includes several significant changes. The largest are:

1) Support for multiple Dropbox accounts (via the command line)
2) A Maestral daemon for the command line
3) A redesigned settings window with more prominent account information

The detailed list of changes is:

#### Added:

- Maestral can now be started as a daemon from the command line. A new command group
  `maestral daemon` has been introduced to manage this.
- Added support for custom Dropbox folder names. The folder name must be set with the
  command line scripts.
- Added a new command group `maestral config` to manage multiple Maestral configurations
  for different Dropbox accounts.
- Added a new command line option `--config-name` or `-c` to select the configuration
  file to use.
- Improved grouping and naming of command line scripts.
- Added a "relink" dialog which is shown when Maestral's Dropbox access has expired or
  has been revoked by the user.
- Improved logic to detect system tray color and set icons accordingly. This is mostly
  for KDE which, unlike Gnome, does not handle automatically adapting its tray icon
  colours.

#### Changed:

- Animated setup dialog.
- Redesigned the settings window to show more prominent account information.
- Improved command line and GUI flows for setting or moving the Dropbox folder location.
- Moved to an Implicit Grant OAuth2 flow. This does not require an app secret to be
  stored in the client source code. Maestral will therefore no longer require the user
  to get their own API keys or to use the precompiled oauth binaries hosted on PyPI.
- Improved the user massages given by command line scripts.
- Improved status messages given in RebuildIndexDialog.
- Unified and improved the creation of QThreads by the GUI to perform background tasks.
  This fixes an issue with occasional segfaults RebuildIndexDialog and improves the
  reliability of the UI.
- Started to work on providing a top-level API in `Maestral` for all functionality that
  is required by the UI. There should be no need to interact with `Monitor` or
  `UpDownSync` directly for high-level functionality.

#### Fixed:

- Fixed a crash on startup if the Meastral's Dropbox access has expired or has been
  revoked.
- Fixed handling of `ListFolder` errors. Those will only occur when the user gives an
  incorrect folder name to list and will (hopefully) never be caused my Maestral itself.

## v0.2.6

This release fixes a critical bug which would cause Maestral to get stuck after the
initial sync. This does not affect users who have already performed the initial sync
with a previous version of Maestral.

#### Added:

- Added a context menu entry to the "Sync issues" window to show a file on dropbox.com.

#### Changed:

- Move logs to '$XDG_CACHE_HOME/maestral' on Linux and '~/Library/Logs/maestral' on
  macOS.
- Reduce the number of Dropbox API calls during initial sync.

#### Fixed:

- Fixed a bug which would cause Maestral to get stuck after the initial download.
- Fixes an issue in macOS where modal dialogs in the settings window would sometimes
  appear behind the window instead of in front of it.

## v0.2.5

This release fixes several sync issues which could occur when the internet connection is
lost during a sync. It also notifies the user if Maestral's access to their Dropbox has
been revoked.

#### Added:

- Handle expired or invalidated Dropbox access.
- Ask the user before overriding an existing folder in the setup dialog.
- Added status updates for large file uploads (e.g., "Uploading 10/545MB...").

#### Changed:

- Significant speedup of initial indexing. Excluded folders or subfolders will no
  longer be indexed.
- Save config files in the systems default location: '$XDG_CONFIG_HOME/maestral' or
  '.config/maestral' in Linux and '~/Library/Application Support/maestral' on macOS.

#### Fixed:

- Fixed a false "Dropbox folder cannot be found" message which would appear when
  quitting and restarting Maestral during the first sync. Now, the initial download is
  quietly resumed when relaunching Maestral.
- Fixed an issue where an interrupted upload would not resume without restarting
  Maestral.
- Fixed an issue where file changes while "offline" would sometimes not be synced to
  Dropbox when a connection is reestablished.
- Fixed an issue where errors from `requests` would inadvertently get caught instead of
  being raised.

## v0.2.4

This version mainly improves the appearance and responsiveness of the GUI specifically
on Linux platforms with a Gnome desktop. It also introduces a dialog to handle a deleted
or moved Dropbox folder.

#### Added:

- Added a "Select all" option when choosing which folders to sync.
- Handle deleted or moved Dropbox folder in setup dialog.
- Handle deleted or moved Dropbox folder while Maestral is running.

#### Changed:

- Improved performance of the GUI on some Gnome systems in case of many rapid status
  changes.
- Show system tray icon already during the setup dialog.

#### Fixed:

- Fixed size of the system tray icon in Gnome desktops with high-DPI scaling.
- Fixed a bug which would result in an error dialog being shown for "normal" sync errors
  such as an invalid file name.
- Fixed missing line-breaks in the traceback shown by the error dialog.
- Updated console scripts to reflect changes in MaestralMonitor and MaestralApiClient.

## v0.2.3

This release mainly fixes crashes of the setup dialog and contains tweaks to the UI.

#### Changed:

- Launch into setup dialog if no Dropbox authentication token can be found in keychain.
- Only log messages of level ERROR or higher to file.
- Show account email in the system tray menu above space usage.
- Unified the code for error dialogs and added an app icon to all dialogs.

#### Fixed:

- Fixed a bug which could could result in the user being asked to re-authenticate when
  no Dropbox folder is detected on startup.
- Fixed a bug which could cause Maestral to crash during the setup dialog, immediately
  after user authentication.

## v0.2.2

#### Added:

- Added support for file and folder names with two or more periods.
- Temporary autosave files that are created by macOS are now detected by their extension
  and excluded from syncing.
- More fine-grained errors, subclassed from `MaestralApiError`.
- Log all events of level INFO and higher to a rotating file in '~/.maestral/logs'. The
  log folder size will never exceed 6 MB.

#### Changed:

- Better handling when Dropbox resets a cursor: retry any `files_list_folder` calls and
  prompt the user to rebuild the index on `files_list_folder_longpoll` calls.
- Prepare for G-suite Dropbox integration: G-suite files such as Google docs and sheets
  will not be downloadable but can only be exported. Maestral will ignore such files.
- Moved deprecated API calls to v2.
- Better handling of `OSErrors` on download.
- Tweaks to logo.

#### Fixed:

- Fixed a bug which would prevent some error dialogs from being shown to the user.
- Fixed a bug which would cause the setup dialog to crash after linking to Dropbox.

## v0.2.1

#### Changed:

- Reload all file and folder icons when the system appearance changes: the system may
  provide different icons (e.g., darker folder icons in "dark mode" on macOS Mojave).
- Improved notification centre alerts in macOS: when installed as a bundled app,
  notifications are now properly sent from the Maestral itself, showing the Maestral
  icon, instead of through apple script.
- Improved layout of the "Rebuild index" dialog.

#### Fixed:

- Fixes a bug which would prevent Meastral from starting on login: the correct startup
  script is now called.

## v0.2.0

#### Major changes

#### Added:

- Proper handling of sync errors. Dropbox API errors are converted to a more informative
  `MaestralApiError` and a log of sync errors is kept. This log is cleared as sync
  errors are resolved. Errors are now handled as follows:
      - Individual file sync errors are indicated by the system tray icon changing. The
        can listed by the user through the GUI.
      - Unexpected errors or major errors which prevent Maestral from functioning (e.g.,
        a corrupted index) trigger an error dialog.

- Introduced a new panel "View Sync Issues..." to show an overview of sync issues and
  their cause (invalid file name, insufficient space on Dropbox, etc...)
- Added a new function to rebuild Maestral's file index which is accessible through the
  GUI.
- Added "Recently Changed Files" submenu to the system tray menu. "Recently Changed
  Files" shows entries for the 30 last-changed files (synced folders only) and navigates
  to the respective file in the default file manager when an entry is clicked.

#### Changed:

- Refactored sync code: Collected all sync functionality in a the new class
  `monitor.UpDownSync`. `MaestralClient` now only handles access to the Dropbox API
  itself but is no longer concerned with version tracking, etc. `MaestralClient` no
  longer catches Dropbox API errors but raises them, augmented with useful information,
  as `MaestralApiError`.
- Moved storage of user authentication tokens from a text file to the system keyring. As a
  result, authentication tokens will be encrypted on the hard drive and only decrypted
  when the user logs in. On some systems, this may cause problems in headless mode, when
  the Gnome keyring is not loaded. The
  [keyring documentation](https://keyring.readthedocs.io/en/latest/#using-keyring-on-headless-linux-systems)
  provides help for such cases.

#### Minor changes

#### Added:

- Added progress messages for uploads and downloads, e.g., "Downloading 3/98...". These
  are output as info messages and shown in the status field of the system tray menu.
- When unlinking your Dropbox account through the GUI, Maestral is restarted to enter the
  setup dialog.
- Refinements for dark interface themes such as Dark Mode in macOS Mojave

#### Changed:

- Use native system icons instead of macOS icons to represent files and folders.
- Some programs save file changes by deleting the old file and creating a new file. This
  is now correctly combined to a single `FileModified` event.
- Some programs create temporary files when saving changes. Those temporary files are
  deleted again after the save is completed. Those `FileCreated` and `FileDeleted`
  events, which occur in quick succession, are now ignored by Maestral.
- The following file names have been added to the exclusion list:
    - Files that start with "\~$" or ".~"
    - Files that start with "~" and end with ".tmp"
- Cleaned up some of the config module code: removed Spyder specific functions and
  obsolete Python 2 compatibility.
- Adapted code to correctly load resources in case Maestral is packaged as a macOS app
  bundle.

#### Fixed:

- Fixed a bug which may result in a removed folder not being deleted locally if it
  contains subfolders.
- Fixed a bug which may result in file modifications not being uploaded, depending on
  how the changes were saved by the program which was used to edit the file.
- Fixed a bug which would incorrectly list top level files as folders in the "Exclude
  folders" dialog.
- Truncate entries in the "Recently Changed Files" menu if their width exceeds 200
  pixels.
- Fixed a bug which would cause Maestral to crash when clicking "Choose folders to
  sync..." while Maestral cannot connect to Dropbox servers.

## v0.1.2

#### Added:

- Added new command line option 'autostart' to automatically start Maestral on login.

#### Changed:

- Limit notifications to remote changes only and only notify for changes in folders that
  currently being synced, unless more than 100 files have changed.
- Detect colour of system tray and invert icon colour automatically if not on macOS.
- Shut down immediately and kill threads instead of waiting for timeout.
- Improve appearance of Settings window in GTK 3 style.

#### Fixed:

- Fixed a bug which would cause uploads to fail if they are split into multiple chunks.
- Fixed a bug that would prevent Maestral from quitting if the setup dialog is aborted.
- Fixed a bug that would cause Maestral to crash during the setup dialog when switching
  multiple times between the "Select Folders to Sync" and "Select Dropbox location"
  panels.
- Do not upload files that have identical content on Dropbox. Previously: files were
  always uploaded and conflict checking was left to do by the Dropbox server.

## v0.1.1

#### Fixed:

- Fixes an issue which would prevent newly created empty folders from being synced.
- Remove references to conda in startup script.