From e9ed43d8b3c08ef2145da7a19139ddc30e46d45a Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 4 Dec 2020 20:13:51 +0100 Subject: [PATCH 001/374] Add new command: diff This takes in a file name + a rev version hash to compare it against the current version. If a user inputs two rev versions, the two versions get compared. --- src/maestral/cli.py | 59 ++++++++++++++++++++++++++++++++++++++++++ src/maestral/client.py | 20 ++++++++++++++ src/maestral/main.py | 13 ++++++++++ 3 files changed, 92 insertions(+) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 1d03eddae..0190cd324 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,6 +20,7 @@ # local imports from . import __version__, __author__, __url__ from .utils.cli import Column, Table, Align, Elide, Grid, TextField, DateField, Field +from .utils.appdirs import get_cache_path if TYPE_CHECKING: @@ -1434,3 +1435,61 @@ def notify_snooze(minutes: int, config_name: str) -> None: ) else: click.echo("Notifications enabled.") + + +@main.command( + help_priority=8, + help=""" +Compare changes of two revisions of a file. +If the second revision is omitted, it will compare the file to the current version. +""", +) +@click.argument("dbx_path") +@click.argument("old_rev") +@click.argument("new_rev", required = False) +@existing_config_option +# If new_version_hash is omitted, use the current version of the file +def diff(dbx_path: str, old_rev: str, new_rev: str, config_name: str) -> None: + + import difflib + from .daemon import MaestralProxy + + # Reason for rel_dbx_path: os.path.join does not like leading / + if dbx_path.startswith("/"): + abs_dbx_path = dbx_path + rel_dbx_path = dbx_path[1:] + else: + rel_dbx_path = dbx_path + abs_dbx_path = "/" + dbx_path + + try: + with MaestralProxy(config_name) as m: + # Download specific revisions to cache + new_location = os.path.join(m.dropbox_path, rel_dbx_path) + old_location = m.download_rev_to_file( + dbx_path = abs_dbx_path, + rev = old_rev + ) + + # Use the current version if new_version_hash is None + if new_rev != None: + new_location = m.download_rev_to_file( + dbx_path = abs_dbx_path, + rev = new_rev + ) + + # TODO: is there a better function? + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() + + for line in difflib.context_diff( + new_content, old_content, + # TODO: True paths or something simpler? + fromfile = new_location, tofile = old_location + ): + click.echo(line, nl = False) + + except Pyro5.errors.CommunicationError: + click.echo("unwatched") diff --git a/src/maestral/client.py b/src/maestral/client.py index 1ab4740a7..6a9319309 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -73,6 +73,7 @@ from .config import MaestralState from .constants import DROPBOX_APP_KEY, IDLE from .utils import natural_size, chunks, clamp +from .utils.appdirs import get_cache_path if TYPE_CHECKING: from .sync import SyncEvent @@ -527,6 +528,25 @@ def download( return md + def download_rev_to_file( + self, + dbx_path: str, + rev: str + ) -> str: + """ + Downloads specific revision from Dropbox into a temporary file in the + users cache directory. The path will be returned by the function and is + equal to 'name_revhash'. + + :param dbx_path: Path to retrieve file on Dropbox. + :param rev: Revision of file to download. + """ + + # TODO: better temp file solution? + local_path = os.path.join("/tmp", f"{rev}") + self.dbx.files_download_to_file(local_path, dbx_path, rev) + return local_path + @convert_api_errors_decorator(local_path_arg=1, dbx_path_arg=2) def upload( self, diff --git a/src/maestral/main.py b/src/maestral/main.py index dc2393e48..f03ffc099 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -865,6 +865,19 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries + def download_rev_to_file(self, dbx_path: str, rev: str) -> str: + """ + Downloads specific revision from Dropbox into a temporary file in the + users cache directory. The path will be returned by the function and is + equal to 'name_revhash'. + + :param dbx_path: Path to retrieve file on Dropbox. + :param rev: Revision of file to download. + """ + + return self.client.download_rev_to_file(dbx_path, rev) + + def restore(self, dbx_path: str, rev: str) -> StoneType: """ Restore an old revision of a file. From ba8c582fb72f7cd3add2927f5aff5515d0a11986 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 4 Dec 2020 20:25:05 +0100 Subject: [PATCH 002/374] Remove unnecessary imports --- src/maestral/cli.py | 1 - src/maestral/client.py | 1 - 2 files changed, 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 0190cd324..66d5c6006 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,7 +20,6 @@ # local imports from . import __version__, __author__, __url__ from .utils.cli import Column, Table, Align, Elide, Grid, TextField, DateField, Field -from .utils.appdirs import get_cache_path if TYPE_CHECKING: diff --git a/src/maestral/client.py b/src/maestral/client.py index 6a9319309..269f18822 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -73,7 +73,6 @@ from .config import MaestralState from .constants import DROPBOX_APP_KEY, IDLE from .utils import natural_size, chunks, clamp -from .utils.appdirs import get_cache_path if TYPE_CHECKING: from .sync import SyncEvent From ff754c771d8f75f3e70e1a7cecb98b7f0f82b0ed Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 4 Dec 2020 20:28:39 +0100 Subject: [PATCH 003/374] Format code with 'black' --- src/maestral/cli.py | 18 ++++++++---------- src/maestral/client.py | 8 ++------ src/maestral/main.py | 3 +-- 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 66d5c6006..6a3eac730 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1445,7 +1445,7 @@ def notify_snooze(minutes: int, config_name: str) -> None: ) @click.argument("dbx_path") @click.argument("old_rev") -@click.argument("new_rev", required = False) +@click.argument("new_rev", required=False) @existing_config_option # If new_version_hash is omitted, use the current version of the file def diff(dbx_path: str, old_rev: str, new_rev: str, config_name: str) -> None: @@ -1465,16 +1465,12 @@ def diff(dbx_path: str, old_rev: str, new_rev: str, config_name: str) -> None: with MaestralProxy(config_name) as m: # Download specific revisions to cache new_location = os.path.join(m.dropbox_path, rel_dbx_path) - old_location = m.download_rev_to_file( - dbx_path = abs_dbx_path, - rev = old_rev - ) + old_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=old_rev) # Use the current version if new_version_hash is None if new_rev != None: new_location = m.download_rev_to_file( - dbx_path = abs_dbx_path, - rev = new_rev + dbx_path=abs_dbx_path, rev=new_rev ) # TODO: is there a better function? @@ -1484,11 +1480,13 @@ def diff(dbx_path: str, old_rev: str, new_rev: str, config_name: str) -> None: old_content = f.readlines() for line in difflib.context_diff( - new_content, old_content, + new_content, + old_content, # TODO: True paths or something simpler? - fromfile = new_location, tofile = old_location + fromfile=new_location, + tofile=old_location, ): - click.echo(line, nl = False) + click.echo(line, nl=False) except Pyro5.errors.CommunicationError: click.echo("unwatched") diff --git a/src/maestral/client.py b/src/maestral/client.py index 269f18822..fdd8359e2 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -527,16 +527,12 @@ def download( return md - def download_rev_to_file( - self, - dbx_path: str, - rev: str - ) -> str: + def download_rev_to_file(self, dbx_path: str, rev: str) -> str: """ Downloads specific revision from Dropbox into a temporary file in the users cache directory. The path will be returned by the function and is equal to 'name_revhash'. - + :param dbx_path: Path to retrieve file on Dropbox. :param rev: Revision of file to download. """ diff --git a/src/maestral/main.py b/src/maestral/main.py index f03ffc099..69a3b0d9a 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -870,14 +870,13 @@ def download_rev_to_file(self, dbx_path: str, rev: str) -> str: Downloads specific revision from Dropbox into a temporary file in the users cache directory. The path will be returned by the function and is equal to 'name_revhash'. - + :param dbx_path: Path to retrieve file on Dropbox. :param rev: Revision of file to download. """ return self.client.download_rev_to_file(dbx_path, rev) - def restore(self, dbx_path: str, rev: str) -> StoneType: """ Restore an old revision of a file. From 281d0ce8280a3c5ef608be3d0b833abd6a60eab7 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 4 Dec 2020 20:34:02 +0100 Subject: [PATCH 004/374] Fix issue with 'flake8' --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 6a3eac730..f33f6a872 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1468,7 +1468,7 @@ def diff(dbx_path: str, old_rev: str, new_rev: str, config_name: str) -> None: old_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=old_rev) # Use the current version if new_version_hash is None - if new_rev != None: + if new_rev is not None: new_location = m.download_rev_to_file( dbx_path=abs_dbx_path, rev=new_rev ) From 500993835495626b0afb3f083a5745e5677ced71 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 5 Dec 2020 11:30:25 +0100 Subject: [PATCH 005/374] Implement new fancy menu --- src/maestral/cli.py | 109 ++++++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 33 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 3172ea587..c48367950 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1495,56 +1495,99 @@ def log_level(level_name: str, config_name: str) -> None: @main.command( - help_priority=8, + section="Maintenance", help=""" Compare changes of two revisions of a file. If the second revision is omitted, it will compare the file to the current version. """, ) -@click.argument("dbx_path") -@click.argument("old_rev") -@click.argument("new_rev", required=False) +@click.argument("dropbox_path", type=click.Path()) +@click.option( + "-v", + "--rev", + help="Revisions to compare (mulitple allowed to compare two old revs)", + multiple=True, + default=[], +) +@catch_maestral_errors @existing_config_option # If new_version_hash is omitted, use the current version of the file -def diff(dbx_path: str, old_rev: str, new_rev: str, config_name: str) -> None: +def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: import difflib + from datetime import datetime from .daemon import MaestralProxy # Reason for rel_dbx_path: os.path.join does not like leading / - if dbx_path.startswith("/"): - abs_dbx_path = dbx_path - rel_dbx_path = dbx_path[1:] + if dropbox_path.startswith("/"): + abs_dbx_path = dropbox_path + rel_dbx_path = dropbox_path[1:] else: - rel_dbx_path = dbx_path - abs_dbx_path = "/" + dbx_path + rel_dbx_path = dropbox_path + abs_dbx_path = "/" + dropbox_path + + def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): + # Download specific revisions to cache + new_location = os.path.join(m.dropbox_path, rel_dbx_path) + old_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=old_rev) + + # Use the current version if new_version_hash is None + if new_rev is not None: + new_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=new_rev) + + # TODO: is there a better function? + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() + + for line in difflib.context_diff( + new_content, + old_content, + # TODO: True paths or something simpler? + fromfile=new_location, + tofile=old_location, + ): + click.echo(line, nl=False) try: with MaestralProxy(config_name) as m: - # Download specific revisions to cache - new_location = os.path.join(m.dropbox_path, rel_dbx_path) - old_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=old_rev) - - # Use the current version if new_version_hash is None - if new_rev is not None: - new_location = m.download_rev_to_file( - dbx_path=abs_dbx_path, rev=new_rev - ) + if len(rev) == 0: + entries = m.list_revisions(abs_dbx_path) + dates = [] + for entry in entries: + cm = cast(str, entry["client_modified"]) + dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() + field = cli.DateField(dt) + dates.append(field.format(40)[0]) - # TODO: is there a better function? - with open(new_location) as f: - new_content = f.readlines() - with open(old_location) as f: - old_content = f.readlines() - - for line in difflib.context_diff( - new_content, - old_content, - # TODO: True paths or something simpler? - fromfile=new_location, - tofile=old_location, - ): - click.echo(line, nl=False) + base = cli.select( + message="Select a version as a base:", + options=dates, + hint="(↓ to see more)" if len(dates) > 6 else "", + ) + # Remove the option of 'Current Version' + dates = dates[base + 1 :] + to_compare = cli.select( + message="Select a version to compare to:", + options=dates, + hint="(↓ to see more)" if len(dates) > 6 else "", + ) + # First index = current version + if base == 0: + download_and_compare(m, entries[base + to_compare]["rev"]) + else: + download_and_compare( + m, + entries[base + to_compare]["rev"], + new_rev=entries[base]["rev"], + ) + elif len(rev) == 1: + download_and_compare(m, rev[0]) + elif len(rev) == 2: + download_and_compare(m, rev[0], new_rev=rev[1]) + else: + click.echo("You can only compare two revisions at a time") except Pyro5.errors.CommunicationError: click.echo("unwatched") From 648f855af07d526a83f18ccfefc6da54ecda15ca Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 6 Dec 2020 15:23:47 +0000 Subject: [PATCH 006/374] =?UTF-8?q?Bump=20version:=201.3.1=20=E2=86=92=201?= =?UTF-8?q?.3.2.dev0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .bumpversion.cfg | 2 +- docs/conf.py | 2 +- setup.py | 2 +- src/maestral/__init__.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.bumpversion.cfg b/.bumpversion.cfg index a8535b949..6b2888436 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.3.1 +current_version = 1.3.2.dev0 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? diff --git a/docs/conf.py b/docs/conf.py index 23119372e..2fa534a6c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -11,7 +11,7 @@ # -- Project information --------------------------------------------------------------- author = "Sam Schott" -version = "1.3.1" +version = "1.3.2.dev0" release = version project = "Maestral" title = "Maestral API Documentation" diff --git a/setup.py b/setup.py index d4928c85c..af526e739 100644 --- a/setup.py +++ b/setup.py @@ -56,7 +56,7 @@ name="maestral", author="Sam Schott", author_email="ss2151@cam.ac.uk", - version="1.3.1", + version="1.3.2.dev0", url="https://github.com/SamSchott/maestral", description="Open-source Dropbox client for macOS and Linux.", license="MIT", diff --git a/src/maestral/__init__.py b/src/maestral/__init__.py index 2681b2e26..c8bf040a2 100644 --- a/src/maestral/__init__.py +++ b/src/maestral/__init__.py @@ -14,7 +14,7 @@ import warnings -__version__ = "1.3.1" +__version__ = "1.3.2.dev0" __author__ = "Sam Schott" __url__ = "https://github.com/SamSchott/maestral" From 93725f1131bfda05e22f07522601312e8cc2a6aa Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 6 Dec 2020 15:26:34 +0000 Subject: [PATCH 007/374] bump survey to < 4.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index af526e739..42045c2c7 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "sdnotify>=0.3.2", "setuptools", "sqlalchemy>=1.3,<1.4", - "survey>=2.1.0,<3.0", + "survey>=3.0,<4.0", "watchdog>=0.10.0,<=0.10.3", ] From c7cdd04af5dc99e762958241f1541fffef9d97a6 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 6 Dec 2020 16:25:43 +0000 Subject: [PATCH 008/374] [cli] adapt to survey 3.0 API --- src/maestral/utils/cli.py | 86 +++++++++++++++------------------------ 1 file changed, 32 insertions(+), 54 deletions(-) diff --git a/src/maestral/utils/cli.py b/src/maestral/utils/cli.py index 95e627bdc..5453383dc 100644 --- a/src/maestral/utils/cli.py +++ b/src/maestral/utils/cli.py @@ -9,7 +9,6 @@ Iterator, Sequence, Any, - Tuple, Callable, TYPE_CHECKING, ) @@ -543,21 +542,11 @@ def ok(message: str, nl: bool = True) -> None: def _style_message(message: str) -> str: - pre = click.style("?", fg="green") - return f"{pre} {message} " + return f"{message} " def _syle_hint(hint: str) -> str: - return click.style(hint, fg="white") + " " if hint else "" - - -orange = "\x1b[38;5;214m" -cyan = "\x1b[38;5;6m" -grey = "\x1b[90m" -bold = "\x1b[1m" - -response_color = cyan -focus_color = f"{response_color}" + return f"{hint} " if hint else "" class loading: @@ -602,10 +591,6 @@ def prompt(message: str, default: str = "", validate: Optional[Callable] = None) styled_default = _syle_hint(default) styled_message = _style_message(message) - def view(value: str) -> Tuple[str]: - response = value or default - return (response,) - def check(value: str) -> bool: if validate is None: return True @@ -614,15 +599,12 @@ def check(value: str) -> bool: else: return validate(value) - res = survey.input( - styled_message, - hint=styled_default, - view=view, - check=check, - color=response_color, - ) + res = survey.input(styled_message, hint=styled_default, check=check, auto=False) - return res + response = res or default + survey.respond(response) + + return response def confirm(message: str, default: Optional[bool] = True) -> bool: @@ -631,7 +613,7 @@ def confirm(message: str, default: Optional[bool] = True) -> bool: styled_message = _style_message(message) - return survey.confirm(styled_message, default=default, color=response_color) + return survey.confirm(styled_message, default=default) def select(message: str, options: Sequence[str], hint="") -> int: @@ -645,14 +627,12 @@ def select(message: str, options: Sequence[str], hint="") -> int: index = survey.select( options, styled_message, - focus=focus_color, - color=response_color, hint=styled_hint, ) return index except (KeyboardInterrupt, SystemExit): - survey.api.respond() + survey.respond() raise @@ -666,32 +646,27 @@ def select_multiple(message: str, options: Sequence[str], hint="") -> List[int]: kwargs = {"hint": styled_hint} if hint else {} - def view(value: Sequence[int]) -> Tuple[str]: - - chosen = [options[index] for index in value] - response = ", ".join(chosen) - - if len(value) == 0 or len(response) > 50: - response = f"[{len(value)} chosen]" - - return (response,) - indices = survey.select( options, styled_message, multi=True, - focus=focus_color, - color=response_color, pin="[✓] ", unpin="[ ] ", - view=view, **kwargs, ) + chosen = [options[index] for index in indices] + response = ", ".join(chosen) + + if len(indices) == 0 or len(response) > 50: + response = f"[{len(indices)} chosen]" + + survey.respond(response) + return indices except (KeyboardInterrupt, SystemExit): - survey.api.respond() + survey.respond() raise @@ -706,14 +681,13 @@ def select_path( import os import survey + import wrapio + + track = wrapio.Track() styled_default = _syle_hint(f"[{default}]") styled_message = _style_message(message) - def view(value: str) -> Tuple[str]: - response = value or default - return (response,) - failed = False def check(value: str) -> bool: @@ -737,23 +711,27 @@ def check(value: str) -> bool: return passed - def callback(event: str, result: str, *args) -> None: + @track.call("delete") + def handle(result: str, *args) -> None: nonlocal failed - if event == "delete" and failed: - survey.update(styled_default) + if failed: + survey.update("") failed = False res = survey.input( styled_message, hint=styled_default, - view=view, check=check, - callback=callback, - color=response_color, + callback=track.invoke, + auto=False, ) - return res or default + response = res or default + + survey.respond(response) + + return response class RemoteApiError(click.ClickException): From cf576343125fc7113477efd7ee1f9f9f82954de7 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sun, 6 Dec 2020 23:30:53 +0100 Subject: [PATCH 009/374] Fix index when selecting file versions --- src/maestral/cli.py | 58 +++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c48367950..20ab4f920 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1519,21 +1519,23 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: from .daemon import MaestralProxy # Reason for rel_dbx_path: os.path.join does not like leading / - if dropbox_path.startswith("/"): - abs_dbx_path = dropbox_path - rel_dbx_path = dropbox_path[1:] - else: - rel_dbx_path = dropbox_path - abs_dbx_path = "/" + dropbox_path + if not dropbox_path.startswith("/"): + dropbox_path = "/" + dropbox_path def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): - # Download specific revisions to cache - new_location = os.path.join(m.dropbox_path, rel_dbx_path) - old_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=old_rev) + # Get the dates of the revisions + entries = m.list_revisions(dropbox_path) + new_date = entries[0]["client_modified"] + old_date = check_rev(entries, rev) + new_location = os.path.join(m.dropbox_path, dropbox_path[1:]) + # Download specific revision to cache + old_location = m.download_rev_to_file(dropbox_path, old_rev) # Use the current version if new_version_hash is None - if new_rev is not None: - new_location = m.download_rev_to_file(dbx_path=abs_dbx_path, rev=new_rev) + # Saves space (unnecessary downloads omitted) + if new_rev: + new_date = check_rev(entries, new_rev) + new_location = m.download_rev_to_file(dropbox_path, new_rev) # TODO: is there a better function? with open(new_location) as f: @@ -1545,15 +1547,24 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): new_content, old_content, # TODO: True paths or something simpler? - fromfile=new_location, - tofile=old_location, + fromfile=os.path.join(m.dropbox_path, dropbox_path), + tofile=os.path.join(m.dropbox_path, dropbox_path), + fromfiledate=new_date, + tofiledate=old_date, ): click.echo(line, nl=False) + # Check if a revision exists and return the date ("client_modified") + def check_rev(revs: List[str], rev: str) -> str: + for r in revs: + if r["rev"] == revs: + return r["client_modified"] + return None + try: with MaestralProxy(config_name) as m: if len(rev) == 0: - entries = m.list_revisions(abs_dbx_path) + entries = m.list_revisions(dropbox_path) dates = [] for entry in entries: cm = cast(str, entry["client_modified"]) @@ -1567,26 +1578,21 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): hint="(↓ to see more)" if len(dates) > 6 else "", ) - # Remove the option of 'Current Version' - dates = dates[base + 1 :] to_compare = cli.select( message="Select a version to compare to:", - options=dates, - hint="(↓ to see more)" if len(dates) > 6 else "", - ) + options=dates[base + 1 :], + hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", + ) + base + 1 + # First index = current version if base == 0: - download_and_compare(m, entries[base + to_compare]["rev"]) + download_and_compare(m, entries[to_compare]["rev"]) else: - download_and_compare( - m, - entries[base + to_compare]["rev"], - new_rev=entries[base]["rev"], - ) + download_and_compare(m, entries[to_compare]["rev"], entries[base]["rev"]) elif len(rev) == 1: download_and_compare(m, rev[0]) elif len(rev) == 2: - download_and_compare(m, rev[0], new_rev=rev[1]) + download_and_compare(m, rev[0], rev[1]) else: click.echo("You can only compare two revisions at a time") except Pyro5.errors.CommunicationError: From 53b905c790cc47e3c586dee00624b700bb43b838 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sun, 6 Dec 2020 23:41:41 +0100 Subject: [PATCH 010/374] Implement temporary storage 'maestral diff' now saves all downloaded files in a temporary directory that gets deleted as soon as the program ends. This also removes the 'download_rev_to_file' function and switches to 'download'. --- src/maestral/cli.py | 17 ++++++++++++----- src/maestral/client.py | 15 --------------- src/maestral/main.py | 10 +++++----- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 20ab4f920..612ce3248 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1514,7 +1514,7 @@ def log_level(level_name: str, config_name: str) -> None: # If new_version_hash is omitted, use the current version of the file def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: - import difflib + import difflib, tempfile from datetime import datetime from .daemon import MaestralProxy @@ -1523,19 +1523,25 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: dropbox_path = "/" + dropbox_path def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): + # Create a temporary directory to store all downloaded files + tempdir = tempfile.TemporaryDirectory() + # Get the dates of the revisions entries = m.list_revisions(dropbox_path) new_date = entries[0]["client_modified"] old_date = check_rev(entries, rev) new_location = os.path.join(m.dropbox_path, dropbox_path[1:]) + old_location = os.path.join(tempdir.name, old_rev) + # Download specific revision to cache - old_location = m.download_rev_to_file(dropbox_path, old_rev) + old_md = m.download_revision(dropbox_path, old_location, old_rev) # Use the current version if new_version_hash is None # Saves space (unnecessary downloads omitted) if new_rev: new_date = check_rev(entries, new_rev) - new_location = m.download_rev_to_file(dropbox_path, new_rev) + new_location = os.path.join(tempdir.name, new_rev) + new_md = m.download_revision(dropbox_path, new_location, new_rev) # TODO: is there a better function? with open(new_location) as f: @@ -1547,8 +1553,8 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): new_content, old_content, # TODO: True paths or something simpler? - fromfile=os.path.join(m.dropbox_path, dropbox_path), - tofile=os.path.join(m.dropbox_path, dropbox_path), + fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), + tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), fromfiledate=new_date, tofiledate=old_date, ): @@ -1595,5 +1601,6 @@ def check_rev(revs: List[str], rev: str) -> str: download_and_compare(m, rev[0], rev[1]) else: click.echo("You can only compare two revisions at a time") + except Pyro5.errors.CommunicationError: click.echo("unwatched") diff --git a/src/maestral/client.py b/src/maestral/client.py index ec70d780a..715333ac2 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -519,21 +519,6 @@ def download( return md - def download_rev_to_file(self, dbx_path: str, rev: str) -> str: - """ - Downloads specific revision from Dropbox into a temporary file in the - users cache directory. The path will be returned by the function and is - equal to 'name_revhash'. - - :param dbx_path: Path to retrieve file on Dropbox. - :param rev: Revision of file to download. - """ - - # TODO: better temp file solution? - local_path = os.path.join("/tmp", f"{rev}") - self.dbx.files_download_to_file(local_path, dbx_path, rev) - return local_path - @convert_api_errors_decorator(local_path_arg=1, dbx_path_arg=2) def upload( self, diff --git a/src/maestral/main.py b/src/maestral/main.py index 52742c759..07827f13b 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -865,17 +865,17 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries - def download_rev_to_file(self, dbx_path: str, rev: str) -> str: + def download_revision(self, dbx_path: str, local_path: str, rev: str) -> files.Metadata: """ - Downloads specific revision from Dropbox into a temporary file in the - users cache directory. The path will be returned by the function and is - equal to 'name_revhash'. + Downloads specific revision from Dropbox into a local file. + Returns metadata about the downloaded file. :param dbx_path: Path to retrieve file on Dropbox. + :param local_path: Path to save file on local computer. :param rev: Revision of file to download. """ - return self.client.download_rev_to_file(dbx_path, rev) + return self.client.download(dbx_path, local_path, rev=rev) def restore(self, dbx_path: str, rev: str) -> StoneType: """ From d53a9c92124c2b397b585dc85fa40804f4b6b95b Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 00:01:18 +0100 Subject: [PATCH 011/374] Fix black and mypy issues --- src/maestral/cli.py | 59 +++++++++++++++++++++++++++++++------------- src/maestral/main.py | 5 +++- 2 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 612ce3248..8a107e2f2 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,6 +20,7 @@ # local imports from . import __version__, __author__, __url__ from .utils import cli +from .utils.serializer import StoneType if TYPE_CHECKING: from .main import Maestral @@ -1522,14 +1523,20 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: if not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path - def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): + # Returns False if a revision does not exist + def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None) -> bool: # Create a temporary directory to store all downloaded files tempdir = tempfile.TemporaryDirectory() # Get the dates of the revisions entries = m.list_revisions(dropbox_path) - new_date = entries[0]["client_modified"] - old_date = check_rev(entries, rev) + new_date = cast(str, entries[0]["client_modified"]) + od = check_rev(entries, old_rev) + if not od: + return False + else: + old_date = cast(str, od) + new_location = os.path.join(m.dropbox_path, dropbox_path[1:]) old_location = os.path.join(tempdir.name, old_rev) @@ -1539,11 +1546,14 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): # Use the current version if new_version_hash is None # Saves space (unnecessary downloads omitted) if new_rev: - new_date = check_rev(entries, new_rev) + nd = check_rev(entries, new_rev) + if not nd: + return False + else: + new_date = cast(str, nd) new_location = os.path.join(tempdir.name, new_rev) new_md = m.download_revision(dropbox_path, new_location, new_rev) - # TODO: is there a better function? with open(new_location) as f: new_content = f.readlines() with open(old_location) as f: @@ -1552,7 +1562,6 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): for line in difflib.context_diff( new_content, old_content, - # TODO: True paths or something simpler? fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), fromfiledate=new_date, @@ -1560,11 +1569,13 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): ): click.echo(line, nl=False) + return True + # Check if a revision exists and return the date ("client_modified") - def check_rev(revs: List[str], rev: str) -> str: + def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: for r in revs: if r["rev"] == revs: - return r["client_modified"] + return cast(str, r["client_modified"]) return None try: @@ -1584,21 +1595,35 @@ def check_rev(revs: List[str], rev: str) -> str: hint="(↓ to see more)" if len(dates) > 6 else "", ) - to_compare = cli.select( - message="Select a version to compare to:", - options=dates[base + 1 :], - hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", - ) + base + 1 + to_compare = ( + cli.select( + message="Select a version to compare to:", + options=dates[base + 1 :], + hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", + ) + + base + + 1 + ) # First index = current version if base == 0: - download_and_compare(m, entries[to_compare]["rev"]) + if not download_and_compare(m, entries[to_compare]["rev"]): + click.echo("Selected revision was not found") + return else: - download_and_compare(m, entries[to_compare]["rev"], entries[base]["rev"]) + if not download_and_compare( + m, entries[to_compare]["rev"], entries[base]["rev"] + ): + click.echo("Selected revision was not found") + return elif len(rev) == 1: - download_and_compare(m, rev[0]) + if not download_and_compare(m, rev[0]): + click.echo("Selected revision was not found") + return elif len(rev) == 2: - download_and_compare(m, rev[0], rev[1]) + if not download_and_compare(m, rev[0], rev[1]): + click.echo("Selected revision was not found") + return else: click.echo("You can only compare two revisions at a time") diff --git a/src/maestral/main.py b/src/maestral/main.py index 07827f13b..bed2f3bc0 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -21,6 +21,7 @@ import bugsnag # type: ignore from bugsnag.handlers import BugsnagHandler # type: ignore from packaging.version import Version +from dropbox import files try: from systemd import journal # type: ignore @@ -865,7 +866,9 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries - def download_revision(self, dbx_path: str, local_path: str, rev: str) -> files.Metadata: + def download_revision( + self, dbx_path: str, local_path: str, rev: str + ) -> files.Metadata: """ Downloads specific revision from Dropbox into a local file. Returns metadata about the downloaded file. From 10830fe235dbd522fb47e9fc8013f17d59a2875c Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 07:57:07 +0100 Subject: [PATCH 012/374] Fix black issues --- src/maestral/cli.py | 4 +++- src/maestral/main.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 8a107e2f2..0a30a339e 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1524,7 +1524,9 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: dropbox_path = "/" + dropbox_path # Returns False if a revision does not exist - def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None) -> bool: + def download_and_compare( + m: MaestralProxy, old_rev: str, new_rev: str = None + ) -> bool: # Create a temporary directory to store all downloaded files tempdir = tempfile.TemporaryDirectory() diff --git a/src/maestral/main.py b/src/maestral/main.py index bed2f3bc0..2f7065360 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -21,7 +21,7 @@ import bugsnag # type: ignore from bugsnag.handlers import BugsnagHandler # type: ignore from packaging.version import Version -from dropbox import files +from dropbox import files try: from systemd import journal # type: ignore From 2f14748a56fbda0a332474560267557a24058653 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 11:15:49 +0100 Subject: [PATCH 013/374] Add check for file type --- src/maestral/cli.py | 60 ++++++++++++++++++++++---------------------- src/maestral/main.py | 6 ++--- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 0a30a339e..105e089a6 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1515,7 +1515,7 @@ def log_level(level_name: str, config_name: str) -> None: # If new_version_hash is omitted, use the current version of the file def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: - import difflib, tempfile + import difflib, tempfile, magic from datetime import datetime from .daemon import MaestralProxy @@ -1526,35 +1526,35 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: # Returns False if a revision does not exist def download_and_compare( m: MaestralProxy, old_rev: str, new_rev: str = None - ) -> bool: + ): # Create a temporary directory to store all downloaded files tempdir = tempfile.TemporaryDirectory() # Get the dates of the revisions entries = m.list_revisions(dropbox_path) - new_date = cast(str, entries[0]["client_modified"]) + new_date = check_rev(entries, entries[0]["rev"]) od = check_rev(entries, old_rev) - if not od: - return False - else: - old_date = cast(str, od) + if od == None: + click.echo("Selected revision was not found") + return + old_date = cast(str, od) new_location = os.path.join(m.dropbox_path, dropbox_path[1:]) old_location = os.path.join(tempdir.name, old_rev) # Download specific revision to cache - old_md = m.download_revision(dropbox_path, old_location, old_rev) + _ = m.download_revision(dropbox_path, old_location, old_rev) # Use the current version if new_version_hash is None # Saves space (unnecessary downloads omitted) if new_rev: nd = check_rev(entries, new_rev) - if not nd: - return False - else: - new_date = cast(str, nd) + if nd == None: + click.echo("Selected revision was not found") + return + new_date = cast(str, nd) new_location = os.path.join(tempdir.name, new_rev) - new_md = m.download_revision(dropbox_path, new_location, new_rev) + _ = m.download_revision(dropbox_path, new_location, new_rev) with open(new_location) as f: new_content = f.readlines() @@ -1571,17 +1571,25 @@ def download_and_compare( ): click.echo(line, nl=False) - return True - # Check if a revision exists and return the date ("client_modified") def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: for r in revs: - if r["rev"] == revs: - return cast(str, r["client_modified"]) + if r["rev"] == rev: + d = r["client_modified"] + return str(datetime.strptime(d, "%Y-%m-%dT%H:%M:%S%z").astimezone()) return None try: with MaestralProxy(config_name) as m: + # Check the file type is supported + # If not, ask user if he wants to download revs and + # compare them manually + full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) + if not magic.from_file(full_path, mime=True).startswith("text/"): + click.echo("Bad file type, only files with the type 'text/*' are supported.") + click.echo("You can look at an old version manually with 'maestral restore'.") + return + if len(rev) == 0: entries = m.list_revisions(dropbox_path) dates = [] @@ -1609,23 +1617,15 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: # First index = current version if base == 0: - if not download_and_compare(m, entries[to_compare]["rev"]): - click.echo("Selected revision was not found") - return + download_and_compare(m, entries[to_compare]["rev"]) else: - if not download_and_compare( + download_and_compare( m, entries[to_compare]["rev"], entries[base]["rev"] - ): - click.echo("Selected revision was not found") - return + ) elif len(rev) == 1: - if not download_and_compare(m, rev[0]): - click.echo("Selected revision was not found") - return + download_and_compare(m, rev[0]) elif len(rev) == 2: - if not download_and_compare(m, rev[0], rev[1]): - click.echo("Selected revision was not found") - return + download_and_compare(m, rev[0], rev[1]) else: click.echo("You can only compare two revisions at a time") diff --git a/src/maestral/main.py b/src/maestral/main.py index 2f7065360..c80ab4a5c 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -21,7 +21,6 @@ import bugsnag # type: ignore from bugsnag.handlers import BugsnagHandler # type: ignore from packaging.version import Version -from dropbox import files try: from systemd import journal # type: ignore @@ -868,7 +867,7 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: def download_revision( self, dbx_path: str, local_path: str, rev: str - ) -> files.Metadata: + ) -> StoneType: """ Downloads specific revision from Dropbox into a local file. Returns metadata about the downloaded file. @@ -878,7 +877,8 @@ def download_revision( :param rev: Revision of file to download. """ - return self.client.download(dbx_path, local_path, rev=rev) + md = self.client.download(dbx_path, local_path, rev=rev) + return dropbox_stone_to_dict(md) def restore(self, dbx_path: str, rev: str) -> StoneType: """ From d2279cc424809ce55d2827bcf499892a445eaffe Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 16:58:20 +0100 Subject: [PATCH 014/374] Expand error msg if file type is not supported --- src/maestral/cli.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 105e089a6..dbdc50b66 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1585,9 +1585,10 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: # If not, ask user if he wants to download revs and # compare them manually full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) - if not magic.from_file(full_path, mime=True).startswith("text/"): - click.echo("Bad file type, only files with the type 'text/*' are supported.") - click.echo("You can look at an old version manually with 'maestral restore'.") + mime_type = magic.from_file(full_path, mime=True) + if not mime_type.startswith("text/"): + click.echo(f"Bad file type: '{mime_type}'. Only files with the type 'text/*' are supported.") + click.echo("You can look at an old version with 'maestral restore' to compare them manually.") return if len(rev) == 0: From c187f2eeb3199ec090db4a0e8118f992e9d01378 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 17:09:33 +0100 Subject: [PATCH 015/374] Fix mypy type issues --- src/maestral/cli.py | 29 ++++++++++++++++------------- src/maestral/main.py | 4 +--- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index dbdc50b66..6128b32dc 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1524,20 +1524,20 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: dropbox_path = "/" + dropbox_path # Returns False if a revision does not exist - def download_and_compare( - m: MaestralProxy, old_rev: str, new_rev: str = None - ): + def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): # Create a temporary directory to store all downloaded files tempdir = tempfile.TemporaryDirectory() # Get the dates of the revisions entries = m.list_revisions(dropbox_path) new_date = check_rev(entries, entries[0]["rev"]) - od = check_rev(entries, old_rev) - if od == None: + if new_date is None: + click.echo("Selected revision was not found") + return + old_date = check_rev(entries, old_rev) + if old_date is None: click.echo("Selected revision was not found") return - old_date = cast(str, od) new_location = os.path.join(m.dropbox_path, dropbox_path[1:]) old_location = os.path.join(tempdir.name, old_rev) @@ -1548,11 +1548,10 @@ def download_and_compare( # Use the current version if new_version_hash is None # Saves space (unnecessary downloads omitted) if new_rev: - nd = check_rev(entries, new_rev) - if nd == None: + new_date = check_rev(entries, new_rev) + if new_date is None: click.echo("Selected revision was not found") return - new_date = cast(str, nd) new_location = os.path.join(tempdir.name, new_rev) _ = m.download_revision(dropbox_path, new_location, new_rev) @@ -1575,7 +1574,7 @@ def download_and_compare( def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: for r in revs: if r["rev"] == rev: - d = r["client_modified"] + d = cast(str, r["client_modified"]) return str(datetime.strptime(d, "%Y-%m-%dT%H:%M:%S%z").astimezone()) return None @@ -1586,9 +1585,13 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: # compare them manually full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) mime_type = magic.from_file(full_path, mime=True) - if not mime_type.startswith("text/"): - click.echo(f"Bad file type: '{mime_type}'. Only files with the type 'text/*' are supported.") - click.echo("You can look at an old version with 'maestral restore' to compare them manually.") + if not mime_type.startswith("text/"): + click.echo( + f"Bad file type: '{mime_type}'. Only files with the type 'text/*' are supported." + ) + click.echo( + "You can look at an old version with 'maestral restore' to compare them manually." + ) return if len(rev) == 0: diff --git a/src/maestral/main.py b/src/maestral/main.py index c80ab4a5c..1d20d7ff0 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -865,9 +865,7 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries - def download_revision( - self, dbx_path: str, local_path: str, rev: str - ) -> StoneType: + def download_revision(self, dbx_path: str, local_path: str, rev: str) -> StoneType: """ Downloads specific revision from Dropbox into a local file. Returns metadata about the downloaded file. From d673e6e79d5c93fa720bffd1fcee36ca7baefccd Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 17:12:08 +0100 Subject: [PATCH 016/374] Fix black issues --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 6128b32dc..d0b3b461d 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1533,7 +1533,7 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): new_date = check_rev(entries, entries[0]["rev"]) if new_date is None: click.echo("Selected revision was not found") - return + return old_date = check_rev(entries, old_rev) if old_date is None: click.echo("Selected revision was not found") From 830aa9103b7c2d0dcc280b2d3990d66c68c36c7a Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 17:15:13 +0100 Subject: [PATCH 017/374] Fix formatting of error message when file type is not supported --- src/maestral/cli.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index d0b3b461d..2cb1a82d8 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1515,7 +1515,9 @@ def log_level(level_name: str, config_name: str) -> None: # If new_version_hash is omitted, use the current version of the file def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: - import difflib, tempfile, magic + import difflib + import tempfile + import magic from datetime import datetime from .daemon import MaestralProxy @@ -1586,9 +1588,8 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) mime_type = magic.from_file(full_path, mime=True) if not mime_type.startswith("text/"): - click.echo( - f"Bad file type: '{mime_type}'. Only files with the type 'text/*' are supported." - ) + click.echo(f"Bad file type: '{mime_type}'.") + click.echo("Only files with the type 'text/*' are supported.") click.echo( "You can look at an old version with 'maestral restore' to compare them manually." ) From 180c059587aee331c5c801bccc5e754c13fa90a5 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 7 Dec 2020 20:17:36 +0100 Subject: [PATCH 018/374] Add colors (inspired by 'git diff') --- src/maestral/cli.py | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 2cb1a82d8..973974516 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1521,6 +1521,14 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: from datetime import datetime from .daemon import MaestralProxy + # Some colors + RED = "\033[91m" + CYAN = "\033[96m" + GREEN = "\033[92m" + YELLOW = "\033[93m" + RESET = "\033[0m" + BOLD = "\033[1m" + # Reason for rel_dbx_path: os.path.join does not like leading / if not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path @@ -1562,14 +1570,30 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): with open(old_location) as f: old_content = f.readlines() - for line in difflib.context_diff( - new_content, - old_content, - fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), - tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), - fromfiledate=new_date, - tofiledate=old_date, + for ind, line in enumerate( + difflib.context_diff( + old_content, + new_content, + fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), + tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), + fromfiledate=old_date, + tofiledate=new_date, + ) ): + # Inspiration for colors from 'git diff' + if ind < 2: + line = BOLD + line + RESET + if line.startswith("! "): + line = YELLOW + line + RESET + elif line.startswith("+ "): + line = GREEN + line + RESET + elif line.startswith("- "): + line = RED + line + RESET + # Don't highlight these in the intro + elif line.startswith("*** ") and ind > 2: + line = CYAN + line + RESET + elif line.startswith("--- ") and ind > 2: + line = CYAN + line + RESET click.echo(line, nl=False) # Check if a revision exists and return the date ("client_modified") @@ -1605,14 +1629,14 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: dates.append(field.format(40)[0]) base = cli.select( - message="Select a version as a base:", + message="New revision:", options=dates, hint="(↓ to see more)" if len(dates) > 6 else "", ) to_compare = ( cli.select( - message="Select a version to compare to:", + message="Old revision:", options=dates[base + 1 :], hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", ) From 31f61ea00004dc8a8d29fd539d91e27a43018a56 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 8 Dec 2020 08:09:10 +0100 Subject: [PATCH 019/374] Add feature to enter less if line count > 50 --- src/maestral/cli.py | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 973974516..4a46edd99 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1570,20 +1570,11 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): with open(old_location) as f: old_content = f.readlines() - for ind, line in enumerate( - difflib.context_diff( - old_content, - new_content, - fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), - tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), - fromfiledate=old_date, - tofiledate=new_date, - ) - ): - # Inspiration for colors from 'git diff' + # Inspiration for colors from 'git diff' + def color(ind: int, line: str) -> str: if ind < 2: line = BOLD + line + RESET - if line.startswith("! "): + elif line.startswith("! "): line = YELLOW + line + RESET elif line.startswith("+ "): line = GREEN + line + RESET @@ -1594,7 +1585,28 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): line = CYAN + line + RESET elif line.startswith("--- ") and ind > 2: line = CYAN + line + RESET - click.echo(line, nl=False) + return line + + # TODO: enter less if diff is long + delta = [ + color(i, l) + for i, l in enumerate( + difflib.context_diff( + old_content, + new_content, + fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), + tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), + fromfiledate=old_date, + tofiledate=new_date, + ) + ) + ] + + lines = "".join(delta) + if len(delta) > 50: + os.system(f"echo '{lines}' | less -R") + else: + click.echo(lines) # Check if a revision exists and return the date ("client_modified") def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: From ba003016eabbd76395890d8edf9c17c551762896 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 8 Dec 2020 13:58:14 +0100 Subject: [PATCH 020/374] Add better comments to functions --- src/maestral/cli.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 4a46edd99..ba4175ba8 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1533,8 +1533,13 @@ def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: if not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path - # Returns False if a revision does not exist def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): + """ + Download up to two revisions to a local temporary folder + and compare them with a 'diff'. Only text files are supported. + If an unknown file type was found, everything that doesn't match + 'text/*', an error message gets printed. + """ # Create a temporary directory to store all downloaded files tempdir = tempfile.TemporaryDirectory() @@ -1572,6 +1577,11 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): # Inspiration for colors from 'git diff' def color(ind: int, line: str) -> str: + """ + Color diff lines. + Inspiration for colors was taken from the + well known command 'git diff'. + """ if ind < 2: line = BOLD + line + RESET elif line.startswith("! "): @@ -1587,7 +1597,6 @@ def color(ind: int, line: str) -> str: line = CYAN + line + RESET return line - # TODO: enter less if diff is long delta = [ color(i, l) for i, l in enumerate( @@ -1603,6 +1612,7 @@ def color(ind: int, line: str) -> str: ] lines = "".join(delta) + # Enter 'less' if diff is too long if len(delta) > 50: os.system(f"echo '{lines}' | less -R") else: @@ -1627,7 +1637,7 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: click.echo(f"Bad file type: '{mime_type}'.") click.echo("Only files with the type 'text/*' are supported.") click.echo( - "You can look at an old version with 'maestral restore' to compare them manually." + "You can look at an old version with 'maestral restore' to compare manually." ) return From e901d284e2b601f80bc6f8f187dcfbb60f31e62f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 9 Dec 2020 14:58:01 +0000 Subject: [PATCH 021/374] [notify_linux] handle notification-daemon's without clickable actions --- src/maestral/notify/notify_linux.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maestral/notify/notify_linux.py b/src/maestral/notify/notify_linux.py index d922b8cd1..6194aeda6 100644 --- a/src/maestral/notify/notify_linux.py +++ b/src/maestral/notify/notify_linux.py @@ -66,7 +66,9 @@ async def _init_dbus(self) -> None: self.interface = self.proxy_object.get_interface( "org.freedesktop.Notifications" ) - self.interface.on_action_invoked(self._on_action) + if hasattr(self.interface, "on_action_invoked"): + # some older interfaces may not support notification actions + self.interface.on_action_invoked(self._on_action) except Exception: self.interface = None logger.warning("Could not connect to DBUS interface", exc_info=True) From 3c0265518405513550c7df184504ac76f3fe81ed Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 9 Dec 2020 15:05:15 +0000 Subject: [PATCH 022/374] [notify] stronger typing of buttons --- src/maestral/notify/notify.py | 4 ++-- src/maestral/notify/notify_base.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maestral/notify/notify.py b/src/maestral/notify/notify.py index 219aeb903..1128ba812 100644 --- a/src/maestral/notify/notify.py +++ b/src/maestral/notify/notify.py @@ -64,7 +64,7 @@ def send( urgency: NotificationLevel = NotificationLevel.Normal, icon: Optional[str] = None, action: Optional[Callable] = None, - buttons: Optional[Dict[str, Optional[Callable]]] = None, + buttons: Optional[Dict[str, Callable]] = None, ) -> None: """ Sends a desktop notification. Some arguments may be ignored, depending on the @@ -166,7 +166,7 @@ def notify( message: str, level: int = FILECHANGE, on_click: Optional[Callable] = None, - buttons: Optional[Dict[str, Optional[Callable]]] = None, + buttons: Optional[Dict[str, Callable]] = None, ) -> None: """ Sends a desktop notification. diff --git a/src/maestral/notify/notify_base.py b/src/maestral/notify/notify_base.py index 9e5131c75..765021ecc 100644 --- a/src/maestral/notify/notify_base.py +++ b/src/maestral/notify/notify_base.py @@ -54,7 +54,7 @@ def __init__( urgency: NotificationLevel = NotificationLevel.Normal, icon: Optional[str] = None, action: Optional[Callable] = None, - buttons: Optional[Dict[str, Optional[Callable]]] = None, + buttons: Optional[Dict[str, Callable]] = None, ) -> None: self.title = title From 11d5486b5f51fd9a781c9a852d2f94cd9989153d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 9 Dec 2020 15:05:22 +0000 Subject: [PATCH 023/374] [sync] remove "show" button if there is no callback --- src/maestral/sync.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 5386650ff..d4123d6e8 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2675,7 +2675,7 @@ def notify_user(self, sync_events: List[SyncEvent]) -> None: :param sync_events: List of SyncEvents from download sync. """ - callback: Optional[Callable] + buttons: Dict[str, Callable] changes = [e for e in sync_events if e.status != SyncStatus.Skipped] @@ -2712,6 +2712,8 @@ def notify_user(self, sync_events: List[SyncEvent]) -> None: def callback(): click.launch(event.local_path, locate=True) + buttons = {"Show": callback} + else: if all(e.change_type == sync_events[0].change_type for e in sync_events): @@ -2726,7 +2728,7 @@ def callback(): else: file_name = f"{n_changed} items" - callback = None + buttons = {} if change_type == ChangeType.Removed.value: @@ -2734,12 +2736,14 @@ def callback(): # show dropbox website with deleted files click.launch("https://www.dropbox.com/deleted_files") + buttons = {"Show": callback} + if user_name: msg = f"{user_name} {change_type} {file_name}" else: msg = f"{file_name} {change_type}" - self.notifier.notify("Items synced", msg, buttons={"Show": callback}) + self.notifier.notify("Items synced", msg, buttons=buttons) def _filter_excluded_changes_remote( self, changes: List[SyncEvent] From ccea9291d80faf7aa0a24602bd9ab8ca7684c369 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 9 Dec 2020 20:41:11 +0100 Subject: [PATCH 024/374] Move diff donwload and compare function partly to the main api You can find the function at 'get_file_diff'. The 'new_rev' argument is optional. If left out, it will compare the old revision to the current one. I still have to implement error handling though. --- src/maestral/cli.py | 136 +++++++++++++------------------------------ src/maestral/main.py | 48 +++++++++++++++ 2 files changed, 89 insertions(+), 95 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index ba4175ba8..c5b7a83be 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -21,6 +21,7 @@ from . import __version__, __author__, __url__ from .utils import cli from .utils.serializer import StoneType +from .errors import PathError if TYPE_CHECKING: from .main import Maestral @@ -1510,25 +1511,17 @@ def log_level(level_name: str, config_name: str) -> None: multiple=True, default=[], ) +@click.option("--nocolor", help="Don't use any colors when creating the diff", is_flag=True) +@click.option("--nopager", help="Don't display pager if the number of lines is bigger than 50", is_flag=True) @catch_maestral_errors @existing_config_option # If new_version_hash is omitted, use the current version of the file -def diff(dropbox_path: str, rev: List[str], config_name: str) -> None: +def diff(dropbox_path: str, rev: List[str], nocolor: bool, nopager: bool, config_name: str) -> None: - import difflib - import tempfile import magic from datetime import datetime from .daemon import MaestralProxy - # Some colors - RED = "\033[91m" - CYAN = "\033[96m" - GREEN = "\033[92m" - YELLOW = "\033[93m" - RESET = "\033[0m" - BOLD = "\033[1m" - # Reason for rel_dbx_path: os.path.join does not like leading / if not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path @@ -1540,106 +1533,59 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): If an unknown file type was found, everything that doesn't match 'text/*', an error message gets printed. """ - # Create a temporary directory to store all downloaded files - tempdir = tempfile.TemporaryDirectory() - - # Get the dates of the revisions - entries = m.list_revisions(dropbox_path) - new_date = check_rev(entries, entries[0]["rev"]) - if new_date is None: - click.echo("Selected revision was not found") - return - old_date = check_rev(entries, old_rev) - if old_date is None: - click.echo("Selected revision was not found") - return - - new_location = os.path.join(m.dropbox_path, dropbox_path[1:]) - old_location = os.path.join(tempdir.name, old_rev) - - # Download specific revision to cache - _ = m.download_revision(dropbox_path, old_location, old_rev) - - # Use the current version if new_version_hash is None - # Saves space (unnecessary downloads omitted) - if new_rev: - new_date = check_rev(entries, new_rev) - if new_date is None: - click.echo("Selected revision was not found") - return - new_location = os.path.join(tempdir.name, new_rev) - _ = m.download_revision(dropbox_path, new_location, new_rev) - - with open(new_location) as f: - new_content = f.readlines() - with open(old_location) as f: - old_content = f.readlines() + + try: + diff = m.get_file_diff(dropbox_path, old_rev, new_rev) + except FileNotFoundError: + cli.warn("Downloaded files were not found") + except PathError: + cli.warn("Selected revision was not found") - # Inspiration for colors from 'git diff' def color(ind: int, line: str) -> str: """ Color diff lines. Inspiration for colors was taken from the well known command 'git diff'. """ + if ind < 2: - line = BOLD + line + RESET - elif line.startswith("! "): - line = YELLOW + line + RESET - elif line.startswith("+ "): - line = GREEN + line + RESET - elif line.startswith("- "): - line = RED + line + RESET + line = click.style(line, bold=True) + elif line.startswith("+"): + line = click.style(line, fg="green") + elif line.startswith("-"): + line = click.style(line, fg="red") # Don't highlight these in the intro - elif line.startswith("*** ") and ind > 2: - line = CYAN + line + RESET - elif line.startswith("--- ") and ind > 2: - line = CYAN + line + RESET + elif line.startswith("@@ "): + line = click.style(line, fg="cyan") return line - delta = [ - color(i, l) - for i, l in enumerate( - difflib.context_diff( - old_content, - new_content, - fromfile=os.path.join(m.dropbox_path, dropbox_path[1:]), - tofile=os.path.join(m.dropbox_path, dropbox_path[1:]), - fromfiledate=old_date, - tofiledate=new_date, - ) - ) - ] + # Color the lines + diff = diff.split("\n") + if not nocolor: + diff = [color(i, l) for i, l in enumerate(diff)] - lines = "".join(delta) - # Enter 'less' if diff is too long - if len(delta) > 50: - os.system(f"echo '{lines}' | less -R") - else: - click.echo(lines) + # Enter pager if diff is too long + if not nopager: + if len(diff) > 30: + click.echo_via_pager("\n".join(diff), color=True) + return - # Check if a revision exists and return the date ("client_modified") - def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: - for r in revs: - if r["rev"] == rev: - d = cast(str, r["client_modified"]) - return str(datetime.strptime(d, "%Y-%m-%dT%H:%M:%S%z").astimezone()) - return None + click.echo("\n".join(diff)) try: with MaestralProxy(config_name) as m: # Check the file type is supported - # If not, ask user if he wants to download revs and - # compare them manually - full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) - mime_type = magic.from_file(full_path, mime=True) - if not mime_type.startswith("text/"): - click.echo(f"Bad file type: '{mime_type}'.") - click.echo("Only files with the type 'text/*' are supported.") - click.echo( - "You can look at an old version with 'maestral restore' to compare manually." - ) - return + # If not, ask user to restore and compare files manually + # Maybe there will be PDF support in the future (only text) + # full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) + # mime_type = magic.from_file(full_path, mime=True) + # if not mime_type.startswith("text/"): + # click.echo(f"Bad file type: '{mime_type}'.") + # click.echo("Only files with the type 'text/*' are supported.") + # click.echo( + # "You can look at an old version with 'maestral restore' to compare manually." + # ) + # return if len(rev) == 0: entries = m.list_revisions(dropbox_path) @@ -1678,7 +1624,7 @@ def check_rev(revs: List[StoneType], rev: str) -> Optional[str]: elif len(rev) == 2: download_and_compare(m, rev[0], rev[1]) else: - click.echo("You can only compare two revisions at a time") + cli.warn("You can only compare two revisions at a time") except Pyro5.errors.CommunicationError: click.echo("unwatched") diff --git a/src/maestral/main.py b/src/maestral/main.py index 1d20d7ff0..b6c1fe5ca 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -38,6 +38,7 @@ NotFoundError, BusyError, KeyringAccessError, + PathError, ) from .config import MaestralConfig, MaestralState, validate_config_name from .notify import MaestralDesktopNotificationHandler @@ -878,6 +879,53 @@ def download_revision(self, dbx_path: str, local_path: str, rev: str) -> StoneTy md = self.client.download(dbx_path, local_path, rev=rev) return dropbox_stone_to_dict(md) + def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str: + """ + Download the two revisions if necessary and create a + diff with the python difflib library. If new_rev is None, + it will compare the old revision to the current file. + + :param old_rev: Hash of old revision. + :param new_rev: Hash of new revision. + :returns: Diff as a string. + :raises PathError: if revision was not found. + :raises FileNotFoundError: if the created temporary file was not found. + """ + + import tempfile + import difflib + + full_path = os.path.join(self.dropbox_path, dbx_path[1:]) + + new_location = full_path + new_date = self.list_revisions(dbx_path)[0]["client_modified"] + old_location = tempfile.NamedTemporaryFile().name + + # Check if the revision is the newest + # If true, there is no reason to download the revision + entries = self.list_revisions(dbx_path) + if new_rev is not None: + new_location = tempfile.NamedTemporaryFile().name + new_date = self.download_revision(dbx_path, new_location, new_rev)["client_modified"] + + old_date = self.download_revision(dbx_path, old_location, old_rev)["client_modified"] + + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() + + return "".join( + difflib.unified_diff( + old_content, + new_content, + fromfile=full_path, + tofile=full_path, + fromfiledate=old_date, + tofiledate=new_date + ) + ) + def restore(self, dbx_path: str, rev: str) -> StoneType: """ Restore an old revision of a file. From 4ebe63d627b92cf1a06ce25b75209c16a5fecd98 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 9 Dec 2020 20:54:49 +0100 Subject: [PATCH 025/374] Add exception handling to cli + prettier dates in diff --- src/maestral/cli.py | 21 +++++++++++++++++---- src/maestral/main.py | 31 ++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c5b7a83be..ba10390cc 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1511,12 +1511,20 @@ def log_level(level_name: str, config_name: str) -> None: multiple=True, default=[], ) -@click.option("--nocolor", help="Don't use any colors when creating the diff", is_flag=True) -@click.option("--nopager", help="Don't display pager if the number of lines is bigger than 50", is_flag=True) +@click.option( + "--nocolor", help="Don't use any colors when creating the diff", is_flag=True +) +@click.option( + "--nopager", + help="Don't display pager if the number of lines is bigger than 50", + is_flag=True, +) @catch_maestral_errors @existing_config_option # If new_version_hash is omitted, use the current version of the file -def diff(dropbox_path: str, rev: List[str], nocolor: bool, nopager: bool, config_name: str) -> None: +def diff( + dropbox_path: str, rev: List[str], nocolor: bool, nopager: bool, config_name: str +) -> None: import magic from datetime import datetime @@ -1533,13 +1541,18 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): If an unknown file type was found, everything that doesn't match 'text/*', an error message gets printed. """ - + try: diff = m.get_file_diff(dropbox_path, old_rev, new_rev) except FileNotFoundError: cli.warn("Downloaded files were not found") + return except PathError: cli.warn("Selected revision was not found") + return + except: + cli.warn("An unknown error occured, failed to get the diff") + return def color(ind: int, line: str) -> str: """ diff --git a/src/maestral/main.py b/src/maestral/main.py index b6c1fe5ca..113c60a7f 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -13,7 +13,7 @@ import asyncio import random from concurrent.futures import ThreadPoolExecutor -from typing import Union, List, Iterator, Dict, Set, Awaitable, Optional, Any +from typing import Union, List, Iterator, Dict, Set, Awaitable, Optional, Any, cast # external imports import requests @@ -892,23 +892,40 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str :raises FileNotFoundError: if the created temporary file was not found. """ - import tempfile import difflib + import tempfile + from datetime import datetime + + def pretty_date(s) -> str: + """ + Pretty print the 'client_modified' metadata. + """ + return ( + datetime.strptime(cast(str, s), "%Y-%m-%dT%H:%M:%S%z") + .astimezone() + .strftime("%d %b %Y at %H:%M") + ) full_path = os.path.join(self.dropbox_path, dbx_path[1:]) new_location = full_path - new_date = self.list_revisions(dbx_path)[0]["client_modified"] + new_date = pretty_date(self.list_revisions(dbx_path)[0]["client_modified"]) old_location = tempfile.NamedTemporaryFile().name - + # Check if the revision is the newest # If true, there is no reason to download the revision entries = self.list_revisions(dbx_path) if new_rev is not None: new_location = tempfile.NamedTemporaryFile().name - new_date = self.download_revision(dbx_path, new_location, new_rev)["client_modified"] + new_date = pretty_date( + self.download_revision(dbx_path, new_location, new_rev)[ + "client_modified" + ], + ) - old_date = self.download_revision(dbx_path, old_location, old_rev)["client_modified"] + old_date = pretty_date( + self.download_revision(dbx_path, old_location, old_rev)["client_modified"], + ) with open(new_location) as f: new_content = f.readlines() @@ -922,7 +939,7 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str fromfile=full_path, tofile=full_path, fromfiledate=old_date, - tofiledate=new_date + tofiledate=new_date, ) ) From ef482d83a10782c0fb71665de5bb62e6ec107790 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 9 Dec 2020 21:14:01 +0100 Subject: [PATCH 026/374] Fix flake8 issues --- setup.py | 1 + src/maestral/cli.py | 25 ++++++++++++------------- src/maestral/main.py | 2 -- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/setup.py b/setup.py index 5e22a86a3..4828cf628 100644 --- a/setup.py +++ b/setup.py @@ -26,6 +26,7 @@ "sqlalchemy>=1.3,<1.4", "survey>=2.1.0", "watchdog>=0.10.0,<=0.10.3", + "python-magic==0.4.18", ] gui_requires = [ diff --git a/src/maestral/cli.py b/src/maestral/cli.py index ba10390cc..02e6be80e 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,7 +20,6 @@ # local imports from . import __version__, __author__, __url__ from .utils import cli -from .utils.serializer import StoneType from .errors import PathError if TYPE_CHECKING: @@ -1550,9 +1549,6 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): except PathError: cli.warn("Selected revision was not found") return - except: - cli.warn("An unknown error occured, failed to get the diff") - return def color(ind: int, line: str) -> str: """ @@ -1590,15 +1586,18 @@ def color(ind: int, line: str) -> str: # Check the file type is supported # If not, ask user to restore and compare files manually # Maybe there will be PDF support in the future (only text) - # full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) - # mime_type = magic.from_file(full_path, mime=True) - # if not mime_type.startswith("text/"): - # click.echo(f"Bad file type: '{mime_type}'.") - # click.echo("Only files with the type 'text/*' are supported.") - # click.echo( - # "You can look at an old version with 'maestral restore' to compare manually." - # ) - # return + full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) + try: + mime_type = magic.from_file(full_path, mime=True) + if not mime_type.startswith("text/"): + click.echo(f"Bad file type: '{mime_type}'.") + click.echo("Only files with the type 'text/*' are supported.") + click.echo( + "You can look at an old version with 'maestral restore' to compare manually." + ) + return + except FileNotFoundError: + cli.warn("File was not found locally, continuing anyway ...") if len(rev) == 0: entries = m.list_revisions(dropbox_path) diff --git a/src/maestral/main.py b/src/maestral/main.py index 113c60a7f..e6da26ad0 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -38,7 +38,6 @@ NotFoundError, BusyError, KeyringAccessError, - PathError, ) from .config import MaestralConfig, MaestralState, validate_config_name from .notify import MaestralDesktopNotificationHandler @@ -914,7 +913,6 @@ def pretty_date(s) -> str: # Check if the revision is the newest # If true, there is no reason to download the revision - entries = self.list_revisions(dbx_path) if new_rev is not None: new_location = tempfile.NamedTemporaryFile().name new_date = pretty_date( From d618eef51ca6464ed6cbe91db0e83f4d7525764a Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 9 Dec 2020 21:22:39 +0100 Subject: [PATCH 027/374] Handle file issues with OSError --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 02e6be80e..0f2faaceb 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1543,7 +1543,7 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): try: diff = m.get_file_diff(dropbox_path, old_rev, new_rev) - except FileNotFoundError: + except OSError: cli.warn("Downloaded files were not found") return except PathError: From 6b658032d5364ba3ba79b362302dedbd8523a259 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 9 Dec 2020 21:14:25 +0000 Subject: [PATCH 028/374] [cli] fixed message after rebuild-request --- src/maestral/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 0d5ad8185..a41d72f68 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1366,9 +1366,9 @@ def rebuild_index(config_name: str) -> None: m.rebuild_index() if m._is_fallback: - cli.ok("Rebuilding now. Run 'maestral status' to view progress.") - else: cli.ok("Daemon is not running. Rebuilding scheduled for next startup.") + else: + cli.ok("Rebuilding now. Run 'maestral status' to view progress.") @main.command( From 8be75a5cc0ffefe6c90065b5d6bade94c69ae2ac Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 9 Dec 2020 22:35:53 +0100 Subject: [PATCH 029/374] Move mime type validation to 'get_file_diff' function in main api --- src/maestral/cli.py | 22 +++++----------------- src/maestral/errors.py | 7 +++++++ src/maestral/main.py | 13 +++++++++++-- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 0f2faaceb..6e0d0f446 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,7 +20,7 @@ # local imports from . import __version__, __author__, __url__ from .utils import cli -from .errors import PathError +from .errors import PathError, UnsupportedFileTypeForDiff if TYPE_CHECKING: from .main import Maestral @@ -1549,6 +1549,10 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): except PathError: cli.warn("Selected revision was not found") return + except UnsupportedFileTypeForDiff as e: + cli.warn(e.title) + cli.warn(e.message) + return def color(ind: int, line: str) -> str: """ @@ -1583,22 +1587,6 @@ def color(ind: int, line: str) -> str: try: with MaestralProxy(config_name) as m: - # Check the file type is supported - # If not, ask user to restore and compare files manually - # Maybe there will be PDF support in the future (only text) - full_path = os.path.join(m.dropbox_path, dropbox_path[1:]) - try: - mime_type = magic.from_file(full_path, mime=True) - if not mime_type.startswith("text/"): - click.echo(f"Bad file type: '{mime_type}'.") - click.echo("Only files with the type 'text/*' are supported.") - click.echo( - "You can look at an old version with 'maestral restore' to compare manually." - ) - return - except FileNotFoundError: - cli.warn("File was not found locally, continuing anyway ...") - if len(rev) == 0: entries = m.list_revisions(dropbox_path) dates = [] diff --git a/src/maestral/errors.py b/src/maestral/errors.py index 2bd7622d5..8b659ec6e 100644 --- a/src/maestral/errors.py +++ b/src/maestral/errors.py @@ -243,6 +243,12 @@ class BusyError(MaestralApiError): pass +class UnsupportedFileTypeForDiff(MaestralApiError): + """Raised when a diff for an unsupported file type was issued.""" + + pass + + # connection errors are handled as warnings # sync errors only appear in the sync errors list # all other errors raise an error dialog in the GUI @@ -263,6 +269,7 @@ class BusyError(MaestralApiError): BadInputError, OutOfMemoryError, BusyError, + UnsupportedFileTypeForDiff, ) SYNC_ERRORS = ( diff --git a/src/maestral/main.py b/src/maestral/main.py index e6da26ad0..da5de5308 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -38,6 +38,7 @@ NotFoundError, BusyError, KeyringAccessError, + UnsupportedFileTypeForDiff, ) from .config import MaestralConfig, MaestralState, validate_config_name from .notify import MaestralDesktopNotificationHandler @@ -887,10 +888,10 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str :param old_rev: Hash of old revision. :param new_rev: Hash of new revision. :returns: Diff as a string. - :raises PathError: if revision was not found. - :raises FileNotFoundError: if the created temporary file was not found. + :raises UnsupportedFileTypeForDiff: if file type is not supported. """ + import magic import difflib import tempfile from datetime import datetime @@ -925,6 +926,14 @@ def pretty_date(s) -> str: self.download_revision(dbx_path, old_location, old_rev)["client_modified"], ) + # Check if a diff is possible + mime_type = magic.from_file(new_location, mime=True) + if not mime_type.startswith("text/"): + raise UnsupportedFileTypeForDiff( + f"Bad file type: '{mime_type}'", + "Only files with the type 'text/*' are supported. You can look at an old version with 'maestral restore' to compare manually.", + ) + with open(new_location) as f: new_content = f.readlines() with open(old_location) as f: From ced69385ffa32552cd362977405aa74e70e97750 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Thu, 10 Dec 2020 11:08:50 +0100 Subject: [PATCH 030/374] Fix wrong handling of tempfiles --- src/maestral/main.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index da5de5308..b06177b60 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -910,12 +910,15 @@ def pretty_date(s) -> str: new_location = full_path new_date = pretty_date(self.list_revisions(dbx_path)[0]["client_modified"]) - old_location = tempfile.NamedTemporaryFile().name + + old_f = tempfile.NamedTemporaryFile() + old_location = old_f.name # Check if the revision is the newest # If true, there is no reason to download the revision if new_rev is not None: - new_location = tempfile.NamedTemporaryFile().name + new_f = tempfile.NamedTemporaryFile() + new_location = new_f.name new_date = pretty_date( self.download_revision(dbx_path, new_location, new_rev)[ "client_modified" From 2e6eb635afe12d09dc9a598f17d4e4c848c6f0e8 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Thu, 10 Dec 2020 11:12:15 +0100 Subject: [PATCH 031/374] Remove unnecessary imports --- src/maestral/cli.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 6e0d0f446..a473858cb 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1525,7 +1525,6 @@ def diff( dropbox_path: str, rev: List[str], nocolor: bool, nopager: bool, config_name: str ) -> None: - import magic from datetime import datetime from .daemon import MaestralProxy From e9e6237cb264a3cac926921cbb646804d26e28c4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 10 Dec 2020 12:19:05 +0000 Subject: [PATCH 032/374] [cli] use "default" argument introduced in survey 3.2 --- setup.py | 2 +- src/maestral/utils/cli.py | 44 +++++++++++---------------------------- 2 files changed, 13 insertions(+), 33 deletions(-) diff --git a/setup.py b/setup.py index 42045c2c7..39363b6e7 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "sdnotify>=0.3.2", "setuptools", "sqlalchemy>=1.3,<1.4", - "survey>=3.0,<4.0", + "survey>=3.2.2,<4.0", "watchdog>=0.10.0,<=0.10.3", ] diff --git a/src/maestral/utils/cli.py b/src/maestral/utils/cli.py index 5453383dc..d4d414ac6 100644 --- a/src/maestral/utils/cli.py +++ b/src/maestral/utils/cli.py @@ -588,23 +588,17 @@ def prompt(message: str, default: str = "", validate: Optional[Callable] = None) import survey - styled_default = _syle_hint(default) styled_message = _style_message(message) def check(value: str) -> bool: - if validate is None: - return True - elif value == "" and default: - return True - else: + if validate is not None: return validate(value) + else: + return True - res = survey.input(styled_message, hint=styled_default, check=check, auto=False) - - response = res or default - survey.respond(response) + res = survey.input(styled_message, default=default, check=check) - return response + return res def confirm(message: str, default: Optional[bool] = True) -> bool: @@ -624,11 +618,7 @@ def select(message: str, options: Sequence[str], hint="") -> int: styled_hint = _syle_hint(hint) styled_message = _style_message(message) - index = survey.select( - options, - styled_message, - hint=styled_hint, - ) + index = survey.select(options, styled_message, hint=styled_hint) return index except (KeyboardInterrupt, SystemExit): @@ -647,12 +637,7 @@ def select_multiple(message: str, options: Sequence[str], hint="") -> List[int]: kwargs = {"hint": styled_hint} if hint else {} indices = survey.select( - options, - styled_message, - multi=True, - pin="[✓] ", - unpin="[ ] ", - **kwargs, + options, styled_message, multi=True, pin="[✓] ", unpin="[ ] ", **kwargs ) chosen = [options[index] for index in indices] @@ -685,7 +670,6 @@ def select_path( track = wrapio.Track() - styled_default = _syle_hint(f"[{default}]") styled_message = _style_message(message) failed = False @@ -704,13 +688,14 @@ def check(value: str) -> bool: if not dir_condition: survey.update(click.style("(not a directory) ", fg="red")) elif not exist_condition: - survey.update(click.style("(does not exist) ", fg="red")) + survey.update(click.style("(not found) ", fg="red")) passed = dir_condition and exist_condition and validate(value) failed = not passed return passed + @track.call("insert") @track.call("delete") def handle(result: str, *args) -> None: nonlocal failed @@ -721,17 +706,12 @@ def handle(result: str, *args) -> None: res = survey.input( styled_message, - hint=styled_default, - check=check, + default=default, callback=track.invoke, - auto=False, + check=check, ) - response = res or default - - survey.respond(response) - - return response + return res class RemoteApiError(click.ClickException): From 2d05760e2a54d24c1e0b1f324f8dcaa84f9cfe43 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 11 Dec 2020 21:38:06 +0100 Subject: [PATCH 033/374] Add exception conversion for func 'get_file_diff' in main api --- src/maestral/cli.py | 9 ++------- src/maestral/main.py | 28 ++++++++++++++++++++++------ 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index a473858cb..1060f3a4e 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1526,6 +1526,7 @@ def diff( ) -> None: from datetime import datetime + from .errors import MaestralApiError from .daemon import MaestralProxy # Reason for rel_dbx_path: os.path.join does not like leading / @@ -1542,13 +1543,7 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): try: diff = m.get_file_diff(dropbox_path, old_rev, new_rev) - except OSError: - cli.warn("Downloaded files were not found") - return - except PathError: - cli.warn("Selected revision was not found") - return - except UnsupportedFileTypeForDiff as e: + except (MaestralApiError, UnsupportedFileTypeForDiff) as e: cli.warn(e.title) cli.warn(e.message) return diff --git a/src/maestral/main.py b/src/maestral/main.py index b06177b60..bf8a89f21 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -2,6 +2,7 @@ """This module defines the main API which is exposed to the CLI or GUI.""" # system imports +import errno import sys import os import os.path as osp @@ -889,6 +890,8 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str :param new_rev: Hash of new revision. :returns: Diff as a string. :raises UnsupportedFileTypeForDiff: if file type is not supported. + :raises UnsupportedFileTypeForDiff: if file content could not be decoded. + :raises MaestralApiError: if file could not be read for any other reason. """ import magic @@ -900,6 +903,7 @@ def pretty_date(s) -> str: """ Pretty print the 'client_modified' metadata. """ + return ( datetime.strptime(cast(str, s), "%Y-%m-%dT%H:%M:%S%z") .astimezone() @@ -933,14 +937,26 @@ def pretty_date(s) -> str: mime_type = magic.from_file(new_location, mime=True) if not mime_type.startswith("text/"): raise UnsupportedFileTypeForDiff( - f"Bad file type: '{mime_type}'", - "Only files with the type 'text/*' are supported. You can look at an old version with 'maestral restore' to compare manually.", + title=f"Bad file type: '{mime_type}'", + message="Only files with the type 'text/*' are supported." + "You can look at an old version with 'maestral restore' and compare manually.", ) - with open(new_location) as f: - new_content = f.readlines() - with open(old_location) as f: - old_content = f.readlines() + try: + with convert_api_errors(): + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() + # TODO: Implement redownloading ... + except FileNotFoundError: + raise FileNotFoundError + except UnicodeDecodeError as e: + raise UnsupportedFileTypeForDiff( + title="File could not be decoded", + message="Maestral failed to read from the file," + "because some character could not be decoded.", + ) return "".join( difflib.unified_diff( From cba6bd112f76d7d78a730eae2d0f2d319589e76b Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 11 Dec 2020 21:39:02 +0100 Subject: [PATCH 034/374] Add check to download file if it's not found locally If the rev is newest one but the file was not found, the file will be downloaded as well. --- src/maestral/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index bf8a89f21..b91db9b57 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -920,7 +920,7 @@ def pretty_date(s) -> str: # Check if the revision is the newest # If true, there is no reason to download the revision - if new_rev is not None: + if new_rev is not None or not os.path.exists(full_path): new_f = tempfile.NamedTemporaryFile() new_location = new_f.name new_date = pretty_date( From 8d5f86813c9af5579fa1220f6decb4018e7abde8 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 11 Dec 2020 21:43:11 +0100 Subject: [PATCH 035/374] Change file name from full to just dbx path in diff --- src/maestral/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index b91db9b57..648cb1bf5 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -962,8 +962,8 @@ def pretty_date(s) -> str: difflib.unified_diff( old_content, new_content, - fromfile=full_path, - tofile=full_path, + fromfile=dbx_path, + tofile=dbx_path, fromfiledate=old_date, tofiledate=new_date, ) From 1ab73435fa3bdafcf9a4bb5623376d55024816c2 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 11 Dec 2020 21:57:42 +0100 Subject: [PATCH 036/374] Switch to mimetypes and remove libmagic dependency --- setup.py | 1 - src/maestral/main.py | 35 +++++++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/setup.py b/setup.py index 4828cf628..5e22a86a3 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,6 @@ "sqlalchemy>=1.3,<1.4", "survey>=2.1.0", "watchdog>=0.10.0,<=0.10.3", - "python-magic==0.4.18", ] gui_requires = [ diff --git a/src/maestral/main.py b/src/maestral/main.py index 648cb1bf5..17b4f6be3 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -894,7 +894,7 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str :raises MaestralApiError: if file could not be read for any other reason. """ - import magic + import mimetypes import difflib import tempfile from datetime import datetime @@ -912,6 +912,18 @@ def pretty_date(s) -> str: full_path = os.path.join(self.dropbox_path, dbx_path[1:]) + # Check if a diff is possible + # If mime is None, procede because most files without + # an extension are just text files + mime, _ = mimetypes.guess_type(full_path) + if mime != None and not mime.startswith("text/"): + raise UnsupportedFileTypeForDiff( + title=f"Bad file type: '{mime_type}'", + message="Only files with the type 'text/*' are supported." + "You can look at an old version with 'maestral restore' and compare manually.", + ) + + new_location = full_path new_date = pretty_date(self.list_revisions(dbx_path)[0]["client_modified"]) @@ -933,25 +945,16 @@ def pretty_date(s) -> str: self.download_revision(dbx_path, old_location, old_rev)["client_modified"], ) - # Check if a diff is possible - mime_type = magic.from_file(new_location, mime=True) - if not mime_type.startswith("text/"): - raise UnsupportedFileTypeForDiff( - title=f"Bad file type: '{mime_type}'", - message="Only files with the type 'text/*' are supported." - "You can look at an old version with 'maestral restore' and compare manually.", - ) - try: - with convert_api_errors(): - with open(new_location) as f: - new_content = f.readlines() - with open(old_location) as f: - old_content = f.readlines() + # with convert_api_errors(): + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() # TODO: Implement redownloading ... except FileNotFoundError: raise FileNotFoundError - except UnicodeDecodeError as e: + except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( title="File could not be decoded", message="Maestral failed to read from the file," From de10af01822396284f830d3d75734b709dc4617c Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 11 Dec 2020 22:01:16 +0100 Subject: [PATCH 037/374] Fix no-color-support for pager --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 1060f3a4e..d2e14c144 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1574,7 +1574,7 @@ def color(ind: int, line: str) -> str: # Enter pager if diff is too long if not nopager: if len(diff) > 30: - click.echo_via_pager("\n".join(diff), color=True) + click.echo_via_pager("\n".join(diff)) return click.echo("\n".join(diff)) From 03d5ca9fd953bd382823ef5fbbbdb23ad0c42642 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 11 Dec 2020 22:11:12 +0100 Subject: [PATCH 038/374] Fix error-msg for UnsupportedFileType... --- src/maestral/main.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 17b4f6be3..04acf1e33 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -918,9 +918,8 @@ def pretty_date(s) -> str: mime, _ = mimetypes.guess_type(full_path) if mime != None and not mime.startswith("text/"): raise UnsupportedFileTypeForDiff( - title=f"Bad file type: '{mime_type}'", - message="Only files with the type 'text/*' are supported." - "You can look at an old version with 'maestral restore' and compare manually.", + f"Bad file type: '{mime}'", + "Only files of type 'text/*' are supported." ) @@ -946,19 +945,19 @@ def pretty_date(s) -> str: ) try: - # with convert_api_errors(): - with open(new_location) as f: - new_content = f.readlines() - with open(old_location) as f: - old_content = f.readlines() + with convert_api_errors(): + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() # TODO: Implement redownloading ... except FileNotFoundError: - raise FileNotFoundError + pass except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( - title="File could not be decoded", - message="Maestral failed to read from the file," - "because some character could not be decoded.", + "File failed to decode", + "Maestral failed to read from the file, " + "because some characters could not be decoded.", ) return "".join( From 13c64d3ea0a4a8f0c3b3c9b0a968c3b278e972e1 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 12 Dec 2020 12:22:03 +0000 Subject: [PATCH 039/374] [client] raise NotFoundError when trying to restore an invalid rev --- src/maestral/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 715333ac2..64a055596 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -1442,7 +1442,7 @@ def dropbox_to_maestral_error( if error.is_invalid_revision(): text = "Invalid revision." - err_cls = PathError + err_cls = NotFoundError elif error.is_path_lookup(): lookup_error = error.get_path_lookup() text, err_cls = _get_lookup_error_msg(lookup_error) From a260e97a9828f357f40451a42a0dfaf182809d9a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 9 Dec 2020 23:46:21 +0000 Subject: [PATCH 040/374] [client] suppress index error for invalid argument number --- src/maestral/client.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 64a055596..80ead39d3 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -206,8 +206,21 @@ def decorator(func: _FT) -> _FT: @functools.wraps(func) def wrapper(*args, **kwargs) -> Any: - dbx_path = args[dbx_path_arg] if dbx_path_arg else None - local_path = args[local_path_arg] if local_path_arg else None + if dbx_path_arg: + try: + dbx_path = args[dbx_path_arg] + except IndexError: + dbx_path = None + else: + dbx_path = None + + if local_path_arg: + try: + local_path = args[local_path_arg] + except IndexError: + local_path = None + else: + local_path = None with convert_api_errors(dbx_path, local_path): return func(*args, **kwargs) From c195ee8d23b0cd8db53619441f2bacaecab81201 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 9 Dec 2020 23:50:16 +0000 Subject: [PATCH 041/374] started testing some client methods --- tests/linked/resources/large-file.pdf | Bin 0 -> 1845640 bytes tests/linked/test_client.py | 23 ++++++++++++++++ tests/offline/test_client.py | 37 ++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 tests/linked/resources/large-file.pdf create mode 100644 tests/linked/test_client.py create mode 100644 tests/offline/test_client.py diff --git a/tests/linked/resources/large-file.pdf b/tests/linked/resources/large-file.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7793960c04bd11090f0a05a4a6262b2e462e248c GIT binary patch literal 1845640 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

?c*HT-zq?gz9d1c!Py~q?T! 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 YlNnE`Y<8h$G*TGrD@B}@D_+@l57 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

};*7Pj=E-D&`YrhR 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

uBq-0c?vUsb)GTaIv<1d9 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

(p;Po(gD2ZDwho;F=b8h&o%SmBtrT43(bCTvZ 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�X!?q2jol1EKrOtuZaMcVEhUl>d>OL`S>B{ZH9C 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

;!Mogt6L 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 z�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

%W`&+_k|*PtJA_{k?99 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�j=RES>Ct7JhcnSH~ z9e$Pgv|mB>kmNYNLEUC5=gavnyl4Jt-t0@UJ)JwXoAc@SDvATU3fT57U5^54t_0~6 zoQ(DsUa%}Sl=-)hDPur-x1B4SGyoIBCqvW@4X>R1jKI;Y)I>O))^OFPlAq714n=B| zX69KHoR&snW0w)f=x|$?ht6%HA~QfN2u#6W(`plwAc|#W^GGk>ynb45X>fS6zwYWj z*G;EkV~m+VC!5Nf5SKNSuN1+{Y(FsY)=vG#O^-T${M+NWjM0bFX8vpyIPUq>rvYs& z!{+kQbggba`x=Dv-}c}V7iv$A4>mgv>NdhA*{mRLFhn@%9wdf{)ao!GYCB&R_gl$ z9Xdwj7Zv&rdUi^bAMYSpgG_xh0f^}2wZKDzOL#E#&Guxde+Np6IzAdZSoIq-aq&sJ zozuiO-M_}VwvW7E-$|oH6y$fT>`*pr8iaixig!+mE#UALc*h}K(;ZT~{Kc5!nPpqb za347;~N+l&Bb!4eg8;{u#aL3gkQ3@41Jb&EsdtDHwApR@%AZ!8MF=Bw$HkmXixIm4d3r;hVGcL~2V7lcgd>K@l7YW&eR zT$wB2(sl0+$s4?|pprnk5#I%sFnddh%seLA;uo|kVmjTT#Wpg(EUmTAi0AximW|@h zRsy(bBW5n{dZzmwI_nP;)pQ<{t<)CX(iI+#Y=l+E%%4-mQUGODKcPR$W7Qt zrw@XjWEv1roIF5x@OkiJ1VHA6ByZOho`*}lnGfy8K@9tvTRC=O`5rdiMAaxwUuEcg zHBS_gf46h!BOkB~4dF+NT5g_o&ymj#cuw{D5MMzDk%kyZi?`^GdxoC0xxT0RIkjwW zM*JJmp0mtnvG)f%5p+4wV{6f|ym|MA;&M;Shl!aTO3jkb>*s0G2h| zj@th>Bt_@C^?*hY8wG7)pdO|k<`8^i7xo|TW)xNzEPbF7Om>uT?Fy%~6=C2qQ#m}&c<9OCF za&qEEw5~mpd@4tqkRlgGe>VXKrV370~RkqJa?Y<`zWW0Njd_ zFam^>syA~&%w;nRi)h-oXH`{9fWd!O)oXb7x(B!!W1~!b&5DR%a=7$geOE2u}1!yse?GgDglR6({f^xyT05#1*-J=SF?I^DQDo zUT{B@{1J*E@cJUWvrvw$oMqu=k|E~lI>UduZic(Rnog6dt96d%kT;impgHsQdIof) zqIT0d_T}Z}8M|j*r<&M?G)_0E)W#p-5QTj*NDKKIFRBm>igIrdC76lq0Gl z;lqay0J|FE5HXi483A4vV6f3gM7hpw5{=Syp1s={UiNeG1LIoR(k4iA!v|04F`Av! zOCAT<+j{2H#)VgumE}Jy>-f|Sj3;HawO+8rJ*;DlU7*xmETWlqEi~MB;f~y+SWd@5&t{@Yxfo@}idG(pGPe&eTXI0GP-b`3P z@*K$MczqY;qKlGfD@|Tzy!O4aV2vnFabmtCX0-U>tb)5%)WyvlS>3V#)MZ7e) zun0NR)7CRHGokOh(xSfNl^tdO+@I~Ic^W<`QA8&TZ2&w+{>`?3pMG^zybtwB5>pMl zhu@k&i+$H)g*73_gCQj2%XTcYISe=ebR@sK4}j#mCuX*HHkd#$(n4mVG)rUT$2$-- zdxj61UWnSw5Eb$gZIfSFInHB6o*Mg^7Jy9IzMW%TT3!6fA?Q#)6wg$>OI)R_>v2?t5 z29wOQ-JOipc(&@E&t!WwvledX<@U^q?Z41@Z(3j{%&2M7=g2S{_%UwhUf%4 z;P=$58iP6%@L}5ID5S)Gss8ZYi4F60t-~Br18xBMH4#Ygl8z3&;N0i;k5y%SeSIme zEv>KDFSUAoeuPG0FsU^TbAB@PCY>+nfL*FUrdUaAYZ-_SC~$!Ya&bNpWXn|PZCk@{ zhwlTZC1GKZfv|vq_X`ZS)P1lo)GZ7ZyL+A6WBaZPe3_p(l(McV15=9e5l!&-V5-!% zp%2Q+$`XFHE^CQ9E3L%7$yK!g6J>;APkRf;(Z%m>TJ&;6B7J2uaur{mfBE!18OeFt z+aXX4pB(J84EAUQxs*D3c6N-{f@5N0FfcL0!hH`8p%fsg-=8T1JN>2nUHmYRY0|X- z!O3C(Z~FWD_x1I`cxNfwuI&qF4I&tt%4ulubvoSA+`F||2<{5lHw$$oU0o}Z@9kvY z$|hb8xTO=B`>?_$g}3K17XRG{@(850Ej@Wi-$f(w_BqP#?zrtZaY{aHJYk%v+7*ew}s%lOGK2u{z*UGq~y$O{Yr)oUtXD`3ND zM37%q_K`A+aip;2DNd`82b+*d`2|`#*`!e zaRHFLu4`jE(3F1|3v#)!y1*Gh=-xiXSZ3n1$;@N7J4Hvi^a~d-1 ztUS5a?#Kufnxl35$c|ku_i^UsLGJreplhR3eN|GQMRa=_mxOI-A!t{`XgW9HAq#g& zZDRG8ej(-(3htF$J8zuG>tb2mx!K?ES%VuGIf>&#WV)!1H2C_m;>#R#{|vv)lj?iy zo?GjPg4@!nmC ziHp;%b~2yqh*jhV$F#%Q7cd}L7}0X;O5D+t(zsbSmsQjxZnNx#*E-)8f4+e6Z@6MV zG!3xQD~N^y-`D{);2oZtI)))H{dx9U9xw z;yccIN@#RD$pe>(jt+fjS1z4LUV7-)pNZo=P!|?qYYi%3d2X- z4$y2Be)$o`idxjob$pMU@o@0)0+CY+B>f=Ze#@&zc>yGXA=U~h>T5IO+!cVAP!4@} zyV1ycH#TPY&TfxTsc<0uxE$6U|^(DjY|esX3dLbpEgaBI3Dy)-!) zFMpn7XEY6w+QsG0wy->zT+`$G^AhGU&q71k2|2@;7b0!CUjpPwDJ*}2CKpuPb#!zn zWz`@PhNyt0+N&=zk$Xkk1N#UA3u~Nv0N5JUvhaC4pOVMDPCVHX@V%3~x#72i7DYRD zGl;0$f%$n}kDJln_7aX3w}3!HU7feN`O?LVAE`6CJ9BCKauP}>4d8Wc8anyCgF z8-WN z#|6jI6xYmk`Ioq4%HZPEL7=oQ zw0kkWXxRc!we$@_=4Szbbl~DAO_3`p=b)mY!Nt!X-U!(QG@8TNk=N?+#-}4^_#C}G zdRcWf`Y7ng?`$o|#T30&ish^K1aD@qNim9Y6p2o%5s;h*LnahIT)tp%QMlv+&+_ZK zt&?6gmZ)Nn%n*-@%q%P!7NF=2xD>C27YCY~X5%aE0Nl z5v9h?TrRYY+J;_-Hb$i(#`dyO@&Y?|z;-5kCBOq7#=e*6NlN4 zSlO^nT3}#_2Ay48z>BKTL{+l0vXaC?uSNUeLn(`CR|&3b>?9%ZBeL224&)uCK2j9v*^zR{Wj?{T92!H8M87a|~lUO>#)6y`_Re)cUoSvQHr$_luW1 z)xbpPXle1nEETL_-4r!q{fq1;jI!4>l_|a#q7`*JEY!Hq2O%xf#O05+qw(u6Au3A| zudMo7E>VoKPkKYBI0TwUFhjgBKi_zxh!&K#uEfH~ZDU&6kNXb(iD01zASJAI-^zUR z=7SAMM1%2`2WWSxs0{Y>gh$m%?tw+Qt5xrXXG|d=m&VW6wkf$~s+u#EHhkwts_uiv z3wU!()v1YNdlo=t786Rb0N?d}T32S6C)eYse(o&eDC{hS`(mW?TfswPWBV{QG&g5F z$zft@I;TcK1Ke(HK3{BIa9In&RFyA8557KON53)+P;Dipj5JXK$3Qdau{aP1dEU=E zKOmBGN9BE(@>YYx@#T}VSVwCygYJ@2Sm(*;2wM5BzkOuzDSn)+{la39^2K%`RaMo( z%S{AxGL46aUe5GRUz>wxryQ$mYk94Nfv+9dhsp>jw1eLCc-=Tq0If-8Bdf)c&!HJP z%5idu0wvW1`%_YM>J+m8LKM}9IRt*CzVY!r3wwJe=663I=uDm7<9@^Aw(}VezQ9f9 ztX`L?3R)-V_*f~rys;rJW=h-PZvEsHb7UT6M)*;b4Wx$;`N%33FxDok9MJ**zG_g{ ztneVmpP=pMNLtMr_9)?zzYlV81jvqq3JF*e4{$~w#Y)J2EjssKx5-f`!1 z#4E+Ri;q+sH)kcMlfRpiMa8G3A>O|I$kONcQ1ONq9QLtn;)MO<00w*X@Un>O+DFvH za=|Q5=m`4xwy|GQH9a9DbrPa^Vw8mD;_SS(y4uy#^U4e4G-s!t>&6iCx}{enCnX8b zfku1DBaeLs_i&wzT{e;+y0&MtVM7eM^@Mht=Eq$$@d%%jW9?u^5IwN^3Wz>2zGHEB zM@L6X%Lgj#Y-|8jeVJKbucM}Lzks#ABxiU-vtV}W`!J9($g8WX%iC6Si&~nSR{?g{ zVPi64Hf<>^8h;6$P|wRtYfo5E@DcupN_K7^6B3Q1AOT%I$c8sJnL9u_8N{C-ammTZ zz|mZ?q{w@rd|sf->jv5I&`>zAb6A0WeXa4@c&0Mw(LF+nI*gv#HV$!`M_}3J9tnZk z`0iErPgjy;9UWOLq#ir~C1sTvnE!33UA?gT{;9%a3J|Zys46-f1DgTlO@ZyY-O?S) zl4>!WfbSIRpj&qE(alh!r>7^Y5LBfk&JZo|;QH6Wx|TtHbU!ns=7#xa985?-Vw1!3W7coM3nhkG>49A+pq+>Y}YS`Vq;b1i@n z;^GfVeK0CN_3N=BCp_(MJs`rPHUbW|Dxl#d>};{e%A$2Jr5G*bQban_HZ@SUzEbbS z-1;dnz>xaZ4bk_P_6P!QA@96_IatKN-o6N&QN$s*aw96FKiYf-s>y)cCD^+{1p;~w z%8Yy&zohhv@iI-zfBh(-`kpZMf2FYZKZOWJSX`c^Wo1jg{`Xd4EjrnSjXcUnDR-t* zz*>$h&@f}4<>ODNfn;A8kJ*n{ zrK$5bO(MObUyin6O3ZKfldy*ZE+C=pGL3LiEC=ma;nuuy(!BAdhW z?7_D)*X=wF1b)OM!pwa}Y3cQ~tjx@>>K|2=lM@J@m+lDg@FYo4MB25KnvXC!VSG>V zS!aEFoXdwJj1}mopF(TQtzxR#OqI8tfo1*F{2)T9*PqmX%OOp)(cy!Jy)5So%g!q5k;laDT^g zA~>D0&%gYYL5~*k5R>;`&Iqv`-olXw3 zir)7c*W?+*FkTBix37bU zEEhL7K6TB}b3Se#W=cFCgT>^0rMsFgv!pPLAtoSOH`=t;ga+E}A@|Pj$-Tq7@90=U zSQSKPMoTl_wIijeaJLf!QW=GC!~Q~|>*YVcEG=EYRHs^H)KAI1+?3N#_w~B!4o>#B z!c=l^{`8=Dhc(X+qWEKs-1|@FIUt(k;E1|Jey2tIrAHc99%0ty^JK9)>uYPGT0&nS z|ANyUC2N*@*F@cMOgl}{jq(Y0G`;eyU|W7}E{o#TDtp;=QO}Gz*20pEpGPa2<+m@P zo}XAEN89RtpCAg1EmtrxxgsuxPFY2L@+FIk?6ugY>!Uio*)cuCO&Oj@#BvGd#W&C6 z;!JO18VHs5(j(og?$s5xR4xC^&4ql=JkgQNDTo`dhcDzCMSIDZcAO0zS17$5*L}0!VqMD(z8sE`HiP zQ)5NzAt)A8@bMV@jsvq^ui%Ctnmw+)Gi1dA!T6L z7%Q_}K2yPjHqCSL%ZZQheNxoXbKIT34)EtM{;B9=#b`do;&JRBXQ5af&BUK>*E6&@ zM8(tMAN^8)@0~dQx$VrjA74-%tjVGZ8y*UI+uPgQ*sR0&$45uP%lIK70*>C%<;Rc< z0JiB3)9&`P?+Krkk|q|v_4wCupLLeEq-FentrSnJIc{gU#Op$f#kLI_Sf!C8+_-~# z*QnKIL$<<*UQC)g@m&&0FQmew&Sp?NKZZac(s4Z0zjxbaYFx=yiRg zpTXNj-7YHWK5)>4K zsq3#_Uww+0wRw9RgtC|(y?Aj`E4)3O zQkLK`6rH$};A#XP7}(4R9nNki!23c%(5YRWo!=}!2qLt=aOF#W`Q{MjC`8B}aY6ED z`S}WQ0R5`HmkW5S6)5M%g zw5|6&q0e;#y8sWqyj&G=4pKSA7g8E*clCyqESF)Z3*70K%f9POJUq{myW>#{MCah* zKI$18pHIrxdP-F20IUpiV?{+wtiq_5NX+_2N4W$9A_Smw@}25J2#Y&4xu^8{T;yT{ z1kH>m@6_+MdA+{FT@<9m>vM>^v=3cK>!Xa`!UPgvE_QQZ&=wpS5VuGFniSursHcOH)0y+jq+Y)l*pTSq$Xk!yQUquf*V!0_HLB3zh>IUJb&FkH}VSx2F85?vrsnw zNo)ZagqdvcB@TeZSosxpR@loeFaoA5(w-h3_}Va7_XEIo`zo;NtwZLt=Thzlq>sa( z|C`wdK{qXu*YTHF(9XS=2@bZ2decO!tQx7aU1XKzTp&e2LANW{BZd02{9(ymVxw*c zb7C*^@vrZ;irNjdc}lblNyjsu#IcjM5_z-fD~!kXya<6@ufc1Nc|r_PxP#kEW4y85%^Adlfv z%)J0*k&7P`RfC<>Bi}XKOjI%ZKMO>g3)idlC%3bc2PD41D2gQ}sT~U;u zxx!i)nUZnt1@hiCZac(3KCrJ-6tHy)jN-7J!bJ=06I<6=Bek1Bq|V%halYAg&SE0p zSBe`ruElVWWUBi}pgbGNgP0E&Q_*{Re!eja1&Nq6^?VM*$fcX*{CZKBaQUCKp zZCC*8b;v_hFjvEQuGGBgrFSs!%aaW6D6&_Ex%$}H?7Q6T?12K%+k1WCh%@a`L4JPO z#v?0tZ*T1#;Km4{!2GU3^E@?!J!^^)hpQ1?o$j+5#83l2@U1Yxc@AqDNRhGG)HL7x zIbC`FS^qrDdjc#VvUn1sBCO-%@=e7Ulrx{WXdqOdTf6Od8~dQR0NZJuC+PcLbT47` zC+ijA@yhc}l=NtVvc6Ae3eKbz`8roWnKW^Ay*1Q2fqwaN3d8b9oJh!w=UOWfE%R(3 zRRlYXWmZlTDOMeFyjQ zD3_F;IgZ0>l!U*;GwDs>cJO#}WG2>NXJ|MBB492T=4#~u2BaYTB;z?^it~(^?Pgz$ zV`cna&Zqp1hYRZUSHke0h&$(vjgI2ElUYCR)F+wnUdcLlMz9e_NwWnCN4y`Nk;jnq z-T|VkShJ^xU<*|Qf?o?f z8hV?Ml=S$q=tH_yHK@Hu6G628p|V6`eQwwH@Vj{5mNJuL zP=k5xF&s2u7WuON{oOlJU(@Z)&9f({-<3ffMSg~Wwtj{C17u1}+=PUL%8AOi_G1Wf z$10mEhLXEus;Wwr9**ti6($$GeR1i83wu(-9Cc-oDti`;jg}yC(1+eV>JXgU8NtZ1R)oO8X|xNAEL(rKk_CsDCY$JU$>Y<#>D+ ztQ%~usPpIR^{>8hc5-SXI2$MwYR%dg_ccklqCT;fpSFqkYhF!Z??}Vgh_#-QyEglh zr1|QDuTLNEkVQDz{)*~xVYx0etM#UbmCYy@7n$s6+8$h+&M8gG=09Dka?WMv>sn@| zrMHT0W7^)xwAtS|ex~Sg$L88}t^4!kfT!Oad~^B-2j>nIM||)u@dO+n=Uj)7y)cXT z+mXtRr;Wp7hI<8lme|Ue*-^AWZG%r2M$VkU;cV%bM$^2DBSjyz5V z^Tvd4D8O9)6QtjOy#J{7Lq&FW#Fa)*Gr|VZ&BxXQBY7#Rmk(}4x`u|ueS{h=FhZpt z=OGYr!t8G)_hLOdc`7stK5-_7UCp_%r{{B6?jfM8k93J5rV5c?^D zSYSDp`P^9$i+uileF8#M7+OH4sk(FKQM^LYw%SmdnKkT%@ne0Ug^Uly+uhm8wkM}T z_-2K=g&!9kv|S;JZ*aU<156k%Gt<-GRjvfJ!MJFoXjP)6XnvT`3Sv0EA|7)jQu= z?}v4!-nnH(zM`8M4N|uYAHG980UyfxaT=rf4q1v!#$&l}~$NsEyiCzWKBVuoLWW_Tx{J>}M68Iw(faq4>^kJo2w* zVcQphd(J|a(@7&LXr!weW1Z>JCGO-f`0Ox!zsJPGb5-Q&q5M^wQc;03f?uUE&fwIw zPpuJ5n%~M`y5`W_3lDd1&pkUKJ|5}^g0Ds2)S~@7E$21Dc079Mc9uIxUgGhZ`J(Yb z28L%NbR*;Q5s&oQ(sVD4JiWuBhI=J#g2$*Sa{~Sh4N>Y=Hk)UB6zH&HZ)(<)e=DI) zCUrk2I1S949)A{(B<3}RX>mMRU57;B>j6cP{QxE)V<|$rw$fDDhUs;zC)ejP?AOcb zTc+J;^Eg3oKEB+m(nxN~T~gYfUaK;l>dme?b%2&9W#0vM|Jy1Ta_P6bX{vrWFne8+ z^|!RNumC#Ax$9sy&vsXqDrt|&+DEPld%`v?6X1Tvf^wLbw<<9Dj*aYYb9~HvUSVBM-{zxf!8fZ~VVj4hbXS%W9h6RImGzWdwMR8$KjlRiJc0Vz&;1+z6ul!kz6-+Uxa`Up{3=5&;H&P73D|Z z7wKfe8)!B+L=^_;ou1iS@TyCGV)h0X%Njbd`eUH*Q{ym)F8#bab9H&yA!H`Gmo(Cl zbO)X#+V+_?XemNQ`@_2?A-`9;vXsub`bFR;X=(~=g&lRc1{2)#Z1FGiJZ|8H2I$o! zv!rs8zwG7M?l{ddr1HvQ$WSOm&zWWs*x zb>(KOGZrpU*yOjglS5OF{1?2L&D+GA4<7CCFf;o%LM8lFKP+IO7xYsi$peNPp$yu{ zmvKhR#>a<9UxT3&aq;RRF{#4YnZ-pjXJ@wg!i_Iq^X99fui z3=XPv;VA7_wF1cwD{2af9@*!`GlUA~)ktq*VqoZPnoSH32U&@U*j;74^CI?$4`IuXreQ{%ASojp z3lBtT=gebB{Xn>mu6T5Jx7_xkW?F)sd7a{G{N2eD=W*M z^zaaZ`<`EG+1zf?%n_K}QCs;VkTF5i`vFBx-< zUuaZ)^SAXh+`r#7S@`ztU2RpKw#059gMF+$=XdL&*CjfD!Rey>a@IEm7|h=wQ zDJaQf^l;mp4dz~&Y_*FzA`gShW(pr5p|t4@+m-(SU5stZ?^&}%@n5>SLUYnmQXo4U z(j=ppUs#~}!7jqZ-K1(vfn`5-7abivQd>epj-~HGmyLHIr?e7TZSHN}PMP48s}H1Y ziR0z)2XFLCA8egT0u-DX1D#Fgb^>V}zZ-6Fzx4HMPv45&tNsrF(_1~9k`}p;)JO`f#fZ77j+%D zrx<9@ma5Srsx8pEN(aMDj5H4uX{2JN5;6{*j!X~&QltVTAef)0f?`G;fI%na~@Nff$ z$E&X#HEsJ=fe7|49i8aWz(5RZ6GCDQqjRio)PxPgo+2|ZHy1WjlMIK8`|81{mDD|Y z@>`f)R1Pn>^6^aF@ht|h9)@+k!S27?Aql4REPqu^&E*;rNx$|1>_D}VeW$P2hdAhI zK(xuO22EqYQU54fdBH08!>BZM^DTun^(Qu@Y|#aPOmZ&`D}K1)v7bdS;KG%bu};1v zSa9*vYrToq^Yn43UqIYPMF9RVGGd#u^vN*Dabvp=AQpFF)XZg@T@2$Kndfz5>MUXI zuxByXF7eXLi3}{=;BSbPW!7g~BCO!8FC)i<$u36631N`^zU+y|SD;ov& z7ZenbrM@-G;CL}$;O>s+uH1Dov;{!G7ccJS)%zUf=zO`{rP_^|kZR>yNnK9Pz3zjK0pFNdn&q1&Unc0Y~7xER)FR^%HvzEGfCzOR*Lq+)r{}lIuhh zcO;~PBg4DTDt*Ws$f$$U-e+!zcIn^G;K08glZzqP{Q4Oia?grhDtkx!gI#N7vVpgx zRtUyzJb{~gEuweIO_U*Eq!HYHpqNsUf76uZ4Ysa`bIYq)oofFiC3i79K)->}8c3(r zy<%9C+^g^-3L&I^n&bp)F>N~dIbDoG@01@TCvC2K2fbS|s`Mls%8YdqfLP4#pd17^ z8aCf2DHd0F;lTa6zY^jmk<@Z%fBCQL}^2+HcQ{XDMzHJFI?EL#ve)c)u0Eyilzqrw-+ymjeBl z82Ao!)brD!uMd(i6V`iy&-Lbbo|iH#!2k!9O^*gCeVyBPGP}EIRfSJqA1)8la=BN+ z>9i+<%1RIf{_BY|rS|?sc9thVA?WAPCDo6f#cirvm7=jbSMqaOv+c)56yK(Y z@ObYSBq`PD*8xewT^z#)jhKl2?Y=lfV7CWFW;1=p+3frCkW@BQPpRY(rQl`UU3^nZR#}L z@bvV2c{eN28ceNz&K`};eyEboY#8`JCI$|_z5&y6S*!jBwjaeHxuI_j5p!{R$M*sE zgPry`sW(3f%c$$Q&d5PB0yN&~7q>&WJ$F~3z<&1jm|AyN7eImT+g^kys{bJT+dlt| zR^K)T|6~4lzmf+#22`w=EW_oijEU{7IqC=BXt{D3?%tJemjzasf53UmY^zqw;#=Ws3;WUU6phzs7lnS&&yy^cZM`&GMmO3N+8Ca=Og1CBhy zeaJtSbmgE^ZXmUJ^#`Q)>1U3}Z6-D{9vur^p^s{BYh7xui{P8n$H@#i_!w`Ue0dK_ zhnul00F419uxMGbEc)zxj_b|Mm8!lpAtU}CTwPboBy1I5Oj(uS2XbChGLV9Rr||On zoI;z4(%1&-li$xlisN}-G>K{c+ta7f2bhPkCONCtMdE{E3q7}h{NDR*%uja0 zXdPbODQ4KaFW3I|wXAth`NLI{YN4}N2cL?boj~F8^YS3y6&mw<^ICTAG}P+9loIvv zzL)SAiHhGAuG|@t2hj4Zw_EKTR5dts0u<@HEv@nGeIp>mb=z51$urBC;xZt?9?e*M z;SfljhDG8W#AYnTbn96?YUU@4jx=YED^KKOw{ra*huuz&>uRw=>nOj4Kgws4(65NV zlTMDJ3x^$!cH~L>ZKZ>#!^OT-Q(dhbh)PLGDJ3QK`J}Sp1xLX47i@*1r5P%BP0FQxqGqB2&VELG zy}4yXpP-Q$i7(dmP%3iu)cqk;*%WT$?TGk5FNk;WT)$tu$25+zb1fy2o&ECSO_xXU z2G`R_%BSRYwX^`p;R%x$@seui{i}}s>n4+|RhzKIjit^>YMm7wCH`R?OMTTdY$LyM zD_F}+)>2GoPRX#3d*!+A48*Y`QlWCgDLPN47&)Y+>wO%!bMobg%M0u6-}tGZ;=J|b zAhw?ew`pU-Te&T&Y-lzS*@#CH7bU1qO-(y~vsAlh>4|+QzJQjvPQm@uOIM-F4zf0= z!sD64o$?n;UBCT0ET-}3KT%X~uCvBs;p$u+lB3MKIXa@6qQhtuu~!$HUsP4aCGm2K z_89ol43}H+Mo;6m`-jbISUZt?&?nX4tC7BJPec=i@rYN1Up<5E5@~CaW`#|*q5Ev| zBZjBexT6w;;AVk<`EAg>F94N;KTFFpsh$^7aiY4Ipz*o4gPkvVk&9?{VWHD97l_Q@ zh{K45X4hrBQ3-N5wE1bpc@PTM{Q}=x)UNnsz1x zXlr1BiO#~rMZ!pO`XetdgOZbjv!Ro`zJsxilOqWe3p0bFv7@cCgQ2k_ys9o|U}0?N z1V4#cGm@~fv%qgElJN60h`Kq6D>>;q8N*BBN{l3I99&GNufe~VNZ6Sff4@=Q!PZd8 z*h!N?UPO#R+1SlVn?cOh2KkA?%(|z)$M);@;Gaw+9E`|oQzT(fWC>cE$|y`liVLAa4mSjE&>hM+(E& zp57$OUsuPVXp6i95=I7L2V1-U{47Bm8(UZtHg?uuAE2yn;K-oF&;PfjJpH8KODSz^ zW9no^!otkO${=QL;kPigtbzJBv_$K}T2H51rblmE+!?`}=!e znv^O=C)R#M_&WVSU7;Z0$rs@;`&8G!15<-au0Q&lezf`uIFGL#yDi%6E+o|moWwfo z9y>d_V*482-snlQwbAIs#hKg_rmESh2p?|{ZC!2nCV6p`fTi6=K9eJd=ftC==<@9D zVFW>glhXrRG2MM|g}>WG&0@vNj?dYXBcyS=w3 zeDz(sWt|>vVRHsmta%FCGFVqGXOZ#Wikw{Z%B%0sXDHd|@%8vZcGlsnRE~~1hE3Hf zjyy^qmH_I5n9q~_{Y^o-{NAhU8$A&Xnih}jZN6-;s<)^Z9ZojIAsYC2y}b`HHK-1Y zZ#G<6Xj`qr6n{81VB~uxbSdMAZ)`e|X}$c@x4OcOQHI&iskSnRH6i2jdtM`Gy8)x& ze6E@yYx#>|2Syw>T~L{xU{)0i1bwUa%#0aF^O+FjJ*UUy;d>nQxlP`(6}wcM*7@Q` z?fZ9Kd7r$jc#b73yv_cV^c=VK8vXHe0ZZD0Pe(;tXv;b_La*1WcU|8snmtx^jZ;KCZ)Dt&XRQ-rE1Tyxc0S8OBbr!IN z?jL$fkT+-JJU>pjc(0}xyqo0tW zD7oe2?hBbUNg zq$lEuB3F?QJHdG6q8Vp-Xo~qIYGv>G)Kw8z?0OWoj*xf3S#20^_NDmM{N{%dD2#TV zv`+1JyQLeQn9`RmRLO=T)>+$Z!h6c+eVV$2H@((5FDF`Rz{Rp^O{ttI=9Ts)h z^^ckuNQp{=bTiT&illTm0s_+AF)A%3NHc(RgLE@0-HOsBIW*EW3}+ACKJRls@AIDb zob#URch2?mpZmHmX6F0dd$0Jcwb%MAuGg$J>O#a@FI8?T1jj5A@)!{&O7L(mT{iI0 z)a$EAY31dzre?f6oDhSnLx;^#w&gffxn6Qd{ZcmV3H#H)ME2fmZd8)Wu<95NWfEmf zcJ~lTBa&o>!t<*gkQ8!~+OxGOnpiPF6^6lx&PB}4}<_;FNDq7Bo!8H3;o zweC8&{fSJ@tCU&qv>sFBHj!=qX)!@7!2ZdlzO-uN(n87DSU`+x+L)GKN5|Kj0d70> z<*#X9ezF?8URw*h5zF3yUo3JX_R?Ddc6%c1+X)T9{%(@Q9?3>i&yO_1nm!`Lp=aA1 zZ8?wGi+y8kRJes`T7wN^9j-ql)e*bTtu#i&EV)eCI@EBEaokmEnyLMP;5#mP(4;Nn zCtSv!p4)^=j+0%VNDE-PP{i<&Z`92>=J;P@t)vEvOYAAu1WN*n}A8^-sAhBee zGIFIv3$+@}VEXA)Ia+I}B$&41%5LiMT{k5=2`KZ)I8nmGfX`FbmihG`3`%oTcRek$KX`-1PjYht8|{F9r3T_-ZM zoH~{k_gAiA7WX?&Ti(drZs>NG*r`eSQoVcn@p2cRD%stRC@3udl6>U&JL-rOf4|G= zTEq|b#iYJP-GdrJAJtJNt=*Uc1ETO1xXMi&e(XV$Tls@(X~Nguz1u-BIp(~Xh${lgcEfcwF9i%%6;`~>ryE6C-2rK5R?5IA+hw_SdZ9O({sG2s|w zmqGBQp|d4c?-#`ntBWX}mxxE-yHxDVMBua5I|Ufau+kCM}enkJ~?ZdZU4lyzqViO7vCkm!7QQ@sp-H??zIaGK`7lag(f9oXl zqj-Y8^320e*!#;Q-ly!xeY(zZcTZJBqo)LvUXN1v-6pVa0tL#?bsV3qGh6bGI^y`j zcRrGN2H51t94;346y!18WI%}BWZL07c8OkIpz(~nQ4_7go^YpnJjkk8>CpSzNwq43 zw|FvuH6xKwD}40}=MN(*ekZSMWLfS_rLgmRYnNl&IV&1=P{uRn^o8^yKd?0I;67cA z4(nZ7jC5kgH`Z?17`fg)^-jm{ru*8&WV5ttBu4;;R`1`&Vag3O^X2O3btiStl4@DZ z|01gqk-qCu`3{fC^r?gs=Sa`A;hr^({%-Qor+}l13MyNz=ccO?2Ah~x)|U=a6@9~$ zf<)90yO$f0tX!|^M|}GyrURq($NVG_iK?F7`Q=yK?NcazW{hwLD8*Z9;uauwZtH%n zV-1UCtrU>{{L#-}nTmAvRNB#gFAQJLsAJW5^rg`7t>ZU(We+2dig24ZgC3iAAI>Tq zvzPgrAYNs(=(*?zz4XGWW@j($y7>v*`$fIKHkM9IbxG;@kINeS9|x9S%k(?Iu!`>) zck6d2gjUT)!ybn{6gW(ton~`ZjlBLtO&AdoOjb1W`9vIVt6(!({~ML$llX43X{Gl! z4;Qg!AN1dO?mo`}mzX%%E%3tZe9>E_a~ja!$mA3oMsQ8AoCW`Cw|dvN7g?M#Neuf% z*0`x96e?QWY1gjRWDth znsxj!2;`=b<%&|s=L++2965i_h2JIl8*FwzrySg+Ta0j1S>(5KYG;{Ols;d1k4OAm#-`bwOcgDB&yh9Q}ZmF(zh8e3!l+mf> z7oB0MxA`;+wOBCqVGsux*KeM1eGv#?kaqpRBJoQ$;P1caR8;T!@)75uEWcCJG-rfm5%X&mPy1aDeQ4;k?# zZ{)}z+wv_Q5>a<~E#pW8O3YrqJU#lla#%>k(p3IxzN^Q9u4{W%LPk@Qjxf_@>7Z9P zpY*;W^nWry4!Jkk_Q={tg=AQ5$C|}UYvHOuw(9tIiqxN=&aK>a;pq#(az5rOOCL`p zj&fe$EDn>tLb3BL3U^ z+D_7`rMI%QZTLrB-<>=XfKj?CdLL-7z?8LJUmQPj*UqVWQk75UdbqK&h6ut@?0@N| zsE9-1d%RcH0G|*Q5f(;`H^C>iD9)ER+gb(qT~&T5Se6NA

_S3^{} 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 z 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

m(`Vzg|U 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�r4Xa^Kw^wl9yw^&$iSG}BJ;!Jiqi5B^Kh@~ADt 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�u3r@6I-S>l{3G9*R(g+O>8XH$H>xc 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 z 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%0DF^N&be$URbYKFRnMMrP@eYQd+`L1w%1FbzPbj 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 +p%@b1hp;=$-&6 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�G^x2Nse(SRhu5~+e^fDZ0-3ZCw z?5JSl+HmG`mZEj8_Z4hx=3eQUwr-b9W-*KSKso=)n zW>bKeoU7-hJcXcl;`K)`N1vZyHh!zb7iX^V!cHUKs5kVcRAn~D%>~u3*9mtXsbAEg zpx+YqtUQQ)dF6x8(Ia`iPk9s%*juKoSH)BxI#_O}l^s3D?y%CQ!`D~NK65?6E;C(v zsKqwi=GOM$SUu^TF5=5yn>9D!G;)g$wd~5r>^z~?JyY%WndZKRt{v#?i>c2|I@j7n z56N_Nw|G3QC!})A$+Y=B?_Z#jnN@(e{PJc-mu?En^7Z9T2#2ny-V!yFHCe(wUWA$; zi}yPV$__?4zIR%@RU@hoy;Ek{(++B;fiPV6bo9XnGGN;rHuSmtq7 zt}9*aox(xm4(;4c(-Svdx~RSWioI|8>MMyaEqxMO<&UM)z<&0- zP)f1lbgZdz)HIa9h{tumDl|V3E?jo>XnfAA9na-PqVc)|#aQ;y6Tvbdp~-W=qjRQ8 zaQ@A&!r2!4cJ1w{FSrpXbE08(YHO*(=VaczyJ7}GT@Tf*t35n!xatX}C=Czh+t+{C zp4(E?ep%zZ%)L`0)7}VVzgRfU$el+vV)ojID`Dv##vL!Nif%3d2dxl}ipvy;+dh2s zVyV6N{%cX*YYv^-cI^&F?nSRtb*i%}(j@uY3ozI2Otq_eQ#I_(ZfKxZEt;$)+S0Xh zmqQ2pO2Km;#@Vw4k^~Zo#)Tf)hr1ICUifI$N>y$>+~8(=c|(j*wsiZG8Ov?>mh0`D zceHn>!^}Re7{Ly9S9!T*&sQDQP59{a?qi~((Xw92u~cvCkLa&<$KNwrWBrOsI|D<6*MBX z?CHk0v0Q-#34Iasu$rgd?@{}d9ru>U>IvIfa~>u6;5A3ma*m|8dhBvaUyvtKpMdXd zu@FGKWUpXqTK_0*Sxu`K@6D^yi7zCUS-IEWXt*j~ln7G%Vw$a&Z_Rl^DA)23-CG|R zqxZ;B_mSSN$hJ`q4I_OdR*p>45Nt6j$-TFwboqoiqJfuuhaByOR~j2 z0dGHI=d`8T+1v4vve$by2lNaj-~PDc@kiMr7B?ladg9ABM*F-jh6z3>lU_fxebgx6 zNZCi-(;|9C5uK|7)0W<<=Hjdt+A^|Zy`g{4?NoJ%*2^+G7qors)-CY-T+KV0`AWyc zkE`ut^!7?|gu3C-m72yo7VG0a3O?>adfh*szE82!%<*moUes_#s^HOp(>KmeyKb+k zzOaBu2wmO(EWc2>hNEQRlFTeFcU2yf_shM9<~?oVZ|k(%x&&vNlEz|Z zxamY8`?-+4dmmWd^gms==s>^$6!FaLBzY+w|uB zu;a_!xi8&5Ri_pC?66t8U)`e5{ygqgI@e9#7|HOx=ku1D=1MFd!F|LkZgoDU5ggsV zt?;3};pyvl52x8zpE+;2z(fSrshx2*EcOL4< z^F>7)otU5UAnj&C^V}uYD_1VKRVS`^#J5qO<(X1jTjw2|N0mdX8GC?@O|y-bXP%9U z@c>iVO(*2m<&SFW6Hisuls~G`N*5F?MLku#Zz-~?#wOP0;oV&xKK|)E7FrKu?U|02 ziWsU~dpXR1UcTgnVfU0|R`2&W0zPMDt}krc5D`wiXJov3|Ao-hnvc>Ash!=^{VVsF zWgMO7v1`-ymjU}PmX%zJT-Aaxk#&=7w%}H7-1||!UN&RhbKb`xt}FOo9922X{xr2E?n+Y}bB0~Q4(w_4Cv4%9Dy@Le z9}C_O)TB0SDfipu@7rtbRZ!1%%&%T-DfhKL++F39S5_%;Jt)^Qd>yneV{2?jkO%tp((O8au8*-hf@_$Bj-KuJQ5|hiJj{PV_w~!0xFs`} zuGc86I=Mh(>3US|x^8)g;m?IVoXsEiZxo30*9!UQ$RTj*+&kP_d*zp*aeO8^5vHrK zyEpYGY`Ng?-~aK>^AZz@4-e!9HwrYDl^w|#wY_9In@z%hIkPuTlgMHGY2Tn{eD;iD z`%52JT;n(YvijaNKZN~t`o=ISkKOL?C?m`TSL36afeIpJ(9o~ z&)?kl=*>!mDPLxsM~U`nB43qm%u`8BfAHRb!S=i;vwC-yz)RUT z8KJMXRJrNx&9rNZ#X2e&s@Cs9v`bAn*?ZMVT0%p2H>XV{LRWN~YsBf}2PBWXpw~K> zo}Z&|>A`^VRQ^WZH@s1td!l*85TbEBGh}x?0l!=eTc)|dc#UGuM&+YR(%(pl&Eed& zPEl>6+Kwk%6$EF5%|IqTIM~i#-3qWlES>XmtrB|l1_M8jSFMTHT95>KBHa_F6UcHijQb zzx4>6eq8+N<51gpi*QrB>Pz#v94-5`j1q3{HylmTtw?jY^ra%hbmPT%XOkfIy9-XR zr(m(lUv3xH7T&vhaD@8|LSI(ois(_UK5w@aH%xy!MZ8S z<{trVRy?AYQ&H@|TO2EDXPNxqCE?Hl{tHhPRMzjQ-p(y#vUL4MDKU@rPb8E~Ia8-3 zEM1a&gvH=S^W)=YnQ0r}yiq~A*xFgX;XNxH-LFCz<<{8vILKn^h6|RwnIAvAJ0zWS z;c3i=?vH2L!*@9fUfQzU@Hjvp=N8T7XR1>&J=`dDhb7CFn#XT05iYsheO`PxTpyQ) zc0r=$-|Sw)?NSlWz9#miKJrqaN$1Qf*R(p$dGd)bPhLAM;giYs*SyNi$Ja$a%Je)T zEh~OEoaH!s**H)}akoCg0LZ&cFSNZF~3gv~b?QgAWX@KXea`{t&P+eGm866{Q*} zGpqY6=4J6*uq@kLRLB<4S=5bwb*Oy%(u?xKp9(h}`u;X)^Fe(KsoPX4*V{|d&-d$a#Kn$)U6R9{ zP3;Z7l9-RDE)R@m1-)~axo~(*g?p3l(_)l+Z_mT+c{73)KJ&a2EDgvG=$CY@{512` zO}?Qo&8^4WBKk|!2B+xv7Fiqn?Qd3en4fe0!UY*gQ|HeGy&p9KMrK_=EOq?!>0wPx zW$Z$Z<~(7;uY<261AH2HHjZ??c+${5fM0m}G%D}wr|N=uo7evCJ&i@q8mM~7$c`1A zqWhDC6L043zBxE@GsM5&anaI&rldKeLs=L1iB*;6GtZavxb%+ATP|M{8_GtIE7Uq1 zy+{##)PC6u(KuJ#hHHgdN1~S~;=m6cE}xf49>;UBDaaLRimVB$&_r7;s~632^=kNB z`1Z*CrNQ{w&ZHlvHLw=WJ-m96qR`Rp%ko8Ko4x9?o4ZD0cZ73u>=8XIiY?)7S@3yi z387kyX-PqA)BJNmayhr|ep<=erY<#8b+r&`Y8~sB?z>XK+CB)LJ#vT54!Fu4HlqC} zBINm<PZ zKQY3)L;OpczV>ZQVtaLLZF{!jvbP#CK@zi2A)n3sIR?Fg`bO_(gp@|KUCcY*S#S5@ zkx8&BfoIlfg?_7;ymO7CrcP-+4|7K(!*-lzmKM0j!G~8c%Ij#=5WdZ4;AIfFQs-0V zg@cJeIj^T?b8mVq7qMnHhU*BKx3Urn39 zPQy~Ov7sXd!2XqD7>Wr7->4F$1opE;i=b4&19ZxZNE2TB@&4qGMeK6B8$sqA!wZcQeO>yI&7X;m9>cCa-@<*6@o!`N< zI&ODJ#FfZtu6{a9ju9Gy4+x4^>~jxx`ix#Fy;Qy(zfTtsTW9eXx~YDkjUS% zH+iIP>#k+*+}%_!xDVB;w4UvlUz2vd+#jJ*TO%aK6`GwXwc+|DbF`?_*84nBeP8VA z4hCF#ZNQd&QltlI(Q>zHPyZ{gho6sE z8+V4t)}&RNBwRgQu6fTmRAFhY+hf)Hgmuo!&sp+6-dFqbFxpV}n43a%%6r@ggmj*z zJ*r~4+ErwfHhXkr`?H$V&RVU_&K}!KjwK^L?%C3H|IQJGCyUMAcX)R?IlkjN)_PQ} zhSRXG{%KZi&f^l(LWTKKs@FewuBnlE(OWDl!7sd?d)w0~&M7HA@zse(F5FGIq5AwZ z-wR1|<4tC}5>^>+I4LhX9pRaOu%{s3MjoX;`1V1AVuI++XmmbishPy115OX7COByc zWxovI^y?0MpPPDkqxamJG~s}o#+n-In-qON^PP~N{zm8IbM%I5XRbx)5&Kv08D;aG z`1&#~W4`2OMV1wbHqtC*`PX!1P@8Oq6fGJM$S6CeX+$*Bu5)MiN}hAoK7JxlC-Ig%VpwMKvaQ|FV{!c8ropU5 zu8X&e?!7CL$-0M)@8P;>GaR3ZKRCYU?UZ>Ih*g}MOYBu191mWbBEBtMNI>z$-Z@-4 zJbrB9YmUWa-CQ4N@Ra}Fn(FXv;tw$z)yY%mK3J;bP__NVUCSt+Weqo97H+?_V0-fh z|JA!gJZ8MDzjU6p;)BJ>du4~QE=88F9JkwrH0s~*I4)y@JTh7+wS2^8>r6?(=(`^L zi&yCS_IJxJeBgwfmRcJzWRW;eCQO$p>BRImK40(cS?pr4W9k((_6LvWHSd;k<^34v zbiAX;QvGiAn@w}J_sHvca5s_VQ|H>Y zCnhXUrn+L5J?itM0KfF40lvRj{v-(p$oOCIBO+W{sz+7Vr zmtvuvgQ4AoQECLDxs^H59Hrx7L4RysA(eQoZSdWoS=w+CGgUbqF6yRPE-t!+W<%&3t0p-K?y|wdFTcJ_oL(xNV6<7jYEI)6-MXQ&`a1%?5=A z=g~mLU@!vU2?2L+C!)ERfRp=bav{`mfZUh6lrY;0E}dFp35MgaP=DxSF$-owc_-IO0bdBZLtWKw|`i#B_zk z#4%WLVUhJhXmKGSNz|Ap=>U<+kaHtIM+7mHfzd_d#Bn0xLRbMI9IXu4lVi%DYA0hU zSY0$I0=$odm%{KYtQ;##acgHcM{}aIxr>W~ouxU{vM5k>NfiAS(R8QQ&+{s3Y+e^TTU~TT zowI|p4G_cusp;lyNFX4=;YtKY3j#QHNeJo!7$Kw@ zfk3o#vO&ta*%7RvKjfV)Js_nKKLIA&!nY%Xen6|%%o%Z0rQ zD;E%zxC+7B)7j0+{Z}>ar1@k65^A0eG|B?_Gsr`clZ-!X;3V}A@~>c61{MK|W)ghU zb;#=bi~map@D~>hFYe!uz|r{b-~Yn(U5MZh{0kQxjqm>bFI?Y+2>!soaKX{|?%)5y z^<9YI5BwEe2zpQf#3-b=JweC-9=L$-l8J+bE}(D){O}_@wD80YoPC7H2~lIjVxs8p zPU#z{IoEDx8(uHD?zHWer!!`-vN_ntikw>)awFs_pO29Ji*3Z4(~V{+(pQ^?pv2X_-V%Sq}KE~`w*!Qde!mj2Y1%>3{;=J zXSV!Pz^J=>)$8TiEBi7sf^)Om`aCaAuk)yT(U~mM+w;yT(|b{tXI(@@K!*%RUFl%W z+f(Y?dB?d%0#>;uJiY2ax_LxeZ{!QtsM>J7y34lRNjgrpLvrtrrMmg;d&tr+{=TX3 z;`#vm`mIZ9QFpiUZO!a_c+adW(l}~*EOhtkL7C=aGwb&v@m)?+a+Po2-Zp=0{E{A- zRd{^71*x=D{zQFT;%gnZ2t8M0sCejywdVTZ-`-iDam8t?YaayM;+I)n`P6@2%Vze3Qat7F%nrhc$drd%buC?>a9^ zsY?> zTPIA)L4#cNRQ?UvU}kF922&SUA{*i^@tL6jBn+9*|Z zL338`<<`J+ck;!edYkM$**i?{x5jq__>A@p)jmLVFB4P~x+iwVS;%u|@5(vY_|A#g z13C|yF(=4?dKfeoiJ=}hEd&mW#^X&;lyjp=wBkSnaTkUusqs(8#*aN6n>ts8$6^_e zrA9KIWeqMTb!av?1zQxaAc_+aR=^2iMZ{#~<*_1YVG%S|NJLHyFDwl^(i)uV_R7v- zfx@C0pU*nBut@DUt3I3Q_8Vb7uXgUtk%j#or_CkACmP)^qUnGoIdB^50GCSxM`9(z_)PErdH>xjbUPpn~fJNJV3j>~- zoXVKdb1y%j8cg|Cwj6C`6Losx8RM1Rs93Atkt^G3xYs}Pb)X8yX;qV_&!OiriRSxW zZyefN^`7~#=i=NMo+0+L-W{1!x*t>eQ1Y>*f92u>eXCa-^};3!4|m88YA#}qy~pmt z6FF1mQV_~AXM^vZr}DS@c3bDpc;=sR=U5gy*1J1<*HmE_6X(a>t1ToezpCD87O}Ef zG(G!nk7jj;!iTjvUrqPFN>=x)f7-gF)JrRwwUs}`pC=)&^Okd3!}P@Lmrnj2o^zb{ znRyiozq_q-_2TVBu1_0%uk!>v5O&Iq^^@po8o=sT#Vx6r|+0k=}GY{}Bs z(xq9_y=|lFrK0aIw92GC)C-nul?xzzHS4_*eNVX5$#?kcZky33yL>}?q+2&KcYF6n z=MUD|^<{spJ=6K5`&PAkz=1IDq*;;;5ku?df2}v+pH-Kke?lsL?duPLRh@EQcCek2 zYMAd;xc=D86aPnVt9w{urBuF3PUXU~;8(nr2Fof&LJXgyr^ICh55rR-aA*!i$1-@ zSN~Sc3fyh6L^)s8pc;SIdan#A@sU=a!Nr<+!(YQ1jnv~jU*`{bx+Na?WYya)T@(<$ zcA!@IaJi|fid^1`GUpcU7X0As#^)&aqf(>1kMr77{LIi7ReY1=oO~Z^rk36*;H|j7 z|Ehmf{pQNdN|OUdji!}euUrpDv^JIIxfyhIyNr~H2JC-*IFsYuoy4r1XQxhg91s*~ z4!r&;GtFi}W<#O%nc>sJaS6t#0re)y;NdOk9+TdvbW!cEM+&5GH>YaKRM;s#-I0bG z793uHO}p59CiX>I--aq@$*=Qoq&^H;zP&U;LhEZ-bJc)D4WYNNn!fv6Z(~ zB3!ck=sb<8!Q-~0{y2dJ#iD6TZ?qEk-VVs&>9lMUwFn#DRd8hMOV8WSxA@jKIeXXh z4EeK&CW$@@F1o!X@BGK2y!8W@b1%5M%r?v|C^!2Un^@i4a;)1ztX{Eud5ME%QpO9E z{tag_>x_)V&IdBpuDj3{kuuZU68f^IACV8h<sCp(n+V!mj^>t&2S5a*2vH8o4| z*Hq@~S=~A#CRAJIA9hjC+OztS_UxeeQ&9%T^ontFu$RN zovzgOIN!tjUGA*QvUvrrpS<)+bWUsyh%$^>UQA3V=F_qp{pzo++%j6UG-|fCGT(4B zVfa$0_D98+8~_V{E9%8p&!w6zd~4%GxfE4hM@OTadJP9;4n!0`2sb-)Gof)*@LZwN zGI#aE7xwh?8t)%%H8|SOXAn5D_<-X5ZWpec8N-|p3SXRAS@|$DL@g-lj;!i|P1!>M z2M&E`|5&j~J-nwSa3&{D`n*%h1&>$v%Y?2_9-hKt#3VWHu+EME0aiDnmm9&F9f8JU zgoQ=L*b!^jDrjs5*W>{o7t>#qC!wEj5bnQ8i`Wy zA}Z<-!R!#JFhw0wS)`|tC`BFcFqV7)o`oLQG-Y7 z0F!I{#xMW}!_g^*YgXy*HS03%2Mi-74h%CqAD4AkKV0Y+e80F#vhh)$l9 zN8rJyfL+Q6Fj>~$2rvy%6222C=YJ2t!Z3iz-HZ+}nsR6|Bf?aLBE=DYk_i4%h5w%+ zjD;bLrt%L}htZU*5)#DZ(9DlRO75yO4iz#JLf|Q^_#=!;=EQMW0Rbrb=U9PEyL47S z{1R3`Vqmm@K$8^`rnZ!D*RRABj7x~gjY|`v2n}=;6iJdzo?FMFNd5$A@B%`S2d^LJ zRwM@A_tB7-uMOIVrkUf=tB9D07>VD15x-JLaLN!p-sq1PqJB|V2#F^#64@}oK9*rp` zZ*7f(Dlot(=G!me2B-yo5jWrvFq@2Oj!?B4FvmEkk`?C{DfM_-OjlKs)qp370rdF4 z)hZK#jcI^J$R-~RV>tiP{0E3mpc?-+v*90#F{Q`;xaEt7V@#zs8paS^e8Ub@I{ecZ zlX@L!K}+4pBkXH5GB@v)Wy=^dJ-KpIZJ z4Kqw=DNKwwFdG=+CS$@3z_g(cY800qrne9~{9?WRt`k8s%t#2+$#?9K2Er_4WY7h$KQLPB-nwCH2 zDUG&Z7v9nTlU zQM~4#HB=aV!T)vk0g*ZS2umS$dPl*H=Qfgl{ADi9|9k^r;0-X=r^G=$>wlL1De;LP z^&ydHv@ncTaATcF96ZGLvo!L3f9F3OQ>pw<51)Qxl#{p|M>QG#iod@zP4$yNBhVlS z4Wke0NJ1TFMIb}*_iOJYjBo~Xg)*edAx#j}$n^Noijb!*|D&PtC!qy83=imujGaIs zO-@pwrMjCqGJX6a!yFhb-%LtRq|=Zo4on)Vy9*4QNw}M24VQ&Y5RjTd$q_GvM2k|K z3~+@;phYQzKDfewd*pTj@8gBR6{XhT3Jb0%^K{?}2d*fV3AhpgSER;(EGs-7T+xgm zyePP$*iqn~7`UR;M9C4zffl2E9ms(OGyJ5G9=L}=pv7ok2XcUIC2046EY$gY@Fb8$ zjG_wQ3dkZx`#O*VO^)b8k^wouN@H3nVqoni4GA>(6GR~>Uq^$40P4I1Fyz3@7r>2n zPZ)uxNsSi5A^~o+dpKYz(yv6205{q_JV=P9Ux^|CZr~my85%S%z>W4KQiOg1Y)`se z7$hA&FwqA|O??S~LY@mG6$n6~Oq_$_#e|?`s?;X|1zsBmt7@)Wq8cLuxV0RSi_rUZF8my3~U59IK`qe~9}&6-L?XFmq`HAxqN&j!a1RJX_0GT*4uPh+3g8NeLmi&L6_AEH ze+#aFFeF2lTqcl(VzPnnL6Ac|2S`e)B_s_gd4TjR1Ul4rNc9-w58fbId6rPwgg z6;KdLP7`zmiAk#(kRDA(0DKEg#{hf_O{RKCH1I7nebfQpLeobb@GUfb)B)cD8Fth< zfN!DcqmBqbj6UjsZ=va<4)_+DJnBFV1)xOJM;-8GG-ae=u*!ZkB28(zaXgFfM5KWR z(G6Y-esq5s!;sfPGs`G2|E#OQ7_k`7ETdb%F?fo*?@Tzzjl6;}~Lqo-i;z z1Y1S~j1R$>4C6zvKmx{xU`&SbAsCZkdVd%XId%24>~}$;f671Se=+kTp#Gf(YmYFjfPlz*r5G0%J8$3Z2z}R2aH> z1f;@{M;4M~pbm5c1vC!^#;KqV6i#K}Ka%70O~7{I>7t4G57g|hri%dhbpFFohF%x} zk}TYB{8CDb{5}Gl$S?gN0t5j8c-$Q1XT#EfLDPelpcv^4*#Eh)2R>7Tp?D8)>>-%H z!Jg98zYqIgGWbjed$NV~_h1jG1g7^C4-Aey#IWCBPq7JqANK#D-v5QZGr;@}z5K3t zA{YT+FjI_W7|bL`@f(;art!ZpPj2}J@cl6iFq4NfILzZR3B`!`eK1eJB#Cz%0^WpJxln6?;#ItM9Cih7PwU>wz#{l~%#+znFp z&tJez@<@a!Qy2{9+K+l96J!6KXc%yy>E@a+C7=vbaZ=!R4E7?T)H#tq0sbV%yUD{% z?Z)HGwnMpyl!z|0>UP3h&57Zr4uS~EGU72@4I&gUxG7<9INakh3ME+aN6^*<^IsH= z{AQ5{&D3Dbh@Cw2WZeE9O$Xs1IP_!-5f1%${vS0e_KTqZZu&RF1UzlUI6U8*5&FL% z7Y3BSasNmw^CpfieP6+;>*N^}905&u!BD2eDPbs+f`C*$`B_v+wP9F^3w2zm>p%w0 znDyc`rDe<@nHahMY)u^lazBzq3__A{h*!lV!>6*gmDr^=q}y& zkfr!^lcobon0;JD{W&HE;f8M$j3=UEc;b^VCFBg(RH!At#rwBMDt;s0WcU9+!kbck ziu?CNc;guKn_LhKZ&L7n4Bj~EjONcW#Wxdg7}%~HAw?QB|Cu53`aQvAKK)?hAjBhBDCGhqb$8E$>XM%oN zdwi3hMpu6Z=jK~ne{%$hQPIcam2pQvC>I6pG=96}i8L`p)$^alk#PhB3J7w=D3f0R zwuwRg7RGPXliX!s^Cmy7o}j}}CtQC#Tm&YP;p#~mRv8xSK@CKOkvdOLotpevSihl* ziIIdT0p#mZ*@KZUKsTBM3ouSk{WZ+r3D^ImwgP*N!T+P=2EbT=lo3FM`DbBe)K-XS zC%erD8DuKaf-8`tIxgfSqwV{|I|;}qYk7Ph@(BzNka7XjY)a@D4*9smOZnW-Ho+Lp zW*Fco(LC&~e|7!El#0ziu}kup~Pw3bf{@!#n9O$;$LvN7(k2NEk8 z96w6Z4_vFElBp2W`1%h{NR4Iav3A-&)tfFfufN3Qf=c zA9p7vn({IZgCvHgn{Xt|DeENvn;4qGHKZh>!66@yp{WUAKidRj7*@*ar^tc;*~6SN2c9JQmnLY|j1Upa<4{!1qfKresLNfF+G@-_XP# zOac9`1r`mDyU|jtX+9o_1E|3MtcEh$$)KzM=bLL%r%TBHDnUE3jJHb&WkDtsC7Nja zAy9%4Qkat115|3VyMaK{i%_}rU8NbdTMSa!Np33*jAfXyK_LXVdc%3+PqYF99g}Lw zu-)5l4u3KN`2$g8u-*lZBdHvC_>+`@LDgoOZA_Vb{8?PT?}Ge)8|Hx10fU*cxEH3b zq}2jcn12@5-#{Al*=ur}{i1L^HQn+@eK|0!G5B)iwa*OtI<8qpi8lQ#u>Y<4`m->D zHL480+&7CDgh`9XsrpKz1quuO3-jbgG15|CI4zLzgV6$MW_B#he>5o$Hsw6dOcXtM zH;ECCOivRr2&s>Kvo3AI)VRM;?eE0s!Bim(bIN`KaLl2o{Wq9XrpW(f%134^k7*g9A$F$5FF)kvR-i1Z7%)@%HK)f`n_TLp9L1IsAur&DEqt9fyIuy zyn(u7$R7a~P8kzAdH-yU zOIvwC4H97)mOK0`EB}bU_pS1dJNeI$yZpO0>!q$-`f=|MYz6~U-fxyQU`e|SP?h&z zSSRO(Ks)#_z&h4g!;&^F`IE3t*zFng6SfJ%uZ>PnjQyX`Px#y%ma^*#j9f{3tx$oa zy3N#W*?v}E|7)WYKM6C~sS57GVJTbIz+fir4nu|cXJP%{V^=%|P6L$mM>wqTbd=u$ z>ks$)u`vZw^3NnUC;w(Tf^l5>ku^0SpbHz9D4Ptyk%LDi|3waVJSd3Z!jU7}nQ-Lb zae`lj+)w8Plhjj`x^*JBBAu>EqOm`ob;hWyz-Iq;>TH6%U=YoPLr#v3!y$)z0DlT{ zTAtruVEo6ICr$$639?kdm=433vR@bsW70C1KRH7EFth$cEGjS^4F{6Ey(b*V-##V* z&uPLVmf;%7Xqr-I+rPJQIF_iNvrZx#_@ zf5RdofakAEX81n5RC@b+;AOB2XlJg_!T_XoF#kXrn6&m%HuC(tw3i`%h$SyfgOLMi z&C7o^yws5B-=n<@p+d^OtZ;aLyH)#}xtF$jmiH!LP7d|9L<%cvs{_^bA1$hETvi8A!@1nIGmz z=;R$3N0Mh};Xsli3I9VJ`SUQREPc=p0q<3wFNhM5N(~^ki6>7P6C_d zH}Qe&Zabm_0m-XxZfR-fL~uu%J6R#M2@d8&f)!HM4xGkmV`pjZfCM`SSb10y-I1HD zcG|f+yLlt!oE;tQh(rPbDNnE@I9d?gzpYmmUAPR6YZRxscI!Jwjn>#2O9Bv{gB#1^D z^U8YIIamQ)WHDmKd`K-1b2p+7Qd54j92CCrB5pu#a&aLzS%FUxkZ3_PC{l&s?dj}h z<^JcP*?^RjRnXo*Yk7A*xDMk<%baMsWa;L-+1bqz+K7j;wTdR#(9s=SQxBuiw(G%`FHHB=IN( zsS$|gR^V%3ry@$1M5&qsZRI66fwrfX4CRWFyBFQZ!Qn|=kP5{w3O4`12m__@kb?MR z>v*CpR_L&W@iy6n7Q*20w3RU5^>d&$riL)du|spvphT#tDY;`mJoLcR0f8uEV<40b zc*%qZF32gy;16+_DMM8#ejl9 z@CcIrh5iu6VZ=a)3A`@93Bij(Z6P@91e9oL4z_tl>RN+Y4;vudW+d>W$+|K1CGaptPKC(G>bIG?5da33d$o zK{S!V6lp0~j+K^rn*t>5HszX*BXR;9X-kldz>$WO6k+fO88w&!GaM+QJFx;&j^Kge z4fbCb1Y3@YBC#UEg3$Sn!Z^Gj4lHs&VDTb?Sg^)#JjgMBp90ebrpQMX7#!|H7MT9T zm@3igNC$o*1twuV2?eGMC@?_5IeLO3;0zWJSb) zj)D}Jal1OrP@UXZ^$XdRCN5b#s<;S>xZnV&393V>9v#XF`IQ=WBJnFZAsFy088|q< zLcdG`a@cmOl<`bdL{J!PzAlW%2#P_cvx)(B00TGf88w zix&Pd-u+#019541Q^aKe{M+hG0&)_{-=_dk%8s%yy`}UatPma;0w7{br2t?B;(@I) zuI8eD&>;AQP>vOsN&!@HDdJC5oykB6*{?JxNxN!O_gg@z5}a&^wxqLLQBY`rDTeB`fRfMRA7EKo>x83mmB` zC<@X&Odv1Roe07>jtH+QdKwb5?+LNh`5y9|icjx8zxa%V>uy#9rt6I(oK6wCvWtg? zyf5A`NWNEXxwdFUq$HuIzuxu!jP4k;{l4gv=NF)pE7@(2zgwJOkt=fH0{e-}8SM3% z*&Iu)%1nBbSPSL|f4r?G8+r203!ZsAF>hp-$*z9+Rw(O`thSr9jkcMTXSkq;JTgiEStIJ^66XY-kqWt%x$T_HEZ8qi^`c@b2JO{wd57v*B#z5 zvm*i5U4L%);kMV+%^8)|HXVMISxlNkd#Bwa8cf-ZjWXc+)S7S1Ij`hF-_%8Orpz{& za`*q*I}>QCzBlftBvVv|h;+%2GTr&!44Gxh6j7O{$dH*tDJnxMktn1@NahkDb4nzo zWJ(AbN-83G_qp6OT>bT1?^><(zGwCOUDrOt-TOJ`9{clrpZz>tHa65M6N*cpel3=c ziMhVLI`{L4*b%FuR*_O|LAU0a!)N*M3j8!n=#`$~r2GZf_AZUo%dO%>%}_u17$uB4 zjzqC1(p|a1*Ik+E@HyqpmZI7V(SkjR>x}9-?_%P^inKdo1-h<=Q77)bAn?le>Y)|Z z#XD7Fm-LQrYHFIeq_ISTHO92APcYFT7^TF@ITHL~=@Qz=O5$BtrqD0Meep}YlWluK zsDo84l2<>!VAtD!-)3?&SMQ4ja!X`|X4gq?jfRhTjNuY%k7PQZSE3Rya*Ww`b~uB3 zc-W}<&Au(h*_OtHuFkRvoMAR-&U2)%8dWpiuW&BRt4leZ@+_MTv zf4}7JzKpY(Zl_TPzx7RSVAvbt)TJTEr}ySF<7q2bfh!`MS33h8%9gGu{Jtja* zVyTGPO70`*1Is!PO9GE)y%(42(xqWa*EWsY_6G1lZ9YeZPwBid@wCND z&#a1&{qk7wI>+W?X^9Hj(jPavuPdZAJ~nxI#bX49W}3<`aP@_yP39|KEV*^0B}-`duAk*@5w6gbUmo+LI(sGR|%AYahr&`Us z|14k9(p06`GfYWbcTR0T>(aA~=0u|T1rGLV&h8UNVO$$F9c3Ho`xV=UzRdyijiNH19 zb@ENue4Z5KY36NxY5h`Sy$U{Qs_EQ7)yEC}#UJUc1+4e$A8t$26^{ z683`j=JqZ2Q_sZGPc@`8c*QrwnPO&ozMgoSRTzA*VAB3m#arpO=hnrpD_O_6PJdlA zrW(r`>l9lX+Z)@5sma^7n<1Zickk}Ld=rVNn31}jHUhb!#Ker7!zrSTGD+>}(ixW5 za}8~;?#QiYF^&-1gO|I#_qLvwyq3DSp}1+L&bvezorH{pq*9gAJ%=CMdyIH#7AkkK z?0RBIVySt&`PDAVjcI4o8#iCweO0oWV0p_WWK^bmk6>1CoN9#Xsaj3F7f(BOniV$W zH8AdfvriC{jxDOWlGSEpbVIrMGO6TWmJa(##u{g}vls0sYWU3bnQuyP z3b{i1g!hSJrtuf=ER-K3h*8D~^4T)(pZDg)!%_iLYu za=13SbQN&Bo)xna3p4dTkoZ);HL82};AEZV^HY7Em5!C|FQi+h3#PU(t23Wf39X4t zIoG$Yfx+Ztbmp$JyE1P_j9a|3f0rV&RVG;GlnhIWXGyxB_=NfN(rM4h_Oa*h`zD`H zX;BlXZ_xGACs8X?8?2CFK+&yP?m=BqMpagHbc6U4Q~teA*_X2is2oCua=zIHndr^y8C@Csb7HvO$|H*xo&{OQ{>|V;XDpg9)R5X=*m7&zP1Oxoqa) z+OWQJ)l4u;d1|l5&5x#cyn3mhpDQ{s7139{rSH_J@r3o)v((XnIf0Fe(Ur!*mZ~>Z z*;KoiYRTol^2jm$5YUqvc_#9zFgmp{^^sj*-b7xLynuN~))r&5v{12l1?H-RLg53u zXCwM7S7aN{YHV^dvMIU{{!Qc4_Avg70>_LPa_w_EY*nli9_ZAqe)F*>w#Vt=`r5JD zDSxaD*2}}T#Pi$nuVvVg{Y)7_%{TY9-r3=0Tvpiisbui9Bf@ce%ln7Q4^LThbvlJ~ zJk`0ZlT~82FZbP>YWX|zI$g!0^?R5csvOuHhTCm&GwfTV`Aix=Sv-6l@>)xvEn=|K z$Zyw|_PWo3!^PJ=Uz_rJ@;W*B2(WYY5Z<}2fj-ntK0KHM(aHB@3?zQ@Ik z+3vK}={(f+oMN?1dzEJ?Z=wL*r6mHY1D z`{UaCGvpkr%-gzdR5T1;d0SX&d)V}_;_&v-vkfXiD%WbtPkTI*eEJ-J9UqA+KNV4( z-R)B2JpJmEf-g(@fHwN-oe63JFLCsB&BTUx@r+U}J|TW-147dYpKm?h9kM&Ixve?) zRuaz6SHrh+;7C*4`ug>v+b+%=`WW^(CN}qht$M@RdbUd!i3wi*ALOfpMni+wp4hs} zU8XRv=SkenteYJV1EMocM(?<$wiZu))sIfMy-75d^o#Q=9zH&Os+p%K{=DgszuiFo zJICUI1G&@ZyEDQ|mizTh8c&ILd@l6s4WEhQS{6z(IU-i#J7dx&J>b_d-MAu^*<@SY zLBjODY0IJRD?;>Io8!~AWlTStcy5zg{Bh{=bF+rrleVXi7bu9&M19HBs#xBT+OS1A zPx-A%hDt-&m$3GO*&nOkKMad*>JBOu{&s6Tsxdvm-)pMa)}prZ{r<+mm~Cnu*Gq_# z&7U3ntonPJyzJg3r-XE*mu&kSFr7GM`LX8gz>wC2R#d{NZC;1yzJBl)bhLTXIUYDR zMRBrB_VYmEp}Zy#5j-5+?G8Bjkj0bv3Gz=<-=Ew*ltBfAH!KV)vmT}Y2r57*0$w`c zO8$jZPG>`;qB!nfC#ijSQj@j%PKPhdn4Er8B6XOdPTD_7*KEHRuz$x=g+tD zHgzdu7)wRkD_pkVWp^2kyLfW50CIQLAt$MJE>v%ixHsQqiBp8IQ^}0Nrv135>(vh& zMoQ6K;HM3KlQ+ekf3VyoV-tVX(DREiA@-h+*C%i2=j18O{K(F;_1-3;NX2Me2-kUL zT#b|?Mf3mY^P$Wt3&yHLtU@GZ_RyV`4QF%9Ex;=CevzM82W$6(T878~L!=h_K&96|gR70a1l0@!v!h6cA-W zY8Rpy5kwdN3@Xy|lFCtx=S58XoTfsrTRSaal6nmFqQPf_Z%xShvszew;Vd(s^1g7c z4i0fmZ7z$fH9~s0(t{X1-HXdJEbc~pa!{z$i08k%FZ!71*W?fHx41uI2;A+~lwt$NAhlnpCSkeH^!2dSl3*-#}i`c;G?71~6KMN^JAmXb60V2K* zfrzhTE0w)R9uxJpEy*{2q9!~e{>+hf^)i{k0$&HiEZ&K;2>u70+^T9ME#-pvDIKn* zMs$spCuXL(u7n6Er(eiCm6B3)Mp&rqq0q)`-FvKuUFxjTIOUCUor`Xmp>@^!>^)eW z&uwbzTIV3`)?b_v|Gp8auUx+Goq%4-=-N2TlszY0o>NKpPiTYHDQgQRrD`b2DI`0P z?MP8h`Ch?-vYdikq?|%J4fH`j%PFL47(dA=Kh?*8Sp{Ylm{nj_fmsD+6_{0ER)JXs zW|e=)D*tJ93Xwu-vfm@VK$g>m2{EmrQkUC&r!+8;>A|Y0R-YML5c5@gS};eChM~9cm0ty$cwJxpzV$Ncsv^Fl zMWsQJ4h&cEbTHqp$(LSOV-M7= zFSy*oU|)7910}shF0NvuUdA50alKkqXHQWaCp*R8Zs; z_iGZawP{oZOGvMlX^`)0+bLU` zH#?+csYQ9&fSgS%h4Fy{HO;Mo6_{0ER)JXsW)+xKU{--y1!fhPRsJEX{5NFRg`QbMN}{!D}BrWQi(<$h}8Jsk*9} zeRvcelVcyK{d8Z`s7SJui&QQ0U@SdrPPMg@W}Y2!yRSiRe@_QTKIf;g!|qy!G-^b| z*4X7t)g9c&8^3Cnt#4ghdtQ=KB^x5i5M(r<3@d*YRxpcPu!5#oN`;92O;{ndkb4Bf z3JfbStiZ4W!wL*5Fs#6^0>cUnEB_8wNON8C)O7K}3g&lVMbp~d+{)bD{D;-@hMF3H zS18q-pDS<rX^WJ_r(sW<>0+Wov%$-`Eb3R9QEGIow0oIbKz?0fN+g= zOk&oN>HQU>bhv5pjrTc)68##ZM8%Dk@r%{B1Y}|~X$rqqOR2g9H}MqOpOmMMGssI` z`Od@Ay#MxB>ef)pCUKgZp+}!h(%mknYj-bq+@tft^P{@z>5!r}jOkHlf^WmCp`w!Qu6u)GW)gb zLaP<@@oc+x36zMa>p!qR!RGXN%P=)vdzV60{-+HEn;snhyaZ1z)kyEACc85yWLSxh z&3lN0$a;4L*N1CEM&p|cQ*Wx*3ooY=-51xy#L>@l;l84oy0G{~>63*KBRvY`A;(0- zs1tTK)6QIzvAJqPyqQ+Z+|wr|;N?18z!?%~AgAo{t%1JHW{XEZ^Ow%N3(tHnuj?vK ztIKEb-&yAT++|H)(WLoN7L|b}{INK$TcwWR3~7wRpG@S19U67&j8fDlG|dm&uB?lA zv;ytDVZU(ojsokXwqn88j(gR46V2sWrLH0{!;f7LD=D9Rtear8LpiW5SYTzE#f66B zEL)vUI-I=3P+jSIJe#eCu8cc<)8|}XL|`deNykBm@PMCbW3`EWTk%JH&$Qx<&aO;9 ziA$oQBL^qHzI+n(S<%e$-M+S-;r{1n>YgrU=TblU;nsddNl}w#?_sjTb8?idZ z))SuW4rZ(=v^L?KT-njqs*^jK6YjrYzbc#2dV*8venT4}>+;|isyxfqqdM#pj}VV~Mdb1;E*lmZfgB(|iF~A;$q%QU zh)sItjtD)=ea`Og!U%CWZ3GkxxdS@syt=4sZRw8KgTUbNVgwA1h(M#Uq_u5W2?;SY zj)0{{W3Xaa93DiFifbY^DQ*RM1tpLu2_gz5fk7j8OGpTT|G?=Lz*#^V4}t`m2>LHZ z`U$;3V^Ku#^aF=0%F%BU7vFB};A!n{XK9WA3H^53fFam|qm>aDa@|}xCnsljP*T^~ z)ymoxIw|QNI9|uY+)CTo&dJ>kv4?)X!*l&3cNjtL@cbUX4C(tA!8!FjEZjj6UV8EE zcDDN*!2j;x`3hYW$cl4DUxY!i^BxegK?xXOHgK&_cqFg^8i64a#3TqvB0Y)#8bG2I zN(RM9{5ykw@9qh~bQ>-a=X1@5bTr5Fzcf(xqV^CCVMtyJUDO9Bvv9qNm+d`#hHJy@f z5KRVWf~1qT<=u~g&8v@zA=9%a+Evbm_D4SEs@|_vac;B5(`!f9K3wPi1}({48g$b` znNQWj{>*)Cj}Aoe-VbK33AJ~*MT3TMxe}f_?>^Tx9m=AMJ;CKHhJM3*No+=R9gkrt zN6OX)iqD20ot_kZb(q=5!$JxBF|*D#X!9SF%aBep`w;q}>@g9Pj{fzTLw4#x4;R>1 z2m9(^UmfhLgMD?duMYOr!M-}!R|os*{-Lk#$Mt!O_tlYL?mP4WIz)*7mRtr4aCM<2 zn^?%#_xB0=K|ldW*N>viC_m(uIjV^mCFhm_+4{$$C!fTgq}uk?f5ua6g_ys~eOB#y{ewR_;Z~{1-01hXB!wIb1++D5B9p^P{QkVew5%Y(j z01#S4#%{8PO$rJCk0>Hei~y?Q%}VTe1QO)G#p7}G6clVM@-IUI5DSC^08RHVLjvYv z7(jRD`bX|BJ^A<9h=AY6GdH|>^%}82H~=a1ViBgq&aapF$&{dC2U3D4h69&m)|O}t zJrW5TK!py9#{7rj0HkXVb$G6SeKmkPG4$UmK}~d_`ej8|-U? zeQmI>4feIczBbs`2K(AzUmNUe`**%J(p;B3HC?=~jl{*|!~R3aGHzDR{{NOyNaH8l zk20goFGrxrDDx4`e`XZ2Q}h=``E8j5?#Cc%m{DLxff)s66qr$9Mu8axW)zrFU`F|e zi~`Md$&=;3V3Z#h;mtA%91j4;1HkbBa6G_o@c>|v|9pA@{H#2PBjRV3Jn&{#5&R)_ zIB6g9GwBZj1o&CdhQj*iRBv!DGzuw(lpr9mXcSoW4vOZYF$6Ir5k)b00E_>-x{AZ@epa^0p?0o+a*trhV&vh6v zzXzTuhKDY|_aV(S04t-wTX16`P#BaLly+hEH)zAG9q8va%vog-#)rNMi!nZ>`yPcR zh@nZh3Q`REPR;d)(ru5E_;qeyXrNM&S7I*@5hk<_M!1ovn@^*kRQM_>IfB2<=Vz7u9a`(RXmwv9l2n=}# z0?6O;(}3n0fRVA_tpxaq0bdp@9@M=fH$dBF4FM9ZkhjfQW)WW;$m6}33qa|MgT-LP zkWhb760?C);A2q>*&qGS9$Ir20zLb!r%)3X4^rX$Fo?O|=Qd%$Pb5gNBY^}L5Nv{e zhc?X({rjfb-=SM?E>F#Ze<#SUZzu`Jf`6jHcZ||4k0F2}kx*yRpwpyV9)lLcQ8qbV z0`t#Ijt2Q>a2P0dZnl3Qr4CLEg(G0-$qn;+puuAe42ir47~5UYLp`M>uq5k}uMS1Y3qKzrN=fn}%t!70QSu_42Ku0%B`^GJSmcj$c=Dtl&eHSX zW0Wu~dBKtwEP26_7c6z_^^I#{Kj66b6pm9xY-*W*pSgX+b*?)>FQOfduI4fnpB<~!P#!C zjno`GAFQ}0KO9YaZr}5*=Uz5fpNkP_AK1TaW)EI!Sb^nQ_X>`vJp9@Z(mMm~#cxL5 z=nlLor_0M^A{6xKx|)po?ntZTyNt{dt{VP`^tN=9a0}UVL=@QNWTJQK7JR0 zB9KlM5{yb-aYu#BwyQ?ozoXEnA$_FLQ)tqIEeF z`AWOk#`R70E{K^kYOI)ODPKQ@U}jfcgf8fJv8uc_ZH$~5(7MTxjbMG455pl>EQdp0q%2>@ohN8}G-MoZqj!9bK)>wd%Y^$;tKczS|}cN}RicTK8Lyx7_os z+Q}NIt^aCp6;Eo91A#B}h2lL{c?@474XRajr}ot_m(V+5wHN%PZtr-J>U*-wVRJgO zkOuK&D<8MWQS2p|tOL^K>>hFVLSxz5Bl80eM{POu!csY`VUl|JwQ-w|?Gc>n&Y~O& z7*APSJJsw1dl?OFLpG)Lg-1xMN8IJd^Vk?$G7_8*v-O-Vm+0hK)*NT?YX1rD3ugTV z`YF4LW|sN~Iv=D2K_ml{FAzltBK}!YA}&%=BAo{Mpr6C)K)CfUk`k$f+#^_0f+Zyw zf?x=OAqa*b7=mC3f*}ZopnnKK|4mXN{%=VMh5m!2MEsAE5?B=urA4R6K$<#|H-V(o z>PH_ho8L3j*7Yc^gDUK^sL%43Z5yud-D7u_mv7_QDMXu(l_Y&BL zy<44PMf6NKxoUSQ+Sr?}UYVx%#F8xl$)$+3e^Aen+C#J$5XJbpAM$6MWX8N)m+u&T zYme=>%2?Z(q}UghwT5A<2Rl~Yp!OR0Q56nC;^T5mlGY`x>|B89$=DK8e{9=WlxvUuE!zc?s zXfQoqK==X2|3~2m%BVA&Zv*6>`Zbw?{yC&;C4y1OcSj=2rtP$h9wARtU6*L#9tonk zIu8qOIQHIVFUR!Rl8;$mFMA!-uCx?z+hQQh6>a}(N=~QV*;aE^`|> z6WJPNX@A2{&C9slp-s~!q^#6tWm9=1Ug;XX%$#-#8=^jr&Dg@kk-TNiH#Uon;B}y+$qmF=w_@ z>WheGp29wXF#kB$8}?^T-3}mXW~rkjR5qMmdyOH~mHx7O?sgUjZFUiN)1K|8J_YLp zwz6D3;k$iL@7|;{>MyQjnA4pry9n9t~I{BudAVz^b{v<|$&5IJF=1%h~n1SYB#HhIza*tp! z3KpYaF$xAV7|dWWgTV|2GZ@TZF#CsK_Fu#(Fr)oljQUS$%|YPUk9q2z?P_)E#;x*e z*tP1dr9$Y_xTB7;yAYf9QnxrX?ozvAj4jl^^89nBxNz02B=78%Irnb)N7Tl++0=&} zfBK=H=V7wdrK6TcJL7!!3S-h)-h|lRxv}{&zDs;dZ^NUFv~SN-?GIqzZq!M&FW>@MP^ zGPfXH>~!CKQPbgX?8R5cTw5D&)5$Kaem?DnnLxUC%IoC@&R>EZ#KZM(_q!P_Ep5CtV!>LS-8dtduQp(0_8^$8< z*gg-xn7F-P`2OYk8KZ#K7Pa+-ejo7awx34yJ`Fgf)#Wqz?}QSYSB@q6b97PrfBa~i z<5uB$TlB=U)Xjdr#ZlVy7jK1qD2!8^Fg8D&xrO6IhvY`@hxx3QHSJH0N~D8cJMLBI z7p}dZ?f|XkX{cBIQHJsnC}i5;m0QTfZ!{`@(}^6g_g>#^}ro7uxI~ zhjvo_TBf&76C-Hvxo1Bu3-Ce`+OnJn%44q9WGdA7v?=&r54UPM}iM6?6Czx$+A&J8{ z7$2);A2{>2h22^7qET{zXvt`CNmph8vwn?TR1Vt7La;8oa=^ki`JTstrR%u{SJ|}~ zr0lS`yi>9}{E$k)>)5y7s&||yd{nr>*PbMx zD$*vHc6SD|HgxVBEXuTdQKdx@)_+t{|CAqfUQ7KUg}DUCKnrC82028DSdi%(B$x)N zKq+MeCP-laS$b5kAakx~Ade|hjDQ1DKDn#VHjrg|HnA~z+g!ukHc}>A@(7`f+@KxW zgalbqNx4l)gQq9|KDP;^bw{9~`soBHdpg(`YJj%Q*=&B>T*G{7Q_3~L!9$@S&3!J<}>*%UbAx>&r+aAB!>4#oOR z5)YDN6kpa&U%Nn6VINXv`lgk63WOlY&?vU>mWi>Fff>z>LUS4HF(HJ6F>l#e_rIN+Tt#!+>^EibF0>DB%BD}<2M z_#F=nI|$NwG;VVC;!;TmF65c>-csR=K14f0>^8X>^HKQP%G(UCguqCo$r+QXAi9C_ zKzH7wMa1VvL=2M}a(4Iaj}&f6zM*rlU>OT9vf#jldlz!m4g{-eJFb)9wr$&w4Ly7B zmdj_ukyqyi1j-H5mOqbn$o}*qx!IA=J3vV48x@ad)Ck3|;g6vM6n$pM`DlgTa{}Qd zK)PNi0vpP6|A(AFU_a@$OXX8+D-Mw;uAr>2V!W1-_=f@iO?bp!cM9BycFeuVdq|1OIjS)i{BL+=s$3T6?V4yx@NTb7$Mh6NMK`mG;=oN-^ zRWPJ6VsOx>U`hL9N!JLA$3a~IKfqcZ1daeI;ULj?;7t=(RYdHO!pIT8r(zW32}+7+ zMP(vVSy7HiB+5&m(eikVlAMebmLNgI$q^M%N)mW95{Z=n$+ng8ib_g&1qGA@8YKgr zOV`=iefBeeH;7(*7wKk%J{N4$uy(R_--p11TM+n&tUbZKh(e=5wlZ;LI|p}bSMbxp z+}&Ey+S1v|8YFA5J7|pneju=r5yG6BdOhcN@@eAJ1*0A&>04n=G#>U{+)0Am-sQ?ArUcugV4CDs>4h)NtR|CZnmBrWH?YE-o_eqalcEtkdu1Z zWhch?aLF7AE5wLYKvBo*5so(Wk_rptUAB$vmR5p1@xe7V=3#G6#i_}h4Re|1D5YWf z@ctu0DtCE7$zd=JFWa1vSQx%H{q|d?2-DPtPj0mut0sbLZtdirSKsjwGzwC5pVDEwZg zR#M^QqhnwF67GgcCybsrXmLt#PwV>>>2I}Xw~Al1f9Xz-+wtf{W`vLn?RXhMyOZ$P z5gl?4bv5Pkm{`lE!&iONl6-BxZt_v=kYye@K1w(eFVK(Gxmo$ewDF=z%yQlwlh0kQ zBNvS7?beyoaY#)wpcH(XZ0cd`zwlpDV3_v&>pv(SMh&NsQ02r}$D% zOZ1VcJHCQ1m3X3kIC3@YSJvc58x9K?_!3i!`R&DPw{XNngs+{b)_iFd!yk&2l#Q?2 z|JJ15!IjDM+MV{(U)q%Q3RL4Oran&~m^O%3UO|a8-(Tb9I-n=g6lT5uzJ6!+L8<1Q zX2Y0N?A`2$i(j^C4AS~+ceT~1;o}T4uK#eoPHAvW>S!@jkI6{Vz$3+rh4u_H3C5y3 z-SW9Mx1^>kEZfRdZJzEjVanZdbcYOzwSA)0)nn||*JVo+SDXLlmPOFJxtqJXd%IfO U(1ZG97^DP}UO+%eOPT)v0AAdWcmMzZ literal 0 HcmV?d00001 diff --git a/tests/linked/test_client.py b/tests/linked/test_client.py new file mode 100644 index 000000000..cf954ad6a --- /dev/null +++ b/tests/linked/test_client.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- + +import os + +import pytest + +from .conftest import resources + + +if not os.environ.get("DROPBOX_TOKEN"): + pytest.skip("Requires auth token", allow_module_level=True) + + +# Client API unit tests + + +def test_upload_large_file(m): + large_file = resources + "/large-file.pdf" + md = m.client.upload( + large_file, "/sync_tests/large-file.pdf", chunk_size=5 * 10 ** 5 + ) + + assert md.content_hash == m.sync.get_local_hash(large_file) diff --git a/tests/offline/test_client.py b/tests/offline/test_client.py new file mode 100644 index 000000000..3b6811033 --- /dev/null +++ b/tests/offline/test_client.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- + +import pytest + +from maestral.config import remove_configuration +from maestral.client import DropboxClient +from maestral.errors import NotLinkedError + + +def test_client_not_linked(): + try: + client = DropboxClient("test-config") + + assert not client.linked + + with pytest.raises(NotLinkedError): + client.get_account_info() + finally: + remove_configuration("test-config") + + +def test_auth_url(): + try: + client = DropboxClient("test-config") + url = client.get_auth_url() + assert url.startswith("https://www.dropbox.com/oauth2/authorize?") + finally: + remove_configuration("test-config") + + +def test_auth_error(): + try: + client = DropboxClient("test-config") + assert client.link("invalid-token") == 1 + + finally: + remove_configuration("test-config") From 1b7ef3178104d720c9dfd0f143928f41d3466052 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 12 Dec 2020 00:17:37 +0000 Subject: [PATCH 042/374] [tests] cleaned up offline client tests --- tests/offline/test_client.py | 34 +++++++++++++--------------------- 1 file changed, 13 insertions(+), 21 deletions(-) diff --git a/tests/offline/test_client.py b/tests/offline/test_client.py index 3b6811033..c0d9db006 100644 --- a/tests/offline/test_client.py +++ b/tests/offline/test_client.py @@ -7,31 +7,23 @@ from maestral.errors import NotLinkedError -def test_client_not_linked(): - try: - client = DropboxClient("test-config") +@pytest.fixture +def client(): + yield DropboxClient("test-config") + remove_configuration("test-config") - assert not client.linked - with pytest.raises(NotLinkedError): - client.get_account_info() - finally: - remove_configuration("test-config") +def test_client_not_linked(client): + assert not client.linked + with pytest.raises(NotLinkedError): + client.get_account_info() -def test_auth_url(): - try: - client = DropboxClient("test-config") - url = client.get_auth_url() - assert url.startswith("https://www.dropbox.com/oauth2/authorize?") - finally: - remove_configuration("test-config") +def test_auth_url(client): + url = client.get_auth_url() + assert url.startswith("https://www.dropbox.com/oauth2/authorize?") -def test_auth_error(): - try: - client = DropboxClient("test-config") - assert client.link("invalid-token") == 1 - finally: - remove_configuration("test-config") +def test_auth_error(client): + assert client.link("invalid-token") == 1 From 0f591de62d74794c2c0fb47ecc515bac67f11cb6 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 12 Dec 2020 00:17:51 +0000 Subject: [PATCH 043/374] [tests] added batch method tests --- tests/linked/test_client.py | 38 ++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/tests/linked/test_client.py b/tests/linked/test_client.py index cf954ad6a..bf656d638 100644 --- a/tests/linked/test_client.py +++ b/tests/linked/test_client.py @@ -3,6 +3,9 @@ import os import pytest +from dropbox.files import FolderMetadata + +from maestral.errors import NotFoundError, PathError from .conftest import resources @@ -11,13 +14,46 @@ pytest.skip("Requires auth token", allow_module_level=True) -# Client API unit tests +# Client API unit tests: we explicitly test those method calls which are not covered +# by current integration tests, either because they are not used by the sync module or +# because niche cases require additional testing. def test_upload_large_file(m): + # not tested during during integration tests + large_file = resources + "/large-file.pdf" md = m.client.upload( large_file, "/sync_tests/large-file.pdf", chunk_size=5 * 10 ** 5 ) assert md.content_hash == m.sync.get_local_hash(large_file) + + +@pytest.mark.parametrize("batch_size", [5, 30]) +@pytest.mark.parametrize("force_async", [True, False]) +def test_batch_methods(m, batch_size, force_async): + # batch methods are not currently used by sync module + + folders = [f"/sync_tests/folder {i}" for i in range(20)] + + # create some test directories + res = m.client.make_dir_batch(folders + ["/invalid\\"], force_async=force_async) + + for i in range(20): + assert isinstance(res[i], FolderMetadata) + assert res[i].path_lower == folders[i] + + assert isinstance(res[20], PathError) + + # remove them again + res = m.client.remove_batch( + [(folder, None) for folder in folders] + [("/not_a_folder", None)], + batch_size=batch_size, + ) + + for i in range(20): + assert isinstance(res[i], FolderMetadata) + assert res[i].path_lower == folders[i] + + assert isinstance(res[20], NotFoundError) From 1821af8dacb09a67634fb4836df9d9b673218cf7 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 12 Dec 2020 12:21:31 +0000 Subject: [PATCH 044/374] [tests] add tests for restoring files --- tests/linked/test_main.py | 42 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 6a582d636..ad1afcb99 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -205,3 +205,45 @@ def test_selective_sync_api_nested(m): # check for fatal errors assert not m.fatal_errors + + +def test_restore(m): + """Tests restoring an old revision""" + + dbx_path = "/sync_tests/file.txt" + local_path = m.to_local_path(dbx_path) + + # create a local file and sync it, remember its rev + with open(local_path, "w") as f: + f.write("old content") + + wait_for_idle(m) + + old_md = m.client.get_metadata(dbx_path) + + # modify the file and sync it + with open(local_path, "w") as f: + f.write("new content") + + wait_for_idle(m) + + new_md = m.client.get_metadata(dbx_path) + + assert new_md.content_hash == m.sync.get_local_hash(local_path) + + # restore the old rev + + m.restore(dbx_path, old_md.rev) + wait_for_idle(m) + + with open(local_path) as f: + restored_content = f.read() + + assert restored_content == "old content" + + +def test_restore_failed(m): + """Tests restoring a non-existing file""" + + with pytest.raises(NotFoundError): + m.restore("/sync_tests/restored-file", "015982ea314dac40000000154e40990") From 6b36a8a68793c0466ff9dfdb656e2b8a27082e2f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 12 Dec 2020 13:54:33 +0000 Subject: [PATCH 045/374] use regular checkout if not pull_request_target --- .github/workflows/test.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 102aca717..b12a1cead 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -19,11 +19,17 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Checkout project + + - name: Checkout merge commit uses: actions/checkout@v2 + if: github.event_name == 'pull_request_target' with: ref: 'refs/pull/${{ github.event.number }}/merge' + - name: Checkout head commit + uses: actions/checkout@v2 + if: github.event_name != 'pull_request_target' + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: @@ -71,11 +77,16 @@ jobs: runs-on: ${{ matrix.platform }} steps: - - name: Checkout project + - name: Checkout merge commit uses: actions/checkout@v2 + if: github.event_name == 'pull_request_target' with: ref: 'refs/pull/${{ github.event.number }}/merge' + - name: Checkout head commit + uses: actions/checkout@v2 + if: github.event_name != 'pull_request_target' + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: From 795240a768aa6351e0e24b98e28417fb735e766b Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 12 Dec 2020 17:37:26 +0100 Subject: [PATCH 046/374] Remove unnecessary exception statements --- src/maestral/main.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 04acf1e33..aef0f8dfd 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -950,9 +950,6 @@ def pretty_date(s) -> str: new_content = f.readlines() with open(old_location) as f: old_content = f.readlines() - # TODO: Implement redownloading ... - except FileNotFoundError: - pass except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( "File failed to decode", From e805bdb373d0bfcdd4bafbb84b8fd38fdc11439d Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 12 Dec 2020 17:54:07 +0100 Subject: [PATCH 047/374] Fix checking logic for new_rev --- src/maestral/main.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index aef0f8dfd..92127ae6e 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -910,28 +910,27 @@ def pretty_date(s) -> str: .strftime("%d %b %Y at %H:%M") ) + all_revs = self.list_revisions(dbx_path) full_path = os.path.join(self.dropbox_path, dbx_path[1:]) # Check if a diff is possible # If mime is None, procede because most files without # an extension are just text files mime, _ = mimetypes.guess_type(full_path) - if mime != None and not mime.startswith("text/"): + if mime is not None and not mime.startswith("text/"): raise UnsupportedFileTypeForDiff( - f"Bad file type: '{mime}'", - "Only files of type 'text/*' are supported." + f"Bad file type: '{mime}'", "Only files of type 'text/*' are supported." ) - + # if new_rev is None, make it to the newest one + if new_rev is None: + new_rev = cast(str, all_revs[0]["rev"]) new_location = full_path - new_date = pretty_date(self.list_revisions(dbx_path)[0]["client_modified"]) - - old_f = tempfile.NamedTemporaryFile() - old_location = old_f.name + new_date = pretty_date(all_revs[0]["client_modified"]) # Check if the revision is the newest - # If true, there is no reason to download the revision - if new_rev is not None or not os.path.exists(full_path): + # and see if it is avaible locally; download it if not + if new_rev is not all_revs[0]["rev"] or not os.path.exists(full_path): new_f = tempfile.NamedTemporaryFile() new_location = new_f.name new_date = pretty_date( @@ -940,6 +939,8 @@ def pretty_date(s) -> str: ], ) + old_f = tempfile.NamedTemporaryFile() + old_location = old_f.name old_date = pretty_date( self.download_revision(dbx_path, old_location, old_rev)["client_modified"], ) From 9edbe4c63fee71c9979a2427f261b4e960f5c286 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 12 Dec 2020 17:56:20 +0100 Subject: [PATCH 048/374] Remove unnecessary imports --- src/maestral/cli.py | 2 +- src/maestral/main.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index d2e14c144..90bbb8b15 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,7 +20,7 @@ # local imports from . import __version__, __author__, __url__ from .utils import cli -from .errors import PathError, UnsupportedFileTypeForDiff +from .errors import UnsupportedFileTypeForDiff if TYPE_CHECKING: from .main import Maestral diff --git a/src/maestral/main.py b/src/maestral/main.py index 92127ae6e..cac26d31e 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -2,7 +2,6 @@ """This module defines the main API which is exposed to the CLI or GUI.""" # system imports -import errno import sys import os import os.path as osp From c902860db63905213b3cc8bfea28134e0481727e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 12 Dec 2020 17:06:34 +0000 Subject: [PATCH 049/374] [tests] reenable daemon tests --- tests/offline/test_daemon.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index 351647ef1..f525f2757 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -9,10 +9,10 @@ import uuid import pytest +from Pyro5.api import Proxy from maestral.daemon import ( CommunicationError, - Proxy, MaestralProxy, start_maestral_daemon, start_maestral_daemon_process, @@ -20,11 +20,11 @@ Start, Stop, Lock, - IS_MACOS, ) from maestral.main import Maestral from maestral.errors import NotLinkedError from maestral.config import list_configs, remove_configuration +from maestral.constants import IS_MACOS @pytest.fixture @@ -161,7 +161,6 @@ def test_locking_multiprocess(): # daemon lifecycle tests -@pytest.mark.skipif(os.environ.get("CI") == "true", reason="Test is flaky on Github") def test_lifecycle_detached(config_name): # start daemon process @@ -185,7 +184,6 @@ def test_lifecycle_detached(config_name): assert res is Stop.NotRunning -@pytest.mark.skipif(os.environ.get("CI") == "true", reason="Test is flaky on Github") def test_lifecycle_attached(config_name): # start daemon process @@ -209,7 +207,6 @@ def test_lifecycle_attached(config_name): # proxy tests -@pytest.mark.skipif(os.environ.get("CI") == "true", reason="Test is flaky on Github") def test_connection(config_name): # start daemon process @@ -227,7 +224,6 @@ def test_connection(config_name): assert res is Stop.Ok -@pytest.mark.skipif(os.environ.get("CI") == "true", reason="Test is flaky on Github") def test_fallback(config_name): # create proxy w/o fallback @@ -241,7 +237,6 @@ def test_fallback(config_name): assert isinstance(m._m, Maestral) -@pytest.mark.skipif(os.environ.get("CI") == "true", reason="Test is flaky on Github") def test_remote_exceptions(config_name): # start daemon process From 2387ea65773510aa4b1a56d992d86e6f8de00101 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 12 Dec 2020 20:09:51 +0100 Subject: [PATCH 050/374] Add function to redownlod the new_rev if it wasn't found locally --- src/maestral/cli.py | 5 +-- src/maestral/main.py | 74 ++++++++++++++++++++++++++++---------------- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 90bbb8b15..984451353 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1500,6 +1500,7 @@ def log_level(level_name: str, config_name: str) -> None: help=""" Compare changes of two revisions of a file. If the second revision is omitted, it will compare the file to the current version. +This will download the revisions if necessary. """, ) @click.argument("dropbox_path", type=click.Path()) @@ -1511,10 +1512,10 @@ def log_level(level_name: str, config_name: str) -> None: default=[], ) @click.option( - "--nocolor", help="Don't use any colors when creating the diff", is_flag=True + "--no-color", help="Don't use any colors when creating the diff", is_flag=True ) @click.option( - "--nopager", + "--no-pager", help="Don't display pager if the number of lines is bigger than 50", is_flag=True, ) diff --git a/src/maestral/main.py b/src/maestral/main.py index cac26d31e..6f0ea6fdc 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -900,7 +900,7 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str def pretty_date(s) -> str: """ - Pretty print the 'client_modified' metadata. + Prettify the 'client_modified' metadata. """ return ( @@ -909,6 +909,22 @@ def pretty_date(s) -> str: .strftime("%d %b %Y at %H:%M") ) + def download_tmp_rev(rev: str) -> (str, str): + """ + Download a revision of the dbx_path + to a temporary file. + """ + + tmp_f = tempfile.NamedTemporaryFile() + location = tmp_f.name + date = pretty_date( + self.client.download(dbx_path, new_location, new_rev)[ + "client_modified" + ], + ) + return (location, date) + + all_revs = self.list_revisions(dbx_path) full_path = os.path.join(self.dropbox_path, dbx_path[1:]) @@ -929,33 +945,39 @@ def pretty_date(s) -> str: # Check if the revision is the newest # and see if it is avaible locally; download it if not - if new_rev is not all_revs[0]["rev"] or not os.path.exists(full_path): - new_f = tempfile.NamedTemporaryFile() - new_location = new_f.name - new_date = pretty_date( - self.download_revision(dbx_path, new_location, new_rev)[ - "client_modified" - ], - ) + if new_rev is not all_revs[0]["rev"]: + new_location, new_date = download_tmp_rev(new_rev) - old_f = tempfile.NamedTemporaryFile() - old_location = old_f.name - old_date = pretty_date( - self.download_revision(dbx_path, old_location, old_rev)["client_modified"], - ) + old_location, old_date = download_tmp_rev(old_rev) - try: - with convert_api_errors(): - with open(new_location) as f: - new_content = f.readlines() - with open(old_location) as f: - old_content = f.readlines() - except UnicodeDecodeError: - raise UnsupportedFileTypeForDiff( - "File failed to decode", - "Maestral failed to read from the file, " - "because some characters could not be decoded.", - ) + # Is there an easier way? This seems really weird. + # More important: Does it actually work? + def read_content(stop=False) -> (str, str): + """ + Extract the content of the downloaded files. + Redownloads the new_rev if necessary. + """ + + try: + with convert_api_errors(): + try: + with open(new_location) as f: + new_content = f.readlines() + except FileNotFoundError: + # Redownload the new_rev once + if stop: + raise FileNotFoundError + new_location, new_date = download_tmp_rev(new_rev) + return read_content(stop=True) + with open(old_location) as f: + old_content = f.readlines() + except UnicodeDecodeError: + raise UnsupportedFileTypeForDiff( + "File failed to decode", + "Maestral failed to read from the file, " + "because some characters could not be decoded.", + ) + return (new_content, old_content) return "".join( difflib.unified_diff( From 9ae57b45b0f53614230aabf2cedba3d83b0885fc Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 12 Dec 2020 20:10:27 +0100 Subject: [PATCH 051/374] Remove unnecessary download_revision function --- src/maestral/main.py | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 6f0ea6fdc..4464b71c1 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -866,19 +866,6 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries - def download_revision(self, dbx_path: str, local_path: str, rev: str) -> StoneType: - """ - Downloads specific revision from Dropbox into a local file. - Returns metadata about the downloaded file. - - :param dbx_path: Path to retrieve file on Dropbox. - :param local_path: Path to save file on local computer. - :param rev: Revision of file to download. - """ - - md = self.client.download(dbx_path, local_path, rev=rev) - return dropbox_stone_to_dict(md) - def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str: """ Download the two revisions if necessary and create a From 766119ae2183810fd298b2e661ef0edb9aa331a0 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 12 Dec 2020 21:28:52 +0100 Subject: [PATCH 052/374] Fix download-retry for new_rev --- src/maestral/main.py | 64 +++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 4464b71c1..5fc7393ce 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -13,7 +13,18 @@ import asyncio import random from concurrent.futures import ThreadPoolExecutor -from typing import Union, List, Iterator, Dict, Set, Awaitable, Optional, Any, cast +from typing import ( + Union, + List, + Iterator, + Dict, + Set, + Tuple, + Awaitable, + Optional, + Any, + cast, +) # external imports import requests @@ -896,7 +907,7 @@ def pretty_date(s) -> str: .strftime("%d %b %Y at %H:%M") ) - def download_tmp_rev(rev: str) -> (str, str): + def download_tmp_rev(rev: str) -> Tuple[str, str]: """ Download a revision of the dbx_path to a temporary file. @@ -911,7 +922,6 @@ def download_tmp_rev(rev: str) -> (str, str): ) return (location, date) - all_revs = self.list_revisions(dbx_path) full_path = os.path.join(self.dropbox_path, dbx_path[1:]) @@ -937,34 +947,26 @@ def download_tmp_rev(rev: str) -> (str, str): old_location, old_date = download_tmp_rev(old_rev) - # Is there an easier way? This seems really weird. - # More important: Does it actually work? - def read_content(stop=False) -> (str, str): - """ - Extract the content of the downloaded files. - Redownloads the new_rev if necessary. - """ - - try: - with convert_api_errors(): - try: - with open(new_location) as f: - new_content = f.readlines() - except FileNotFoundError: - # Redownload the new_rev once - if stop: - raise FileNotFoundError - new_location, new_date = download_tmp_rev(new_rev) - return read_content(stop=True) - with open(old_location) as f: - old_content = f.readlines() - except UnicodeDecodeError: - raise UnsupportedFileTypeForDiff( - "File failed to decode", - "Maestral failed to read from the file, " - "because some characters could not be decoded.", - ) - return (new_content, old_content) + # Is there a better way? + try: + with convert_api_errors(): + try: + with open(new_location) as f: + new_content = f.readlines() + # If the file was not found, retry download once + # Possible if the file is only stored in the cloud + except FileNotFoundError: + new_location, new_date = download_tmp_rev(new_rev) + with open(new_location) as f: + new_content = f.readlines() + with open(old_location) as f: + old_content = f.readlines() + except UnicodeDecodeError: + raise UnsupportedFileTypeForDiff( + "File failed to decode", + "Maestral failed to read from the file, " + "because some characters could not be decoded.", + ) return "".join( difflib.unified_diff( From 62fe36f1aec410f58cd3423c6864d23ebd8720eb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 01:53:49 +0000 Subject: [PATCH 053/374] [sync] ignore local FileCreated after move from temp dir --- src/maestral/sync.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index d4123d6e8..2f9d2ff1f 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3084,7 +3084,10 @@ def _on_remote_file(self, event: SyncEvent) -> Optional[SyncEvent]: else: preserve_permissions = False - ignore_events = [FileMovedEvent(tmp_fname, local_path)] + ignore_events = [ + FileMovedEvent(tmp_fname, local_path), + FileCreatedEvent(local_path), # sometimes emitted on macOS + ] if preserve_permissions: # ignore FileModifiedEvent when changing permissions From 2ec437fcbbc5e662ac831b058d31122766368735 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 13:38:11 +0000 Subject: [PATCH 054/374] [cli] remove loading indicator --- src/maestral/utils/cli.py | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/src/maestral/utils/cli.py b/src/maestral/utils/cli.py index d4d414ac6..b951a99c2 100644 --- a/src/maestral/utils/cli.py +++ b/src/maestral/utils/cli.py @@ -549,41 +549,6 @@ def _syle_hint(hint: str) -> str: return f"{hint} " if hint else "" -class loading: - - _animation = ("...", " ", ". ", ".. ") - - def __init__(self, iterable, prefix="Loading", animation=None, clear=True): - - import itertools - - self.iterable = iterable - self.prefix = prefix - self.clear = clear - self.indicator = itertools.cycle(animation or loading._animation) - - def _render(self) -> None: - click.echo(self.prefix + next(self.indicator) + "\r", nl=False) - - def __enter__(self) -> "loading": - self._render() - return self - - def __iter__(self) -> "loading": - return self - - def __next__(self) -> Any: - res = next(self.iterable) - self._render() - return res - - def __exit__(self, exc_type, exc_val, exc_tb) -> None: - if self.clear: - click.echo(" " * (len(self.prefix) + 3) + "\r", nl=False) - else: - click.echo("") - - def prompt(message: str, default: str = "", validate: Optional[Callable] = None) -> str: import survey From 9cbe0b5a411623675c113b17c839cf80e63080ba Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sun, 13 Dec 2020 16:03:41 +0100 Subject: [PATCH 055/374] Add small improvements described in SamSchott's review --- src/maestral/cli.py | 105 +++++++++++++++++++------------------------ src/maestral/main.py | 67 +++++++++++++-------------- 2 files changed, 77 insertions(+), 95 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 984451353..7e947bb97 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1499,8 +1499,9 @@ def log_level(level_name: str, config_name: str) -> None: section="Maintenance", help=""" Compare changes of two revisions of a file. -If the second revision is omitted, it will compare the file to the current version. -This will download the revisions if necessary. + +If the second revision is omitted, it will compare the file to the currently downloaded version. +The specified revisions will be downloaded if necessary. A pager will be used, if there are more than 50 lines. """, ) @click.argument("dropbox_path", type=click.Path()) @@ -1511,19 +1512,13 @@ def log_level(level_name: str, config_name: str) -> None: multiple=True, default=[], ) -@click.option( - "--no-color", help="Don't use any colors when creating the diff", is_flag=True -) -@click.option( - "--no-pager", - help="Don't display pager if the number of lines is bigger than 50", - is_flag=True, -) +@click.option("--no-color", help="Don't use any colors for the diff", is_flag=True) +@click.option("--no-pager", help="Don't use a pager for output", is_flag=True) @catch_maestral_errors @existing_config_option # If new_version_hash is omitted, use the current version of the file def diff( - dropbox_path: str, rev: List[str], nocolor: bool, nopager: bool, config_name: str + dropbox_path: str, rev: List[str], no_color: bool, no_pager: bool, config_name: str ) -> None: from datetime import datetime @@ -1542,12 +1537,7 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): 'text/*', an error message gets printed. """ - try: - diff = m.get_file_diff(dropbox_path, old_rev, new_rev) - except (MaestralApiError, UnsupportedFileTypeForDiff) as e: - cli.warn(e.title) - cli.warn(e.message) - return + diff = m.get_file_diff(dropbox_path, old_rev, new_rev) def color(ind: int, line: str) -> str: """ @@ -1568,58 +1558,53 @@ def color(ind: int, line: str) -> str: return line # Color the lines - diff = diff.split("\n") - if not nocolor: + if not no_color: diff = [color(i, l) for i, l in enumerate(diff)] # Enter pager if diff is too long - if not nopager: + if not no_pager: if len(diff) > 30: - click.echo_via_pager("\n".join(diff)) + click.echo_via_pager("".join(diff)) return - click.echo("\n".join(diff)) + click.echo("".join(diff)) - try: - with MaestralProxy(config_name) as m: - if len(rev) == 0: - entries = m.list_revisions(dropbox_path) - dates = [] - for entry in entries: - cm = cast(str, entry["client_modified"]) - dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() - field = cli.DateField(dt) - dates.append(field.format(40)[0]) + with MaestralProxy(config_name, fallback=True) as m: + if len(rev) == 0: + entries = m.list_revisions(dropbox_path) + dates = [] + for entry in entries: + cm = cast(str, entry["client_modified"]) + dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() + field = cli.DateField(dt) + dates.append(field.format(40)[0]) - base = cli.select( - message="New revision:", - options=dates, - hint="(↓ to see more)" if len(dates) > 6 else "", - ) + base = cli.select( + message="New revision:", + options=dates, + hint="(↓ to see more)" if len(dates) > 6 else "", + ) - to_compare = ( - cli.select( - message="Old revision:", - options=dates[base + 1 :], - hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", - ) - + base - + 1 + to_compare = ( + cli.select( + message="Old revision:", + options=dates[base + 1 :], + hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", ) + + base + + 1 + ) - # First index = current version - if base == 0: - download_and_compare(m, entries[to_compare]["rev"]) - else: - download_and_compare( - m, entries[to_compare]["rev"], entries[base]["rev"] - ) - elif len(rev) == 1: - download_and_compare(m, rev[0]) - elif len(rev) == 2: - download_and_compare(m, rev[0], rev[1]) + # First index = current version + if base == 0: + download_and_compare(m, entries[to_compare]["rev"]) else: - cli.warn("You can only compare two revisions at a time") - - except Pyro5.errors.CommunicationError: - click.echo("unwatched") + download_and_compare( + m, entries[to_compare]["rev"], entries[base]["rev"] + ) + elif len(rev) == 1: + download_and_compare(m, rev[0]) + elif len(rev) == 2: + download_and_compare(m, rev[0], rev[1]) + else: + cli.warn("You can only compare two revisions at a time") diff --git a/src/maestral/main.py b/src/maestral/main.py index 5fc7393ce..2a067f39b 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -24,7 +24,12 @@ Optional, Any, cast, + IO, ) +import tempfile +import mimetypes +import difflib + # external imports import requests @@ -32,6 +37,7 @@ import bugsnag # type: ignore from bugsnag.handlers import BugsnagHandler # type: ignore from packaging.version import Version +from datetime import datetime try: from systemd import journal # type: ignore @@ -877,7 +883,9 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries - def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str: + def get_file_diff( + self, dbx_path: str, old_rev: str, new_rev: Optional[str] = None + ) -> List[str]: """ Download the two revisions if necessary and create a diff with the python difflib library. If new_rev is None, @@ -885,45 +893,32 @@ def get_file_diff(self, dbx_path: str, old_rev: str, new_rev: str = None) -> str :param old_rev: Hash of old revision. :param new_rev: Hash of new revision. - :returns: Diff as a string. + :returns: Diff as a list of lines. :raises UnsupportedFileTypeForDiff: if file type is not supported. :raises UnsupportedFileTypeForDiff: if file content could not be decoded. :raises MaestralApiError: if file could not be read for any other reason. """ - import mimetypes - import difflib - import tempfile - from datetime import datetime - - def pretty_date(s) -> str: + def pretty_date(s: datetime) -> str: """ Prettify the 'client_modified' metadata. """ - return ( - datetime.strptime(cast(str, s), "%Y-%m-%dT%H:%M:%S%z") - .astimezone() - .strftime("%d %b %Y at %H:%M") - ) + return s.astimezone().strftime("%d %b %Y at %H:%M") - def download_tmp_rev(rev: str) -> Tuple[str, str]: + def download_rev(f: IO[bytes], rev: str) -> Tuple[str, str]: """ - Download a revision of the dbx_path - to a temporary file. + Download a rev to 'f' and return the location and the date. """ - tmp_f = tempfile.NamedTemporaryFile() - location = tmp_f.name + location = f.name date = pretty_date( - self.client.download(dbx_path, new_location, new_rev)[ - "client_modified" - ], + self.client.download(dbx_path, location, rev=rev).client_modified ) return (location, date) - all_revs = self.list_revisions(dbx_path) - full_path = os.path.join(self.dropbox_path, dbx_path[1:]) + all_revs = self.client.list_revisions(dbx_path).entries + full_path = self.sync.to_local_path(dbx_path) # Check if a diff is possible # If mime is None, procede because most files without @@ -936,39 +931,41 @@ def download_tmp_rev(rev: str) -> Tuple[str, str]: # if new_rev is None, make it to the newest one if new_rev is None: - new_rev = cast(str, all_revs[0]["rev"]) + new_rev = all_revs[0].rev new_location = full_path - new_date = pretty_date(all_revs[0]["client_modified"]) + new_date = pretty_date(all_revs[0].client_modified) # Check if the revision is the newest # and see if it is avaible locally; download it if not - if new_rev is not all_revs[0]["rev"]: - new_location, new_date = download_tmp_rev(new_rev) + if new_rev is not all_revs[0].rev: + tmp_n = tempfile.NamedTemporaryFile() + new_location, new_date = download_rev(tmp_n, new_rev) - old_location, old_date = download_tmp_rev(old_rev) + tmp_o = tempfile.NamedTemporaryFile() + old_location, old_date = download_rev(tmp_o, old_rev) - # Is there a better way? try: - with convert_api_errors(): + with convert_api_errors(dbx_path=dbx_path, local_path=new_location): try: with open(new_location) as f: new_content = f.readlines() # If the file was not found, retry download once # Possible if the file is only stored in the cloud except FileNotFoundError: - new_location, new_date = download_tmp_rev(new_rev) + tmp_n = tempfile.NamedTemporaryFile() + new_location, new_date = self.client.download(tmp_n, new_rev) with open(new_location) as f: new_content = f.readlines() + with convert_api_errors(dbx_path=dbx_path, local_path=old_location): with open(old_location) as f: old_content = f.readlines() except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( - "File failed to decode", - "Maestral failed to read from the file, " - "because some characters could not be decoded.", + "Failed to decode the file.", + "Only UTF-8 plain text files are currently supported.", ) - return "".join( + return list( difflib.unified_diff( old_content, new_content, From e465188e80b69f550081ca6cbb4983e35d0654b3 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sun, 13 Dec 2020 16:16:40 +0100 Subject: [PATCH 056/374] Simplify argument parsing in cli diff function --- src/maestral/cli.py | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 7e947bb97..c3404d43e 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1585,6 +1585,10 @@ def color(ind: int, line: str) -> str: hint="(↓ to see more)" if len(dates) > 6 else "", ) + if base == len(dates) - 1: + cli.warn("Oldest version selected as base") + return + to_compare = ( cli.select( message="Old revision:", @@ -1595,16 +1599,8 @@ def color(ind: int, line: str) -> str: + 1 ) - # First index = current version - if base == 0: - download_and_compare(m, entries[to_compare]["rev"]) - else: - download_and_compare( - m, entries[to_compare]["rev"], entries[base]["rev"] - ) - elif len(rev) == 1: - download_and_compare(m, rev[0]) - elif len(rev) == 2: - download_and_compare(m, rev[0], rev[1]) - else: + rev = [entries[to_compare]["rev"], entries[base]["rev"]] + elif len(rev) > 2: cli.warn("You can only compare two revisions at a time") + return + download_and_compare(m, *rev) From 909185d0eb0ae81609dfe582b09aa250371c3419 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sun, 13 Dec 2020 16:32:44 +0100 Subject: [PATCH 057/374] Fix flake8 errors --- src/maestral/cli.py | 2 -- src/maestral/main.py | 1 - 2 files changed, 3 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c3404d43e..c4f89e361 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -20,7 +20,6 @@ # local imports from . import __version__, __author__, __url__ from .utils import cli -from .errors import UnsupportedFileTypeForDiff if TYPE_CHECKING: from .main import Maestral @@ -1522,7 +1521,6 @@ def diff( ) -> None: from datetime import datetime - from .errors import MaestralApiError from .daemon import MaestralProxy # Reason for rel_dbx_path: os.path.join does not like leading / diff --git a/src/maestral/main.py b/src/maestral/main.py index 2a067f39b..d9b293242 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -23,7 +23,6 @@ Awaitable, Optional, Any, - cast, IO, ) import tempfile From b59af90fd4350e594c0ba60e8f24161efa0153f7 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 15:48:40 +0000 Subject: [PATCH 058/374] [cli] handle maestral errors in history command --- src/maestral/cli.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index a41d72f68..762c63dcc 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -909,6 +909,7 @@ def curses_loop(screen) -> None: # no type hints for screen provided yet @main.command(section="Information", help="Show recently changed or added files.") @existing_config_option +@catch_maestral_errors def history(config_name: str) -> None: from datetime import datetime From 1f209848c9a7a9f77d3a192e80d83356c07b8101 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 15:48:59 +0000 Subject: [PATCH 059/374] [tests] add offline CLI tests --- tests/offline/test_cli.py | 147 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 tests/offline/test_cli.py diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py new file mode 100644 index 000000000..bdff3e213 --- /dev/null +++ b/tests/offline/test_cli.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- + +import logging + +import pytest +from click.testing import CliRunner + +from maestral.cli import main +from maestral.main import Maestral +from maestral.config import remove_configuration +from maestral.autostart import AutoStart +from maestral.notify import MaestralDesktopNotifier + + +@pytest.fixture +def m(): + yield Maestral("test-config") + remove_configuration("test-config") + + +def test_invalid_config(m): + runner = CliRunner() + result = runner.invoke(main, ["resume", "-c", "non-existent-config"]) + + assert result.exit_code == 1 + assert ( + result.output == "! Configuration 'non-existent-config' does not exist. " + "Use 'maestral configs' to list all configurations.\n" + ) + + +def test_file_status(m): + runner = CliRunner() + result = runner.invoke(main, ["file-status", "/usr", "-c", "test-config"]) + + assert result.exit_code == 0 + assert result.output == "unwatched\n" + + result = runner.invoke(main, ["file-status", "/invalid-dir", "-c", "test-config"]) + + # the exception will be already raised by click's argument check + assert result.exit_code == 2 + assert isinstance(result.exception, SystemExit) + assert "'/invalid-dir' does not exist" in result.output + + +def test_history(m): + runner = CliRunner() + result = runner.invoke(main, ["history", "-c", "test-config"]) + + assert result.exit_code == 1 + assert isinstance(result.exception, SystemExit) + assert "No Dropbox account linked." in result.output + + +def test_ls(m): + runner = CliRunner() + result = runner.invoke(main, ["ls", "/", "-c", "test-config"]) + + assert result.exit_code == 1 + assert isinstance(result.exception, SystemExit) + assert "No Dropbox account linked." in result.output + + +def test_autostart(m): + autostart = AutoStart(m.config_name) + autostart.disable() + + runner = CliRunner() + result = runner.invoke(main, ["autostart", "-c", "test-config"]) + + assert result.exit_code == 0 + assert "disabled" in result.output + + result = runner.invoke(main, ["autostart", "-Y", "-c", "test-config"]) + + assert result.exit_code == 0 + assert "Enabled" in result.output + assert autostart.enabled + + result = runner.invoke(main, ["autostart", "-N", "-c", "test-config"]) + + assert result.exit_code == 0 + assert "Disabled" in result.output + assert not autostart.enabled + + +def test_excluded_list(m): + runner = CliRunner() + result = runner.invoke(main, ["excluded", "list", "-c", "test-config"]) + + assert result.exit_code == 0 + assert result.output == "No excluded files or folders.\n" + + +def test_excluded_add(m): + runner = CliRunner() + result = runner.invoke(main, ["excluded", "add", "/test", "-c", "test-config"]) + + assert result.exit_code == 1 + assert isinstance(result.exception, SystemExit) + assert "No Dropbox account linked." in result.output + + +def test_excluded_remove(m): + runner = CliRunner() + result = runner.invoke(main, ["excluded", "remove", "/test", "-c", "test-config"]) + + assert result.exit_code == 1 + assert isinstance(result.exception, SystemExit) + assert "Daemon must be running to download folders." in result.output + + +def test_notify_level(m): + runner = CliRunner() + result = runner.invoke(main, ["notify", "level", "-c", "test-config"]) + + level_name = MaestralDesktopNotifier.level_number_to_name(m.notification_level) + + assert result.exit_code == 0 + assert level_name in result.output + + result = runner.invoke(main, ["notify", "level", "SYNCISSUE", "-c", "test-config"]) + assert result.exit_code == 0 + assert "SYNCISSUE" in result.output + + result = runner.invoke(main, ["notify", "level", "INVALID", "-c", "test-config"]) + assert result.exit_code == 2 + assert isinstance(result.exception, SystemExit) + + +def test_log_level(m): + runner = CliRunner() + result = runner.invoke(main, ["log", "level", "-c", "test-config"]) + + level_name = logging.getLevelName(m.log_level) + + assert result.exit_code == 0 + assert level_name in result.output + + result = runner.invoke(main, ["log", "level", "DEBUG", "-c", "test-config"]) + assert result.exit_code == 0 + assert "DEBUG" in result.output + + result = runner.invoke(main, ["notify", "level", "INVALID", "-c", "test-config"]) + assert result.exit_code == 2 + assert isinstance(result.exception, SystemExit) From b1c75cae3efe35801c785996f834cf04378d380d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 15:56:59 +0000 Subject: [PATCH 060/374] [tests] allow for CI not supporting systemd --- tests/offline/test_cli.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index bdff3e213..d33a68ee6 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -75,8 +75,13 @@ def test_autostart(m): result = runner.invoke(main, ["autostart", "-Y", "-c", "test-config"]) assert result.exit_code == 0 - assert "Enabled" in result.output - assert autostart.enabled + + if autostart.implementation: + assert "Enabled" in result.output + assert autostart.enabled + else: + assert "not supported" in result.output + assert not autostart.enabled result = runner.invoke(main, ["autostart", "-N", "-c", "test-config"]) From 1535325617cedb12f99dcda8eca171ab66a36326 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 16:17:56 +0000 Subject: [PATCH 061/374] [autostart] raise CalledProcessError when enable / disable fails in systemd impl --- src/maestral/autostart.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/autostart.py b/src/maestral/autostart.py index 001758edf..fae916dfa 100644 --- a/src/maestral/autostart.py +++ b/src/maestral/autostart.py @@ -114,10 +114,10 @@ def __init__( self.service_config.write(f) def enable(self) -> None: - subprocess.run(["systemctl", "--user", "enable", self.service_name]) + subprocess.check_output(["systemctl", "--user", "enable", self.service_name]) def disable(self) -> None: - subprocess.run(["systemctl", "--user", "disable", self.service_name]) + subprocess.check_output(["systemctl", "--user", "disable", self.service_name]) @property def enabled(self) -> bool: From 836c3f5fb4a58b9eab6c990f7b3376924423be07 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 16:20:07 +0000 Subject: [PATCH 062/374] [tests] allow for autostart to fail despite implementation --- tests/offline/test_cli.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index d33a68ee6..472214004 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -74,11 +74,13 @@ def test_autostart(m): result = runner.invoke(main, ["autostart", "-Y", "-c", "test-config"]) - assert result.exit_code == 0 - if autostart.implementation: - assert "Enabled" in result.output - assert autostart.enabled + if result.exit_code == 0: + assert "Enabled" in result.output + assert autostart.enabled + else: + # TODO: be more specific here + assert result.exception is not None else: assert "not supported" in result.output assert not autostart.enabled From 48f30c0f2385b5653c451d3eb2f0a52011dd9e4b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 17:01:57 +0000 Subject: [PATCH 063/374] [tests] added test for main CLI help --- tests/offline/test_cli.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 472214004..152119c6c 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -18,6 +18,14 @@ def m(): remove_configuration("test-config") +def test_help(): + runner = CliRunner() + result = runner.invoke(main) + + assert result.exit_code == 0 + assert result.output.startswith("Usage: main [OPTIONS] COMMAND [ARGS]") + + def test_invalid_config(m): runner = CliRunner() result = runner.invoke(main, ["resume", "-c", "non-existent-config"]) From fc4ec446b28b5286ebe731f2766e5ed179eb759e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 20:06:04 +0000 Subject: [PATCH 064/374] [tests] added tests to show and clear logs --- tests/offline/test_cli.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 152119c6c..840a5ebe2 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -6,7 +6,7 @@ from click.testing import CliRunner from maestral.cli import main -from maestral.main import Maestral +from maestral.main import Maestral, logger from maestral.config import remove_configuration from maestral.autostart import AutoStart from maestral.notify import MaestralDesktopNotifier @@ -160,3 +160,32 @@ def test_log_level(m): result = runner.invoke(main, ["notify", "level", "INVALID", "-c", "test-config"]) assert result.exit_code == 2 assert isinstance(result.exception, SystemExit) + + +def test_log_show(m): + # log a message + logger.info("Hello from pytest!") + runner = CliRunner() + result = runner.invoke(main, ["log", "show", "-c", "test-config"]) + + assert result.exit_code == 0 + assert "Hello from pytest!" in result.output + + +def test_log_clear(m): + # log a message + logger.info("Hello from pytest!") + runner = CliRunner() + result = runner.invoke(main, ["log", "show", "-c", "test-config"]) + + assert result.exit_code == 0 + assert "Hello from pytest!" in result.output + + # clear the logs + result = runner.invoke(main, ["log", "clear", "-c", "test-config"]) + assert result.exit_code == 0 + + with open(m.log_handler_file.stream.name) as f: + log_content = f.read() + + assert log_content == "" From 5d2e36f7f25b2267b7948803b86c4ddb5f5d4bc1 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 20:25:26 +0000 Subject: [PATCH 065/374] [tests] move common test fixtures to conftest.py --- tests/offline/conftest.py | 73 +++++++++++++++++++++++++++ tests/offline/test_cleaning_events.py | 17 ++++--- tests/offline/test_cli.py | 10 +--- tests/offline/test_client.py | 8 --- tests/offline/test_daemon.py | 21 -------- tests/offline/test_ignoring_events.py | 36 +------------ 6 files changed, 85 insertions(+), 80 deletions(-) create mode 100644 tests/offline/conftest.py diff --git a/tests/offline/conftest.py b/tests/offline/conftest.py new file mode 100644 index 000000000..9c32f7d89 --- /dev/null +++ b/tests/offline/conftest.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- + +import os +import os.path as osp +from threading import Event + +import pytest + +from maestral.main import Maestral +from maestral.sync import SyncEngine, Observer, FSEventHandler +from maestral.client import DropboxClient +from maestral.config import list_configs, remove_configuration +from maestral.daemon import stop_maestral_daemon_process, Stop +from maestral.utils.appdirs import get_home_dir +from maestral.utils.path import delete + + +@pytest.fixture +def m(): + yield Maestral("test-config") + remove_configuration("test-config") + + +@pytest.fixture +def sync(): + syncing = Event() + startup = Event() + syncing.set() + + local_dir = osp.join(get_home_dir(), "dummy_dir") + os.mkdir(local_dir) + + sync = SyncEngine(DropboxClient("test-config"), FSEventHandler(syncing, startup)) + + sync.dropbox_path = local_dir + + observer = Observer() + observer.schedule(sync.fs_events, sync.dropbox_path, recursive=True) + observer.start() + + yield sync + + observer.stop() + observer.join() + + remove_configuration("test-config") + delete(sync.dropbox_path) + + +@pytest.fixture +def client(): + yield DropboxClient("test-config") + remove_configuration("test-config") + + +@pytest.fixture +def config_name(prefix: str = "test-config"): + + i = 0 + config_name = f"{prefix}-{i}" + + while config_name in list_configs(): + i += 1 + config_name = f"{prefix}-{i}" + + yield config_name + + res = stop_maestral_daemon_process(config_name) + + if res is Stop.Failed: + raise RuntimeError("Could not stop test daemon") + + remove_configuration(config_name) diff --git a/tests/offline/test_cleaning_events.py b/tests/offline/test_cleaning_events.py index b19a8a72b..fe3ba97e0 100644 --- a/tests/offline/test_cleaning_events.py +++ b/tests/offline/test_cleaning_events.py @@ -3,8 +3,7 @@ import timeit import pytest - -from maestral.sync import ( +from watchdog.events import ( FileCreatedEvent, FileDeletedEvent, FileModifiedEvent, @@ -13,13 +12,10 @@ DirDeletedEvent, DirMovedEvent, ) -from maestral.sync import SyncEngine, DropboxClient -from maestral.config import remove_configuration - -def ipath(i): - """Returns path names '/test 1', '/test 2', ... """ - return f"/test {i}" +from maestral.sync import SyncEngine +from maestral.client import DropboxClient +from maestral.config import remove_configuration @pytest.fixture @@ -32,6 +28,11 @@ def sync(): remove_configuration("test-config") +def ipath(i): + """Returns path names '/test 1', '/test 2', ... """ + return f"/test {i}" + + def test_single_file_events(sync): # only a single event for every path -> no consolidation diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 840a5ebe2..9d93dda86 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -2,22 +2,14 @@ import logging -import pytest from click.testing import CliRunner from maestral.cli import main -from maestral.main import Maestral, logger -from maestral.config import remove_configuration +from maestral.main import logger from maestral.autostart import AutoStart from maestral.notify import MaestralDesktopNotifier -@pytest.fixture -def m(): - yield Maestral("test-config") - remove_configuration("test-config") - - def test_help(): runner = CliRunner() result = runner.invoke(main) diff --git a/tests/offline/test_client.py b/tests/offline/test_client.py index c0d9db006..37deca038 100644 --- a/tests/offline/test_client.py +++ b/tests/offline/test_client.py @@ -2,17 +2,9 @@ import pytest -from maestral.config import remove_configuration -from maestral.client import DropboxClient from maestral.errors import NotLinkedError -@pytest.fixture -def client(): - yield DropboxClient("test-config") - remove_configuration("test-config") - - def test_client_not_linked(client): assert not client.linked diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index f525f2757..317b8e80f 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -23,30 +23,9 @@ ) from maestral.main import Maestral from maestral.errors import NotLinkedError -from maestral.config import list_configs, remove_configuration from maestral.constants import IS_MACOS -@pytest.fixture -def config_name(prefix: str = "test-config"): - - i = 0 - config_name = f"{prefix}-{i}" - - while config_name in list_configs(): - i += 1 - config_name = f"{prefix}-{i}" - - yield config_name - - res = stop_maestral_daemon_process(config_name) - - if res is Stop.Failed: - raise RuntimeError("Could not stop test daemon") - - remove_configuration(config_name) - - # locking tests diff --git a/tests/offline/test_ignoring_events.py b/tests/offline/test_ignoring_events.py index aa94f9ee9..3a5e78985 100644 --- a/tests/offline/test_ignoring_events.py +++ b/tests/offline/test_ignoring_events.py @@ -1,18 +1,12 @@ # -*- coding: utf-8 -*- import os -import os.path as osp from pathlib import Path -from threading import Event -import pytest +from watchdog.events import DirCreatedEvent, DirMovedEvent -from maestral.sync import DirCreatedEvent, DirMovedEvent -from maestral.sync import delete, move -from maestral.sync import SyncEngine, DropboxClient, Observer, FSEventHandler from maestral.sync import SyncDirection, ItemType, ChangeType -from maestral.utils.appdirs import get_home_dir -from maestral.config import remove_configuration +from maestral.utils.path import move def ipath(i): @@ -20,32 +14,6 @@ def ipath(i): return f"/test {i}" -@pytest.fixture -def sync(): - syncing = Event() - startup = Event() - syncing.set() - - local_dir = osp.join(get_home_dir(), "dummy_dir") - os.mkdir(local_dir) - - sync = SyncEngine(DropboxClient("test-config"), FSEventHandler(syncing, startup)) - - sync.dropbox_path = local_dir - - observer = Observer() - observer.schedule(sync.fs_events, sync.dropbox_path, recursive=True) - observer.start() - - yield sync - - observer.stop() - observer.join() - - remove_configuration("test-config") - delete(sync.dropbox_path) - - def test_receiving_events(sync): new_dir = Path(sync.dropbox_path) / "parent" From 77a609f6c4b102b5699ae1b0e86bc961c383a4e5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 20:25:45 +0000 Subject: [PATCH 066/374] [tests] use dynamic config_name --- tests/offline/test_cli.py | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 9d93dda86..c87c813f1 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -31,12 +31,12 @@ def test_invalid_config(m): def test_file_status(m): runner = CliRunner() - result = runner.invoke(main, ["file-status", "/usr", "-c", "test-config"]) + result = runner.invoke(main, ["file-status", "/usr", "-c", m.config_name]) assert result.exit_code == 0 assert result.output == "unwatched\n" - result = runner.invoke(main, ["file-status", "/invalid-dir", "-c", "test-config"]) + result = runner.invoke(main, ["file-status", "/invalid-dir", "-c", m.config_name]) # the exception will be already raised by click's argument check assert result.exit_code == 2 @@ -46,7 +46,7 @@ def test_file_status(m): def test_history(m): runner = CliRunner() - result = runner.invoke(main, ["history", "-c", "test-config"]) + result = runner.invoke(main, ["history", "-c", m.config_name]) assert result.exit_code == 1 assert isinstance(result.exception, SystemExit) @@ -55,7 +55,7 @@ def test_history(m): def test_ls(m): runner = CliRunner() - result = runner.invoke(main, ["ls", "/", "-c", "test-config"]) + result = runner.invoke(main, ["ls", "/", "-c", m.config_name]) assert result.exit_code == 1 assert isinstance(result.exception, SystemExit) @@ -67,12 +67,12 @@ def test_autostart(m): autostart.disable() runner = CliRunner() - result = runner.invoke(main, ["autostart", "-c", "test-config"]) + result = runner.invoke(main, ["autostart", "-c", m.config_name]) assert result.exit_code == 0 assert "disabled" in result.output - result = runner.invoke(main, ["autostart", "-Y", "-c", "test-config"]) + result = runner.invoke(main, ["autostart", "-Y", "-c", m.config_name]) if autostart.implementation: if result.exit_code == 0: @@ -85,7 +85,7 @@ def test_autostart(m): assert "not supported" in result.output assert not autostart.enabled - result = runner.invoke(main, ["autostart", "-N", "-c", "test-config"]) + result = runner.invoke(main, ["autostart", "-N", "-c", m.config_name]) assert result.exit_code == 0 assert "Disabled" in result.output @@ -94,7 +94,7 @@ def test_autostart(m): def test_excluded_list(m): runner = CliRunner() - result = runner.invoke(main, ["excluded", "list", "-c", "test-config"]) + result = runner.invoke(main, ["excluded", "list", "-c", m.config_name]) assert result.exit_code == 0 assert result.output == "No excluded files or folders.\n" @@ -102,7 +102,7 @@ def test_excluded_list(m): def test_excluded_add(m): runner = CliRunner() - result = runner.invoke(main, ["excluded", "add", "/test", "-c", "test-config"]) + result = runner.invoke(main, ["excluded", "add", "/test", "-c", m.config_name]) assert result.exit_code == 1 assert isinstance(result.exception, SystemExit) @@ -111,7 +111,7 @@ def test_excluded_add(m): def test_excluded_remove(m): runner = CliRunner() - result = runner.invoke(main, ["excluded", "remove", "/test", "-c", "test-config"]) + result = runner.invoke(main, ["excluded", "remove", "/test", "-c", m.config_name]) assert result.exit_code == 1 assert isinstance(result.exception, SystemExit) @@ -120,36 +120,36 @@ def test_excluded_remove(m): def test_notify_level(m): runner = CliRunner() - result = runner.invoke(main, ["notify", "level", "-c", "test-config"]) + result = runner.invoke(main, ["notify", "level", "-c", m.config_name]) level_name = MaestralDesktopNotifier.level_number_to_name(m.notification_level) assert result.exit_code == 0 assert level_name in result.output - result = runner.invoke(main, ["notify", "level", "SYNCISSUE", "-c", "test-config"]) + result = runner.invoke(main, ["notify", "level", "SYNCISSUE", "-c", m.config_name]) assert result.exit_code == 0 assert "SYNCISSUE" in result.output - result = runner.invoke(main, ["notify", "level", "INVALID", "-c", "test-config"]) + result = runner.invoke(main, ["notify", "level", "INVALID", "-c", m.config_name]) assert result.exit_code == 2 assert isinstance(result.exception, SystemExit) def test_log_level(m): runner = CliRunner() - result = runner.invoke(main, ["log", "level", "-c", "test-config"]) + result = runner.invoke(main, ["log", "level", "-c", m.config_name]) level_name = logging.getLevelName(m.log_level) assert result.exit_code == 0 assert level_name in result.output - result = runner.invoke(main, ["log", "level", "DEBUG", "-c", "test-config"]) + result = runner.invoke(main, ["log", "level", "DEBUG", "-c", m.config_name]) assert result.exit_code == 0 assert "DEBUG" in result.output - result = runner.invoke(main, ["notify", "level", "INVALID", "-c", "test-config"]) + result = runner.invoke(main, ["notify", "level", "INVALID", "-c", m.config_name]) assert result.exit_code == 2 assert isinstance(result.exception, SystemExit) @@ -158,7 +158,7 @@ def test_log_show(m): # log a message logger.info("Hello from pytest!") runner = CliRunner() - result = runner.invoke(main, ["log", "show", "-c", "test-config"]) + result = runner.invoke(main, ["log", "show", "-c", m.config_name]) assert result.exit_code == 0 assert "Hello from pytest!" in result.output @@ -168,13 +168,13 @@ def test_log_clear(m): # log a message logger.info("Hello from pytest!") runner = CliRunner() - result = runner.invoke(main, ["log", "show", "-c", "test-config"]) + result = runner.invoke(main, ["log", "show", "-c", m.config_name]) assert result.exit_code == 0 assert "Hello from pytest!" in result.output # clear the logs - result = runner.invoke(main, ["log", "clear", "-c", "test-config"]) + result = runner.invoke(main, ["log", "clear", "-c", m.config_name]) assert result.exit_code == 0 with open(m.log_handler_file.stream.name) as f: From 1bf2f509d7e7d4f00a9eb3e8c839f932cdb5fb3c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 13 Dec 2020 20:28:04 +0000 Subject: [PATCH 067/374] [tests] added "start" and "stop" cli tests --- tests/offline/test_cli.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index c87c813f1..82811493a 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -8,6 +8,7 @@ from maestral.main import logger from maestral.autostart import AutoStart from maestral.notify import MaestralDesktopNotifier +from maestral.daemon import start_maestral_daemon_process, Start def test_help(): @@ -29,6 +30,29 @@ def test_invalid_config(m): ) +def test_start(config_name): + + res = start_maestral_daemon_process(config_name) + assert res is Start.Ok + + runner = CliRunner() + result = runner.invoke(main, ["start", "-c", config_name]) + + assert result.exit_code == 0 + assert "already running" in result.output + + +def test_stop(config_name): + + res = start_maestral_daemon_process(config_name) + assert res is Start.Ok + + runner = CliRunner() + result = runner.invoke(main, ["stop", "-c", config_name]) + + assert result.exit_code == 0 + + def test_file_status(m): runner = CliRunner() result = runner.invoke(main, ["file-status", "/usr", "-c", m.config_name]) From 25866f7b9523958b14ea21ef51ac86d044a86138 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 00:01:42 +0000 Subject: [PATCH 068/374] [tests] expanded offline cli tests --- tests/offline/test_cli.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 82811493a..f70bc8847 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -8,7 +8,7 @@ from maestral.main import logger from maestral.autostart import AutoStart from maestral.notify import MaestralDesktopNotifier -from maestral.daemon import start_maestral_daemon_process, Start +from maestral.daemon import MaestralProxy, start_maestral_daemon_process, Start def test_help(): @@ -142,7 +142,11 @@ def test_excluded_remove(m): assert "Daemon must be running to download folders." in result.output -def test_notify_level(m): +def test_notify_level(config_name): + + start_maestral_daemon_process(config_name) + m = MaestralProxy(config_name) + runner = CliRunner() result = runner.invoke(main, ["notify", "level", "-c", m.config_name]) @@ -151,15 +155,37 @@ def test_notify_level(m): assert result.exit_code == 0 assert level_name in result.output - result = runner.invoke(main, ["notify", "level", "SYNCISSUE", "-c", m.config_name]) + level_name = "SYNCISSUE" + level_number = MaestralDesktopNotifier.level_name_to_number(level_name) + result = runner.invoke(main, ["notify", "level", level_name, "-c", m.config_name]) + assert result.exit_code == 0 - assert "SYNCISSUE" in result.output + assert level_name in result.output + assert m.notification_level == level_number result = runner.invoke(main, ["notify", "level", "INVALID", "-c", m.config_name]) + assert result.exit_code == 2 assert isinstance(result.exception, SystemExit) +def test_notify_snooze(config_name): + + start_maestral_daemon_process(config_name) + m = MaestralProxy(config_name) + + runner = CliRunner() + result = runner.invoke(main, ["notify", "snooze", "20", "-c", m.config_name]) + + assert result.exit_code == 0 + assert 0 < m.notification_snooze <= 20 + + result = runner.invoke(main, ["notify", "snooze", "0", "-c", m.config_name]) + + assert result.exit_code == 0 + assert m.notification_snooze == 0 + + def test_log_level(m): runner = CliRunner() result = runner.invoke(main, ["log", "level", "-c", m.config_name]) From f58f991c5d4aa7857a2a98d01e4e9210db041de4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 00:02:03 +0000 Subject: [PATCH 069/374] [cli] cleanup string --- src/maestral/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 762c63dcc..2bd9c0113 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -312,7 +312,7 @@ def __init__(self, file_okay: bool = True, dir_okay: bool = True) -> None: class ConfigName(click.ParamType): - """ "A command line parameter representing a Dropbox path + """A command line parameter representing a Dropbox path :param existing: If ``True`` require an existing config, otherwise create a new config on demand. @@ -1275,7 +1275,7 @@ def notify_snooze(minutes: int, config_name: str) -> None: else: if minutes > 0: cli.ok( - f"Notifications snoozed for {minutes} min. " "Set snooze to 0 to reset." + f"Notifications snoozed for {minutes} min. Set snooze to 0 to reset." ) else: cli.ok("Notifications enabled.") From e959b18ae479444a6c51ebf6b3fbff0e035c5353 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 00:04:38 +0000 Subject: [PATCH 070/374] [tests] added proxy fixture --- tests/linked/conftest.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 2a8e378ee..0cc2e5fc1 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -7,8 +7,9 @@ import uuid import pytest - +from watchdog.utils.dirsnapshot import DirectorySnapshot from dropbox.files import WriteMode, FileMetadata + from maestral.main import Maestral from maestral.errors import NotFoundError, FileConflictError from maestral.client import convert_api_errors @@ -19,8 +20,9 @@ to_existing_cased_path, is_child, ) -from maestral.sync import DirectorySnapshot from maestral.utils.appdirs import get_home_dir +from maestral.daemon import MaestralProxy +from maestral.daemon import start_maestral_daemon_process, stop_maestral_daemon_process resources = os.path.dirname(__file__) + "/resources" @@ -95,6 +97,15 @@ def m(): lock.release() +@pytest.fixture +def proxy(m): + m.stop_sync() + start_maestral_daemon_process(m.config_name) + yield MaestralProxy(m.config_name) + + stop_maestral_daemon_process(m.config_name) + + # helper functions From 9f13a8a0d2fcb14e9ae1de8308f81039c9092f5e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 00:05:14 +0000 Subject: [PATCH 071/374] [tests] added online cli tests --- tests/linked/test_cli.py | 115 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 tests/linked/test_cli.py diff --git a/tests/linked/test_cli.py b/tests/linked/test_cli.py new file mode 100644 index 000000000..3ae9f4129 --- /dev/null +++ b/tests/linked/test_cli.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- + +from click.testing import CliRunner + +from maestral.cli import main +from maestral.constants import IDLE, PAUSED, STOPPED, ERROR +from maestral.daemon import MaestralProxy + + +def wait_for_idle(m: MaestralProxy, minimum: int = 2): + + while True: + current_status = m.status + if current_status in (IDLE, PAUSED, STOPPED, ERROR, ""): + m.status_change_longpoll(timeout=minimum) + if m.status == current_status: + # status did not change, we are done + return + else: + m.status_change_longpoll(timeout=minimum) + + +def test_pause_resume(proxy): + + runner = CliRunner() + result = runner.invoke(main, ["pause", "-c", proxy.config_name]) + + wait_for_idle(proxy) + + assert result.exit_code == 0 + assert proxy.paused + + result = runner.invoke(main, ["resume", "-c", proxy.config_name]) + + wait_for_idle(proxy) + + assert result.exit_code == 0 + assert not proxy.paused + + +def test_status(proxy): + runner = CliRunner() + result = runner.invoke(main, ["status", "-c", proxy.config_name]) + + assert result.exit_code == 0 + assert "Stopped" in result.output + + +def test_file_status(proxy): + runner = CliRunner() + proxy.start_sync() + wait_for_idle(proxy) + + local_path = proxy.to_local_path("/sync_tests") + + result = runner.invoke(main, ["file-status", local_path, "-c", proxy.config_name]) + + assert result.exit_code == 0 + assert result.output == "up to date\n" + + +def test_history(proxy): + + proxy.start_sync() + wait_for_idle(proxy) + + # lets make history + dbx_path = "/sync_tests/new_file.txt" + local_path = proxy.to_local_path(dbx_path) + + with open(local_path, "a") as f: + f.write("content") + + wait_for_idle(proxy) + + # check that history has been be written + runner = CliRunner() + result = runner.invoke(main, ["history", "-c", proxy.config_name]) + + lines = result.output.strip().split("\n") + + assert result.exit_code == 0 + # last entry will be test.lock with change time in the future + assert "/test.lock" in lines[-1] + assert "added" in lines[-1] + # then comes our own file + assert dbx_path in lines[-2] + assert "added" in lines[-2] + + +def test_ls(proxy): + runner = CliRunner() + result = runner.invoke(main, ["ls", "/", "-c", proxy.config_name]) + + entries = proxy.list_folder("/") + + assert result.exit_code == 0 + + for entry in entries: + assert entry["name"] in result.output + + +def test_ls_long(proxy): + runner = CliRunner() + result = runner.invoke(main, ["ls", "-l", "/", "-c", proxy.config_name]) + + lines = result.output.strip().split("\n") + entries = proxy.list_folder("/") + + assert result.exit_code == 0 + assert lines[0].startswith("Loading...") # loading indicator + assert lines[1].startswith("Name") # column titles + + for line, entry in zip(lines[2:], entries): + assert entry["name"] in line From d479416b51c2998888b826807dce021d23e18fdb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 01:49:43 +0000 Subject: [PATCH 072/374] [tests] tweaked batch tests --- tests/linked/test_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/test_client.py b/tests/linked/test_client.py index bf656d638..54979b0a4 100644 --- a/tests/linked/test_client.py +++ b/tests/linked/test_client.py @@ -30,7 +30,7 @@ def test_upload_large_file(m): assert md.content_hash == m.sync.get_local_hash(large_file) -@pytest.mark.parametrize("batch_size", [5, 30]) +@pytest.mark.parametrize("batch_size", [10, 30]) @pytest.mark.parametrize("force_async", [True, False]) def test_batch_methods(m, batch_size, force_async): # batch methods are not currently used by sync module From 2576bbadfaa8571ca4730a3c2598bc3608d3578b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 11:26:00 +0000 Subject: [PATCH 073/374] [cli] fixed parsing of datetimes in Python 3.6 --- src/maestral/cli.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 2bd9c0113..4f87f914d 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1020,7 +1020,8 @@ def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) - dt_field: cli.Field if "client_modified" in entry: - cm = cast(str, entry["client_modified"]) + # replacing Z with +0000 is required for Python 3.6 + cm = cast(str, entry["client_modified"]).replace("Z", "+0000") dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() dt_field = cli.DateField(dt) else: @@ -1398,7 +1399,7 @@ def restore(dropbox_path: str, rev: str, config_name: str) -> None: entries = m.list_revisions(dropbox_path) dates = [] for entry in entries: - cm = cast(str, entry["client_modified"]) + cm = cast(str, entry["client_modified"]).replace("Z", "+0000") dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() field = cli.DateField(dt) dates.append(field.format(40)[0]) From b3e79a201ff88bbfcd1ed92627fafc8528a8a9e5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 11:29:15 +0000 Subject: [PATCH 074/374] updated changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d5dff8e6..239845df8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +## v1.3.2.dev + +#### Fixes: + +* Fixes an issue with CLI on Python 3.6 where commands that print datetimes to the + console would raise an exception. + +#### Dependencies: + +* Bumped survey to version >=3.2.2,<4.0. + ## v1.3.1 #### Fixes: From d9b8ff9e9d2008100c434798041ee1b1d1880d06 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 12:45:24 +0000 Subject: [PATCH 075/374] [tests] use attached daemon where possible --- tests/linked/conftest.py | 2 +- tests/offline/test_cli.py | 8 ++++---- tests/offline/test_daemon.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 0cc2e5fc1..cb7b103c6 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -100,7 +100,7 @@ def m(): @pytest.fixture def proxy(m): m.stop_sync() - start_maestral_daemon_process(m.config_name) + start_maestral_daemon_process(m.config_name, detach=False) yield MaestralProxy(m.config_name) stop_maestral_daemon_process(m.config_name) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index f70bc8847..04c534fd2 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -32,7 +32,7 @@ def test_invalid_config(m): def test_start(config_name): - res = start_maestral_daemon_process(config_name) + res = start_maestral_daemon_process(config_name, detach=False) assert res is Start.Ok runner = CliRunner() @@ -44,7 +44,7 @@ def test_start(config_name): def test_stop(config_name): - res = start_maestral_daemon_process(config_name) + res = start_maestral_daemon_process(config_name, detach=False) assert res is Start.Ok runner = CliRunner() @@ -144,7 +144,7 @@ def test_excluded_remove(m): def test_notify_level(config_name): - start_maestral_daemon_process(config_name) + start_maestral_daemon_process(config_name, detach=False) m = MaestralProxy(config_name) runner = CliRunner() @@ -171,7 +171,7 @@ def test_notify_level(config_name): def test_notify_snooze(config_name): - start_maestral_daemon_process(config_name) + start_maestral_daemon_process(config_name, detach=False) m = MaestralProxy(config_name) runner = CliRunner() diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index 317b8e80f..15f62f45b 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -219,7 +219,7 @@ def test_fallback(config_name): def test_remote_exceptions(config_name): # start daemon process - start_maestral_daemon_process(config_name) + start_maestral_daemon_process(config_name, detach=False) # create proxy and call a remote method which raises an error with MaestralProxy(config_name) as m: From 28b3a60074eb089058e67819c39e248be9079adc Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 13:12:21 +0000 Subject: [PATCH 076/374] [daemon] emit debug message on startup error --- src/maestral/daemon.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 4b3299663..c77a2493c 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -9,16 +9,16 @@ import os import time import signal -import traceback import enum import subprocess -from shlex import quote +import traceback import threading import fcntl import struct import tempfile import logging import warnings +from shlex import quote from typing import Optional, Any, Union, Tuple, Dict, Iterable, Type, TYPE_CHECKING from types import TracebackType, FrameType @@ -351,16 +351,24 @@ def _wait_for_startup(config_name: str, timeout: float = 8) -> Start: sock_name = sockpath_for_config(config_name) maestral_daemon = Proxy(URI.format(config_name, "./u:" + sock_name)) + exc: Optional[Exception] = None + while timeout > 0: try: maestral_daemon._pyroBind() return Start.Ok - except Exception: + except Exception as e: + exc = e time.sleep(0.2) timeout -= 0.2 finally: maestral_daemon._pyroRelease() + if exc: + logger.debug( + "Could not start daemon", exc_info=(type(exc), exc, exc.__traceback__) + ) + return Start.Failed From 7c0e24c684a4e34787fb0706cb23cc90fbe48933 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 13:19:01 +0000 Subject: [PATCH 077/374] [tests] set all log level to debug --- tests/linked/conftest.py | 4 +++- tests/offline/conftest.py | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index cb7b103c6..793b9481e 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -10,7 +10,7 @@ from watchdog.utils.dirsnapshot import DirectorySnapshot from dropbox.files import WriteMode, FileMetadata -from maestral.main import Maestral +from maestral.main import Maestral, logger from maestral.errors import NotFoundError, FileConflictError from maestral.client import convert_api_errors from maestral.config import remove_configuration @@ -27,6 +27,8 @@ resources = os.path.dirname(__file__) + "/resources" +logger.setLevel(logging.DEBUG) + @pytest.fixture def m(): diff --git a/tests/offline/conftest.py b/tests/offline/conftest.py index 9c32f7d89..b0a050448 100644 --- a/tests/offline/conftest.py +++ b/tests/offline/conftest.py @@ -2,11 +2,12 @@ import os import os.path as osp +import logging from threading import Event import pytest -from maestral.main import Maestral +from maestral.main import Maestral, logger from maestral.sync import SyncEngine, Observer, FSEventHandler from maestral.client import DropboxClient from maestral.config import list_configs, remove_configuration @@ -15,6 +16,9 @@ from maestral.utils.path import delete +logger.setLevel(logging.DEBUG) + + @pytest.fixture def m(): yield Maestral("test-config") From d4830de207e763fffa8328c26313e7859c5af726 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 14 Dec 2020 21:38:58 +0100 Subject: [PATCH 078/374] Try a test :) --- tests/linked/resources/bin.txt | Bin 0 -> 49424 bytes tests/linked/test_main.py | 44 +++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100755 tests/linked/resources/bin.txt diff --git a/tests/linked/resources/bin.txt b/tests/linked/resources/bin.txt new file mode 100755 index 0000000000000000000000000000000000000000..0e3fa8d7bea74478c5b065972d1fc94386ccecc5 GIT binary patch literal 49424 zcmeI*&x>1C6u|MD`OyZgZ3-g(sE}4i`~jUJ3T~ts?bHmG{%}SpLOCXVuTAhx5|Wp; zvyliEEVR(2i*7`4-GvL6fo|Nn^&e2`LU7ZK3*$NO-ZzuH&a5l=J#go~^X|>bd7qbb z_tIbf{_~&x&Xwk!b8|W>Ixa3cchgn%$hjAE)OCoQU-@YDv(-<|+1c4B&8E9%R_9mU zD6+A7abtE%_WIiFITvzm#pT0xh@|n2)Q)@<>-A3R#pu$rVcqhDaGXsGZZw^W4ANn9 zuzjjn@9R)+U)Yi7`3uUSUcT<@Nh?lzabGtT>)j6ZUJL~+H}~y$tiQ{HwBPPr4I7H} zehBrR3G0?m$4qTq5E*u^w>y!vJ6F0{K6^iY4E5}uTUcJK;aB`$yRYBs5IME7u_7Oy zJG<`hZq46^{5}?E`@Gq(du5+Fk*nRQ+q!4HvhK~I=3gH&Xa3peD4ejq9_sLYg_Aao z3VmswMa@rnU->nQBn=sCZ8p1!^wR#G^|t#O&Gx0=trfx9{iAI@fi6TE}@E7WsSFUb}|e)Ygje(|GsmJg6J1Iu7Vq9uE4;NxQimZ6%TB z7BA_rKED6r(y?zIom{woy7E=?(RUBt)^k-I*)<+|%I(u($C>5+#@w5FY@fS4Uf1il zI`;3yblCg8r^D8)|58-a%PsBnqW!FI4bph?_y@VH1=o^OQQya)sk zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_Kd|Bk??^;^Hy@4Ww(c68r8v?oe0J(w(At67Ik(Vin4YbgJ-_;n&Ngm_XIbsoo_jr@&#hMc z6S11@99TjifB*srAb^cWr@s-9{U6y+t_9v10R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_Kd|GmKBSKI|dI9!Xil1K*Wuqn-UCyM*-Lf_qW16`3` zzuif%Xr@sTx9H|%vnBD3`0_A~r4=`9`_autyW^JTbkDr|>r30KksrLP#|O*Kl}G;f z25j4*Qbqsz{JAW5t`~lf;D|rJ{nG@m7V>$`7j)QcQFXFQPm=YN_y5=xie#ts@~$<~ HIIHt7Q|-(U literal 0 HcmV?d00001 diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 6a582d636..5aa3c0cb7 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -1,16 +1,17 @@ # -*- coding: utf-8 -*- import os +import shutil import os.path as osp import pytest -from maestral.errors import NotFoundError +from maestral.errors import NotFoundError, MaestralApiError, UnsupportedFileTypeForDiff from maestral.main import FileStatus, IDLE from maestral.main import logger as maestral_logger from maestral.utils.path import delete -from .conftest import wait_for_idle +from .conftest import wait_for_idle, resources if not os.environ.get("DROPBOX_TOKEN"): @@ -205,3 +206,42 @@ def test_selective_sync_api_nested(m): # check for fatal errors assert not m.fatal_errors + + +def test_create_file_diff(m): + """Tests file diffs for supported and unsupported files.""" + + # dbx_path_success = "/sync_tests/file.txt" + dbx_path_fail_pdf = "/sync_tests/diff.pdf" + dbx_path_fail_ext = "/sync_tests/bin.txt" + + local_path_fail_pdf = m.to_local_path(dbx_path_fail_pdf) + local_path_fail_ext = m.to_local_path(dbx_path_fail_ext) + + with pytest.raises(UnsupportedFileTypeForDiff) as e: + # Write some dummy stuff to create two revs + with open(local_path_fail_pdf, "w") as f: + f.write("old") + wait_for_idle(m) + old_rev = m.client.get_metadata(dbx_path_fail_pdf).rev + + with open(local_path_fail_pdf, "w") as f: + f.write("new") + wait_for_idle(m) + new_rev = m.client.get_metadata(dbx_path_fail_pdf).rev + + m.get_file_diff(dbx_path_fail_pdf, old_rev, new_rev) + + with pytest.raises(UnsupportedFileTypeForDiff) as e: + # Add a compiled helloworld c file with .txt extension + shutil.copy(resources + "/bin.txt", m.test_folder_local) + wait_for_idle(m) + old_rev = m.client.get_metadata(dbx_path_fail_ext).rev + + # Just some bytes + with open(local_path_fail_ext, "ab") as f: + f.write("\10\10") + wait_for_idle(m) + new_rev = m.client.get_metadata(dbx_path_fail_ext).rev + + m.get_file_diff(dbx_path_fail_ext, old_rev, new_rev) From 109a22c2e46d6c3552c87025810eb3ef2ee3ce63 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Mon, 14 Dec 2020 21:39:22 +0100 Subject: [PATCH 079/374] Fix black issues --- tests/linked/test_main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 5aa3c0cb7..4d8bde29d 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -210,7 +210,7 @@ def test_selective_sync_api_nested(m): def test_create_file_diff(m): """Tests file diffs for supported and unsupported files.""" - + # dbx_path_success = "/sync_tests/file.txt" dbx_path_fail_pdf = "/sync_tests/diff.pdf" dbx_path_fail_ext = "/sync_tests/bin.txt" @@ -231,7 +231,7 @@ def test_create_file_diff(m): new_rev = m.client.get_metadata(dbx_path_fail_pdf).rev m.get_file_diff(dbx_path_fail_pdf, old_rev, new_rev) - + with pytest.raises(UnsupportedFileTypeForDiff) as e: # Add a compiled helloworld c file with .txt extension shutil.copy(resources + "/bin.txt", m.test_folder_local) From 3df773392cdbd963143188cd77570e4dd77f6c98 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 00:29:14 +0000 Subject: [PATCH 080/374] [cli] prompt cleanup --- src/maestral/cli.py | 2 +- src/maestral/utils/cli.py | 32 +++++++++++++++++++++----------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 4f87f914d..6f73e1a93 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -75,7 +75,7 @@ def select_dbx_path_dialog( res = cli.select_path( "Please choose a local Dropbox folder:", default=f"~/{default_dir_name}", - only_directories=True, + files_allowed=False, ) res = res.rstrip(osp.sep) diff --git a/src/maestral/utils/cli.py b/src/maestral/utils/cli.py index b951a99c2..b37760adc 100644 --- a/src/maestral/utils/cli.py +++ b/src/maestral/utils/cli.py @@ -549,7 +549,9 @@ def _syle_hint(hint: str) -> str: return f"{hint} " if hint else "" -def prompt(message: str, default: str = "", validate: Optional[Callable] = None) -> str: +def prompt( + message: str, default: Optional[str] = None, validate: Optional[Callable] = None +) -> str: import survey @@ -622,10 +624,11 @@ def select_multiple(message: str, options: Sequence[str], hint="") -> List[int]: def select_path( message: str, - default: str = "", + default: Optional[str] = None, validate: Callable = lambda x: True, exists: bool = False, - only_directories: bool = False, + files_allowed: bool = True, + dirs_allowed: bool = True, ) -> str: import os @@ -647,18 +650,25 @@ def check(value: str) -> bool: return True full_path = os.path.expanduser(value) - dir_condition = os.path.isdir(full_path) or not only_directories + forbidden_dir = os.path.isdir(full_path) and not dirs_allowed + forbidden_file = os.path.isfile(full_path) and not files_allowed exist_condition = os.path.exists(full_path) or not exists - if not dir_condition: - survey.update(click.style("(not a directory) ", fg="red")) - elif not exist_condition: + if not exist_condition: survey.update(click.style("(not found) ", fg="red")) + elif forbidden_dir: + survey.update(click.style("(not a file) ", fg="red")) + elif forbidden_file: + survey.update(click.style("(not a folder) ", fg="red")) + + failed = ( + not exist_condition + or forbidden_dir + or forbidden_file + or not validate(value) + ) - passed = dir_condition and exist_condition and validate(value) - failed = not passed - - return passed + return not failed @track.call("insert") @track.call("delete") From 978caee2cf1e118f4cfae62a8b1e75375f8a5e52 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 15 Dec 2020 09:49:05 +0100 Subject: [PATCH 081/374] Add a successful test case --- tests/linked/test_main.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 4d8bde29d..af4f549ae 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -211,10 +211,11 @@ def test_selective_sync_api_nested(m): def test_create_file_diff(m): """Tests file diffs for supported and unsupported files.""" - # dbx_path_success = "/sync_tests/file.txt" + dbx_path_success = "/sync_tests/file.txt" dbx_path_fail_pdf = "/sync_tests/diff.pdf" dbx_path_fail_ext = "/sync_tests/bin.txt" + local_path_success = m.to_local_path(dbx_path_success) local_path_fail_pdf = m.to_local_path(dbx_path_fail_pdf) local_path_fail_ext = m.to_local_path(dbx_path_fail_ext) @@ -245,3 +246,17 @@ def test_create_file_diff(m): new_rev = m.client.get_metadata(dbx_path_fail_ext).rev m.get_file_diff(dbx_path_fail_ext, old_rev, new_rev) + + with open(local_path_success, "w") as f: + f.write("old") + wait_for_idle(m) + old_rev = m.client.get_metadata(dbx_path_fail_ext).rev + + with open(local_path_success, "w") as f: + f.write("new") + wait_for_idle(m) + new_rev = m.client.get_metadata(dbx_path_fail_ext).rev + + # If this does not raise an error, + # the function should have been successful + diff = m.get_file_diff(dbx_path_success, old_rev, new_rev) From a128af7ecdfb11cfc55a4ece9944933a0664349f Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 15 Dec 2020 11:17:47 +0100 Subject: [PATCH 082/374] Add utility function to make creating random revs easier --- tests/linked/test_main.py | 53 +++++++++++++++------------------------ 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index af4f549ae..975f5f988 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -211,52 +211,39 @@ def test_selective_sync_api_nested(m): def test_create_file_diff(m): """Tests file diffs for supported and unsupported files.""" + def write_and_get_rev(dbx_path: str, content: str, o: str = "w") -> str: + """ + Open the dbx_path locally and write the content to the string. + If it should append something, you can set 'o = "a"'. + """ + + local_path = m.to_local_path(dbx_path) + with open(local_path, o) as f: + f.write(content) + wait_for_idle(m) + return m.client.get_metadata(dbx_path).rev + dbx_path_success = "/sync_tests/file.txt" dbx_path_fail_pdf = "/sync_tests/diff.pdf" dbx_path_fail_ext = "/sync_tests/bin.txt" - local_path_success = m.to_local_path(dbx_path_success) - local_path_fail_pdf = m.to_local_path(dbx_path_fail_pdf) - local_path_fail_ext = m.to_local_path(dbx_path_fail_ext) - - with pytest.raises(UnsupportedFileTypeForDiff) as e: + with pytest.raises(UnsupportedFileTypeForDiff): # Write some dummy stuff to create two revs - with open(local_path_fail_pdf, "w") as f: - f.write("old") - wait_for_idle(m) - old_rev = m.client.get_metadata(dbx_path_fail_pdf).rev - - with open(local_path_fail_pdf, "w") as f: - f.write("new") - wait_for_idle(m) - new_rev = m.client.get_metadata(dbx_path_fail_pdf).rev - + old_rev = write_and_get_rev(dbx_path_fail_pdf, "old") + new_rev = write_and_get_rev(dbx_path_fail_pdf, "new") m.get_file_diff(dbx_path_fail_pdf, old_rev, new_rev) - with pytest.raises(UnsupportedFileTypeForDiff) as e: + with pytest.raises(UnsupportedFileTypeForDiff): # Add a compiled helloworld c file with .txt extension shutil.copy(resources + "/bin.txt", m.test_folder_local) wait_for_idle(m) old_rev = m.client.get_metadata(dbx_path_fail_ext).rev - # Just some bytes - with open(local_path_fail_ext, "ab") as f: - f.write("\10\10") - wait_for_idle(m) - new_rev = m.client.get_metadata(dbx_path_fail_ext).rev - + new_rev = write_and_get_rev(dbx_path_fail_ext, "\01\01", o="ab") m.get_file_diff(dbx_path_fail_ext, old_rev, new_rev) - with open(local_path_success, "w") as f: - f.write("old") - wait_for_idle(m) - old_rev = m.client.get_metadata(dbx_path_fail_ext).rev - - with open(local_path_success, "w") as f: - f.write("new") - wait_for_idle(m) - new_rev = m.client.get_metadata(dbx_path_fail_ext).rev - + old_rev = write_and_get_rev(dbx_path_fail_ext, "old") + new_rev = write_and_get_rev(dbx_path_fail_ext, "new") # If this does not raise an error, # the function should have been successful - diff = m.get_file_diff(dbx_path_success, old_rev, new_rev) + _ = m.get_file_diff(dbx_path_success, old_rev, new_rev) From 697c961e17159b588f395f97bd1893953ee52c9a Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 15 Dec 2020 14:45:43 +0100 Subject: [PATCH 083/374] Fix code formatting --- tests/linked/test_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index e44488158..32dad6637 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -222,7 +222,7 @@ def write_and_get_rev(dbx_path: str, content: str, o: str = "w") -> str: f.write(content) wait_for_idle(m) return m.client.get_metadata(dbx_path).rev - + dbx_path_success = "/sync_tests/file.txt" dbx_path_fail_pdf = "/sync_tests/diff.pdf" dbx_path_fail_ext = "/sync_tests/bin.txt" From 3a4be41ed46cf9a96b0cc0f93265666833a0f254 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 15 Dec 2020 14:47:53 +0100 Subject: [PATCH 084/374] Remove unused import --- tests/linked/test_main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 32dad6637..16f1d3fb9 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -6,7 +6,7 @@ import pytest -from maestral.errors import NotFoundError, MaestralApiError, UnsupportedFileTypeForDiff +from maestral.errors import NotFoundError, UnsupportedFileTypeForDiff from maestral.main import FileStatus, IDLE from maestral.main import logger as maestral_logger from maestral.utils.path import delete From 7618c1eb8381eb4cfa0e9dc19ba155c9605e7e98 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Tue, 15 Dec 2020 16:15:56 +0100 Subject: [PATCH 085/374] Fix test --- tests/linked/test_main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 16f1d3fb9..86b33ec4b 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -211,7 +211,7 @@ def test_selective_sync_api_nested(m): def test_create_file_diff(m): """Tests file diffs for supported and unsupported files.""" - def write_and_get_rev(dbx_path: str, content: str, o: str = "w") -> str: + def write_and_get_rev(dbx_path, content, o="w"): """ Open the dbx_path locally and write the content to the string. If it should append something, you can set 'o = "a"'. @@ -239,7 +239,7 @@ def write_and_get_rev(dbx_path: str, content: str, o: str = "w") -> str: wait_for_idle(m) old_rev = m.client.get_metadata(dbx_path_fail_ext).rev # Just some bytes - new_rev = write_and_get_rev(dbx_path_fail_ext, "\01\01", o="ab") + new_rev = write_and_get_rev(dbx_path_fail_ext, "hi".encode(), o="ab") m.get_file_diff(dbx_path_fail_ext, old_rev, new_rev) old_rev = write_and_get_rev(dbx_path_fail_ext, "old") From c650dbd50f3a7e05c78238e283111b1d641e1188 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 23:25:22 +0000 Subject: [PATCH 086/374] [cli] simplified daemon startup --- src/maestral/cli.py | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 6f73e1a93..079f9bed0 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -524,8 +524,8 @@ def start(foreground: bool, verbose: bool, config_name: str) -> None: # running with the --foreground flag, prevents leaving a zombie process if the setup # fails with an exception and does not confuse systemd. - from .main import Maestral from .daemon import ( + MaestralProxy, start_maestral_daemon, start_maestral_daemon_process, is_running, @@ -538,7 +538,22 @@ def start(foreground: bool, verbose: bool, config_name: str) -> None: click.echo("Daemon is already running.") return - m = Maestral(config_name, log_to_stdout=verbose) + if not foreground: + # start daemon process + cli.echo("Starting Maestral...", nl=False) + + res = start_maestral_daemon_process(config_name) + + if res == Start.Ok: + cli.echo(" " * 8 + OK) + elif res == Start.AlreadyRunning: + cli.echo(" " * 8 + "Already running.") + else: + cli.echo(" " * 8 + FAILED) + cli.echo("Please check logs for more information.") + return + + m = MaestralProxy(config_name, fallback=True) if m.pending_link: # this may raise KeyringAccessError link_dialog(m) @@ -578,28 +593,13 @@ def start(foreground: bool, verbose: bool, config_name: str) -> None: m.excluded_items = excluded_paths - # free resources - del m + cli.ok("Setup completed. Starting sync.") if foreground: - # start our current process + del m start_maestral_daemon(config_name, log_to_stdout=verbose, start_sync=True) else: - - # start daemon process - cli.echo("Starting Maestral...", nl=False) - - res = start_maestral_daemon_process( - config_name, log_to_stdout=verbose, start_sync=True - ) - - if res == Start.Ok: - cli.echo(" " * 8 + OK) - elif res == Start.AlreadyRunning: - cli.echo(" " * 8 + "Already running.") - else: - cli.echo(" " * 8 + FAILED) - cli.echo("Please check logs for more information.") + m.start_sync() @main.command(section="Core Commands", help="Stop the sync daemon.") From e92525ac38c5880923f04a78e7c29d5ca53e7bfc Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 15:17:33 +0000 Subject: [PATCH 087/374] [daemon] refactor _wait_for_stable --- src/maestral/daemon.py | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index c77a2493c..d8316a8c4 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -342,35 +342,33 @@ def is_running(config_name: str) -> bool: return maestral_lock(config_name).locked() -def _wait_for_startup(config_name: str, timeout: float = 8) -> Start: +def _wait_for_startup(config_name: str, timeout: float) -> None: """ - Checks if we can communicate with the maestral daemon. Returns :attr:`Start.Ok` if - communication succeeds within timeout, :attr:`Start.Failed` otherwise. + Waits until we can communicate with the maestral daemon for ``config_name``. + + :param config_name: Configuration to connect to. + :param timeout: Timeout it seconds until we raise an error. + :raises CommunicationError: if we cannot communicate with the daemon within the + given timeout. """ sock_name = sockpath_for_config(config_name) maestral_daemon = Proxy(URI.format(config_name, "./u:" + sock_name)) - exc: Optional[Exception] = None + t0 = time.time() - while timeout > 0: + while True: try: maestral_daemon._pyroBind() - return Start.Ok - except Exception as e: - exc = e - time.sleep(0.2) - timeout -= 0.2 + return + except Exception as exc: + if time.time() - t0 > timeout: + raise exc + else: + time.sleep(0.2) finally: maestral_daemon._pyroRelease() - if exc: - logger.debug( - "Could not start daemon", exc_info=(type(exc), exc, exc.__traceback__) - ) - - return Start.Failed - # ==== main functions to manage daemon ================================================= @@ -590,7 +588,15 @@ def start_maestral_daemon_process( daemon=True, ).start() - return _wait_for_startup(config_name) + try: + _wait_for_startup(config_name, timeout=5) + except Exception as exc: + logger.debug( + "Could not start daemon", exc_info=(type(exc), exc, exc.__traceback__) + ) + return Start.Failed + else: + return Start.Ok def stop_maestral_daemon_process( From 6f8095040a05c87451e7c57ee4fe15bbc22c92e4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 20:38:27 +0000 Subject: [PATCH 088/374] [daemon] remove attached option and kill hanging process --- src/maestral/daemon.py | 64 +++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index d8316a8c4..450992d33 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -72,6 +72,25 @@ URI = "PYRO:maestral.{0}@{1}" Pyro5.config.THREADPOOL_SIZE_MIN = 2 +if FROZEN and IS_MACOS: + EXECUTABLE = [sys.executable, "--run-python", "-OO"] +else: + EXECUTABLE = [sys.executable, "-OO"] + + +def set_executable(executable: str, *argv) -> None: + """ + Sets the path of the Python interpreter to use when starting the daemon. By default + sys.executable is used. Can be used in case of an embedded Python executable. + + :param executable: Path to Python executable which is used to start the daemon + process. + :param argv: Any command line arguments to be injected before the daemon startup + command. By default, "-OO" will be used. + """ + global EXECUTABLE + EXECUTABLE = [executable, *argv] + class Stop(enum.Enum): """Enumeration of daemon exit results""" @@ -535,19 +554,16 @@ def start_maestral_daemon_process( config_name: str = "maestral", log_to_stdout: bool = False, start_sync: bool = False, - detach: bool = True, ) -> Start: """ Starts the Maestral daemon in a new process by calling :func:`start_maestral_daemon`. Startup is race free: there will never be two daemons running for the same config. - This function requires that :obj:`sys.executable` points to a Python executable and - therefore may not work for "frozen" apps. + This function expects that :obj:`sys.executable` points to a Python executable. Use + :func:`set_executable` to override the default behavior. :param config_name: The name of the Maestral configuration to use. :param log_to_stdout: If ``True``, write logs to stdout. :param start_sync: If ``True``, start syncing once the daemon has started. - :param detach: If ``True``, the daemon process will be detached. If ``False``, - the daemon processes will run in the same session as the current process. :returns: :attr:`Start.Ok` if successful, :attr:`Start.AlreadyRunning` if the daemon was already running or :attr:`Start.Failed` if startup failed. It is possible that :attr:`Start.Ok` may be returned instead of :attr:`Start.AlreadyRunning` @@ -557,36 +573,19 @@ def start_maestral_daemon_process( if is_running(config_name): return Start.AlreadyRunning - if detach: - - # protect against injection - cc = quote(config_name).strip("'") - std_log = bool(log_to_stdout) - start_sync = bool(start_sync) + # protect against injection + cc = quote(config_name).strip("'") + std_log = bool(log_to_stdout) + start_sync = bool(start_sync) - script = ( - f"import maestral.daemon; " - f'maestral.daemon.start_maestral_daemon("{cc}", {std_log}, {start_sync})' - ) - - if FROZEN and IS_MACOS: - cmd = [sys.executable, "--run-python", "-OO", "-c", script] - else: - cmd = [sys.executable, "-OO", "-c", script] - - subprocess.Popen(cmd, start_new_session=True) - - else: - import multiprocessing as mp + script = ( + f"import maestral.daemon; " + f'maestral.daemon.start_maestral_daemon("{cc}", {std_log}, {start_sync})' + ) - ctx = mp.get_context("spawn" if IS_MACOS else "fork") + cmd = [*EXECUTABLE, "-OO", "-c", script] - ctx.Process( - target=start_maestral_daemon, - args=(config_name, log_to_stdout, start_sync), - name="maestral-daemon", - daemon=True, - ).start() + process = subprocess.Popen(cmd, start_new_session=True) try: _wait_for_startup(config_name, timeout=5) @@ -594,6 +593,7 @@ def start_maestral_daemon_process( logger.debug( "Could not start daemon", exc_info=(type(exc), exc, exc.__traceback__) ) + process.kill() # make sure we don't leave a stray process return Start.Failed else: return Start.Ok From 1e2a6878f1dc8baab567e2a2fea32f8961ef9a5c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 20:38:56 +0000 Subject: [PATCH 089/374] [tests] remove attached daemon test --- tests/offline/test_daemon.py | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index 15f62f45b..632e9b488 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -5,7 +5,6 @@ import time import subprocess import threading -import multiprocessing as mp import uuid import pytest @@ -23,7 +22,6 @@ ) from maestral.main import Maestral from maestral.errors import NotLinkedError -from maestral.constants import IS_MACOS # locking tests @@ -163,26 +161,6 @@ def test_lifecycle_detached(config_name): assert res is Stop.NotRunning -def test_lifecycle_attached(config_name): - - # start daemon process - res = start_maestral_daemon_process(config_name, detach=False) - assert res is Start.Ok - - # check that we have attached process - ctx = mp.get_context("spawn" if IS_MACOS else "fork") - daemon = ctx.active_children()[0] - assert daemon.name == "maestral-daemon" - - # stop daemon - res = stop_maestral_daemon_process(config_name) - assert res is Stop.Ok - - # retry stop daemon - res = stop_maestral_daemon_process(config_name) - assert res is Stop.NotRunning - - # proxy tests From 01f7b13af2f58464d8cd6b7feaffca9a3c7795e3 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 20:39:26 +0000 Subject: [PATCH 090/374] [tests] and log to stdout from daemon --- tests/linked/conftest.py | 2 +- tests/offline/test_cli.py | 8 ++++---- tests/offline/test_daemon.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 793b9481e..e48f66a40 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -102,7 +102,7 @@ def m(): @pytest.fixture def proxy(m): m.stop_sync() - start_maestral_daemon_process(m.config_name, detach=False) + start_maestral_daemon_process(m.config_name, log_to_stdout=True) yield MaestralProxy(m.config_name) stop_maestral_daemon_process(m.config_name) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 04c534fd2..4ba950311 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -32,7 +32,7 @@ def test_invalid_config(m): def test_start(config_name): - res = start_maestral_daemon_process(config_name, detach=False) + res = start_maestral_daemon_process(config_name, log_to_stdout=True) assert res is Start.Ok runner = CliRunner() @@ -44,7 +44,7 @@ def test_start(config_name): def test_stop(config_name): - res = start_maestral_daemon_process(config_name, detach=False) + res = start_maestral_daemon_process(config_name, log_to_stdout=True) assert res is Start.Ok runner = CliRunner() @@ -144,7 +144,7 @@ def test_excluded_remove(m): def test_notify_level(config_name): - start_maestral_daemon_process(config_name, detach=False) + start_maestral_daemon_process(config_name, log_to_stdout=True) m = MaestralProxy(config_name) runner = CliRunner() @@ -171,7 +171,7 @@ def test_notify_level(config_name): def test_notify_snooze(config_name): - start_maestral_daemon_process(config_name, detach=False) + start_maestral_daemon_process(config_name, log_to_stdout=True) m = MaestralProxy(config_name) runner = CliRunner() diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index 632e9b488..36ef40162 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -141,11 +141,11 @@ def test_locking_multiprocess(): def test_lifecycle_detached(config_name): # start daemon process - res = start_maestral_daemon_process(config_name) + res = start_maestral_daemon_process(config_name, log_to_stdout=True) assert res is Start.Ok # retry start daemon process - res = start_maestral_daemon_process(config_name) + res = start_maestral_daemon_process(config_name, log_to_stdout=True) assert res is Start.AlreadyRunning # retry start daemon in-process @@ -167,7 +167,7 @@ def test_lifecycle_detached(config_name): def test_connection(config_name): # start daemon process - res = start_maestral_daemon_process(config_name) + res = start_maestral_daemon_process(config_name, log_to_stdout=True) assert res is Start.Ok # create proxy @@ -197,7 +197,7 @@ def test_fallback(config_name): def test_remote_exceptions(config_name): # start daemon process - start_maestral_daemon_process(config_name, detach=False) + start_maestral_daemon_process(config_name, log_to_stdout=True) # create proxy and call a remote method which raises an error with MaestralProxy(config_name) as m: From 7bcd85c798a1a98e3674c0e0be6d05a34a0a45e8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 14 Dec 2020 21:26:23 +0000 Subject: [PATCH 091/374] [daemon] print startup logs to stdout --- src/maestral/daemon.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 450992d33..c38de173b 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -415,6 +415,9 @@ def start_maestral_daemon( import asyncio from .main import Maestral + if log_to_stdout: + logger.setLevel(logging.DEBUG) + if threading.current_thread() is not threading.main_thread(): raise RuntimeError("Must run daemon in main thread") From 6cb92925511e3c7c6f1b3a1ed69ee282abfc2b31 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 16:56:20 +0000 Subject: [PATCH 092/374] [daemon] improve debug logs --- src/maestral/daemon.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index c38de173b..c3324fcbc 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -424,7 +424,9 @@ def start_maestral_daemon( # acquire PID lock file lock = maestral_lock(config_name) - if not lock.acquire(): + if lock.acquire(): + logger.debug("Acquired daemon lock") + else: raise RuntimeError("Maestral daemon is already running") # Nice ourselves to give other processes priority. We will likely only @@ -494,7 +496,7 @@ async def periodic_watchdog() -> None: # get socket for config name sockpath = sockpath_for_config(config_name) - logger.debug(f"Socket path for '{config_name}' daemon: '{sockpath}'") + logger.debug(f"Socket path: '{sockpath}'") # clean up old socket try: @@ -594,9 +596,16 @@ def start_maestral_daemon_process( _wait_for_startup(config_name, timeout=5) except Exception as exc: logger.debug( - "Could not start daemon", exc_info=(type(exc), exc, exc.__traceback__) + "Could not communicate with daemon", + exc_info=(type(exc), exc, exc.__traceback__), ) - process.kill() # make sure we don't leave a stray process + + returncode = process.poll() + if returncode is None: + logger.debug("Daemon is running but not responsive, killing now") + process.kill() # make sure we don't leave a stray process + else: + logger.debug("Daemon stopped with return code %s", returncode) return Start.Failed else: return Start.Ok From 055b74384f0d39f4a8dc9d6af185fef90bdec17a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 16:56:37 +0000 Subject: [PATCH 093/374] [daemon] allow setting startup timeout --- src/maestral/daemon.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index c3324fcbc..38e082aa4 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -559,6 +559,7 @@ def start_maestral_daemon_process( config_name: str = "maestral", log_to_stdout: bool = False, start_sync: bool = False, + timeout: int = 5, ) -> Start: """ Starts the Maestral daemon in a new process by calling :func:`start_maestral_daemon`. @@ -569,6 +570,7 @@ def start_maestral_daemon_process( :param config_name: The name of the Maestral configuration to use. :param log_to_stdout: If ``True``, write logs to stdout. :param start_sync: If ``True``, start syncing once the daemon has started. + :param timeout: Time in sec to wait for daemon to start. :returns: :attr:`Start.Ok` if successful, :attr:`Start.AlreadyRunning` if the daemon was already running or :attr:`Start.Failed` if startup failed. It is possible that :attr:`Start.Ok` may be returned instead of :attr:`Start.AlreadyRunning` @@ -593,7 +595,7 @@ def start_maestral_daemon_process( process = subprocess.Popen(cmd, start_new_session=True) try: - _wait_for_startup(config_name, timeout=5) + _wait_for_startup(config_name, timeout=timeout) except Exception as exc: logger.debug( "Could not communicate with daemon", From ab3ef5527d2eb522370876985d827d092d47c27b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 16:57:01 +0000 Subject: [PATCH 094/374] [tests] use 20 sec startup timeout for daemon --- tests/linked/conftest.py | 2 +- tests/offline/test_cli.py | 8 ++++---- tests/offline/test_daemon.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index e48f66a40..c84cc24ad 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -102,7 +102,7 @@ def m(): @pytest.fixture def proxy(m): m.stop_sync() - start_maestral_daemon_process(m.config_name, log_to_stdout=True) + start_maestral_daemon_process(m.config_name, log_to_stdout=True, timeout=20) yield MaestralProxy(m.config_name) stop_maestral_daemon_process(m.config_name) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 4ba950311..c232b7d4b 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -32,7 +32,7 @@ def test_invalid_config(m): def test_start(config_name): - res = start_maestral_daemon_process(config_name, log_to_stdout=True) + res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) assert res is Start.Ok runner = CliRunner() @@ -44,7 +44,7 @@ def test_start(config_name): def test_stop(config_name): - res = start_maestral_daemon_process(config_name, log_to_stdout=True) + res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) assert res is Start.Ok runner = CliRunner() @@ -144,7 +144,7 @@ def test_excluded_remove(m): def test_notify_level(config_name): - start_maestral_daemon_process(config_name, log_to_stdout=True) + start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) m = MaestralProxy(config_name) runner = CliRunner() @@ -171,7 +171,7 @@ def test_notify_level(config_name): def test_notify_snooze(config_name): - start_maestral_daemon_process(config_name, log_to_stdout=True) + start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) m = MaestralProxy(config_name) runner = CliRunner() diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index 36ef40162..3bffc19fb 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -141,11 +141,11 @@ def test_locking_multiprocess(): def test_lifecycle_detached(config_name): # start daemon process - res = start_maestral_daemon_process(config_name, log_to_stdout=True) + res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) assert res is Start.Ok # retry start daemon process - res = start_maestral_daemon_process(config_name, log_to_stdout=True) + res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) assert res is Start.AlreadyRunning # retry start daemon in-process @@ -167,7 +167,7 @@ def test_lifecycle_detached(config_name): def test_connection(config_name): # start daemon process - res = start_maestral_daemon_process(config_name, log_to_stdout=True) + res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) assert res is Start.Ok # create proxy @@ -197,7 +197,7 @@ def test_fallback(config_name): def test_remote_exceptions(config_name): # start daemon process - start_maestral_daemon_process(config_name, log_to_stdout=True) + start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) # create proxy and call a remote method which raises an error with MaestralProxy(config_name) as m: From 8fcf47c2b90f37bc94ab3daad45212f621ead7a9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 18:34:02 +0000 Subject: [PATCH 095/374] [tests] removed test_delete --- tests/offline/utils/test_path.py | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/tests/offline/utils/test_path.py b/tests/offline/utils/test_path.py index cf3dfb604..90bfe81f2 100644 --- a/tests/offline/utils/test_path.py +++ b/tests/offline/utils/test_path.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- import os.path as osp -import tempfile import pytest @@ -11,7 +10,6 @@ to_cased_path, is_fs_case_sensitive, is_child, - delete, ) from maestral.utils.appdirs import get_home_dir @@ -99,17 +97,3 @@ def test_is_child(): assert is_child("/parent/path/child/", "/parent/path") assert not is_child("/parent/path", "/parent/path") assert not is_child("/path1", "/path2") - - -def test_delete(): - # test deleting file - test_file = tempfile.NamedTemporaryFile() - assert osp.isfile(test_file.name) - delete(test_file.name) - assert not osp.exists(test_file.name) - - # test deleting directory - test_dir = tempfile.TemporaryDirectory() - assert osp.isdir(test_dir.name) - delete(test_dir.name) - assert not osp.exists(test_dir.name) From f14199a1157981935aa7935f6aa0cb35060ef4cf Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 19:36:00 +0000 Subject: [PATCH 096/374] [daemon] install fault handler for sigterm --- src/maestral/daemon.py | 10 ++++++++-- tests/offline/test_daemon.py | 2 +- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 38e082aa4..aa382b45c 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -18,6 +18,7 @@ import tempfile import logging import warnings +import faulthandler from shlex import quote from typing import Optional, Any, Union, Tuple, Dict, Iterable, Type, TYPE_CHECKING from types import TracebackType, FrameType @@ -412,6 +413,8 @@ def start_maestral_daemon( :raises RuntimeError: if a daemon for the given ``config_name`` is already running. """ + faulthandler.register(signal.SIGTERM, file=sys.stderr, chain=True) + import asyncio from .main import Maestral @@ -592,7 +595,7 @@ def start_maestral_daemon_process( cmd = [*EXECUTABLE, "-OO", "-c", script] - process = subprocess.Popen(cmd, start_new_session=True) + process = subprocess.Popen(cmd, start_new_session=True, stderr=subprocess.PIPE) try: _wait_for_startup(config_name, timeout=timeout) @@ -602,10 +605,13 @@ def start_maestral_daemon_process( exc_info=(type(exc), exc, exc.__traceback__), ) + # let's check what the daemon has been doing returncode = process.poll() if returncode is None: logger.debug("Daemon is running but not responsive, killing now") - process.kill() # make sure we don't leave a stray process + process.terminate() # make sure we don't leave a stray process + stdout, stderr = process.communicate() + print("stderr from daemon:", stderr) else: logger.debug("Daemon stopped with return code %s", returncode) return Start.Failed diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index 3bffc19fb..b440d57f4 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -138,7 +138,7 @@ def test_locking_multiprocess(): # daemon lifecycle tests -def test_lifecycle_detached(config_name): +def test_lifecycle(config_name): # start daemon process res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) From 45a65572450f8afa8ba4a25b1f47d7afdd15dd36 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 23:28:42 +0000 Subject: [PATCH 097/374] [daemon] don't pass -OO twice --- src/maestral/daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index aa382b45c..70367702c 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -593,7 +593,7 @@ def start_maestral_daemon_process( f'maestral.daemon.start_maestral_daemon("{cc}", {std_log}, {start_sync})' ) - cmd = [*EXECUTABLE, "-OO", "-c", script] + cmd = [*EXECUTABLE, "-c", script] process = subprocess.Popen(cmd, start_new_session=True, stderr=subprocess.PIPE) From 1888ab4ec3ae25436c059d758c6eb5be5fe1f63d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 23:29:03 +0000 Subject: [PATCH 098/374] [daemon] send daemon process IO to devnull --- src/maestral/daemon.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 70367702c..382ad5abe 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -560,7 +560,6 @@ async def periodic_watchdog() -> None: def start_maestral_daemon_process( config_name: str = "maestral", - log_to_stdout: bool = False, start_sync: bool = False, timeout: int = 5, ) -> Start: @@ -571,7 +570,6 @@ def start_maestral_daemon_process( :func:`set_executable` to override the default behavior. :param config_name: The name of the Maestral configuration to use. - :param log_to_stdout: If ``True``, write logs to stdout. :param start_sync: If ``True``, start syncing once the daemon has started. :param timeout: Time in sec to wait for daemon to start. :returns: :attr:`Start.Ok` if successful, :attr:`Start.AlreadyRunning` if the daemon @@ -585,17 +583,22 @@ def start_maestral_daemon_process( # protect against injection cc = quote(config_name).strip("'") - std_log = bool(log_to_stdout) start_sync = bool(start_sync) script = ( f"import maestral.daemon; " - f'maestral.daemon.start_maestral_daemon("{cc}", {std_log}, {start_sync})' + f'maestral.daemon.start_maestral_daemon("{cc}", start_sync={start_sync})' ) cmd = [*EXECUTABLE, "-c", script] - process = subprocess.Popen(cmd, start_new_session=True, stderr=subprocess.PIPE) + process = subprocess.Popen( + cmd, + start_new_session=True, + stdin=subprocess.DEVNULL, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) try: _wait_for_startup(config_name, timeout=timeout) @@ -610,8 +613,6 @@ def start_maestral_daemon_process( if returncode is None: logger.debug("Daemon is running but not responsive, killing now") process.terminate() # make sure we don't leave a stray process - stdout, stderr = process.communicate() - print("stderr from daemon:", stderr) else: logger.debug("Daemon stopped with return code %s", returncode) return Start.Failed From 704e92fa70bcdc70737ee573bec2ccf46c4e5916 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 23:29:18 +0000 Subject: [PATCH 099/374] [cli] update help for verbose flag --- src/maestral/cli.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 079f9bed0..b7b4213ec 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -512,7 +512,11 @@ def main(version: bool): help="Starts Maestral in the foreground.", ) @click.option( - "--verbose", "-v", is_flag=True, default=False, help="Print log messages to stdout." + "--verbose", + "-v", + is_flag=True, + default=False, + help="Print log messages to stdout when started with '-f, --foreground' flag.", ) @config_option @catch_maestral_errors From d53706f6db6a08d7707e66d1333c3db572522733 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 15 Dec 2020 23:35:16 +0000 Subject: [PATCH 100/374] [tests] remove log_to_stdout arg --- tests/linked/conftest.py | 2 +- tests/offline/test_cli.py | 8 ++++---- tests/offline/test_daemon.py | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index c84cc24ad..62efe3285 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -102,7 +102,7 @@ def m(): @pytest.fixture def proxy(m): m.stop_sync() - start_maestral_daemon_process(m.config_name, log_to_stdout=True, timeout=20) + start_maestral_daemon_process(m.config_name, timeout=20) yield MaestralProxy(m.config_name) stop_maestral_daemon_process(m.config_name) diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index c232b7d4b..e60163a79 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -32,7 +32,7 @@ def test_invalid_config(m): def test_start(config_name): - res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + res = start_maestral_daemon_process(config_name, timeout=20) assert res is Start.Ok runner = CliRunner() @@ -44,7 +44,7 @@ def test_start(config_name): def test_stop(config_name): - res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + res = start_maestral_daemon_process(config_name, timeout=20) assert res is Start.Ok runner = CliRunner() @@ -144,7 +144,7 @@ def test_excluded_remove(m): def test_notify_level(config_name): - start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + start_maestral_daemon_process(config_name, timeout=20) m = MaestralProxy(config_name) runner = CliRunner() @@ -171,7 +171,7 @@ def test_notify_level(config_name): def test_notify_snooze(config_name): - start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + start_maestral_daemon_process(config_name, timeout=20) m = MaestralProxy(config_name) runner = CliRunner() diff --git a/tests/offline/test_daemon.py b/tests/offline/test_daemon.py index b440d57f4..920d11d3b 100644 --- a/tests/offline/test_daemon.py +++ b/tests/offline/test_daemon.py @@ -141,11 +141,11 @@ def test_locking_multiprocess(): def test_lifecycle(config_name): # start daemon process - res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + res = start_maestral_daemon_process(config_name, timeout=20) assert res is Start.Ok # retry start daemon process - res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + res = start_maestral_daemon_process(config_name, timeout=20) assert res is Start.AlreadyRunning # retry start daemon in-process @@ -167,7 +167,7 @@ def test_lifecycle(config_name): def test_connection(config_name): # start daemon process - res = start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + res = start_maestral_daemon_process(config_name, timeout=20) assert res is Start.Ok # create proxy @@ -197,7 +197,7 @@ def test_fallback(config_name): def test_remote_exceptions(config_name): # start daemon process - start_maestral_daemon_process(config_name, log_to_stdout=True, timeout=20) + start_maestral_daemon_process(config_name, timeout=20) # create proxy and call a remote method which raises an error with MaestralProxy(config_name) as m: From 31dd9366230bb1c4f7012e39ce6279c5fa3a13e9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 16 Dec 2020 00:52:05 +0000 Subject: [PATCH 101/374] added instructions for retrieving tokens --- CONTRIBUTING.md | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ed1cdcd74..41c03732f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,5 +61,38 @@ tests will set this environment variable for you with a temporary access token t expires after 4 hours. Tests are run on `ubuntu-latest` and `macos-latest` in parallel on different accounts and you should acquire a "lock" on the account before running tests. Fixtures to create and clean up a test config and to acquire a lock are provided -in the `tests/linked/conftest.py`. If you run the tests locally, you will need to -provide an access token for your own Dropbox account. +in the `tests/linked/conftest.py`. + +If you run the tests locally, you will need to provide an access token for your own +Dropbox account. If your account is already linked with Maestral, it will have saved a +long-lived "refresh token" in your system keyring. You can access it manually or through +the Python API: + +```Python +from maestral.main import Maestral + +m = Maestral() +print(m.client.auth.refresh_token) +``` + +This refresh token cannot be used to make API calls directly but should be used to +retrieve a short-lived access token. This can be done again through Python + +```Python +from maestral.main import Maestral + +m.client.dbx.refresh_access_token() # gets a short-lived auth token from server +print(m.client.dbx._oauth2_access_token) # prints the access token +``` + +or from the command line: + +```shell +auth_result=$(curl https://api.dropbox.com/oauth2/token \ + -d grant_type=refresh_token \ + -d refresh_token=$REFRESH_TOKEN \ + -d client_id=2jmbq42w7vof78h) +parse_response="import sys, json; print(json.load(sys.stdin)['access_token'])" +access_token=$(echo $auth_result | python3 -c "$parse_response") +``` + From bf1380cab576b468d578de8040b920c590304455 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 16 Dec 2020 00:54:41 +0000 Subject: [PATCH 102/374] rerun failed tests --- .github/workflows/test.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b12a1cead..1f8a237e8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,11 +40,12 @@ jobs: python -m pip install --upgrade pip python -m pip install --upgrade pytest python -m pip install --upgrade pytest-cov + python -m pip install --upgrade pytest-rerunfailures python -m pip install . - name: Test with pytest run: | - pytest --cov=maestral --cov-report=xml tests/offline + pytest --reruns 5 --cov=maestral --cov-report=xml tests/offline - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 @@ -97,6 +98,7 @@ jobs: python -m pip install --upgrade pip python -m pip install --upgrade pytest python -m pip install --upgrade pytest-cov + python -m pip install --upgrade pytest-rerunfailures python -m pip install . - name: Get short-lived Dropbox token @@ -114,7 +116,7 @@ jobs: - name: Test with pytest run: | - pytest --cov=maestral --cov-report=xml tests/linked + pytest --reruns 5 --cov=maestral --cov-report=xml tests/linked - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 From b44ae1bf4dd9b2f50e40031c975f0033d3df86ec Mon Sep 17 00:00:00 2001 From: SamSchott Date: Wed, 16 Dec 2020 11:05:59 +0000 Subject: [PATCH 103/374] Update CONTRIBUTING.md --- CONTRIBUTING.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 41c03732f..f9747fe39 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -79,8 +79,6 @@ This refresh token cannot be used to make API calls directly but should be used retrieve a short-lived access token. This can be done again through Python ```Python -from maestral.main import Maestral - m.client.dbx.refresh_access_token() # gets a short-lived auth token from server print(m.client.dbx._oauth2_access_token) # prints the access token ``` @@ -96,3 +94,6 @@ parse_response="import sys, json; print(json.load(sys.stdin)['access_token'])" access_token=$(echo $auth_result | python3 -c "$parse_response") ``` +You can then store the retrieved access token in the environement variable +`DROPBOX_TOKEN` to be automatically picked up by the tests. + From dd3211cf9056372f3b66b0be4dd0227d7600efc8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 16 Dec 2020 11:52:49 +0000 Subject: [PATCH 104/374] [docs] include Contributing section and clean up structure --- CONTRIBUTING.md | 10 ++++++---- docs/{ => background}/config_files.rst | 0 docs/background/index.rst | 15 +++++++++++++++ docs/{ => background}/log_handlers.csv | 0 docs/{ => background}/log_levels.csv | 0 docs/{ => background}/logging.rst | 0 docs/{ => background}/state_files.rst | 0 docs/{ => background}/sync_logic.rst | 0 docs/contributing.rst | 7 +++++++ docs/index.rst | 10 ++++------ 10 files changed, 32 insertions(+), 10 deletions(-) rename docs/{ => background}/config_files.rst (100%) create mode 100644 docs/background/index.rst rename docs/{ => background}/log_handlers.csv (100%) rename docs/{ => background}/log_levels.csv (100%) rename docs/{ => background}/logging.rst (100%) rename docs/{ => background}/state_files.rst (100%) rename docs/{ => background}/sync_logic.rst (100%) create mode 100644 docs/contributing.rst diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f9747fe39..1d2027b48 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,5 +1,5 @@ -## Guidelines +### Code To start, install maestral with the `dev` extra to get all dependencies required for development: @@ -8,7 +8,8 @@ development: pip3 install maestral[dev] ``` -### Checking the Format, Coding Style, and Type Hints +This will install packages to check and enforce the code style, use pre-commit hooks and +bump the current version. Code is formatted with [black](https://github.com/psf/black). Coding style is checked with [flake8](http://flake8.pycqa.org). @@ -23,7 +24,8 @@ pre-commit run -a ``` You can also install the provided pre-commit hook to run checks on every commit. This -will however significantly slow down commits. +will however significantly slow down commits. An introduction to pre-commit commit hooks +is given at [https://pre-commit.com](https://pre-commit.com). ### Documentation @@ -40,7 +42,7 @@ pip3 install maestral[docs] The API documentation is mostly based on doc strings. Inline comments should be used whenever code may be difficult to understand for others. -## Tests +### Tests The test suite uses a mixture of [unittest](https://docs.python.org/3.8/library/unittest.html) and [pytest](https://pytest-cov.readthedocs.io/en/latest/), depending on what is most diff --git a/docs/config_files.rst b/docs/background/config_files.rst similarity index 100% rename from docs/config_files.rst rename to docs/background/config_files.rst diff --git a/docs/background/index.rst b/docs/background/index.rst new file mode 100644 index 000000000..e6b62be56 --- /dev/null +++ b/docs/background/index.rst @@ -0,0 +1,15 @@ + +Background +========== + +This section introduces some of the design principles and functionality of the different +modules, including the sync functionality and how index and state data is stored locally. + +.. toctree:: + :caption: Contents + :maxdepth: 1 + + sync_logic + logging + config_files + state_files diff --git a/docs/log_handlers.csv b/docs/background/log_handlers.csv similarity index 100% rename from docs/log_handlers.csv rename to docs/background/log_handlers.csv diff --git a/docs/log_levels.csv b/docs/background/log_levels.csv similarity index 100% rename from docs/log_levels.csv rename to docs/background/log_levels.csv diff --git a/docs/logging.rst b/docs/background/logging.rst similarity index 100% rename from docs/logging.rst rename to docs/background/logging.rst diff --git a/docs/state_files.rst b/docs/background/state_files.rst similarity index 100% rename from docs/state_files.rst rename to docs/background/state_files.rst diff --git a/docs/sync_logic.rst b/docs/background/sync_logic.rst similarity index 100% rename from docs/sync_logic.rst rename to docs/background/sync_logic.rst diff --git a/docs/contributing.rst b/docs/contributing.rst new file mode 100644 index 000000000..1d6be9b98 --- /dev/null +++ b/docs/contributing.rst @@ -0,0 +1,7 @@ + +Contributing +============ + +Thank you for your interest in contributing! + +.. mdinclude:: ../CONTRIBUTING.md diff --git a/docs/index.rst b/docs/index.rst index d25343f5b..df40781dd 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,14 +8,12 @@ For a user manual and an overview of Maestral's functionality, please refer to the `wiki `_. .. toctree:: - :caption: Table of Contents - :maxdepth: 1 + :caption: Contents + :maxdepth: 2 - sync_logic - logging - config_files - state_files + background/index API Reference + contributing Getting started *************** From 66f593aa6a253555354ac56ca1fbba1343f9fc70 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 16 Dec 2020 11:54:09 +0000 Subject: [PATCH 105/374] removed doc string from __init__.py --- src/maestral/__init__.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/maestral/__init__.py b/src/maestral/__init__.py index c8bf040a2..11bf2dc8c 100644 --- a/src/maestral/__init__.py +++ b/src/maestral/__init__.py @@ -1,16 +1,4 @@ # -*- coding: utf-8 -*- -""" - -The following APIs should remain stable for frontends: - -* maestral.main.Maestral -* maestral.constants -* maestral.daemon -* maestral.errors -* maestral.utils.appdirs -* maestral.utils.autostart - -""" import warnings From dff19e415ff60731b9f922d3d26b60dbf3d0f735 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 16 Dec 2020 13:24:49 +0000 Subject: [PATCH 106/374] [daemon] make `set_executable` public and improve doc string --- src/maestral/daemon.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 382ad5abe..848264b5a 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -49,6 +49,7 @@ "sockpath_for_config", "lockpath_for_config", "is_running", + "set_executable", "start_maestral_daemon", "start_maestral_daemon_process", "stop_maestral_daemon_process", @@ -81,11 +82,10 @@ def set_executable(executable: str, *argv) -> None: """ - Sets the path of the Python interpreter to use when starting the daemon. By default - sys.executable is used. Can be used in case of an embedded Python executable. + Sets the path of the Python executable to use when starting the daemon. By default + :obj:`sys.executable` is used. Can be used when embedding the daemon. - :param executable: Path to Python executable which is used to start the daemon - process. + :param executable: Path to custom Python executable. :param argv: Any command line arguments to be injected before the daemon startup command. By default, "-OO" will be used. """ @@ -566,8 +566,8 @@ def start_maestral_daemon_process( """ Starts the Maestral daemon in a new process by calling :func:`start_maestral_daemon`. Startup is race free: there will never be two daemons running for the same config. - This function expects that :obj:`sys.executable` points to a Python executable. Use - :func:`set_executable` to override the default behavior. + This function will use :obj:`sys.executable` as a Python executable to start the + daemon. Use :func:`set_executable` to use a custom executable instead. :param config_name: The name of the Maestral configuration to use. :param start_sync: If ``True``, start syncing once the daemon has started. From 0f357710469d1fbff9e55f5a2b844a5a6fd58697 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 15:33:20 +0100 Subject: [PATCH 107/374] Fix errors from github review --- src/maestral/cli.py | 3 ++- src/maestral/main.py | 60 ++++++++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 020b87b2d..941590eea 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1574,7 +1574,7 @@ def color(ind: int, line: str) -> str: entries = m.list_revisions(dropbox_path) dates = [] for entry in entries: - cm = cast(str, entry["client_modified"]) + cm = cast(str, entry["client_modified"]).replace("Z", "+0000") dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() field = cli.DateField(dt) dates.append(field.format(40)[0]) @@ -1603,4 +1603,5 @@ def color(ind: int, line: str) -> str: elif len(rev) > 2: cli.warn("You can only compare two revisions at a time") return + click.echo("Loading ...") download_and_compare(m, *rev) diff --git a/src/maestral/main.py b/src/maestral/main.py index d9b293242..35c323dc1 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -36,7 +36,7 @@ import bugsnag # type: ignore from bugsnag.handlers import BugsnagHandler # type: ignore from packaging.version import Version -from datetime import datetime +from datetime import datetime, timezone try: from systemd import journal # type: ignore @@ -890,9 +890,10 @@ def get_file_diff( diff with the python difflib library. If new_rev is None, it will compare the old revision to the current file. - :param old_rev: Hash of old revision. - :param new_rev: Hash of new revision. - :returns: Diff as a list of lines. + :param dbx_path: Path to file on Dropbox. + :param old_rev: Identifier of old revision. + :param new_rev: Identifier of new revision. + :returns: Diff as a list of strings (lines). :raises UnsupportedFileTypeForDiff: if file type is not supported. :raises UnsupportedFileTypeForDiff: if file content could not be decoded. :raises MaestralApiError: if file could not be read for any other reason. @@ -903,24 +904,41 @@ def pretty_date(s: datetime) -> str: Prettify the 'client_modified' metadata. """ - return s.astimezone().strftime("%d %b %Y at %H:%M") + return ( + s.replace(tzinfo=timezone.utc) + .astimezone() + .strftime("%d %b %Y at %H:%M") + ) - def download_rev(f: IO[bytes], rev: str) -> Tuple[str, str]: + def download_rev(rev: str) -> Tuple[List[str], str]: """ - Download a rev to 'f' and return the location and the date. + Download a rev to a temporary file, read it and return + the content + the date and time of the modification. """ - location = f.name - date = pretty_date( - self.client.download(dbx_path, location, rev=rev).client_modified - ) - return (location, date) + # By default the file would be opened with "w+b" + with tempfile.NamedTemporaryFile(mode="w+") as f: + location = f.name + date = pretty_date( + self.client.download(dbx_path, location, rev=rev).client_modified + ) + # Read from the file + try: + with convert_api_errors(dbx_path=dbx_path, local_path=location): + content = f.readlines() + except UnicodeDecodeError: + raise UnsupportedFileTypeForDiff( + "Failed to decode the file.", + "Only UTF-8 plain text files are currently supported.", + ) + + return (content, date) all_revs = self.client.list_revisions(dbx_path).entries full_path = self.sync.to_local_path(dbx_path) # Check if a diff is possible - # If mime is None, procede because most files without + # If mime is None, proceed because most files without # an extension are just text files mime, _ = mimetypes.guess_type(full_path) if mime is not None and not mime.startswith("text/"): @@ -935,13 +953,11 @@ def download_rev(f: IO[bytes], rev: str) -> Tuple[str, str]: new_date = pretty_date(all_revs[0].client_modified) # Check if the revision is the newest - # and see if it is avaible locally; download it if not + # and see if it is available locally; download it if not if new_rev is not all_revs[0].rev: - tmp_n = tempfile.NamedTemporaryFile() - new_location, new_date = download_rev(tmp_n, new_rev) + new_content, new_date = download_rev(new_rev) - tmp_o = tempfile.NamedTemporaryFile() - old_location, old_date = download_rev(tmp_o, old_rev) + old_content, old_date = download_rev(old_rev) try: with convert_api_errors(dbx_path=dbx_path, local_path=new_location): @@ -951,13 +967,7 @@ def download_rev(f: IO[bytes], rev: str) -> Tuple[str, str]: # If the file was not found, retry download once # Possible if the file is only stored in the cloud except FileNotFoundError: - tmp_n = tempfile.NamedTemporaryFile() - new_location, new_date = self.client.download(tmp_n, new_rev) - with open(new_location) as f: - new_content = f.readlines() - with convert_api_errors(dbx_path=dbx_path, local_path=old_location): - with open(old_location) as f: - old_content = f.readlines() + new_content, new_date = download_rev(new_rev) except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( "Failed to decode the file.", From bc4a4531ccb09d9cc4c265ec584c71c187f2a2f3 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 15:35:27 +0100 Subject: [PATCH 108/374] Explain error if oldest version was selected --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 941590eea..90724cdb3 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1586,7 +1586,7 @@ def color(ind: int, line: str) -> str: ) if base == len(dates) - 1: - cli.warn("Oldest version selected as base") + cli.warn("Oldest version selected, unable to find anything to compare") return to_compare = ( From 30d68097e07d6733abf792984497304dd0f977c5 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 15:38:24 +0100 Subject: [PATCH 109/374] Remove unnecessary import --- src/maestral/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 35c323dc1..b2a2c5931 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -23,7 +23,6 @@ Awaitable, Optional, Any, - IO, ) import tempfile import mimetypes From 7cd802af794ba56495ba812d69dd170c1e30cde9 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 21:10:08 +0100 Subject: [PATCH 110/374] If new_rev is None, don't download anything and use the current version --- src/maestral/main.py | 40 ++++++++++++++-------------------------- 1 file changed, 14 insertions(+), 26 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index b2a2c5931..d44dcf4e4 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -917,13 +917,12 @@ def download_rev(rev: str) -> Tuple[List[str], str]: # By default the file would be opened with "w+b" with tempfile.NamedTemporaryFile(mode="w+") as f: - location = f.name date = pretty_date( - self.client.download(dbx_path, location, rev=rev).client_modified + self.client.download(dbx_path, f.name, rev=rev).client_modified ) # Read from the file try: - with convert_api_errors(dbx_path=dbx_path, local_path=location): + with convert_api_errors(dbx_path=dbx_path, local_path=f.name): content = f.readlines() except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( @@ -945,34 +944,23 @@ def download_rev(rev: str) -> Tuple[List[str], str]: f"Bad file type: '{mime}'", "Only files of type 'text/*' are supported." ) - # if new_rev is None, make it to the newest one + # If new_rev is None, the local file is used, even if it isn't synced if new_rev is None: - new_rev = all_revs[0].rev - new_location = full_path - new_date = pretty_date(all_revs[0].client_modified) - - # Check if the revision is the newest - # and see if it is available locally; download it if not - if new_rev is not all_revs[0].rev: + new_date = "Local version" + try: + with convert_api_errors(dbx_path=dbx_path, local_path=full_path): + with open(full_path) as f: + new_content = f.readlines() + except UnicodeDecodeError: + raise UnsupportedFileTypeForDiff( + "Failed to decode the file.", + "Only UTF-8 plain text files are currently supported.", + ) + else: new_content, new_date = download_rev(new_rev) old_content, old_date = download_rev(old_rev) - try: - with convert_api_errors(dbx_path=dbx_path, local_path=new_location): - try: - with open(new_location) as f: - new_content = f.readlines() - # If the file was not found, retry download once - # Possible if the file is only stored in the cloud - except FileNotFoundError: - new_content, new_date = download_rev(new_rev) - except UnicodeDecodeError: - raise UnsupportedFileTypeForDiff( - "Failed to decode the file.", - "Only UTF-8 plain text files are currently supported.", - ) - return list( difflib.unified_diff( old_content, From 5572295f5c451790660e6b821351ca74feaa000a Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 21:12:41 +0100 Subject: [PATCH 111/374] Add option to set local version as base rev --- src/maestral/cli.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 90724cdb3..f3bc293f8 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1572,7 +1572,7 @@ def color(ind: int, line: str) -> str: with MaestralProxy(config_name, fallback=True) as m: if len(rev) == 0: entries = m.list_revisions(dropbox_path) - dates = [] + dates = ["Local version"] for entry in entries: cm = cast(str, entry["client_modified"]).replace("Z", "+0000") dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() @@ -1582,7 +1582,7 @@ def color(ind: int, line: str) -> str: base = cli.select( message="New revision:", options=dates, - hint="(↓ to see more)" if len(dates) > 6 else "", + hint="(↓ to see more)" if len(dates) + 1 > 6 else "", ) if base == len(dates) - 1: @@ -1599,7 +1599,11 @@ def color(ind: int, line: str) -> str: + 1 ) - rev = [entries[to_compare]["rev"], entries[base]["rev"]] + rev = [ + entries[to_compare]["rev"], + # None will not download anything and instead use the local version + entries[base - 1]["rev"] if base != 0 else None, + ] elif len(rev) > 2: cli.warn("You can only compare two revisions at a time") return From 07f30390a202f367143f81bb25c1c0c88466c184 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 21:18:08 +0100 Subject: [PATCH 112/374] Fix flake8 errors --- src/maestral/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index d44dcf4e4..728114a3e 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -932,7 +932,6 @@ def download_rev(rev: str) -> Tuple[List[str], str]: return (content, date) - all_revs = self.client.list_revisions(dbx_path).entries full_path = self.sync.to_local_path(dbx_path) # Check if a diff is possible From a2804eff481be6a4077d2b2a3391c23114b46f4b Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Wed, 16 Dec 2020 22:29:20 +0100 Subject: [PATCH 113/374] Fix wrong calculation for compare rev index --- src/maestral/cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index f3bc293f8..ca6506fa1 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1582,21 +1582,21 @@ def color(ind: int, line: str) -> str: base = cli.select( message="New revision:", options=dates, - hint="(↓ to see more)" if len(dates) + 1 > 6 else "", + hint="(↓ to see more)" if len(dates) > 6 else "", ) if base == len(dates) - 1: cli.warn("Oldest version selected, unable to find anything to compare") return + comparable_versions = dates[base + 1 :] to_compare = ( cli.select( message="Old revision:", - options=dates[base + 1 :], - hint="(↓ to see more)" if len(dates[base + 1 :]) > 6 else "", + options=comparable_versions, + hint="(↓ to see more)" if len(comparable_versions) > 6 else "", ) + base - + 1 ) rev = [ From 82fc243d2df3e21252c7df13e877878156e14db1 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 16 Dec 2020 23:25:46 +0000 Subject: [PATCH 114/374] updated instructions for test.lock --- CONTRIBUTING.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1d2027b48..9403fdbc2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -61,9 +61,14 @@ The current test suite uses a Dropbox access token provided by the environment v `DROPBOX_TOKEN` to connect to a real account. The GitHub action which is running the tests will set this environment variable for you with a temporary access token that expires after 4 hours. Tests are run on `ubuntu-latest` and `macos-latest` in parallel -on different accounts and you should acquire a "lock" on the account before running -tests. Fixtures to create and clean up a test config and to acquire a lock are provided -in the `tests/linked/conftest.py`. +on different accounts. + +When using the GitHub test runner, you should acquire a "lock" on the account before +running tests to prevent them from interfering which each other by creating a folder +`test.lock` in the root of the Dropbox folder. This folder should have a +`client_modified` time set in the future, to the expiry time of the lock. Fixtures to +create and clean up a test config and to acquire a lock are provided in the +`tests/linked/conftest.py`. If you run the tests locally, you will need to provide an access token for your own Dropbox account. If your account is already linked with Maestral, it will have saved a @@ -96,6 +101,6 @@ parse_response="import sys, json; print(json.load(sys.stdin)['access_token'])" access_token=$(echo $auth_result | python3 -c "$parse_response") ``` -You can then store the retrieved access token in the environement variable +You can then store the retrieved access token in the environment variable `DROPBOX_TOKEN` to be automatically picked up by the tests. From 7306250c6cba730e110318efda7ccd575a08e237 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 4 Dec 2020 21:40:08 +0000 Subject: [PATCH 115/374] removed bugsnag error handling --- setup.py | 1 - src/maestral/constants.py | 1 - src/maestral/main.py | 56 +++------------------------------------ 3 files changed, 3 insertions(+), 55 deletions(-) diff --git a/setup.py b/setup.py index 39363b6e7..51fc36a4d 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,6 @@ # proceed with actual install install_requires = [ "alembic>=1.3,<1.5", - "bugsnag>=3.4,<5.0", "click>=7.1.1,<8.0", "dropbox>=10.9.0,<12.0", "dbus-next>=0.1.4;sys_platform=='linux'", diff --git a/src/maestral/constants.py b/src/maestral/constants.py index a58847c5e..89d185761 100644 --- a/src/maestral/constants.py +++ b/src/maestral/constants.py @@ -87,7 +87,6 @@ class FileStatus(Enum): FROZEN = BRIEFCASE or getattr(sys, "frozen", False) # keys -BUGSNAG_API_KEY = "081c05e2bf9730d5f55bc35dea15c833" DROPBOX_APP_KEY = "2jmbq42w7vof78h" # urls diff --git a/src/maestral/main.py b/src/maestral/main.py index d5bf9c729..c2143bcb2 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -5,7 +5,6 @@ import sys import os import os.path as osp -import platform import shutil import time import warnings @@ -18,8 +17,6 @@ # external imports import requests from watchdog.events import DirDeletedEvent, FileDeletedEvent # type: ignore -import bugsnag # type: ignore -from bugsnag.handlers import BugsnagHandler # type: ignore from packaging.version import Version try: @@ -57,39 +54,15 @@ ErrorType, ) from .utils.appdirs import get_log_path, get_cache_path, get_data_path -from .constants import BUGSNAG_API_KEY, IDLE, FileStatus, GITHUB_RELEASES_API +from .constants import IDLE, FileStatus, GITHUB_RELEASES_API -__all__ = [ - "Maestral", -] +__all__ = ["Maestral"] logger = logging.getLogger(__name__) -# set up error reporting but do not activate - -bugsnag.configure( - api_key=BUGSNAG_API_KEY, - app_version=__version__, - auto_notify=False, - auto_capture_sessions=False, -) - - -def bugsnag_global_callback(notification): - notification.add_tab( - "system", {"platform": platform.platform(), "python": platform.python_version()} - ) - cause = notification.exception.__cause__ - if cause: - notification.add_tab("original exception", error_to_dict(cause)) - - -bugsnag.before_notify(bugsnag_global_callback) - - # ====================================================================================== # Main API # ====================================================================================== @@ -141,9 +114,6 @@ def __init__( self._conf = MaestralConfig(self._config_name) self._state = MaestralState(self._config_name) - # enable / disable automatic reporting of errors - bugsnag.configure(auto_notify=self.analytics) - # set up logging self._log_to_stdout = log_to_stdout self._setup_logging() @@ -241,8 +211,7 @@ def unlink(self) -> None: def _setup_logging(self) -> None: """ Sets up logging to log files, status and error properties, desktop notifications, - the systemd journal if available, bugsnag if error reports are enabled, and to - stdout if requested. + the systemd journal if available, and to stdout if requested. """ self._logger = logging.getLogger("maestral") @@ -313,11 +282,6 @@ def _setup_logging(self) -> None: self._log_handler_desktop_notifier.setLevel(logging.WARNING) self._logger.addHandler(self._log_handler_desktop_notifier) - # log to bugsnag (disabled by default) - self._log_handler_bugsnag = BugsnagHandler() - self._log_handler_bugsnag.setLevel(logging.ERROR if self.analytics else 100) - self._logger.addHandler(self._log_handler_bugsnag) - # ==== methods to access config and saved state ==================================== @property @@ -471,20 +435,6 @@ def log_to_stdout(self, enabled: bool) -> None: level = self.log_level if enabled else 100 self.log_handler_stream.setLevel(level) - @property - def analytics(self) -> bool: - """Enables or disables logging of errors to bugsnag.""" - return self._conf.get("app", "analytics") - - @analytics.setter - def analytics(self, enabled: bool) -> None: - """Setter: analytics.""" - - bugsnag.configure(auto_notify=self.analytics) - self._log_handler_bugsnag.setLevel(logging.ERROR if enabled else 100) - - self._conf.set("app", "analytics", enabled) - @property def notification_snooze(self) -> float: """Snooze time for desktop notifications in minutes. Defaults to 0.0 if From 0661df8a76e59475ed3aafad04a3a7620a18d637 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 4 Dec 2020 21:40:24 +0000 Subject: [PATCH 116/374] removed bugsnag references from docs --- docs/background/log_handlers.csv | 3 +-- docs/background/logging.rst | 4 +--- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/background/log_handlers.csv b/docs/background/log_handlers.csv index 9912c20a2..4de90f1cd 100644 --- a/docs/background/log_handlers.csv +++ b/docs/background/log_handlers.csv @@ -5,5 +5,4 @@ Systemd journal,User defined (default: INFO),If started as systemd service Systemd notify status,INFO,If started as systemd notify service :attr:`Maestral.status` API,INFO,Alyways Desktop notifications,WARNING,Alyways -:attr:`Maestral.fatal_errors` API,ERROR,Alyways -Bugsnag,ERROR,Disabled by default \ No newline at end of file +:attr:`Maestral.fatal_errors` API,ERROR,Alyways \ No newline at end of file diff --git a/docs/background/logging.rst b/docs/background/logging.rst index 11987e0e8..da7bf7e00 100644 --- a/docs/background/logging.rst +++ b/docs/background/logging.rst @@ -18,9 +18,7 @@ internal usage, others for external communication. For instance, cached logging are used to populate the public APIs :attr:`Maestral.status` and :attr:`Maestral.fatal_errors` and therefore use fixed log levels. Logging to stderr, the systemd journal (if applicable) and to our log files uses the user defined log level -from :attr:`Maestral.log_level` which defaults to INFO. Finally, the Bugsnag -error handler which sends all errors to a server for analytics must be explicitly -enabled by the user and has a fixed log level of ERROR. +from :attr:`Maestral.log_level` which defaults to INFO. .. csv-table:: :file: log_handlers.csv From 25899d9cd45ed990d7baa6185b9d2d035f2b9b7a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 17 Dec 2020 11:40:20 +0000 Subject: [PATCH 117/374] [cli] remove analytics command --- src/maestral/cli.py | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index b7b4213ec..0204620b4 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1286,38 +1286,6 @@ def notify_snooze(minutes: int, config_name: str) -> None: cli.ok("Notifications enabled.") -@main.command( - section="Settings", - help=""" -Enable or disables sharing of error reports. - -Sharing is disabled by default. If enabled, error reports are shared with bugsnag and no -personal information will typically be collected. Shared tracebacks may however include -file names, depending on the error. -""", -) -@click.option("--yes", "-Y", is_flag=True, default=False) -@click.option("--no", "-N", is_flag=True, default=False) -@existing_config_option -def analytics(yes: bool, no: bool, config_name: str) -> None: - from .daemon import MaestralProxy - - if yes or no: - with MaestralProxy(config_name, fallback=True) as m: - m.analytics = yes - - status_str = "Enabled" if yes else "Disabled" - cli.ok(f"{status_str} automatic error reports.") - else: - with MaestralProxy(config_name, fallback=True) as m: - enabled = m.analytics - - if enabled: - cli.echo("Analytics are enabled. Use -N to disable") - else: - cli.echo("Analytics are disabled. Use -Y to enable") - - # ====================================================================================== # Maintenance # ====================================================================================== From b56477152021da2a0784e1bf0b1347e49ea01a6c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 17 Dec 2020 12:15:39 +0000 Subject: [PATCH 118/374] [notify_macos] use NSUserNotificationCenter for macOS < 12.0 --- src/maestral/notify/notify_macos.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/notify/notify_macos.py b/src/maestral/notify/notify_macos.py index f12760635..0d3975760 100644 --- a/src/maestral/notify/notify_macos.py +++ b/src/maestral/notify/notify_macos.py @@ -230,7 +230,7 @@ def _category_id_for_button_names( Impl = CocoaNotificationCenter -elif Version(macos_version) < Version("11.1.0"): +elif Version(macos_version) < Version("12.0.0"): NSUserNotification = ObjCClass("NSUserNotification") NSUserNotificationCenter = ObjCClass("NSUserNotificationCenter") From ef472ae39757142b79982b08a4af5250faaffc08 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 18 Dec 2020 17:30:40 +0100 Subject: [PATCH 119/374] Add '--limit' flag to limit revs to query --- src/maestral/cli.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index ca6506fa1..a57db951c 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1515,11 +1515,23 @@ def log_level(level_name: str, config_name: str) -> None: ) @click.option("--no-color", help="Don't use any colors for the diff", is_flag=True) @click.option("--no-pager", help="Don't use a pager for output", is_flag=True) +@click.option( + "-l", + "--limit", + help="Maximum number of old revisions", + type=click.IntRange(min=1, max=100), + default=10, +) @catch_maestral_errors @existing_config_option # If new_version_hash is omitted, use the current version of the file def diff( - dropbox_path: str, rev: List[str], no_color: bool, no_pager: bool, config_name: str + dropbox_path: str, + rev: List[str], + no_color: bool, + no_pager: bool, + limit: int, + config_name: str, ) -> None: from datetime import datetime @@ -1571,7 +1583,7 @@ def color(ind: int, line: str) -> str: with MaestralProxy(config_name, fallback=True) as m: if len(rev) == 0: - entries = m.list_revisions(dropbox_path) + entries = m.list_revisions(dropbox_path, limit=limit) dates = ["Local version"] for entry in entries: cm = cast(str, entry["client_modified"]).replace("Z", "+0000") From 2c2bbe03e7be2bd49c7d813d4876319e720706c4 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 18 Dec 2020 17:34:12 +0100 Subject: [PATCH 120/374] Change help description for 'diff' subcommand --- src/maestral/cli.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index a57db951c..ea9bbb7db 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1499,9 +1499,10 @@ def log_level(level_name: str, config_name: str) -> None: @main.command( section="Maintenance", help=""" -Compare changes of two revisions of a file. +Compare changes between two revisions of a file. -If the second revision is omitted, it will compare the file to the currently downloaded version. +If no revs are passed to the cmd, you can select the revisions interactively. +If only the second revision is omitted, it will compare the file to the currently downloaded version. The specified revisions will be downloaded if necessary. A pager will be used, if there are more than 50 lines. """, ) From 1984501b9e15ee7e9e8a0cf79da9dcd2f4bd0286 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Fri, 18 Dec 2020 17:40:27 +0100 Subject: [PATCH 121/374] Add info text when no changes were detected + overwrite 'Loading ...' message --- src/maestral/cli.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index ea9bbb7db..d376ae0a9 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1552,6 +1552,10 @@ def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): diff = m.get_file_diff(dropbox_path, old_rev, new_rev) + if len(diff) == 0: + click.echo("There are no changes between the two revisions.") + return + def color(ind: int, line: str) -> str: """ Color diff lines. @@ -1620,5 +1624,7 @@ def color(ind: int, line: str) -> str: elif len(rev) > 2: cli.warn("You can only compare two revisions at a time") return - click.echo("Loading ...") + # '\r' will put the cursor to the beginning of the line + # so the next characters will overwrite it + click.echo("Loading ...\r", nl=False) download_and_compare(m, *rev) From 7ab2044ab202edc3c860881d06fb8c5aa5d3090b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 18 Dec 2020 17:23:58 +0000 Subject: [PATCH 122/374] [client] handle [Errno 41] Protocol wrong type for socket on macos see https://bugs.python.org/issue33450 --- src/maestral/client.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 80ead39d3..982506b7e 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -187,7 +187,11 @@ def convert_api_errors( except CONNECTION_ERRORS: raise ConnectionError("Cannot connect to Dropbox") except OSError as exc: - raise os_to_maestral_error(exc, dbx_path, local_path) + if exc.errno == errno.EPROTOTYPE: + # Can occur on macOS, see https://bugs.python.org/issue33450 + raise ConnectionError("Cannot connect to Dropbox") + else: + raise os_to_maestral_error(exc, dbx_path, local_path) def convert_api_errors_decorator( From cf5240d328175930affc2479a4cc30a62918d355 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 18 Dec 2020 17:25:51 +0000 Subject: [PATCH 123/374] [client] simplify error conversion --- src/maestral/client.py | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 982506b7e..bb50dc455 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -210,20 +210,14 @@ def decorator(func: _FT) -> _FT: @functools.wraps(func) def wrapper(*args, **kwargs) -> Any: - if dbx_path_arg: - try: - dbx_path = args[dbx_path_arg] - except IndexError: - dbx_path = None - else: + try: + dbx_path = args[dbx_path_arg] # type: ignore + except (IndexError, TypeError): dbx_path = None - if local_path_arg: - try: - local_path = args[local_path_arg] - except IndexError: - local_path = None - else: + try: + local_path = args[local_path_arg] # type: ignore + except (IndexError, TypeError): local_path = None with convert_api_errors(dbx_path, local_path): From 80e2d2238285615d871c924cc480c56dd2261ed3 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 18 Dec 2020 17:29:29 +0000 Subject: [PATCH 124/374] update changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 239845df8..0ee4e3dec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,19 @@ * Fixes an issue with CLI on Python 3.6 where commands that print datetimes 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. + +#### Removed: + +* Removed automatic error reporting via bugsnag. Please file issues directly on GitHub + instead. This allows following up on errors and investigating their cause while + removing third party access to potentially private information. #### Dependencies: * Bumped survey to version >=3.2.2,<4.0. +* Removed bugsnag dependency. ## v1.3.1 From 119a51f6f29e6d9a87cb9f568f6df9787232c1ac Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 19 Dec 2020 18:26:16 +0100 Subject: [PATCH 125/374] Small improvements to status messages --- src/maestral/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index d376ae0a9..a5869d917 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1603,7 +1603,7 @@ def color(ind: int, line: str) -> str: ) if base == len(dates) - 1: - cli.warn("Oldest version selected, unable to find anything to compare") + cli.warn("Oldest revision selected, unable to find anything to compare.") return comparable_versions = dates[base + 1 :] @@ -1622,7 +1622,7 @@ def color(ind: int, line: str) -> str: entries[base - 1]["rev"] if base != 0 else None, ] elif len(rev) > 2: - cli.warn("You can only compare two revisions at a time") + cli.warn("You can only compare two revisions at a time.") return # '\r' will put the cursor to the beginning of the line # so the next characters will overwrite it From 52d1db0a96675a15d1f99000191f6c56c4e0ce79 Mon Sep 17 00:00:00 2001 From: Finn Hediger Date: Sat, 19 Dec 2020 18:28:48 +0100 Subject: [PATCH 126/374] Fix formatting --- src/maestral/cli.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index a5869d917..c9c0bfcdf 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1603,7 +1603,9 @@ def color(ind: int, line: str) -> str: ) if base == len(dates) - 1: - cli.warn("Oldest revision selected, unable to find anything to compare.") + cli.warn( + "Oldest revision selected, unable to find anything to compare." + ) return comparable_versions = dates[base + 1 :] From 03b333ad030bc9dc9dc6184321e2e9b8c325cdc0 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 21 Dec 2020 07:20:14 +0000 Subject: [PATCH 127/374] Bump sphinx from 3.3.1 to 3.4.0 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 3.3.1 to 3.4.0. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v3.3.1...v3.4.0) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 32d09ea2d..6b9701ab4 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 -sphinx==3.3.1 +sphinx==3.4.0 sphinx-autoapi==1.5.1 sphinx_rtd_theme==0.5.0 \ No newline at end of file From 879cba4408526ea6cc2718bbb23459eb97e7b115 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 16:02:51 +0000 Subject: [PATCH 128/374] tweaked cli help text --- src/maestral/cli.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c9c0bfcdf..e5e43aeb2 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1382,7 +1382,7 @@ def rebuild_index(config_name: str) -> None: """, ) @click.argument("dropbox_path", type=click.Path()) -@click.option("-v", "--rev", help="Revision to restore", default="") +@click.option("-v", "--rev", help="Revision to restore.", default="") @existing_config_option @catch_maestral_errors def restore(dropbox_path: str, rev: str, config_name: str) -> None: @@ -1499,27 +1499,32 @@ def log_level(level_name: str, config_name: str) -> None: @main.command( section="Maintenance", help=""" -Compare changes between two revisions of a file. +Compare two revisions of a file. -If no revs are passed to the cmd, you can select the revisions interactively. -If only the second revision is omitted, it will compare the file to the currently downloaded version. -The specified revisions will be downloaded if necessary. A pager will be used, if there are more than 50 lines. +If no revs are passed to the command, you can select the revisions interactively. If +only one rev is passed, it is compared to the local version of the file. The diff is +shown via a pager if longer 30 lines. + +Warning: The specified revisions will be downloaded to temp files and loaded into memory +to generate the diff. Depending on the file size, this may use significant disk space +and memory. """, ) -@click.argument("dropbox_path", type=click.Path()) +@click.argument("dropbox_path", type=DropboxPath()) @click.option( "-v", "--rev", - help="Revisions to compare (mulitple allowed to compare two old revs)", + help="Revisions to compare (multiple allowed).", multiple=True, default=[], ) -@click.option("--no-color", help="Don't use any colors for the diff", is_flag=True) -@click.option("--no-pager", help="Don't use a pager for output", is_flag=True) +@click.option("--no-color", help="Don't use colors for the diff.", is_flag=True) +@click.option("--no-pager", help="Don't use a pager for output.", is_flag=True) @click.option( "-l", "--limit", - help="Maximum number of old revisions", + help="Maximum number of revs to list.", + show_default=True, type=click.IntRange(min=1, max=100), default=10, ) From 1227cae573ccad07747991ee971a15105e80086e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 16:03:29 +0000 Subject: [PATCH 129/374] removed stray comment --- src/maestral/cli.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index e5e43aeb2..93b34a8cf 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1530,7 +1530,6 @@ def log_level(level_name: str, config_name: str) -> None: ) @catch_maestral_errors @existing_config_option -# If new_version_hash is omitted, use the current version of the file def diff( dropbox_path: str, rev: List[str], From 59c79b1f05abf9bd5a77ddee23e757fc76dea207 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 16:04:57 +0000 Subject: [PATCH 130/374] fixed typing --- src/maestral/cli.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 93b34a8cf..8cfefbfe1 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1546,7 +1546,9 @@ def diff( if not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path - def download_and_compare(m: MaestralProxy, old_rev: str, new_rev: str = None): + def download_and_compare( + m: MaestralProxy, old_rev: str, new_rev: Optional[str] = None + ) -> None: """ Download up to two revisions to a local temporary folder and compare them with a 'diff'. Only text files are supported. From a7a65ed8293f11dade09a71b596b685b51d71a17 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 16:07:45 +0000 Subject: [PATCH 131/374] minor cleanup in flow --- src/maestral/cli.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 8cfefbfe1..712bf93f3 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1585,12 +1585,10 @@ def color(ind: int, line: str) -> str: diff = [color(i, l) for i, l in enumerate(diff)] # Enter pager if diff is too long - if not no_pager: - if len(diff) > 30: - click.echo_via_pager("".join(diff)) - return - - click.echo("".join(diff)) + if len(diff) > 30 and not no_pager: + click.echo_via_pager("".join(diff)) + else: + click.echo("".join(diff)) with MaestralProxy(config_name, fallback=True) as m: if len(rev) == 0: From b9fea4b65afa2a6833aba5cd1e258909d1cc37b4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 16:11:31 +0000 Subject: [PATCH 132/374] be more explicit about old_rev and new_rev --- src/maestral/cli.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 712bf93f3..272b335fd 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1622,15 +1622,20 @@ def color(ind: int, line: str) -> str: + base ) - rev = [ - entries[to_compare]["rev"], - # None will not download anything and instead use the local version - entries[base - 1]["rev"] if base != 0 else None, - ] + old_rev = entries[to_compare]["rev"] + # None will not download anything and instead use the local version + new_rev = entries[base - 1]["rev"] if base != 0 else None + elif len(rev) == 1: + old_rev = rev[0] + new_rev = None + elif len(rev) == 2: + old_rev = rev[0] + new_rev = rev[1] elif len(rev) > 2: cli.warn("You can only compare two revisions at a time.") return + # '\r' will put the cursor to the beginning of the line # so the next characters will overwrite it click.echo("Loading ...\r", nl=False) - download_and_compare(m, *rev) + download_and_compare(m, old_rev, new_rev) From af1009cb9bcd9969e023569b79995f0ed248a144 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 17:06:02 +0000 Subject: [PATCH 133/374] only offer local version if it exists --- src/maestral/cli.py | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 272b335fd..8d18fcef1 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1593,38 +1593,41 @@ def color(ind: int, line: str) -> str: with MaestralProxy(config_name, fallback=True) as m: if len(rev) == 0: entries = m.list_revisions(dropbox_path, limit=limit) - dates = ["Local version"] + for entry in entries: cm = cast(str, entry["client_modified"]).replace("Z", "+0000") dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() field = cli.DateField(dt) - dates.append(field.format(40)[0]) + entry["desc"] = field.format(40)[0] + + dbx_path = cast(str, entries[0]["path_display"]) + local_path = m.to_local_path(dbx_path) + + if osp.isfile(local_path): + # prepend local version as an option + entries.insert(0, {"desc": "local version", "rev": None}) - base = cli.select( + index_base = cli.select( message="New revision:", - options=dates, - hint="(↓ to see more)" if len(dates) > 6 else "", + options=list(e["desc"] for e in entries), + hint="(↓ to see more)" if len(entries) > 6 else "", ) - if base == len(dates) - 1: + if index_base == len(entries) - 1: cli.warn( "Oldest revision selected, unable to find anything to compare." ) return - comparable_versions = dates[base + 1 :] - to_compare = ( - cli.select( - message="Old revision:", - options=comparable_versions, - hint="(↓ to see more)" if len(comparable_versions) > 6 else "", - ) - + base + comparable_versions = entries[index_base + 1 :] + index_new = cli.select( + message="Old revision:", + options=list(e["desc"] for e in comparable_versions), + hint="(↓ to see more)" if len(comparable_versions) > 6 else "", ) - old_rev = entries[to_compare]["rev"] - # None will not download anything and instead use the local version - new_rev = entries[base - 1]["rev"] if base != 0 else None + old_rev = entries[index_new + index_base]["rev"] + new_rev = entries[index_base]["rev"] elif len(rev) == 1: old_rev = rev[0] new_rev = None From d0270fd01da3772efeaf45262365fe8e65b844c1 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 17:17:30 +0000 Subject: [PATCH 134/374] minor code style tweaks --- src/maestral/main.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 728114a3e..e7e874c96 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -885,9 +885,9 @@ def get_file_diff( self, dbx_path: str, old_rev: str, new_rev: Optional[str] = None ) -> List[str]: """ - Download the two revisions if necessary and create a - diff with the python difflib library. If new_rev is None, - it will compare the old revision to the current file. + Download the two revisions if necessary and create a diff with the python + difflib library. If new_rev is None, it will compare the old revision to the + local file. :param dbx_path: Path to file on Dropbox. :param old_rev: Identifier of old revision. @@ -898,13 +898,13 @@ def get_file_diff( :raises MaestralApiError: if file could not be read for any other reason. """ - def pretty_date(s: datetime) -> str: + def pretty_date(d: datetime) -> str: """ Prettify the 'client_modified' metadata. """ return ( - s.replace(tzinfo=timezone.utc) + d.replace(tzinfo=timezone.utc) .astimezone() .strftime("%d %b %Y at %H:%M") ) @@ -917,20 +917,20 @@ def download_rev(rev: str) -> Tuple[List[str], str]: # By default the file would be opened with "w+b" with tempfile.NamedTemporaryFile(mode="w+") as f: - date = pretty_date( - self.client.download(dbx_path, f.name, rev=rev).client_modified - ) + md = self.client.download(dbx_path, f.name, rev=rev) + date = pretty_date(md.client_modified) + # Read from the file try: with convert_api_errors(dbx_path=dbx_path, local_path=f.name): content = f.readlines() except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( - "Failed to decode the file.", + "Failed to decode the file", "Only UTF-8 plain text files are currently supported.", ) - return (content, date) + return content, date full_path = self.sync.to_local_path(dbx_path) @@ -952,7 +952,7 @@ def download_rev(rev: str) -> Tuple[List[str], str]: new_content = f.readlines() except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( - "Failed to decode the file.", + "Failed to decode the file", "Only UTF-8 plain text files are currently supported.", ) else: From 422baa2e157a3a26c6de62198dba7f948ccc7ae9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 21:37:03 +0000 Subject: [PATCH 135/374] [cli] use click's builtin version option --- src/maestral/cli.py | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index de184bec6..22c32d9e0 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -465,17 +465,9 @@ def format_commands( no_args_is_help=True, help="Dropbox client for Linux and macOS.", ) -@click.option( - "--version", - "-V", - is_flag=True, - default=False, - help="Show version and exit.", -) -def main(version: bool): - - if version: - click.echo(__version__) +@click.version_option(version=__version__, message=__version__) +def main(): + pass # ====================================================================================== From bf30563fbd2742428fd63153d5486cd40fa5c186 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 21:37:53 +0000 Subject: [PATCH 136/374] [cli] provide -Y flag unlink without confirmation --- src/maestral/cli.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 22c32d9e0..08b0ca06d 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -732,12 +732,15 @@ def link(relink: bool, config_name: str) -> None: If Maestral is running, it will be stopped before unlinking. """, ) +@click.option("--yes", "-Y", is_flag=True, default=False) @existing_config_option @catch_maestral_errors -def unlink(config_name: str) -> None: +def unlink(yes: bool, config_name: str) -> None: - if cli.confirm("Are you sure you want unlink your account?", default=False): + if not yes: + cli.confirm("Are you sure you want unlink your account?", default=False) + if yes: from .main import Maestral stop_daemon_with_cli_feedback(config_name) From 6a4ba146dbb0d09ed701454224240eab23668763 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 21:46:12 +0000 Subject: [PATCH 137/374] [cli] resurrected `revs` command --- src/maestral/cli.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 08b0ca06d..7e7c3f07d 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1340,6 +1340,34 @@ def rebuild_index(config_name: str) -> None: cli.ok("Rebuilding now. Run 'maestral status' to view progress.") +@main.command(section="Maintenance", help="List old file revisions.") +@click.argument("dropbox_path", type=DropboxPath()) +@existing_config_option +@catch_maestral_errors +def revs(dropbox_path: str, config_name: str) -> None: + + from datetime import datetime + from .daemon import MaestralProxy + + with MaestralProxy(config_name, fallback=True) as m: + + entries = m.list_revisions(dropbox_path) + + table = cli.Table(["Revision", "Modified Time"]) + + for entry in entries: + + rev = cast(str, entry["rev"]) + cm = cast(str, entry["client_modified"]).replace("Z", "+0000") + dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() + + table.append([cli.TextField(rev), cli.DateField(dt)]) + + cli.echo("") + table.echo() + cli.echo("") + + @main.command( section="Maintenance", help=""" From 8f6ca079be25aa3501ba61ffd0f26724a9c12a9e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 21:46:41 +0000 Subject: [PATCH 138/374] [cli] changed command order --- src/maestral/cli.py | 246 ++++++++++++++++++++++---------------------- 1 file changed, 123 insertions(+), 123 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 7e7c3f07d..9c6fc9f4f 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1368,129 +1368,6 @@ def revs(dropbox_path: str, config_name: str) -> None: cli.echo("") -@main.command( - section="Maintenance", - help=""" -Restore a previous version of a file. - -If no revision number is given, old revisions will be listed. -""", -) -@click.argument("dropbox_path", type=click.Path()) -@click.option("-v", "--rev", help="Revision to restore.", default="") -@existing_config_option -@catch_maestral_errors -def restore(dropbox_path: str, rev: str, config_name: str) -> None: - from datetime import datetime - from .daemon import MaestralProxy - - if not dropbox_path.startswith("/"): - dropbox_path = "/" + dropbox_path - - with MaestralProxy(config_name, fallback=True) as m: - - if not rev: - cli.echo("Loading...\r", nl=False) - entries = m.list_revisions(dropbox_path) - dates = [] - for entry in entries: - cm = cast(str, entry["client_modified"]).replace("Z", "+0000") - dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() - field = cli.DateField(dt) - dates.append(field.format(40)[0]) - - index = cli.select( - message="Select a version to restore:", - options=dates, - hint="(↓ to see more)" if len(entries) > 6 else "", - ) - rev = cast(str, entries[index]["rev"]) - - m.restore(dropbox_path, rev) - - cli.ok(f'Restored {rev} to "{dropbox_path}"') - - -@main.group(section="Maintenance", help="View and manage the log.") -def log(): - pass - - -@log.command(name="show", help="Print logs to the console.") -@click.option( - "--external", "-e", is_flag=True, default=False, help="Open in external program." -) -@existing_config_option -def log_show(external: bool, config_name: str) -> None: - - from .utils.appdirs import get_log_path - - log_file = get_log_path("maestral", config_name + ".log") - - if external: - res = click.launch(log_file) - else: - try: - with open(log_file) as f: - text = f.read() - click.echo_via_pager(text) - except OSError: - res = 1 - else: - res = 0 - - if res > 0: - raise cli.CliException(f"Could not open log file at '{log_file}'") - - -@log.command(name="clear", help="Clear the log files.") -@existing_config_option -def log_clear(config_name: str) -> None: - - from .utils.appdirs import get_log_path - - log_dir = get_log_path("maestral") - log_name = config_name + ".log" - - log_files = [] - - for file_name in os.listdir(log_dir): - if file_name.startswith(log_name): - log_files.append(os.path.join(log_dir, file_name)) - - try: - for file in log_files: - open(file, "w").close() - cli.ok("Cleared log files.") - except FileNotFoundError: - cli.ok("Cleared log files.") - except OSError: - raise cli.CliException( - f"Could not clear log at '{log_dir}'. " f"Please try to delete it manually" - ) - - -@log.command(name="level", help="Get or set the log level.") -@click.argument( - "level_name", - required=False, - type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR"]), -) -@existing_config_option -def log_level(level_name: str, config_name: str) -> None: - - import logging - from .daemon import MaestralProxy - - with MaestralProxy(config_name, fallback=True) as m: - if level_name: - m.log_level = cast(int, getattr(logging, level_name)) - cli.ok(f"Log level set to {level_name}.") - else: - level_name = logging.getLevelName(m.log_level) - cli.echo(f"Log level: {level_name}") - - @main.command( section="Maintenance", help=""" @@ -1637,3 +1514,126 @@ def color(ind: int, line: str) -> str: # so the next characters will overwrite it click.echo("Loading ...\r", nl=False) download_and_compare(m, old_rev, new_rev) + + +@main.command( + section="Maintenance", + help=""" +Restore a previous version of a file. + +If no revision number is given, old revisions will be listed. +""", +) +@click.argument("dropbox_path", type=click.Path()) +@click.option("-v", "--rev", help="Revision to restore.", default="") +@existing_config_option +@catch_maestral_errors +def restore(dropbox_path: str, rev: str, config_name: str) -> None: + from datetime import datetime + from .daemon import MaestralProxy + + if not dropbox_path.startswith("/"): + dropbox_path = "/" + dropbox_path + + with MaestralProxy(config_name, fallback=True) as m: + + if not rev: + cli.echo("Loading...\r", nl=False) + entries = m.list_revisions(dropbox_path) + dates = [] + for entry in entries: + cm = cast(str, entry["client_modified"]).replace("Z", "+0000") + dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() + field = cli.DateField(dt) + dates.append(field.format(40)[0]) + + index = cli.select( + message="Select a version to restore:", + options=dates, + hint="(↓ to see more)" if len(entries) > 6 else "", + ) + rev = cast(str, entries[index]["rev"]) + + m.restore(dropbox_path, rev) + + cli.ok(f'Restored {rev} to "{dropbox_path}"') + + +@main.group(section="Maintenance", help="View and manage the log.") +def log(): + pass + + +@log.command(name="show", help="Print logs to the console.") +@click.option( + "--external", "-e", is_flag=True, default=False, help="Open in external program." +) +@existing_config_option +def log_show(external: bool, config_name: str) -> None: + + from .utils.appdirs import get_log_path + + log_file = get_log_path("maestral", config_name + ".log") + + if external: + res = click.launch(log_file) + else: + try: + with open(log_file) as f: + text = f.read() + click.echo_via_pager(text) + except OSError: + res = 1 + else: + res = 0 + + if res > 0: + raise cli.CliException(f"Could not open log file at '{log_file}'") + + +@log.command(name="clear", help="Clear the log files.") +@existing_config_option +def log_clear(config_name: str) -> None: + + from .utils.appdirs import get_log_path + + log_dir = get_log_path("maestral") + log_name = config_name + ".log" + + log_files = [] + + for file_name in os.listdir(log_dir): + if file_name.startswith(log_name): + log_files.append(os.path.join(log_dir, file_name)) + + try: + for file in log_files: + open(file, "w").close() + cli.ok("Cleared log files.") + except FileNotFoundError: + cli.ok("Cleared log files.") + except OSError: + raise cli.CliException( + f"Could not clear log at '{log_dir}'. " f"Please try to delete it manually" + ) + + +@log.command(name="level", help="Get or set the log level.") +@click.argument( + "level_name", + required=False, + type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR"]), +) +@existing_config_option +def log_level(level_name: str, config_name: str) -> None: + + import logging + from .daemon import MaestralProxy + + with MaestralProxy(config_name, fallback=True) as m: + if level_name: + m.log_level = cast(int, getattr(logging, level_name)) + cli.ok(f"Log level set to {level_name}.") + else: + level_name = logging.getLevelName(m.log_level) + cli.echo(f"Log level: {level_name}") From dd956358c3f25db76dd1cc8abd32b50fadc760d4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 23 Dec 2020 21:53:42 +0000 Subject: [PATCH 139/374] updated changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ee4e3dec..3aea9a96a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,15 @@ ## v1.3.2.dev +#### Added: + +* Add a command `maestral diff` to compare different versions of a text file. The + resulting diff is printed to the console. Thanks to @OrangeFran. +* Resurrected the command `maestral revs` to list previous versions or a file. + +#### Changed: + +* Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. + #### Fixes: * Fixes an issue with CLI on Python 3.6 where commands that print datetimes to the From 7908e1e3e30db3feb3288e57238336bae85664d7 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 24 Dec 2020 18:20:33 +0000 Subject: [PATCH 140/374] [cli] added --limit option to revs and restore --- src/maestral/cli.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 9c6fc9f4f..22d1a1d9a 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1342,16 +1342,23 @@ def rebuild_index(config_name: str) -> None: @main.command(section="Maintenance", help="List old file revisions.") @click.argument("dropbox_path", type=DropboxPath()) +@click.option( + "-l", + "--limit", + help="Maximum number of revs to list.", + show_default=True, + type=click.IntRange(min=1, max=100), + default=10, +) @existing_config_option @catch_maestral_errors -def revs(dropbox_path: str, config_name: str) -> None: +def revs(dropbox_path: str, limit: int, config_name: str) -> None: from datetime import datetime from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: - - entries = m.list_revisions(dropbox_path) + entries = m.list_revisions(dropbox_path, limit=limit) table = cli.Table(["Revision", "Modified Time"]) @@ -1526,9 +1533,17 @@ def color(ind: int, line: str) -> str: ) @click.argument("dropbox_path", type=click.Path()) @click.option("-v", "--rev", help="Revision to restore.", default="") +@click.option( + "-l", + "--limit", + help="Maximum number of revs to list.", + show_default=True, + type=click.IntRange(min=1, max=100), + default=10, +) @existing_config_option @catch_maestral_errors -def restore(dropbox_path: str, rev: str, config_name: str) -> None: +def restore(dropbox_path: str, rev: str, limit: int, config_name: str) -> None: from datetime import datetime from .daemon import MaestralProxy @@ -1539,7 +1554,7 @@ def restore(dropbox_path: str, rev: str, config_name: str) -> None: if not rev: cli.echo("Loading...\r", nl=False) - entries = m.list_revisions(dropbox_path) + entries = m.list_revisions(dropbox_path, limit=limit) dates = [] for entry in entries: cm = cast(str, entry["client_modified"]).replace("Z", "+0000") From 9a76342f19677f919ef2b1ac137976c1bf73a684 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 25 Dec 2020 06:55:11 +0000 Subject: [PATCH 141/374] Bump sphinx from 3.4.0 to 3.4.1 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v3.4.0...v3.4.1) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 6b9701ab4..bfbda1a0b 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 -sphinx==3.4.0 +sphinx==3.4.1 sphinx-autoapi==1.5.1 sphinx_rtd_theme==0.5.0 \ No newline at end of file From 1d818f650f68f67cfbb39408b61c817968bc3c10 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 25 Dec 2020 23:03:37 +0000 Subject: [PATCH 142/374] [cli] removed about command --- src/maestral/cli.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 22d1a1d9a..fbd787f1e 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -18,7 +18,7 @@ import Pyro5.errors # type: ignore # local imports -from . import __version__, __author__, __url__ +from . import __version__ from .utils import cli if TYPE_CHECKING: @@ -1097,20 +1097,6 @@ def configs() -> None: cli.echo("") -@main.command( - section="Information", help="Return the version number and other information." -) -def about() -> None: - - year = time.localtime().tm_year - - cli.echo("") - cli.echo(f"Version: {__version__}") - cli.echo(f"Website: {__url__}") - cli.echo(f"Copyright: (c) 2018-{year}, {__author__}.") - cli.echo("") - - # ====================================================================================== # Settings # ====================================================================================== From 28b7a2a70871b15b2d2d2fcdcff178c169d28d1e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 25 Dec 2020 23:04:03 +0000 Subject: [PATCH 143/374] [cli] remove -h flag, use --help instead --- src/maestral/cli.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index fbd787f1e..c04aff233 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -460,7 +460,6 @@ def format_commands( @click.group( cls=OrderedGroup, - context_settings={"help_option_names": ["-h", "--help"]}, invoke_without_command=True, no_args_is_help=True, help="Dropbox client for Linux and macOS.", From 5c58811adfbd2a86a6a912d3550bea1672575d99 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 26 Dec 2020 11:10:25 +0000 Subject: [PATCH 144/374] [cli] fix unlink dialog --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c04aff233..1a1dffa1f 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -737,7 +737,7 @@ def link(relink: bool, config_name: str) -> None: def unlink(yes: bool, config_name: str) -> None: if not yes: - cli.confirm("Are you sure you want unlink your account?", default=False) + yes = cli.confirm("Are you sure you want unlink your account?", default=False) if yes: from .main import Maestral From b60a1a54238321c43b88ba08db30751e88663efd Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 26 Dec 2020 14:17:19 +0000 Subject: [PATCH 145/374] [cli] removed space usage from account-info output --- src/maestral/cli.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 1a1dffa1f..9c16da5ed 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1055,13 +1055,11 @@ def account_info(config_name: str) -> None: email = m.get_state("account", "email") account_type = m.get_state("account", "type").capitalize() - usage = m.get_state("account", "usage") dbid = m.get_conf("account", "account_id") cli.echo("") cli.echo(f"Email: {email}") cli.echo(f"Account-type: {account_type}") - cli.echo(f"Usage: {usage}") cli.echo(f"Dropbox-ID: {dbid}") cli.echo("") From 065e1a892d0a31553507d67d9fcfa56efbe0e201 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 26 Dec 2020 14:19:59 +0000 Subject: [PATCH 146/374] [config] removed default_dir_name from config --- src/maestral/config/main.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index efb2578ea..a9e535a35 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -26,7 +26,6 @@ "main", { "path": "", # dropbox folder location - "default_dir_name": "Dropbox (Maestral)", # default dropbox folder name "excluded_items": [], # files and folders excluded from sync }, ), @@ -98,7 +97,7 @@ # or if you want to *rename* options, then you need to do a MAJOR update in # version, e.g. from 3.0.0 to 4.0.0 # 3. You don't need to touch this value if you're just adding a new option -CONF_VERSION = "13.0.0" +CONF_VERSION = "14.0.0" # ============================================================================= @@ -131,11 +130,6 @@ def MaestralConfig(config_name: str) -> UserConfig: defaults: DefaultsType = copy.deepcopy(DEFAULTS_CONFIG) # type: ignore - # set default dir name according to config - for sec, options in defaults: - if sec == "main": - options["default_dir_name"] = f"Dropbox ({config_name.title()})" - config_path = get_conf_path(CONFIG_DIR_NAME) try: @@ -158,10 +152,6 @@ def MaestralConfig(config_name: str) -> UserConfig: load=False, ) - # adapt folder name to config - dirname = f"Dropbox ({config_name.title()})" - conf.set_default("main", "default_dir_name", dirname) - _config_instances[config_name] = conf return conf From 8983ed46abf8de7e3530d0c2cfaffb4948967909 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 26 Dec 2020 14:54:34 +0000 Subject: [PATCH 147/374] [config] simplify instance creation --- src/maestral/config/main.py | 112 ++++++++++++++---------------------- src/maestral/config/user.py | 19 +++--- 2 files changed, 54 insertions(+), 77 deletions(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index a9e535a35..e8e0f7adf 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -4,7 +4,6 @@ existing config or state instances for a specified config_name. """ -import copy import logging import threading from typing import Dict @@ -21,7 +20,7 @@ # Defaults # ============================================================================= -DEFAULTS_CONFIG = [ +DEFAULTS_CONFIG: DefaultsType = [ ( "main", { @@ -55,7 +54,7 @@ ), ] -DEFAULTS_STATE = [ +DEFAULTS_STATE: DefaultsType = [ ( "account", # account state, periodically updated from dropbox servers { @@ -104,11 +103,43 @@ # Factories # ============================================================================= -_config_instances: Dict[str, UserConfig] = dict() -_state_instances: Dict[str, UserConfig] = dict() +def _get_conf( + config_name: str, + config_path: str, + defaults: DefaultsType, + registry: Dict[str, UserConfig], +): + + try: + conf = registry[config_name] + except KeyError: + + try: + conf = UserConfig( + config_path, + defaults=defaults, + version=CONF_VERSION, + backup=True, + remove_obsolete=True, + ) + except OSError: + conf = UserConfig( + config_path, + defaults=defaults, + version=CONF_VERSION, + backup=True, + remove_obsolete=True, + load=False, + ) + + registry[config_name] = conf + + return conf + + +_config_instances: Dict[str, UserConfig] = dict() _config_lock = threading.Lock() -_state_lock = threading.Lock() def MaestralConfig(config_name: str) -> UserConfig: @@ -123,37 +154,12 @@ def MaestralConfig(config_name: str) -> UserConfig: global _config_instances with _config_lock: + config_path = get_conf_path(CONFIG_DIR_NAME, f"{config_name}.ini") + return _get_conf(config_name, config_path, DEFAULTS_CONFIG, _config_instances) - try: - return _config_instances[config_name] - except KeyError: - - defaults: DefaultsType = copy.deepcopy(DEFAULTS_CONFIG) # type: ignore - - config_path = get_conf_path(CONFIG_DIR_NAME) - - try: - conf = UserConfig( - config_path, - config_name, - defaults=defaults, - version=CONF_VERSION, - backup=True, - remove_obsolete=True, - ) - except OSError: - conf = UserConfig( - config_path, - config_name, - defaults=defaults, - version=CONF_VERSION, - backup=True, - remove_obsolete=True, - load=False, - ) - - _config_instances[config_name] = conf - return conf + +_state_instances: Dict[str, UserConfig] = dict() +_state_lock = threading.Lock() def MaestralState(config_name: str) -> UserConfig: @@ -168,35 +174,5 @@ def MaestralState(config_name: str) -> UserConfig: global _state_instances with _state_lock: - - try: - return _state_instances[config_name] - except KeyError: - state_path = get_data_path(CONFIG_DIR_NAME) - - defaults: DefaultsType = copy.deepcopy(DEFAULTS_STATE) # type: ignore - - try: - state = UserConfig( - state_path, - config_name, - defaults=defaults, - version=CONF_VERSION, - backup=True, - remove_obsolete=True, - suffix=".state", - ) - except OSError: - state = UserConfig( - state_path, - config_name, - defaults=defaults, - version=CONF_VERSION, - backup=True, - remove_obsolete=True, - suffix=".state", - load=False, - ) - - _state_instances[config_name] = state - return state + state_path = get_data_path(CONFIG_DIR_NAME, f"{config_name}.state") + return _get_conf(config_name, state_path, DEFAULTS_STATE, _state_instances) diff --git a/src/maestral/config/user.py b/src/maestral/config/user.py index cd3d0808d..22f4f2c85 100644 --- a/src/maestral/config/user.py +++ b/src/maestral/config/user.py @@ -48,12 +48,15 @@ class DefaultsConfig(cp.ConfigParser): _lock = RLock() - def __init__(self, path: str, name: str, suffix: str) -> None: + def __init__(self, path: str) -> None: super(DefaultsConfig, self).__init__(interpolation=None) - self._path = path - self._name = name - self._suffix = suffix + dirname, basename = osp.split(path) + filename, ext = osp.splitext(basename) + + self._path = dirname + self._name = filename + self._suffix = ext if not osp.isdir(osp.dirname(self._path)): os.makedirs(osp.dirname(self._path)) @@ -147,16 +150,14 @@ class UserConfig(DefaultsConfig): def __init__( self, path: str, - name: str, defaults: InputDefaultsType = None, load: bool = True, version: str = "0.0.0", backup: bool = False, remove_obsolete: bool = False, - suffix: str = ".ini", ) -> None: """UserConfig class, based on ConfigParser.""" - super(UserConfig, self).__init__(path=path, name=name, suffix=suffix) + super(UserConfig, self).__init__(path=path) self._load = load self._version = self._check_version(version) @@ -315,8 +316,8 @@ def _load_old_defaults(self, old_version: str) -> cp.ConfigParser: def _save_new_defaults(self, defaults: DefaultsType) -> None: """Save new defaults.""" - path, name = self.get_defaults_path_name_from_version() - new_defaults = DefaultsConfig(path=path, name=name, suffix=self._suffix) + path = self.get_defaults_fpath_from_version() + new_defaults = DefaultsConfig(path=path) if not osp.isfile(new_defaults.get_config_fpath()): new_defaults.set_defaults(defaults) new_defaults.save() From 2872e1eef787ad035a0a2b67ff5caca7f03afd95 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 26 Dec 2020 15:52:47 +0000 Subject: [PATCH 148/374] [notify_macos] use public API to get / set notification categories --- src/maestral/notify/notify_macos.py | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify/notify_macos.py b/src/maestral/notify/notify_macos.py index 0d3975760..aff01fe85 100644 --- a/src/maestral/notify/notify_macos.py +++ b/src/maestral/notify/notify_macos.py @@ -19,6 +19,7 @@ import subprocess import shutil import logging +from concurrent.futures import Future, wait from typing import Type, Optional, Dict, Tuple # external imports @@ -211,7 +212,21 @@ def _category_id_for_button_names( ) actions.append(action) - categories = self.nc.notificationCategories + # get existing notification categories + + future: Future = Future() + + def handler(categories: objc_id) -> None: + categories = py_from_ns(categories) + future.set_result(categories) + + self.nc.getNotificationCategoriesWithCompletionHandler(handler) + + wait([future]) + categories = future.result() + + # add category for new set of buttons + category_id = str(uuid.uuid4()) new_categories = categories.setByAddingObject( UNNotificationCategory.categoryWithIdentifier( @@ -221,7 +236,7 @@ def _category_id_for_button_names( options=UNNotificationCategoryOptionNone, ) ) - self.nc.notificationCategories = new_categories + self.nc.setNotificationCategories(new_categories) self._notification_categories[button_names] = category_id return category_id From a4e263ee1c7db2c03f52f6470f23aa59bdf4a6d1 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 26 Dec 2020 15:53:09 +0000 Subject: [PATCH 149/374] [logging] import from public API --- src/maestral/logging.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/logging.py b/src/maestral/logging.py index 09996a1aa..4442912c5 100644 --- a/src/maestral/logging.py +++ b/src/maestral/logging.py @@ -3,7 +3,7 @@ import logging from collections import deque -from concurrent.futures._base import Future, wait +from concurrent.futures import Future, wait from typing import Deque, Optional, List try: From 5ee01363f5c5fc46895b18659e5a456f6726124b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 28 Dec 2020 12:40:19 +0000 Subject: [PATCH 150/374] [sync] get umask at import for thread safety --- src/maestral/sync.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 2f9d2ff1f..d8d5aec46 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -145,6 +145,8 @@ logger = logging.getLogger(__name__) _cpu_count = os.cpu_count() or 1 # os.cpu_count can return None +umask = os.umask(0o22) +os.umask(umask) # type definitions ExecInfoType = Tuple[Type[BaseException], BaseException, Optional[TracebackType]] @@ -1023,8 +1025,6 @@ def _new_tmp_file(self) -> str: with tempfile.NamedTemporaryFile( dir=self.file_cache_path, delete=False ) as f: - umask = os.umask(0o22) - os.umask(umask) os.fchmod(f.fileno(), 0o666 & ~umask) return f.name except OSError as err: From 86717f6d6e55aadd168842e7fed80b9731621c34 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 28 Dec 2020 12:41:13 +0000 Subject: [PATCH 151/374] [sync] rename _cpu_count -> cpu_count --- src/maestral/sync.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index d8d5aec46..b3bae3d32 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -144,7 +144,7 @@ logger = logging.getLogger(__name__) -_cpu_count = os.cpu_count() or 1 # os.cpu_count can return None +cpu_count = os.cpu_count() or 1 # os.cpu_count can return None umask = os.umask(0o22) os.umask(umask) @@ -404,7 +404,7 @@ class SyncEngine: _case_conversion_cache: LRUCache _max_history = 1000 - _num_threads = min(32, _cpu_count * 3) + _num_threads = min(32, cpu_count * 3) def __init__(self, client: DropboxClient, fs_events_handler: FSEventHandler): @@ -472,7 +472,7 @@ def __init__(self, client: DropboxClient, fs_events_handler: FSEventHandler): self._is_case_sensitive = is_fs_case_sensitive(get_home_dir()) self._mignore_rules = self._load_mignore_rules_form_file() self._excluded_items = self._conf.get("main", "excluded_items") - self._max_cpu_percent = self._conf.get("sync", "max_cpu_percent") * _cpu_count + self._max_cpu_percent = self._conf.get("sync", "max_cpu_percent") * cpu_count # caches self._case_conversion_cache = LRUCache(capacity=5000) @@ -568,7 +568,7 @@ def max_cpu_percent(self) -> float: def max_cpu_percent(self, percent: float) -> None: """Setter: max_cpu_percent.""" self._max_cpu_percent = percent - self._conf.set("app", "max_cpu_percent", percent // _cpu_count) + self._conf.set("app", "max_cpu_percent", percent // cpu_count) # ==== sync state ================================================================== @@ -4017,7 +4017,7 @@ def cpu_usage_percent(interval: float = 0.1) -> float: raise ValueError(f"interval is not positive (got {interval!r})") def timer(): - return time.monotonic() * _cpu_count + return time.monotonic() * cpu_count st1 = timer() rt1 = resource.getrusage(resource.RUSAGE_SELF) @@ -4033,7 +4033,7 @@ def timer(): except ZeroDivisionError: return 0.0 else: - single_cpu_percent = overall_cpus_percent * _cpu_count + single_cpu_percent = overall_cpus_percent * cpu_count return round(single_cpu_percent, 1) From 46130bc737ab668d354db4ea8384409f3f163328 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 28 Dec 2020 12:42:54 +0000 Subject: [PATCH 152/374] [sync] reordered imports --- src/maestral/sync.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index b3bae3d32..856a5d494 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -10,19 +10,19 @@ import resource import logging import time -import tempfile import random import uuid import urllib.parse +import enum +import pprint +import gc from threading import Thread, Event, RLock, current_thread from concurrent.futures import ThreadPoolExecutor from queue import Queue, Empty from collections import abc from contextlib import contextmanager -import enum -import pprint -import gc from functools import wraps +from tempfile import NamedTemporaryFile from typing import ( Optional, Any, @@ -1022,9 +1022,7 @@ def _new_tmp_file(self) -> str: """Returns a new temporary file name in our cache directory.""" self._ensure_cache_dir_present() try: - with tempfile.NamedTemporaryFile( - dir=self.file_cache_path, delete=False - ) as f: + with NamedTemporaryFile(dir=self.file_cache_path, delete=False) as f: os.fchmod(f.fileno(), 0o666 & ~umask) return f.name except OSError as err: From f0f0de8342502f0db8db3f132fd2bda0aaab6606 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 28 Dec 2020 12:45:00 +0000 Subject: [PATCH 153/374] [sync] fix typo in doc string --- src/maestral/sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 856a5d494..660a114bb 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -961,7 +961,7 @@ def ensure_dropbox_folder_present(self) -> None: """ Checks if the Dropbox folder still exists where we expect it to be. - :raises DropboxDeletedError: When localal Dropbox directory does not exist. + :raises DropboxDeletedError: When local Dropbox directory does not exist. """ if not osp.isdir(self.dropbox_path): From 2dad03787f0781a61287ff0bb031148b0046989f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 28 Dec 2020 12:48:05 +0000 Subject: [PATCH 154/374] [sync] improved logs on connection error --- src/maestral/sync.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 660a114bb..e5a3d4cf6 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3385,7 +3385,7 @@ def download_worker( except ConnectionError: syncing.clear() connected.clear() - logger.debug("Lost connection", exc_info=True) + logger.debug("Connection error", exc_info=True) logger.info(DISCONNECTED) except Exception as err: running.clear() @@ -3439,7 +3439,7 @@ def download_worker_added_item( except ConnectionError: syncing.clear() connected.clear() - logger.debug("Lost connection", exc_info=True) + logger.debug("Connection error", exc_info=True) logger.info(DISCONNECTED) except Exception as err: running.clear() @@ -3488,7 +3488,7 @@ def upload_worker( except ConnectionError: syncing.clear() connected.clear() - logger.debug("Lost connection", exc_info=True) + logger.debug("Connection error", exc_info=True) logger.info(DISCONNECTED) except Exception as err: running.clear() @@ -3585,7 +3585,7 @@ def startup_worker( syncing.clear() connected.clear() startup.clear() - logger.debug("Lost connection", exc_info=True) + logger.debug("Connection error", exc_info=True) logger.info(DISCONNECTED) except Exception as err: running.clear() @@ -4048,6 +4048,7 @@ def check_connection(hostname: str) -> bool: s.close() return True except Exception: + logger.debug("Connection error", exc_info=True) return False From 4407d296b2c31faff8b01419e21d68ecd6e0860e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 28 Dec 2020 13:36:12 +0000 Subject: [PATCH 155/374] [sync] use chmod instead of fchmod --- src/maestral/sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index e5a3d4cf6..a01c8146f 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1023,7 +1023,7 @@ def _new_tmp_file(self) -> str: self._ensure_cache_dir_present() try: with NamedTemporaryFile(dir=self.file_cache_path, delete=False) as f: - os.fchmod(f.fileno(), 0o666 & ~umask) + os.chmod(f.fileno(), 0o666 & ~umask) return f.name except OSError as err: raise CacheDirError( From d676dcd808cc00b4d44b7f1cf32012b9eba8e568 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 29 Dec 2020 15:39:40 +0000 Subject: [PATCH 156/374] [main] drop dbx_path argument from `diff` we instead fetch the dbx_path from the old_rev --- src/maestral/cli.py | 2 +- src/maestral/main.py | 17 ++++++++--------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 9c16da5ed..c2f06347a 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1418,7 +1418,7 @@ def download_and_compare( 'text/*', an error message gets printed. """ - diff = m.get_file_diff(dropbox_path, old_rev, new_rev) + diff = m.get_file_diff(old_rev, new_rev) if len(diff) == 0: click.echo("There are no changes between the two revisions.") diff --git a/src/maestral/main.py b/src/maestral/main.py index 1ee57d75d..d05cd3c5d 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -831,15 +831,12 @@ def list_revisions(self, dbx_path: str, limit: int = 10) -> List[StoneType]: return entries - def get_file_diff( - self, dbx_path: str, old_rev: str, new_rev: Optional[str] = None - ) -> List[str]: + def get_file_diff(self, old_rev: str, new_rev: Optional[str] = None) -> List[str]: """ - Download the two revisions if necessary and create a diff with the python - difflib library. If new_rev is None, it will compare the old revision to the - local file. + Compare to revisions of a text file using Python's difflib. The versions will be + downloaded to temporary files. If new_rev is None, the old revision will be + compared to the corresponding local file, if any. - :param dbx_path: Path to file on Dropbox. :param old_rev: Identifier of old revision. :param new_rev: Identifier of new revision. :returns: Diff as a list of strings (lines). @@ -882,12 +879,14 @@ def download_rev(rev: str) -> Tuple[List[str], str]: return content, date - full_path = self.sync.to_local_path(dbx_path) + md_old = self.client.get_metadata(f"rev:{old_rev}", include_deleted=True) + dbx_path = self.sync.correct_case(md_old.path_display) + full_path = self.sync.to_local_path(md_old.path_display) # Check if a diff is possible # If mime is None, proceed because most files without # an extension are just text files - mime, _ = mimetypes.guess_type(full_path) + mime, _ = mimetypes.guess_type(dbx_path) if mime is not None and not mime.startswith("text/"): raise UnsupportedFileTypeForDiff( f"Bad file type: '{mime}'", "Only files of type 'text/*' are supported." From ed51b32c4c4589c9e59999e046ec759f4c80331a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 29 Dec 2020 15:40:40 +0000 Subject: [PATCH 157/374] [main] add rev to diff output in addition to mtime --- src/maestral/main.py | 50 +++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index d05cd3c5d..281a169c6 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -33,6 +33,7 @@ from watchdog.events import DirDeletedEvent, FileDeletedEvent # type: ignore from packaging.version import Version from datetime import datetime, timezone +from dropbox.files import FileMetadata try: from systemd import journal # type: ignore @@ -845,27 +846,18 @@ def get_file_diff(self, old_rev: str, new_rev: Optional[str] = None) -> List[str :raises MaestralApiError: if file could not be read for any other reason. """ - def pretty_date(d: datetime) -> str: - """ - Prettify the 'client_modified' metadata. - """ - - return ( - d.replace(tzinfo=timezone.utc) - .astimezone() - .strftime("%d %b %Y at %H:%M") - ) + def str_from_date(d: datetime) -> str: + """Convert 'client_modified' metadata to string in local timezone""" + tz_date = d.replace(tzinfo=timezone.utc).astimezone() + return tz_date.strftime("%d %b %Y at %H:%M") - def download_rev(rev: str) -> Tuple[List[str], str]: + def download_rev(rev: str) -> Tuple[List[str], FileMetadata]: """ - Download a rev to a temporary file, read it and return - the content + the date and time of the modification. + Download a rev to a tmp file, read it and return the content + metadata """ - # By default the file would be opened with "w+b" with tempfile.NamedTemporaryFile(mode="w+") as f: md = self.client.download(dbx_path, f.name, rev=rev) - date = pretty_date(md.client_modified) # Read from the file try: @@ -877,7 +869,7 @@ def download_rev(rev: str) -> Tuple[List[str], str]: "Only UTF-8 plain text files are currently supported.", ) - return content, date + return content, md md_old = self.client.get_metadata(f"rev:{old_rev}", include_deleted=True) dbx_path = self.sync.correct_case(md_old.path_display) @@ -894,29 +886,35 @@ def download_rev(rev: str) -> Tuple[List[str], str]: # If new_rev is None, the local file is used, even if it isn't synced if new_rev is None: - new_date = "Local version" + new_rev = "local version" try: with convert_api_errors(dbx_path=dbx_path, local_path=full_path): + mtime = time.localtime(osp.getmtime(full_path)) + date_str_new = time.strftime("%d %b %Y at %H:%M", mtime) + with open(full_path) as f: - new_content = f.readlines() + content_new = f.readlines() + except UnicodeDecodeError: raise UnsupportedFileTypeForDiff( "Failed to decode the file", "Only UTF-8 plain text files are currently supported.", ) else: - new_content, new_date = download_rev(new_rev) + content_new, md_new = download_rev(new_rev) + date_str_new = str_from_date(md_new.client_modified) - old_content, old_date = download_rev(old_rev) + content_old, md_old = download_rev(old_rev) + date_str_old = str_from_date(md_old.client_modified) return list( difflib.unified_diff( - old_content, - new_content, - fromfile=dbx_path, - tofile=dbx_path, - fromfiledate=old_date, - tofiledate=new_date, + content_old, + content_new, + fromfile=f"{dbx_path} ({old_rev})", + tofile=f"{dbx_path} ({new_rev})", + fromfiledate=date_str_old, + tofiledate=date_str_new, ) ) From 5f4ef8a36552855c93bc1627fee47ebcfce93f00 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 29 Dec 2020 15:41:42 +0000 Subject: [PATCH 158/374] [main] rename full_path -> local_path --- src/maestral/main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 281a169c6..810f2e771 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -873,7 +873,7 @@ def download_rev(rev: str) -> Tuple[List[str], FileMetadata]: md_old = self.client.get_metadata(f"rev:{old_rev}", include_deleted=True) dbx_path = self.sync.correct_case(md_old.path_display) - full_path = self.sync.to_local_path(md_old.path_display) + local_path = self.sync.to_local_path(md_old.path_display) # Check if a diff is possible # If mime is None, proceed because most files without @@ -888,11 +888,11 @@ def download_rev(rev: str) -> Tuple[List[str], FileMetadata]: if new_rev is None: new_rev = "local version" try: - with convert_api_errors(dbx_path=dbx_path, local_path=full_path): - mtime = time.localtime(osp.getmtime(full_path)) + with convert_api_errors(dbx_path=dbx_path, local_path=local_path): + mtime = time.localtime(osp.getmtime(local_path)) date_str_new = time.strftime("%d %b %Y at %H:%M", mtime) - with open(full_path) as f: + with open(local_path) as f: content_new = f.readlines() except UnicodeDecodeError: From d1af92dba0c1946f554318455867927bb59fbc6d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 29 Dec 2020 18:52:45 +0000 Subject: [PATCH 159/374] [cli] some cleanup --- src/maestral/cli.py | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c2f06347a..937bfce78 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -458,12 +458,7 @@ def format_commands( formatter.write_dl(rows) -@click.group( - cls=OrderedGroup, - invoke_without_command=True, - no_args_is_help=True, - help="Dropbox client for Linux and macOS.", -) +@click.group(cls=OrderedGroup, help="Dropbox client for Linux and macOS.") @click.version_option(version=__version__, message=__version__) def main(): pass @@ -500,7 +495,7 @@ def main(): "-f", is_flag=True, default=False, - help="Starts Maestral in the foreground.", + help="Start Maestral in the foreground.", ) @click.option( "--verbose", @@ -914,7 +909,7 @@ def history(config_name: str) -> None: from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: - history = m.get_history() + events = m.get_history() table = cli.Table( [ @@ -924,7 +919,7 @@ def history(config_name: str) -> None: ] ) - for event in history: + for event in events: dbx_path = cast(str, event["dbx_path"]) change_type = cast(str, event["change_type"]) From 7224d11820307c8ce92242b1d72263cda8df483d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 2 Jan 2021 15:38:48 +0000 Subject: [PATCH 160/374] [sync] more specific error messages for CacheDirError --- src/maestral/sync.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index a01c8146f..0558651a9 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -992,7 +992,7 @@ def _ensure_cache_dir_present(self) -> None: self.clean_cache_dir() except OSError as err: raise CacheDirError( - f"Cannot create cache directory (errno {err.errno})", + f"Cannot create cache directory: {os.strerror(err.errno)}", "Please check if you have write permissions for " f"{self._file_cache_path}.", ) @@ -1013,7 +1013,7 @@ def clean_cache_dir(self) -> None: pass except OSError as err: raise CacheDirError( - f"Cannot clean cache directory (errno {err.errno})", + f"Cannot create cache directory: {os.strerror(err.errno)}", "Please check if you have write permissions for " f"{self._file_cache_path}.", ) @@ -1027,7 +1027,7 @@ def _new_tmp_file(self) -> str: return f.name except OSError as err: raise CacheDirError( - f"Cannot create temporary file (errno {err.errno})", + f"Cannot create cache directory: {os.strerror(err.errno)}", "Please check if you have write permissions for " f"{self._file_cache_path}.", ) From 6ed01d77b274349c15d9cef2b0edcef1724bc827 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 2 Jan 2021 15:39:25 +0000 Subject: [PATCH 161/374] [sync] increased number of retries to create cache dir --- src/maestral/sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 0558651a9..fef6f4438 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -980,7 +980,7 @@ def _ensure_cache_dir_present(self) -> None: """ retries = 0 - max_retries = 3 + max_retries = 100 while not osp.isdir(self.file_cache_path): try: From 20777333561e04888e2ccfd145ad7f8af8e1a9f7 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 2 Jan 2021 17:03:53 +0000 Subject: [PATCH 162/374] [sync] fixed retry logic when creating cache dir --- src/maestral/sync.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index fef6f4438..16668869e 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1003,6 +1003,8 @@ def _ensure_cache_dir_present(self) -> None: "Exceeded maximum number of retries", ) + retries += 1 + def clean_cache_dir(self) -> None: """Removes all items in the cache directory.""" From cda30807152bf3dc7ade353bf4f51d3362c03c74 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 5 Jan 2021 07:11:00 +0000 Subject: [PATCH 163/374] Bump sphinx-rtd-theme from 0.5.0 to 0.5.1 Bumps [sphinx-rtd-theme](https://github.com/readthedocs/sphinx_rtd_theme) from 0.5.0 to 0.5.1. - [Release notes](https://github.com/readthedocs/sphinx_rtd_theme/releases) - [Changelog](https://github.com/readthedocs/sphinx_rtd_theme/blob/master/docs/changelog.rst) - [Commits](https://github.com/readthedocs/sphinx_rtd_theme/compare/0.5.0...0.5.1) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index bfbda1a0b..51ab9d75f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 sphinx==3.4.1 sphinx-autoapi==1.5.1 -sphinx_rtd_theme==0.5.0 \ No newline at end of file +sphinx_rtd_theme==0.5.1 \ No newline at end of file From 4813f0d2e328043d807677a505ed77a99433fb6c Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 5 Jan 2021 07:11:31 +0000 Subject: [PATCH 164/374] Bump sphinx from 3.4.1 to 3.4.2 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 3.4.1 to 3.4.2. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v3.4.1...v3.4.2) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index bfbda1a0b..376aebd71 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 -sphinx==3.4.1 +sphinx==3.4.2 sphinx-autoapi==1.5.1 sphinx_rtd_theme==0.5.0 \ No newline at end of file From 064c1635ee96b56bfe5581e5dd08730a18121e30 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Fri, 8 Jan 2021 07:36:49 +0000 Subject: [PATCH 165/374] Bump sphinx from 3.4.2 to 3.4.3 Bumps [sphinx](https://github.com/sphinx-doc/sphinx) from 3.4.2 to 3.4.3. - [Release notes](https://github.com/sphinx-doc/sphinx/releases) - [Changelog](https://github.com/sphinx-doc/sphinx/blob/3.x/CHANGES) - [Commits](https://github.com/sphinx-doc/sphinx/compare/v3.4.2...v3.4.3) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index c748a313a..fc555f647 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 -sphinx==3.4.2 +sphinx==3.4.3 sphinx-autoapi==1.5.1 sphinx_rtd_theme==0.5.1 \ No newline at end of file From 637caceb86f87331df9f463215dcdeaec1b29722 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 7 Jan 2021 23:05:26 +0000 Subject: [PATCH 166/374] [tests] adapt diff test --- tests/linked/test_main.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 86b33ec4b..c37656a8b 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -231,7 +231,7 @@ def write_and_get_rev(dbx_path, content, o="w"): # Write some dummy stuff to create two revs old_rev = write_and_get_rev(dbx_path_fail_pdf, "old") new_rev = write_and_get_rev(dbx_path_fail_pdf, "new") - m.get_file_diff(dbx_path_fail_pdf, old_rev, new_rev) + m.get_file_diff(old_rev, new_rev) with pytest.raises(UnsupportedFileTypeForDiff): # Add a compiled helloworld c file with .txt extension @@ -240,13 +240,13 @@ def write_and_get_rev(dbx_path, content, o="w"): old_rev = m.client.get_metadata(dbx_path_fail_ext).rev # Just some bytes new_rev = write_and_get_rev(dbx_path_fail_ext, "hi".encode(), o="ab") - m.get_file_diff(dbx_path_fail_ext, old_rev, new_rev) + m.get_file_diff(old_rev, new_rev) - old_rev = write_and_get_rev(dbx_path_fail_ext, "old") - new_rev = write_and_get_rev(dbx_path_fail_ext, "new") + old_rev = write_and_get_rev(dbx_path_success, "old") + new_rev = write_and_get_rev(dbx_path_success, "new") # If this does not raise an error, # the function should have been successful - _ = m.get_file_diff(dbx_path_success, old_rev, new_rev) + _ = m.get_file_diff(old_rev, new_rev) def test_restore(m): From c264cb79ca94de742e331fd89dad1cc38b4799fb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 8 Jan 2021 12:53:19 +0000 Subject: [PATCH 167/374] allow providing refresh token for tests --- .github/workflows/test.yml | 2 +- CONTRIBUTING.md | 37 +++++++++---------------------------- tests/linked/conftest.py | 20 ++++++++++++++++---- tests/linked/test_cli.py | 7 +++++++ tests/linked/test_client.py | 2 +- tests/linked/test_main.py | 2 +- tests/linked/test_sync.py | 2 +- 7 files changed, 36 insertions(+), 36 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1f8a237e8..e0933f897 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -112,7 +112,7 @@ jobs: -d client_id=2jmbq42w7vof78h) token=$(echo $auth_result | python -c "import sys, json; print(json.load(sys.stdin)['access_token'])") echo "::add-mask::$token" - echo "DROPBOX_TOKEN=$token" >> $GITHUB_ENV + echo "DROPBOX_ACCESS_TOKEN=$token" >> $GITHUB_ENV - name: Test with pytest run: | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9403fdbc2..b84c3fe20 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -58,8 +58,9 @@ indexing and cleaning up sync events, and for particularly complex functions tha prone to regressions. The current test suite uses a Dropbox access token provided by the environment variable -`DROPBOX_TOKEN` to connect to a real account. The GitHub action which is running the -tests will set this environment variable for you with a temporary access token that +`DROPBOX_ACCESS_TOKEN` or a refresh token provided by `DROPBOX_REFRESH_TOKEN` to connect +to a real account. The GitHub action which is running the tests will set the +`DROPBOX_ACCESS_TOKEN` environment variable for you with a temporary access token that expires after 4 hours. Tests are run on `ubuntu-latest` and `macos-latest` in parallel on different accounts. @@ -70,10 +71,10 @@ running tests to prevent them from interfering which each other by creating a fo create and clean up a test config and to acquire a lock are provided in the `tests/linked/conftest.py`. -If you run the tests locally, you will need to provide an access token for your own -Dropbox account. If your account is already linked with Maestral, it will have saved a -long-lived "refresh token" in your system keyring. You can access it manually or through -the Python API: +If you run the tests locally, you will need to provide a refresh or access token for +your own Dropbox account. If your account is already linked with Maestral, it will have +saved a long-lived "refresh token" in your system keyring. You can access it manually or +through the Python API: ```Python from maestral.main import Maestral @@ -82,25 +83,5 @@ m = Maestral() print(m.client.auth.refresh_token) ``` -This refresh token cannot be used to make API calls directly but should be used to -retrieve a short-lived access token. This can be done again through Python - -```Python -m.client.dbx.refresh_access_token() # gets a short-lived auth token from server -print(m.client.dbx._oauth2_access_token) # prints the access token -``` - -or from the command line: - -```shell -auth_result=$(curl https://api.dropbox.com/oauth2/token \ - -d grant_type=refresh_token \ - -d refresh_token=$REFRESH_TOKEN \ - -d client_id=2jmbq42w7vof78h) -parse_response="import sys, json; print(json.load(sys.stdin)['access_token'])" -access_token=$(echo $auth_result | python3 -c "$parse_response") -``` - -You can then store the retrieved access token in the environment variable -`DROPBOX_TOKEN` to be automatically picked up by the tests. - +You can then store the retrieved refresh token in the environment variable +`DROPBOX_REFRESH_TOKEN` to be automatically picked up by the tests. diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 62efe3285..dbf583a17 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -38,14 +38,26 @@ def m(): m.log_level = logging.DEBUG # link with given token - access_token = os.environ.get("DROPBOX_TOKEN", "") - m.client._init_sdk_with_token(access_token=access_token) + access_token = os.environ.get("DROPBOX_ACCESS_TOKEN") + refresh_token = os.environ.get("DROPBOX_REFRESH_TOKEN") + + if access_token: + m.client._init_sdk_with_token(access_token=access_token) + m.client.auth._access_token = access_token + m.client.auth._token_access_type = "legacy" + elif refresh_token: + m.client._init_sdk_with_token(refresh_token=refresh_token) + m.client.auth._refresh_token = refresh_token + m.client.auth._token_access_type = "offline" + else: + raise RuntimeError( + "Either access token or refresh token must be given as environment " + "variable DROPBOX_ACCESS_TOKEN or DROPBOX_REFRESH_TOKEN." + ) # get corresponding Dropbox ID and store in keyring for other processes res = m.client.get_account_info() m.client.auth._account_id = res.account_id - m.client.auth._access_token = access_token - m.client.auth._token_access_type = "legacy" m.client.auth.save_creds() # set local Dropbox directory diff --git a/tests/linked/test_cli.py b/tests/linked/test_cli.py index 3ae9f4129..6c83df5d9 100644 --- a/tests/linked/test_cli.py +++ b/tests/linked/test_cli.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- +import os + +import pytest from click.testing import CliRunner from maestral.cli import main @@ -7,6 +10,10 @@ from maestral.daemon import MaestralProxy +if not ("DROPBOX_ACCESS_TOKEN" in os.environ or "DROPBOX_REFRESH_TOKEN" in os.environ): + pytest.skip("Requires auth token", allow_module_level=True) + + def wait_for_idle(m: MaestralProxy, minimum: int = 2): while True: diff --git a/tests/linked/test_client.py b/tests/linked/test_client.py index 54979b0a4..11efc95b7 100644 --- a/tests/linked/test_client.py +++ b/tests/linked/test_client.py @@ -10,7 +10,7 @@ from .conftest import resources -if not os.environ.get("DROPBOX_TOKEN"): +if not ("DROPBOX_ACCESS_TOKEN" in os.environ or "DROPBOX_REFRESH_TOKEN" in os.environ): pytest.skip("Requires auth token", allow_module_level=True) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index c37656a8b..2ecd3c3ad 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -14,7 +14,7 @@ from .conftest import wait_for_idle, resources -if not os.environ.get("DROPBOX_TOKEN"): +if not ("DROPBOX_ACCESS_TOKEN" in os.environ or "DROPBOX_REFRESH_TOKEN" in os.environ): pytest.skip("Requires auth token", allow_module_level=True) diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index 001fdbd4e..915016bed 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -20,7 +20,7 @@ from .conftest import assert_synced, wait_for_idle, resources -if not os.environ.get("DROPBOX_TOKEN"): +if not ("DROPBOX_ACCESS_TOKEN" in os.environ or "DROPBOX_REFRESH_TOKEN" in os.environ): pytest.skip("Requires auth token", allow_module_level=True) From 0d26c6ebdf7c9e3985cf52b6c2a8d279626eb94b Mon Sep 17 00:00:00 2001 From: SamSchott Date: Tue, 12 Jan 2021 21:55:35 +0000 Subject: [PATCH 168/374] clarify warning about syncing a folder with multiple clients --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1ad8be949..6ce5cfac3 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,8 @@ or downloading a file if it already exists with the same content locally or in t ## Warning -- Never sync a folder with both the official Dropbox client and Maestral at the same time. +- Never sync a local folder with both the official Dropbox client and Maestral at the same + time. - Network drives and some external hard drives are not supported as locations for the Dropbox folder. From 69322c1689cf7a103de86b9e3bc4d62608338746 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 12 Jan 2021 23:25:58 +0000 Subject: [PATCH 169/374] [notify_macos] keep reference to NSUserNotificationCenter delegate --- src/maestral/notify/notify_macos.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/maestral/notify/notify_macos.py b/src/maestral/notify/notify_macos.py index aff01fe85..4e2c3c7f4 100644 --- a/src/maestral/notify/notify_macos.py +++ b/src/maestral/notify/notify_macos.py @@ -304,7 +304,8 @@ def __init__(self, app_name: str, app_id: str) -> None: super().__init__(app_name, app_id) self.nc = NSUserNotificationCenter.defaultUserNotificationCenter - self.nc.delegate = NotificationCenterDelegate.alloc().init() + self.nc_delegate = NotificationCenterDelegate.alloc().init() + self.nc.delegate = self.nc_delegate self.nc.delegate.interface = self def send(self, notification: Notification) -> None: From f076808348252a9daf0485fe6cda83a6520d1671 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 12 Jan 2021 23:29:18 +0000 Subject: [PATCH 170/374] [notify] clean up folder structure --- src/maestral/notify/__init__.py | 2 +- src/maestral/notify/{notify_base.py => base.py} | 0 src/maestral/notify/{notify_linux.py => linux.py} | 4 ++-- src/maestral/notify/{notify_macos.py => macos.py} | 6 +++--- src/maestral/notify/{notify.py => main.py} | 10 +++++----- 5 files changed, 11 insertions(+), 11 deletions(-) rename src/maestral/notify/{notify_base.py => base.py} (100%) rename src/maestral/notify/{notify_linux.py => linux.py} (97%) rename src/maestral/notify/{notify_macos.py => macos.py} (98%) rename src/maestral/notify/{notify.py => main.py} (96%) diff --git a/src/maestral/notify/__init__.py b/src/maestral/notify/__init__.py index 88cf197cc..10f956148 100644 --- a/src/maestral/notify/__init__.py +++ b/src/maestral/notify/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- -from .notify import MaestralDesktopNotifier, MaestralDesktopNotificationHandler +from .main import MaestralDesktopNotifier, MaestralDesktopNotificationHandler __all__ = ["MaestralDesktopNotifier", "MaestralDesktopNotificationHandler"] diff --git a/src/maestral/notify/notify_base.py b/src/maestral/notify/base.py similarity index 100% rename from src/maestral/notify/notify_base.py rename to src/maestral/notify/base.py diff --git a/src/maestral/notify/notify_linux.py b/src/maestral/notify/linux.py similarity index 97% rename from src/maestral/notify/notify_linux.py rename to src/maestral/notify/linux.py index 6194aeda6..a3b94d601 100644 --- a/src/maestral/notify/notify_linux.py +++ b/src/maestral/notify/linux.py @@ -15,10 +15,10 @@ from dbus_next.aio import MessageBus, ProxyInterface # type: ignore # local imports -from .notify_base import Notification, DesktopNotifierBase, NotificationLevel +from .base import Notification, DesktopNotifierBase, NotificationLevel -__all__ = ["Impl", "DBusDesktopNotifier"] +__all__ = ["Impl"] logger = logging.getLogger(__name__) diff --git a/src/maestral/notify/notify_macos.py b/src/maestral/notify/macos.py similarity index 98% rename from src/maestral/notify/notify_macos.py rename to src/maestral/notify/macos.py index 4e2c3c7f4..fe321932e 100644 --- a/src/maestral/notify/notify_macos.py +++ b/src/maestral/notify/macos.py @@ -28,11 +28,11 @@ from rubicon.objc.runtime import load_library, objc_id, objc_block # type: ignore # local imports -from .notify_base import Notification, DesktopNotifierBase -from maestral.constants import FROZEN +from ..constants import FROZEN +from .base import Notification, DesktopNotifierBase -__all__ = ["Impl", "CocoaNotificationCenter", "CocoaNotificationCenterLegacy"] +__all__ = ["Impl"] logger = logging.getLogger(__name__) macos_version, *_ = platform.mac_ver() diff --git a/src/maestral/notify/notify.py b/src/maestral/notify/main.py similarity index 96% rename from src/maestral/notify/notify.py rename to src/maestral/notify/main.py index 1128ba812..f54c035d5 100644 --- a/src/maestral/notify/notify.py +++ b/src/maestral/notify/main.py @@ -12,9 +12,9 @@ from typing import Optional, Dict, ClassVar, Callable # local imports -from maestral.config import MaestralConfig -from maestral.constants import APP_NAME, BUNDLE_ID, APP_ICON_PATH -from .notify_base import DesktopNotifierBase, NotificationLevel, Notification +from ..config import MaestralConfig +from ..constants import APP_NAME, BUNDLE_ID, APP_ICON_PATH +from .base import DesktopNotifierBase, NotificationLevel, Notification __all__ = [ @@ -46,9 +46,9 @@ def __init__(self, app_name: str, app_id: str) -> None: self._lock = Lock() if platform.system() == "Darwin": - from .notify_macos import Impl + from .macos import Impl elif platform.system() == "Linux": - from .notify_linux import Impl # type: ignore + from .linux import Impl # type: ignore else: Impl = None # type: ignore From d9106787053161bfd1d3ae903739e61ec9124578 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 13 Jan 2021 16:58:49 +0000 Subject: [PATCH 171/374] [notify] remove app_id argument --- src/maestral/notify/base.py | 5 +---- src/maestral/notify/linux.py | 4 ++-- src/maestral/notify/macos.py | 18 +++++++++--------- src/maestral/notify/main.py | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/maestral/notify/base.py b/src/maestral/notify/base.py index 765021ecc..cfcf5986f 100644 --- a/src/maestral/notify/base.py +++ b/src/maestral/notify/base.py @@ -84,11 +84,8 @@ class DesktopNotifierBase: notification_limit: int current_notifications: Dict[int, Notification] - def __init__( - self, app_name: str = "", app_id: str = "", notification_limit: int = 5 - ) -> None: + def __init__(self, app_name: str = "", notification_limit: int = 5) -> None: self.app_name = app_name - self.app_id = app_id self.notification_limit = notification_limit self.current_notifications = dict() self._current_nid = 0 diff --git a/src/maestral/notify/linux.py b/src/maestral/notify/linux.py index a3b94d601..267c81779 100644 --- a/src/maestral/notify/linux.py +++ b/src/maestral/notify/linux.py @@ -38,8 +38,8 @@ class DBusDesktopNotifier(DesktopNotifierBase): NotificationLevel.Critical: Variant("y", 2), } - def __init__(self, app_name: str, app_id: str) -> None: - super().__init__(app_name, app_id) + def __init__(self, app_name: str) -> None: + super().__init__(app_name) self._loop = asyncio.get_event_loop() self.interface: Optional[ProxyInterface] = None self._force_run_in_loop(self._init_dbus()) diff --git a/src/maestral/notify/macos.py b/src/maestral/notify/macos.py index fe321932e..a33ca2fd5 100644 --- a/src/maestral/notify/macos.py +++ b/src/maestral/notify/macos.py @@ -113,14 +113,14 @@ class CocoaNotificationCenter(DesktopNotifierBase): by the app bundle. This implementation only works from within signed app bundles and if called from the main executable. - :param app_name: The name of the app. - :param app_id: The bundle identifier of the app. + :param app_name: The name of the app. Does not have any effect because the app + name is automatically determined from the bundle or framework. """ _notification_categories: Dict[Tuple[str, ...], str] - def __init__(self, app_name: str, app_id: str) -> None: - super().__init__(app_name, app_id) + def __init__(self, app_name: str) -> None: + super().__init__(app_name) self.nc = UNUserNotificationCenter.currentNotificationCenter() self.nc_delegate = NotificationCenterDelegate.alloc().init() self.nc_delegate.interface = self @@ -194,7 +194,7 @@ def _category_id_for_button_names( self, button_names: Tuple[str, ...] ) -> Optional[str]: """ - Creates a and registers a new notification category with the given buttons + Creates and registers a new notification category with the given buttons or retrieves an existing one. """ @@ -296,12 +296,12 @@ class CocoaNotificationCenterLegacy(DesktopNotifierBase): identifier will be ignored. The notification center automatically uses the values provided by the app bundle or the Python framework. - :param app_name: The name of the app. - :param app_id: The bundle identifier of the app. + :param app_name: The name of the app. Does not have any effect because the app + name is automatically determined from the bundle or framework. """ - def __init__(self, app_name: str, app_id: str) -> None: - super().__init__(app_name, app_id) + def __init__(self, app_name: str) -> None: + super().__init__(app_name) self.nc = NSUserNotificationCenter.defaultUserNotificationCenter self.nc_delegate = NotificationCenterDelegate.alloc().init() diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index f54c035d5..c3a445cdb 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -53,7 +53,7 @@ def __init__(self, app_name: str, app_id: str) -> None: Impl = None # type: ignore if Impl: - self._impl = Impl(app_name, app_id) + self._impl = Impl(app_name) else: self._impl = None From bc25d9d1013f9c73bc1a7b121dd063190271e24f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 13 Jan 2021 21:01:25 +0000 Subject: [PATCH 172/374] [notify] lazily initialise DesktopNotifier see #242 and #183 --- src/maestral/notify/main.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index c3a445cdb..b0fd82a22 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -13,7 +13,7 @@ # local imports from ..config import MaestralConfig -from ..constants import APP_NAME, BUNDLE_ID, APP_ICON_PATH +from ..constants import APP_NAME, APP_ICON_PATH from .base import DesktopNotifierBase, NotificationLevel, Notification @@ -36,13 +36,11 @@ class DesktopNotifier: :mod:`rubicon.objc` can be used to integrate asyncio with a CFRunLoop. :param app_name: Name of app which sends notifications. - :param app_id: Bundle identifier of the app. This is typically a reverse domain name - such as 'com.google.app'. """ _impl: Optional[DesktopNotifierBase] - def __init__(self, app_name: str, app_id: str) -> None: + def __init__(self, app_name: str) -> None: self._lock = Lock() if platform.system() == "Darwin": @@ -89,7 +87,18 @@ def send( self._impl.send(notification) -_desktop_notifier_maestral = DesktopNotifier(APP_NAME, BUNDLE_ID) +_desktop_notifier: Optional[DesktopNotifier] = None + + +def get_desktop_notifier() -> DesktopNotifier: + """Returns a global instance of :class:`DesktopNotifier`.""" + + global _desktop_notifier + + if not _desktop_notifier: + _desktop_notifier = DesktopNotifier(APP_NAME) + + return _desktop_notifier class MaestralDesktopNotifier: @@ -187,7 +196,8 @@ def notify( urgency = NotificationLevel.Normal if level >= self.notify_level and not ignore: - _desktop_notifier_maestral.send( + desktop_notifier = get_desktop_notifier() + desktop_notifier.send( title=title, message=message, icon=APP_ICON_PATH, @@ -222,7 +232,8 @@ def emit(self, record: logging.LogRecord) -> None: else: urgency = NotificationLevel.Normal - _desktop_notifier_maestral.send( + desktop_notifier = get_desktop_notifier() + desktop_notifier.send( title=record.levelname, message=record.message, icon=APP_ICON_PATH, From d8fdde2586e1390983d3afa324973412e594355e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 14 Jan 2021 16:46:56 +0000 Subject: [PATCH 173/374] [notify.macos] delay authorisation until notification request --- src/maestral/notify/macos.py | 48 ++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify/macos.py b/src/maestral/notify/macos.py index a33ca2fd5..349797081 100644 --- a/src/maestral/notify/macos.py +++ b/src/maestral/notify/macos.py @@ -72,6 +72,10 @@ UNNotificationCategoryOptionNone = 0 + UNAuthorizationStatusAuthorized = 2 + UNAuthorizationStatusProvisional = 3 + UNAuthorizationStatusEphemeral = 4 + class NotificationCenterDelegate(NSObject): # type: ignore """Delegate to handle user interactions with notifications""" @@ -125,10 +129,12 @@ def __init__(self, app_name: str) -> None: self.nc_delegate = NotificationCenterDelegate.alloc().init() self.nc_delegate.interface = self self.nc.delegate = self.nc_delegate + self._did_request_authorisation = False self._notification_categories = {} - def _on_auth_completed(granted: bool, error: objc_id) -> None: + def _request_authorisation(self) -> None: + def on_auth_completed(granted: bool, error: objc_id) -> None: if granted: logger.debug("UNUserNotificationCenter: authorisation granted") else: @@ -142,9 +148,38 @@ def _on_auth_completed(granted: bool, error: objc_id) -> None: UNAuthorizationOptionAlert | UNAuthorizationOptionSound | UNAuthorizationOptionBadge, - completionHandler=_on_auth_completed, + completionHandler=on_auth_completed, ) + self._did_request_authorisation = True + + @property + def _has_authorisation(self) -> bool: + + # get existing notification categories + + future: Future = Future() + + def handler(settings: objc_id) -> None: + settings = py_from_ns(settings) + settings.retain() + future.set_result(settings) + + self.nc.getNotificationSettingsWithCompletionHandler(handler) + + wait([future]) + settings = future.result() + + authorized = settings.authorizationStatus in ( + UNAuthorizationStatusAuthorized, + UNAuthorizationStatusProvisional, + UNAuthorizationStatusEphemeral, + ) + + settings.release() + + return authorized + def send(self, notification: Notification) -> None: """ Sends a notification. @@ -152,6 +187,12 @@ def send(self, notification: Notification) -> None: :param notification: Notification to send. """ + if not self._did_request_authorisation: + self._request_authorisation() + + if not self._has_authorisation: + return + # Get an internal ID for the notifications. This will recycle an old ID if # we are above the max number of notifications. internal_nid = self._next_nid() @@ -218,6 +259,7 @@ def _category_id_for_button_names( def handler(categories: objc_id) -> None: categories = py_from_ns(categories) + categories.retain() future.set_result(categories) self.nc.getNotificationCategoriesWithCompletionHandler(handler) @@ -239,6 +281,8 @@ def handler(categories: objc_id) -> None: self.nc.setNotificationCategories(new_categories) self._notification_categories[button_names] = category_id + categories.release() + return category_id if UNUserNotificationCenter.currentNotificationCenter(): From 5d4790e176aa7ca42eba9c973d3ad41ea15049e3 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 14 Jan 2021 17:10:44 +0000 Subject: [PATCH 174/374] [notify.linux] delay connecting to dbus until first message --- src/maestral/notify/linux.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify/linux.py b/src/maestral/notify/linux.py index 267c81779..9f774a2a9 100644 --- a/src/maestral/notify/linux.py +++ b/src/maestral/notify/linux.py @@ -42,7 +42,7 @@ def __init__(self, app_name: str) -> None: super().__init__(app_name) self._loop = asyncio.get_event_loop() self.interface: Optional[ProxyInterface] = None - self._force_run_in_loop(self._init_dbus()) + self._did_attempt_connect = False def _force_run_in_loop(self, coro: Coroutine) -> None: @@ -72,6 +72,8 @@ async def _init_dbus(self) -> None: except Exception: self.interface = None logger.warning("Could not connect to DBUS interface", exc_info=True) + finally: + self._did_attempt_connect = True def send(self, notification: Notification) -> None: """ @@ -83,7 +85,9 @@ def send(self, notification: Notification) -> None: async def _send(self, notification: Notification) -> None: - # Do nothing if we couldn't connect. + if not self._did_attempt_connect: + await self._init_dbus() + if not self.interface: return From 25d3520b10fb0ff4364aaed5ed80bb8467854a2c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 14 Jan 2021 17:11:08 +0000 Subject: [PATCH 175/374] [notify.main] default app name "Python" --- src/maestral/notify/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index b0fd82a22..2c90c8050 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -40,7 +40,7 @@ class DesktopNotifier: _impl: Optional[DesktopNotifierBase] - def __init__(self, app_name: str) -> None: + def __init__(self, app_name: str = "Python") -> None: self._lock = Lock() if platform.system() == "Darwin": From 692e4be691783c0acf499004023ed88d6610ef35 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 14 Jan 2021 17:11:29 +0000 Subject: [PATCH 176/374] [notify.main] revert to early init --- src/maestral/notify/main.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index 2c90c8050..50b0b3cf0 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -87,18 +87,7 @@ def send( self._impl.send(notification) -_desktop_notifier: Optional[DesktopNotifier] = None - - -def get_desktop_notifier() -> DesktopNotifier: - """Returns a global instance of :class:`DesktopNotifier`.""" - - global _desktop_notifier - - if not _desktop_notifier: - _desktop_notifier = DesktopNotifier(APP_NAME) - - return _desktop_notifier +_desktop_notifier = DesktopNotifier(APP_NAME) class MaestralDesktopNotifier: @@ -196,8 +185,7 @@ def notify( urgency = NotificationLevel.Normal if level >= self.notify_level and not ignore: - desktop_notifier = get_desktop_notifier() - desktop_notifier.send( + _desktop_notifier.send( title=title, message=message, icon=APP_ICON_PATH, @@ -232,8 +220,7 @@ def emit(self, record: logging.LogRecord) -> None: else: urgency = NotificationLevel.Normal - desktop_notifier = get_desktop_notifier() - desktop_notifier.send( + _desktop_notifier.send( title=record.levelname, message=record.message, icon=APP_ICON_PATH, From 37968d4c4381d2f5a95c6e852ac0445c5325816a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 15 Jan 2021 15:30:23 +0000 Subject: [PATCH 177/374] [notify.base] added repr to Notification class --- src/maestral/notify/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/maestral/notify/base.py b/src/maestral/notify/base.py index cfcf5986f..33ace47a9 100644 --- a/src/maestral/notify/base.py +++ b/src/maestral/notify/base.py @@ -65,6 +65,9 @@ def __init__( self.buttons = buttons or dict() self.identifier = None + def __repr__(self): + return f"<{self.__class__.__name__}(title='{self.title}', message='{self.message}')>" + class DesktopNotifierBase: """Base class for desktop notifier implementations From e49af285fcced19d1c04c453abc90800f469be22 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 15 Jan 2021 17:36:11 +0000 Subject: [PATCH 178/374] [notify] use DesktopNotifierBase for unsupported platforms --- src/maestral/notify/base.py | 2 +- src/maestral/notify/linux.py | 4 +--- src/maestral/notify/macos.py | 2 +- src/maestral/notify/main.py | 15 +++++---------- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/src/maestral/notify/base.py b/src/maestral/notify/base.py index 33ace47a9..ff5d3b97d 100644 --- a/src/maestral/notify/base.py +++ b/src/maestral/notify/base.py @@ -100,7 +100,7 @@ def send(self, notification: Notification) -> None: :param notification: Notification to send. """ - raise NotImplementedError() + pass def _next_nid(self) -> int: self._current_nid += 1 diff --git a/src/maestral/notify/linux.py b/src/maestral/notify/linux.py index 9f774a2a9..080240621 100644 --- a/src/maestral/notify/linux.py +++ b/src/maestral/notify/linux.py @@ -8,7 +8,7 @@ # system imports import asyncio import logging -from typing import Optional, Type, Coroutine +from typing import Optional, Coroutine # external imports from dbus_next import Variant # type: ignore @@ -22,8 +22,6 @@ logger = logging.getLogger(__name__) -Impl: Optional[Type[DesktopNotifierBase]] - class DBusDesktopNotifier(DesktopNotifierBase): """DBus notification backend for Linux diff --git a/src/maestral/notify/macos.py b/src/maestral/notify/macos.py index 349797081..a08d30c55 100644 --- a/src/maestral/notify/macos.py +++ b/src/maestral/notify/macos.py @@ -42,7 +42,7 @@ NSObject = ObjCClass("NSObject") -Impl: Optional[Type[DesktopNotifierBase]] = None +Impl: Type[DesktopNotifierBase] = DesktopNotifierBase if FROZEN and Version(macos_version) >= Version("10.14.0"): diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index 50b0b3cf0..7a6694851 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -38,7 +38,7 @@ class DesktopNotifier: :param app_name: Name of app which sends notifications. """ - _impl: Optional[DesktopNotifierBase] + _impl: DesktopNotifierBase def __init__(self, app_name: str = "Python") -> None: self._lock = Lock() @@ -48,12 +48,9 @@ def __init__(self, app_name: str = "Python") -> None: elif platform.system() == "Linux": from .linux import Impl # type: ignore else: - Impl = None # type: ignore + Impl = DesktopNotifierBase # type: ignore - if Impl: - self._impl = Impl(app_name) - else: - self._impl = None + self._impl = Impl(app_name) def send( self, @@ -82,9 +79,8 @@ def send( """ notification = Notification(title, message, urgency, icon, action, buttons) - if self._impl: - with self._lock: - self._impl.send(notification) + with self._lock: + self._impl.send(notification) _desktop_notifier = DesktopNotifier(APP_NAME) @@ -102,7 +98,6 @@ class MaestralDesktopNotifier: """ _instances: ClassVar[Dict[str, "MaestralDesktopNotifier"]] = dict() - _lock = Lock() NONE = 100 ERROR = 40 From 181056021ad2fd754fc50a9af2ef16fe7600d421 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 15 Jan 2021 17:36:39 +0000 Subject: [PATCH 179/374] [notify.linux] shorter warning on connection error --- src/maestral/notify/linux.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/maestral/notify/linux.py b/src/maestral/notify/linux.py index 080240621..4bd464fe9 100644 --- a/src/maestral/notify/linux.py +++ b/src/maestral/notify/linux.py @@ -67,9 +67,8 @@ async def _init_dbus(self) -> None: if hasattr(self.interface, "on_action_invoked"): # some older interfaces may not support notification actions self.interface.on_action_invoked(self._on_action) - except Exception: - self.interface = None - logger.warning("Could not connect to DBUS interface", exc_info=True) + except Exception as exc: + logger.warning("Could not connect to DBUS interface: %s", exc.args[0]) finally: self._did_attempt_connect = True From b555ca4fd58e3924a9ee5317435f5a836265356c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 15 Jan 2021 17:37:02 +0000 Subject: [PATCH 180/374] [tests] mark auth key as loaded --- tests/linked/conftest.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index dbf583a17..09e059b8e 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -58,6 +58,7 @@ def m(): # get corresponding Dropbox ID and store in keyring for other processes res = m.client.get_account_info() m.client.auth._account_id = res.account_id + m.client.auth.loaded = True m.client.auth.save_creds() # set local Dropbox directory From a0abf6ec7f6f0d901db4d8638ca05e812ab7d0e9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 15 Jan 2021 17:59:14 +0000 Subject: [PATCH 181/374] [daemon] improve handling of SIGTERM, SIGINT, SIGHUP --- src/maestral/daemon.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 848264b5a..198b25049 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -18,10 +18,9 @@ import tempfile import logging import warnings -import faulthandler from shlex import quote from typing import Optional, Any, Union, Tuple, Dict, Iterable, Type, TYPE_CHECKING -from types import TracebackType, FrameType +from types import TracebackType # external imports import Pyro5 # type: ignore @@ -302,10 +301,6 @@ def locking_pid(self) -> Optional[int]: # ==== helpers for daemon management =================================================== -def _sigterm_handler(signal_number: int, frame: FrameType) -> None: - sys.exit() - - def _send_term(pid: int) -> None: try: os.kill(pid, signal.SIGTERM) @@ -413,8 +408,6 @@ def start_maestral_daemon( :raises RuntimeError: if a daemon for the given ``config_name`` is already running. """ - faulthandler.register(signal.SIGTERM, file=sys.stderr, chain=True) - import asyncio from .main import Maestral @@ -436,9 +429,6 @@ def start_maestral_daemon( # have significant CPU usage in case of many concurrent downloads. os.nice(10) - # catch sigterm and shut down gracefully - signal.signal(signal.SIGTERM, _sigterm_handler) - # integrate with CFRunLoop in macOS, only works in main thread if sys.platform == "darwin": @@ -541,6 +531,11 @@ async def periodic_watchdog() -> None: for socket in daemon.sockets: loop.add_reader(socket.fileno(), daemon.events, daemon.sockets) + # handle sigterm gracefully + signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT) + for s in signals: + loop.add_signal_handler(s, maestral_daemon.shutdown_daemon) + loop.run_until_complete(maestral_daemon.shutdown_complete) for socket in daemon.sockets: From 3b95f98e4375e47e3401ec803c5ce1c92b823791 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 16 Jan 2021 17:13:46 +0000 Subject: [PATCH 182/374] [notify.main] fix bug in avoiding recursive notifications --- src/maestral/notify/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index 7a6694851..43c3e8333 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -204,8 +204,8 @@ def emit(self, record: logging.LogRecord) -> None: :param record: Log record. """ - # avoid recursive notifications from our own logger - if record.name.startswith(__name__): + # avoid recursive notifications + if record.name.startswith("maestral.notify"): return self.format(record) From 940b69196422b275e6999568e06ba9b22ddac4ba Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Tue, 19 Jan 2021 06:43:56 +0000 Subject: [PATCH 183/374] Update alembic requirement from <1.5,>=1.3 to >=1.3,<1.6 Updates the requirements on [alembic](https://alembic.sqlalchemy.org) to permit the latest version. Signed-off-by: dependabot-preview[bot] --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 51fc36a4d..4328e380d 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ # proceed with actual install install_requires = [ - "alembic>=1.3,<1.5", + "alembic>=1.3,<1.6", "click>=7.1.1,<8.0", "dropbox>=10.9.0,<12.0", "dbus-next>=0.1.4;sys_platform=='linux'", From a70fdcdb46479cb5dc315ad4cd8c369c604e018d Mon Sep 17 00:00:00 2001 From: Andras Date: Thu, 12 Nov 2020 20:01:29 +0100 Subject: [PATCH 184/374] Use mignore when creating directorysnapshot --- src/maestral/sync.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 16668869e..93b8efb81 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1448,7 +1448,7 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa changes = [] snapshot_time = time.time() - snapshot = DirectorySnapshot(self.dropbox_path) + snapshot = self._dir_snapshot_with_mignore(self.dropbox_path) lowercase_snapshot_paths: Set[str] = set() # don't use iterator here but pre-fetch all entries @@ -3262,7 +3262,7 @@ def rescan(self, local_path: str) -> None: # add created and deleted events of children as appropriate - snapshot = DirectorySnapshot(local_path) + snapshot = self._dir_snapshot_with_mignore(local_path) lowercase_snapshot_paths = {x.lower() for x in snapshot.paths} local_path_lower = local_path.lower() @@ -3334,6 +3334,19 @@ def _clean_history(self): # commit to drive self._db_session.commit() + def _scandir_with_mignore(self, path: str) -> List: + return [ + f + for f in os.scandir(path) + if not self._is_mignore_path(self.to_dbx_path(f.path), f.is_dir()) + ] + + def _dir_snapshot_with_mignore(self, path: str) -> DirectorySnapshot: + return DirectorySnapshot( + path, + listdir=self._scandir_with_mignore, + ) + # ====================================================================================== # Workers for upload, download and connection monitoring threads From 52ee2d9bf9504a11f0a71e9d38b99f650c95d36d Mon Sep 17 00:00:00 2001 From: Andras Date: Thu, 14 Jan 2021 13:26:31 +0100 Subject: [PATCH 185/374] Add changes to CHANGELOG.md --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3aea9a96a..9f7d69746 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,11 @@ #### Changed: * Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. +* Performance has been improved by avoiding scanning of objects matching an + `.mignore` pattern (file watches will still be added however). A resulting behavioral change + is that **maestral will remove existing matching files from Dropbox as well**. After this change + it will be immaterial if an `.mignore` pattern is added before or after having matching files + in Dropbox. #### Fixes: From 8532da7f3f94ca680c392f3f35eae2725ab9ce2a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 13:26:44 +0000 Subject: [PATCH 186/374] [sync] unify error handling and notifications from workers --- src/maestral/sync.py | 94 ++++++++++++++++---------------------------- 1 file changed, 34 insertions(+), 60 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 93b8efb81..eea5f7412 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1353,7 +1353,8 @@ def _database_access(self, log_errors: bool = False) -> Iterator[None]: only logged. """ - title = None + title = "" + msg = "" new_exc = None try: @@ -1383,6 +1384,7 @@ def _database_access(self, log_errors: bool = False) -> Iterator[None]: if new_exc: if log_errors: logger.error(title, exc_info=exc_info_tuple(new_exc)) + self.notifier.notify(title, msg, level=self.notifier.ERROR) else: raise new_exc @@ -3353,6 +3355,29 @@ def _dir_snapshot_with_mignore(self, path: str) -> DirectorySnapshot: # ====================================================================================== +@contextmanager +def _handle_sync_thread_errors( + syncing: Event, running: Event, connected: Event, notifier: MaestralDesktopNotifier +) -> Iterator[None]: + + try: + yield + except DropboxServerError: + logger.info("Dropbox server error", exc_info=True) + except ConnectionError: + syncing.clear() + connected.clear() + logger.debug("Connection error", exc_info=True) + logger.info(DISCONNECTED) + except Exception as err: + running.clear() + syncing.clear() + title = getattr(err, "title", "Unexpected error") + message = getattr(err, "message", "Please restart to continue syncing") + logger.error(f"{title}: {message}", exc_info=True) + notifier.notify(title, message, level=notifier.ERROR) + + def download_worker( sync: SyncEngine, syncing: Event, running: Event, connected: Event ) -> None: @@ -3369,7 +3394,7 @@ def download_worker( syncing.wait() - try: + with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_remote_changes(sync.remote_cursor) with sync.sync_lock: @@ -3395,19 +3420,6 @@ def download_worker( del downloaded sync.free_memory() - except DropboxServerError: - logger.info("Dropbox server error", exc_info=True) - except ConnectionError: - syncing.clear() - connected.clear() - logger.debug("Connection error", exc_info=True) - logger.info(DISCONNECTED) - except Exception as err: - running.clear() - syncing.clear() - title = getattr(err, "title", "Unexpected error") - logger.error(title, exc_info=True) - def download_worker_added_item( sync: SyncEngine, @@ -3431,7 +3443,7 @@ def download_worker_added_item( syncing.wait() - try: + with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): dbx_path = added_item_queue.get() sync.pending_downloads.add(dbx_path.lower()) # protect against crashes @@ -3449,19 +3461,6 @@ def download_worker_added_item( # free some memory sync.free_memory() - except DropboxServerError: - logger.info("Dropbox server error", exc_info=True) - except ConnectionError: - syncing.clear() - connected.clear() - logger.debug("Connection error", exc_info=True) - logger.info(DISCONNECTED) - except Exception as err: - running.clear() - syncing.clear() - title = getattr(err, "title", "Unexpected error") - logger.error(title, exc_info=True) - def upload_worker( sync: SyncEngine, syncing: Event, running: Event, connected: Event @@ -3479,7 +3478,7 @@ def upload_worker( syncing.wait() - try: + with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): changes, local_cursor = sync.wait_for_local_changes() with sync.sync_lock: @@ -3498,19 +3497,6 @@ def upload_worker( del changes sync.free_memory() - except DropboxServerError: - logger.info("Dropbox server error", exc_info=True) - except ConnectionError: - syncing.clear() - connected.clear() - logger.debug("Connection error", exc_info=True) - logger.info(DISCONNECTED) - except Exception as err: - running.clear() - syncing.clear() - title = getattr(err, "title", "Unexpected error") - logger.error(title, exc_info=True) - def startup_worker( sync: SyncEngine, @@ -3535,7 +3521,7 @@ def startup_worker( startup.wait() - try: + with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): with sync.sync_lock: # run / resume initial download # local changes during this download will be registered by the local @@ -3594,20 +3580,6 @@ def startup_worker( del downloaded sync.free_memory() - except DropboxServerError: - logger.info("Dropbox server error", exc_info=True) - except ConnectionError: - syncing.clear() - connected.clear() - startup.clear() - logger.debug("Connection error", exc_info=True) - logger.info(DISCONNECTED) - except Exception as err: - running.clear() - syncing.clear() - title = getattr(err, "title", "Unexpected error") - logger.error(title, exc_info=True) - # ====================================================================================== # Main Monitor class to start, stop and coordinate threads @@ -3772,8 +3744,10 @@ def start(self) -> None: self.local_observer_thread.start() except OSError as err: new_err = fswatch_to_maestral_error(err) - title = getattr(new_err, "title", "Unexpected error") - logger.error(title, exc_info=exc_info_tuple(new_err)) + title = getattr(err, "title", "Unexpected error") + message = getattr(err, "message", "Please restart to continue syncing") + logger.error(f"{title}: {message}", exc_info=exc_info_tuple(new_err)) + self.sync.notifier.notify(title, message, level=self.sync.notifier.ERROR) self.running.set() self.syncing.clear() From d272e494176c4f763446ba4eb5e878f906bae05d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 13:46:14 +0000 Subject: [PATCH 187/374] [oauth] don't log errors if we raise them --- src/maestral/oauth.py | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/maestral/oauth.py b/src/maestral/oauth.py index ea2b1242a..9a30ae206 100644 --- a/src/maestral/oauth.py +++ b/src/maestral/oauth.py @@ -138,18 +138,14 @@ def _get_keyring_backend(self) -> KeyringBackend: try: ring = load_keyring(keyring_class) - except Exception as exc: - # reset the keyring and prompt to relink - # them bomb out with an exception + except Exception: + # reset the keyring and bomb out with an exception self._conf.set("app", "keyring", "automatic") title = f"Cannot load keyring {keyring_class}" message = "Please relink Maestral to get a new access token" - new_exc = KeyringAccessError(title, message).with_traceback( - exc.__traceback__ - ) - logger.error(title, exc_info=_exc_info(new_exc)) + new_exc = KeyringAccessError(title, message) raise new_exc else: return ring @@ -291,10 +287,7 @@ def load_token(self) -> None: elif access_type == "offline": self._refresh_token = token else: - msg = "Invalid token access type in state file." - err = RuntimeError("Invalid token access type in state file.") - logger.error(msg, exc_info=_exc_info(err)) - raise err + raise RuntimeError("Invalid token access type in state file.") self._token_access_type = access_type @@ -302,7 +295,6 @@ def load_token(self) -> None: title = f"Could not load auth token, {self.keyring.name} is locked" msg = "Please unlock the keyring and try again." exc = KeyringAccessError(title, msg) - logger.error(title, exc_info=_exc_info(exc)) raise exc def get_auth_url(self) -> str: @@ -386,7 +378,6 @@ def delete_creds(self) -> None: title = f"Could not delete auth token, {self.keyring.name} is locked" msg = "Please unlock the keyring and try again." exc = KeyringAccessError(title, msg) - logger.error(title, exc_info=_exc_info(exc)) raise exc except PasswordDeleteError as exc: # password does not exist in keyring @@ -406,7 +397,3 @@ def __repr__(self) -> str: f"<{self.__class__.__name__}(config={self._config_name!r}, " f"account_id={self._account_id})>" ) - - -def _exc_info(exc): - return type(exc), exc, exc.__traceback__ From 04ef7ae8d4637b7a1d6a3a9cc83bdc7e3eca4e38 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 13:46:40 +0000 Subject: [PATCH 188/374] [oauth] lazily load keyring --- src/maestral/oauth.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/maestral/oauth.py b/src/maestral/oauth.py index 9a30ae206..d2be7d1e1 100644 --- a/src/maestral/oauth.py +++ b/src/maestral/oauth.py @@ -114,14 +114,25 @@ def __init__(self, config_name: str, app_key: str = DROPBOX_APP_KEY) -> None: self._state.get("account", "token_access_type") or None ) - self.keyring = self._get_keyring_backend() - # defer keyring access until token requested by user self.loaded = False + self._keyring: Optional[KeyringBackend] = None self._access_token: Optional[str] = None self._refresh_token: Optional[str] = None self._expires_at: Optional[datetime] = None + @property + def keyring(self) -> KeyringBackend: + + if not self._keyring: + self._keyring = self._get_keyring_backend() + + return self._keyring + + @keyring.setter + def keyring(self, ring: KeyringBackend) -> None: + self._keyring = ring + def _get_keyring_backend(self) -> KeyringBackend: """ Returns the keyring backend currently used. If none is used because we are not From 90cda06bf0ce5a2fd16ed93560724532ed03f182 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 13:48:25 +0000 Subject: [PATCH 189/374] remove MaestralDesktopNotificationHandler --- src/maestral/main.py | 6 ------ src/maestral/notify/__init__.py | 4 ++-- src/maestral/notify/main.py | 35 --------------------------------- 3 files changed, 2 insertions(+), 43 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 810f2e771..db53f3f3c 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -54,7 +54,6 @@ UnsupportedFileTypeForDiff, ) from .config import MaestralConfig, MaestralState, validate_config_name -from .notify import MaestralDesktopNotificationHandler from .logging import CachedHandler, SdNotificationHandler, safe_journal_sender from .utils import get_newer_version from .utils.path import ( @@ -294,11 +293,6 @@ def _setup_logging(self) -> None: self._log_handler_error_cache.setLevel(logging.ERROR) self._logger.addHandler(self._log_handler_error_cache) - # log errors to desktop notifications - self._log_handler_desktop_notifier = MaestralDesktopNotificationHandler() - self._log_handler_desktop_notifier.setLevel(logging.WARNING) - self._logger.addHandler(self._log_handler_desktop_notifier) - # ==== methods to access config and saved state ==================================== @property diff --git a/src/maestral/notify/__init__.py b/src/maestral/notify/__init__.py index 10f956148..2bfd98cd3 100644 --- a/src/maestral/notify/__init__.py +++ b/src/maestral/notify/__init__.py @@ -1,4 +1,4 @@ # -*- coding: utf-8 -*- -from .main import MaestralDesktopNotifier, MaestralDesktopNotificationHandler +from .main import MaestralDesktopNotifier -__all__ = ["MaestralDesktopNotifier", "MaestralDesktopNotificationHandler"] +__all__ = ["MaestralDesktopNotifier"] diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index 43c3e8333..9b2f69f3b 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -7,7 +7,6 @@ # system imports import time import platform -import logging from threading import Lock from typing import Optional, Dict, ClassVar, Callable @@ -22,7 +21,6 @@ "NotificationLevel", "DesktopNotifier", "MaestralDesktopNotifier", - "MaestralDesktopNotificationHandler", ] @@ -188,36 +186,3 @@ def notify( action=on_click, buttons=buttons, ) - - -class MaestralDesktopNotificationHandler(logging.Handler): - """A logging handler to send desktop notifications.""" - - def __init__(self) -> None: - super().__init__() - self.setFormatter(logging.Formatter(fmt="%(message)s")) - - def emit(self, record: logging.LogRecord) -> None: - """ - Emits a logging message as a desktop notification. - - :param record: Log record. - """ - - # avoid recursive notifications - if record.name.startswith("maestral.notify"): - return - - self.format(record) - - if record.levelno == logging.ERROR: - urgency = NotificationLevel.Critical - else: - urgency = NotificationLevel.Normal - - _desktop_notifier.send( - title=record.levelname, - message=record.message, - icon=APP_ICON_PATH, - urgency=urgency, - ) From 0b04484aba641cc84449d529999a59d073b6359d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 21:39:48 +0000 Subject: [PATCH 190/374] move bump2version config to setup.cfg --- .bumpversion.cfg | 25 ------------------------- setup.cfg | 26 ++++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 25 deletions(-) delete mode 100644 .bumpversion.cfg diff --git a/.bumpversion.cfg b/.bumpversion.cfg deleted file mode 100644 index 6b2888436..000000000 --- a/.bumpversion.cfg +++ /dev/null @@ -1,25 +0,0 @@ -[bumpversion] -current_version = 1.3.2.dev0 -commit = True -tag = False -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? -serialize = - {major}.{minor}.{patch}.{release}{build} - {major}.{minor}.{patch} - -[bumpversion:part:release] -optional_value = prod -first_value = dev -values = - dev - prod - -[bumpversion:part:build] - -[bumpversion:file:setup.py] -search = version="{current_version}" -replace = version="{new_version}" - -[bumpversion:file:src/maestral/__init__.py] - -[bumpversion:file:docs/conf.py] diff --git a/setup.cfg b/setup.cfg index 26eb2d881..616b071d7 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,3 +1,29 @@ +[bumpversion] +current_version = 1.3.2.dev0 +commit = True +tag = False +parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? +serialize = + {major}.{minor}.{patch}.{release}{build} + {major}.{minor}.{patch} + +[bumpversion:part:release] +optional_value = prod +first_value = dev +values = + dev + prod + +[bumpversion:part:build] + +[bumpversion:file:setup.py] +search = version="{current_version}" +replace = version="{new_version}" + +[bumpversion:file:src/maestral/__init__.py] + +[bumpversion:file:docs/conf.py] + [flake8] # E203: whitespace before ':', conflicts with black # E501: line width, is handled by black From f4a52a803c24d180e8495767749165b84ceb8e4b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 22:19:31 +0000 Subject: [PATCH 191/374] [notify] simplify handling on notification levels --- src/maestral/cli.py | 6 +-- src/maestral/notify/__init__.py | 20 ++++++++- src/maestral/notify/main.py | 74 ++++++++++++++++++--------------- src/maestral/sync.py | 19 +++++---- 4 files changed, 72 insertions(+), 47 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 937bfce78..951089548 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1224,15 +1224,15 @@ def notify(): @existing_config_option def notify_level(level_name: str, config_name: str) -> None: - from .notify import MaestralDesktopNotifier as Notifier + from . import notify as _notify # prevent conflict with notify command group from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: if level_name: - m.notification_level = Notifier.level_name_to_number(level_name) + m.notification_level = _notify.level_name_to_number(level_name) cli.ok(f"Notification level set to {level_name}.") else: - level_name = Notifier.level_number_to_name(m.notification_level) + level_name = _notify.level_number_to_name(m.notification_level) cli.echo(f"Notification level: {level_name}.") diff --git a/src/maestral/notify/__init__.py b/src/maestral/notify/__init__.py index 2bfd98cd3..c357c77eb 100644 --- a/src/maestral/notify/__init__.py +++ b/src/maestral/notify/__init__.py @@ -1,4 +1,20 @@ # -*- coding: utf-8 -*- -from .main import MaestralDesktopNotifier +from .main import ( + MaestralDesktopNotifier, + NONE, + ERROR, + SYNCISSUE, + FILECHANGE, + level_name_to_number, + level_number_to_name, +) -__all__ = ["MaestralDesktopNotifier"] +__all__ = [ + "NONE", + "ERROR", + "SYNCISSUE", + "FILECHANGE", + "level_name_to_number", + "level_number_to_name", + "MaestralDesktopNotifier", +] diff --git a/src/maestral/notify/main.py b/src/maestral/notify/main.py index 9b2f69f3b..3be6e6540 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify/main.py @@ -8,7 +8,7 @@ import time import platform from threading import Lock -from typing import Optional, Dict, ClassVar, Callable +from typing import Optional, Dict, Callable # local imports from ..config import MaestralConfig @@ -17,6 +17,12 @@ __all__ = [ + "NONE", + "ERROR", + "SYNCISSUE", + "FILECHANGE", + "level_name_to_number", + "level_number_to_name", "Notification", "NotificationLevel", "DesktopNotifier", @@ -84,6 +90,37 @@ def send( _desktop_notifier = DesktopNotifier(APP_NAME) +NONE = 100 +ERROR = 40 +SYNCISSUE = 30 +FILECHANGE = 15 + + +_levelToName = { + NONE: "NONE", + ERROR: "ERROR", + SYNCISSUE: "SYNCISSUE", + FILECHANGE: "FILECHANGE", +} + +_nameToLevel = { + "NONE": 100, + "ERROR": 40, + "SYNCISSUE": 30, + "FILECHANGE": 15, +} + + +def level_number_to_name(number: int) -> str: + """Converts a Maestral notification level number to name.""" + return _levelToName[number] + + +def level_name_to_number(name: str) -> int: + """Converts a Maestral notification level name to number.""" + return _nameToLevel[name] + + class MaestralDesktopNotifier: """Desktop notification emitter for Maestral @@ -95,37 +132,6 @@ class MaestralDesktopNotifier: :cvar int FILECHANGE: Notification level for file changes. """ - _instances: ClassVar[Dict[str, "MaestralDesktopNotifier"]] = dict() - - NONE = 100 - ERROR = 40 - SYNCISSUE = 30 - FILECHANGE = 15 - - _levelToName = { - NONE: "NONE", - ERROR: "ERROR", - SYNCISSUE: "SYNCISSUE", - FILECHANGE: "FILECHANGE", - } - - _nameToLevel = { - "NONE": 100, - "ERROR": 40, - "SYNCISSUE": 30, - "FILECHANGE": 15, - } - - @classmethod - def level_number_to_name(cls, number: int) -> str: - """Converts a Maestral notification level number to name.""" - return cls._levelToName[number] - - @classmethod - def level_name_to_number(cls, name: str) -> int: - """Converts a Maestral notification level name to number.""" - return cls._nameToLevel[name] - def __init__(self, config_name: str) -> None: self._conf = MaestralConfig(config_name) self._snooze = 0.0 @@ -171,8 +177,8 @@ def notify( notification. """ - ignore = self.snoozed and level == MaestralDesktopNotifier.FILECHANGE - if level == MaestralDesktopNotifier.ERROR: + ignore = self.snoozed and level == FILECHANGE + if level == ERROR: urgency = NotificationLevel.Critical else: urgency = NotificationLevel.Normal diff --git a/src/maestral/sync.py b/src/maestral/sync.py index eea5f7412..a335dc3b7 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -65,8 +65,8 @@ from watchdog.utils.dirsnapshot import DirectorySnapshot # type: ignore # local imports +from . import notify from .config import MaestralConfig, MaestralState -from .notify import MaestralDesktopNotifier from .fsevents import Observer from .constants import ( IDLE, @@ -419,7 +419,7 @@ def __init__(self, client: DropboxClient, fs_events_handler: FSEventHandler): self._conf = MaestralConfig(self.config_name) self._state = MaestralState(self.config_name) - self.notifier = MaestralDesktopNotifier(self.config_name) + self.notifier = notify.MaestralDesktopNotifier(self.config_name) # upload_errors / download_errors: contains failed uploads / downloads # (from sync errors) to retry later @@ -1331,7 +1331,7 @@ def callback(): self.notifier.notify( "Sync error", f"Could not sync {file_name}", - level=self.notifier.SYNCISSUE, + level=notify.SYNCISSUE, buttons={"Show": callback}, ) self.sync_errors.add(err) @@ -1384,7 +1384,7 @@ def _database_access(self, log_errors: bool = False) -> Iterator[None]: if new_exc: if log_errors: logger.error(title, exc_info=exc_info_tuple(new_exc)) - self.notifier.notify(title, msg, level=self.notifier.ERROR) + self.notifier.notify(title, msg, level=notify.ERROR) else: raise new_exc @@ -3357,7 +3357,10 @@ def _dir_snapshot_with_mignore(self, path: str) -> DirectorySnapshot: @contextmanager def _handle_sync_thread_errors( - syncing: Event, running: Event, connected: Event, notifier: MaestralDesktopNotifier + syncing: Event, + running: Event, + connected: Event, + notifier: notify.MaestralDesktopNotifier, ) -> Iterator[None]: try: @@ -3374,8 +3377,8 @@ def _handle_sync_thread_errors( syncing.clear() title = getattr(err, "title", "Unexpected error") message = getattr(err, "message", "Please restart to continue syncing") - logger.error(f"{title}: {message}", exc_info=True) - notifier.notify(title, message, level=notifier.ERROR) + logger.error(title, exc_info=True) + notifier.notify(title, message, level=notify.ERROR) def download_worker( @@ -3747,7 +3750,7 @@ def start(self) -> None: title = getattr(err, "title", "Unexpected error") message = getattr(err, "message", "Please restart to continue syncing") logger.error(f"{title}: {message}", exc_info=exc_info_tuple(new_err)) - self.sync.notifier.notify(title, message, level=self.sync.notifier.ERROR) + self.sync.notifier.notify(title, message, level=notify.ERROR) self.running.set() self.syncing.clear() From 75ef5b6f1260f7e303b477cc7956afaac6696845 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 22:19:53 +0000 Subject: [PATCH 192/374] [daemon] handle errors when starting sync --- src/maestral/daemon.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 198b25049..1d393cb39 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -409,6 +409,7 @@ def start_maestral_daemon( """ import asyncio + from . import notify from .main import Maestral if log_to_stdout: @@ -513,8 +514,14 @@ async def periodic_watchdog() -> None: maestral_daemon = ExposedMaestral(config_name, log_to_stdout=log_to_stdout) if start_sync: - logger.debug("Starting sync") - maestral_daemon.start_sync() + + try: + maestral_daemon.start_sync() + except Exception as exc: + title = getattr(exc, "title", "Failed to start sync") + message = getattr(exc, "message", "Please inspect the logs") + logger.error(title, exc_info=True) + maestral_daemon.sync.notify(title, message, level=notify.ERROR) try: From e9d2933f7bfc85f63a5d2c62ef910c73d1e9c9a8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 20 Jan 2021 00:03:46 +0000 Subject: [PATCH 193/374] [tests] adapt tests --- tests/offline/conftest.py | 6 ++++-- tests/offline/test_cli.py | 6 +++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/offline/conftest.py b/tests/offline/conftest.py index b0a050448..bd90e01b8 100644 --- a/tests/offline/conftest.py +++ b/tests/offline/conftest.py @@ -21,8 +21,10 @@ @pytest.fixture def m(): - yield Maestral("test-config") - remove_configuration("test-config") + m = Maestral("test-config") + m._conf.save() + yield m + remove_configuration(m.config_name) @pytest.fixture diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index e60163a79..21eb499de 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -7,7 +7,7 @@ from maestral.cli import main from maestral.main import logger from maestral.autostart import AutoStart -from maestral.notify import MaestralDesktopNotifier +from maestral.notify import level_number_to_name, level_name_to_number from maestral.daemon import MaestralProxy, start_maestral_daemon_process, Start @@ -150,13 +150,13 @@ def test_notify_level(config_name): runner = CliRunner() result = runner.invoke(main, ["notify", "level", "-c", m.config_name]) - level_name = MaestralDesktopNotifier.level_number_to_name(m.notification_level) + level_name = level_number_to_name(m.notification_level) assert result.exit_code == 0 assert level_name in result.output level_name = "SYNCISSUE" - level_number = MaestralDesktopNotifier.level_name_to_number(level_name) + level_number = level_name_to_number(level_name) result = runner.invoke(main, ["notify", "level", level_name, "-c", m.config_name]) assert result.exit_code == 0 From 90cade064c4be38a8a04b75273202a8ee7f30f35 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 20 Jan 2021 11:58:20 +0000 Subject: [PATCH 194/374] [notify] move generic code to separate package --- src/maestral/{notify/main.py => notify.py} | 71 +--- src/maestral/notify/__init__.py | 20 - src/maestral/notify/base.py | 108 ------ src/maestral/notify/linux.py | 153 -------- src/maestral/notify/macos.py | 419 --------------------- 5 files changed, 5 insertions(+), 766 deletions(-) rename src/maestral/{notify/main.py => notify.py} (57%) delete mode 100644 src/maestral/notify/__init__.py delete mode 100644 src/maestral/notify/base.py delete mode 100644 src/maestral/notify/linux.py delete mode 100644 src/maestral/notify/macos.py diff --git a/src/maestral/notify/main.py b/src/maestral/notify.py similarity index 57% rename from src/maestral/notify/main.py rename to src/maestral/notify.py index 3be6e6540..9bbaa5253 100644 --- a/src/maestral/notify/main.py +++ b/src/maestral/notify.py @@ -6,14 +6,14 @@ # system imports import time -import platform -from threading import Lock from typing import Optional, Dict, Callable +# external imports +from desktop_notifier import DesktopNotifier, NotificationLevel + # local imports -from ..config import MaestralConfig -from ..constants import APP_NAME, APP_ICON_PATH -from .base import DesktopNotifierBase, NotificationLevel, Notification +from .config import MaestralConfig +from .constants import APP_NAME, APP_ICON_PATH __all__ = [ @@ -23,70 +23,9 @@ "FILECHANGE", "level_name_to_number", "level_number_to_name", - "Notification", - "NotificationLevel", - "DesktopNotifier", "MaestralDesktopNotifier", ] - -class DesktopNotifier: - """Cross-platform desktop notification emitter - - Uses different backends depending on the platform version and available services. - The Dbus backend requires a running asyncio loop. The Cocoa implementations will - dispatch notifications without an event loop but require a running CFRunLoop *in the - main thread* to react to user interactions with the notification. Packages such as - :mod:`rubicon.objc` can be used to integrate asyncio with a CFRunLoop. - - :param app_name: Name of app which sends notifications. - """ - - _impl: DesktopNotifierBase - - def __init__(self, app_name: str = "Python") -> None: - self._lock = Lock() - - if platform.system() == "Darwin": - from .macos import Impl - elif platform.system() == "Linux": - from .linux import Impl # type: ignore - else: - Impl = DesktopNotifierBase # type: ignore - - self._impl = Impl(app_name) - - def send( - self, - title: str, - message: str, - urgency: NotificationLevel = NotificationLevel.Normal, - icon: Optional[str] = None, - action: Optional[Callable] = None, - buttons: Optional[Dict[str, Callable]] = None, - ) -> None: - """ - Sends a desktop notification. Some arguments may be ignored, depending on the - backend. - - :param title: Notification title. - :param message: Notification message. - :param urgency: Notification level: low, normal or critical. This is ignored by - some implementations. - :param icon: Path to an icon to use for the notification, typically the app - icon. This is ignored by some implementations, e.g., on macOS where the icon - of the app bundle is always used. - :param action: Handler to call when the notification is clicked. This is ignored - by some implementations. - :param buttons: A dictionary with button names and callbacks to show in the - notification. This is ignored by some implementations. - """ - notification = Notification(title, message, urgency, icon, action, buttons) - - with self._lock: - self._impl.send(notification) - - _desktop_notifier = DesktopNotifier(APP_NAME) diff --git a/src/maestral/notify/__init__.py b/src/maestral/notify/__init__.py deleted file mode 100644 index c357c77eb..000000000 --- a/src/maestral/notify/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -from .main import ( - MaestralDesktopNotifier, - NONE, - ERROR, - SYNCISSUE, - FILECHANGE, - level_name_to_number, - level_number_to_name, -) - -__all__ = [ - "NONE", - "ERROR", - "SYNCISSUE", - "FILECHANGE", - "level_name_to_number", - "level_number_to_name", - "MaestralDesktopNotifier", -] diff --git a/src/maestral/notify/base.py b/src/maestral/notify/base.py deleted file mode 100644 index ff5d3b97d..000000000 --- a/src/maestral/notify/base.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module defines base classes for desktop notifications. All platform implementations -must inherit from :class:`DesktopNotifierBase`. -""" - -# system imports -from enum import Enum -from typing import Optional, Dict, Callable, Union - - -class NotificationLevel(Enum): - """Enumeration of notification levels - - The interpretation and visuals will depend on the platform. - - :cvar Critical: For critical errors. - :cvar Normal: Default platform notification level. - :cvar Low: Low priority notification. - """ - - Critical = "critical" - Normal = "normal" - Low = "low" - - -class Notification: - """A desktop notification - - :param title: Notification title. - :param message: Notification message. - :param urgency: Notification level: low, normal or critical. This is ignored by some - implementations. - :param icon: Path to an icon to use for the notification, typically the app icon. - This is ignored by some implementations, e.g., on macOS where the icon of the - app bundle is always used. - :param action: Handler to call when the notification is clicked. This is ignored by - some implementations. - :param buttons: A dictionary with button names to show in the notification and - handler to call when the respective button is clicked. This is ignored by some - implementations. - - :ivar identifier: An identifier which gets assigned to the notification after it is - sent. This may be a str or int, depending on the type of identifier used by the - platform. - """ - - identifier: Union[str, int, None] - - def __init__( - self, - title: str, - message: str, - urgency: NotificationLevel = NotificationLevel.Normal, - icon: Optional[str] = None, - action: Optional[Callable] = None, - buttons: Optional[Dict[str, Callable]] = None, - ) -> None: - - self.title = title - self.message = message - self.urgency = urgency - self.icon = icon - self.action = action - self.buttons = buttons or dict() - self.identifier = None - - def __repr__(self): - return f"<{self.__class__.__name__}(title='{self.title}', message='{self.message}')>" - - -class DesktopNotifierBase: - """Base class for desktop notifier implementations - - Notification levels CRITICAL, NORMAL and LOW may be used by some implementations to - determine how a notification is displayed. - - :param app_name: Name to identify the application in the notification center. On - Linux, this should correspond to the application name in a desktop entry. On - macOS, this field is discarded and the app is identified by the bundle id of the - sending program (e.g., Python). - :param notification_limit: Maximum number of notifications to keep in the system's - notification center. This may be ignored by some implementations. - """ - - app_name: str - notification_limit: int - current_notifications: Dict[int, Notification] - - def __init__(self, app_name: str = "", notification_limit: int = 5) -> None: - self.app_name = app_name - self.notification_limit = notification_limit - self.current_notifications = dict() - self._current_nid = 0 - - def send(self, notification: Notification) -> None: - """ - Sends a desktop notification. Some arguments may be ignored, depending on the - implementation. - - :param notification: Notification to send. - """ - pass - - def _next_nid(self) -> int: - self._current_nid += 1 - self._current_nid %= self.notification_limit - return self._current_nid diff --git a/src/maestral/notify/linux.py b/src/maestral/notify/linux.py deleted file mode 100644 index 4bd464fe9..000000000 --- a/src/maestral/notify/linux.py +++ /dev/null @@ -1,153 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Notification backend for Linux. Includes an implementation to send desktop notifications -over Dbus. Responding to user interaction with a notification requires a running asyncio -event loop. -""" - -# system imports -import asyncio -import logging -from typing import Optional, Coroutine - -# external imports -from dbus_next import Variant # type: ignore -from dbus_next.aio import MessageBus, ProxyInterface # type: ignore - -# local imports -from .base import Notification, DesktopNotifierBase, NotificationLevel - - -__all__ = ["Impl"] - -logger = logging.getLogger(__name__) - - -class DBusDesktopNotifier(DesktopNotifierBase): - """DBus notification backend for Linux - - This implements the org.freedesktop.Notifications standard. The DBUS connection is - created in a thread with a running asyncio loop to handle clicked notifications. - """ - - _to_native_urgency = { - NotificationLevel.Low: Variant("y", 0), - NotificationLevel.Normal: Variant("y", 1), - NotificationLevel.Critical: Variant("y", 2), - } - - def __init__(self, app_name: str) -> None: - super().__init__(app_name) - self._loop = asyncio.get_event_loop() - self.interface: Optional[ProxyInterface] = None - self._did_attempt_connect = False - - def _force_run_in_loop(self, coro: Coroutine) -> None: - - if self._loop.is_running(): - asyncio.run_coroutine_threadsafe(coro, self._loop) - else: - self._loop.run_until_complete(coro) - - async def _init_dbus(self) -> None: - - try: - self.bus = await MessageBus().connect() - introspection = await self.bus.introspect( - "org.freedesktop.Notifications", "/org/freedesktop/Notifications" - ) - self.proxy_object = self.bus.get_proxy_object( - "org.freedesktop.Notifications", - "/org/freedesktop/Notifications", - introspection, - ) - self.interface = self.proxy_object.get_interface( - "org.freedesktop.Notifications" - ) - if hasattr(self.interface, "on_action_invoked"): - # some older interfaces may not support notification actions - self.interface.on_action_invoked(self._on_action) - except Exception as exc: - logger.warning("Could not connect to DBUS interface: %s", exc.args[0]) - finally: - self._did_attempt_connect = True - - def send(self, notification: Notification) -> None: - """ - Sends a notification. - - :param notification: Notification to send. - """ - self._force_run_in_loop(self._send(notification)) - - async def _send(self, notification: Notification) -> None: - - if not self._did_attempt_connect: - await self._init_dbus() - - if not self.interface: - return - - # Get an internal ID for the notifications. This will recycle an old ID if we - # are above the max number of notifications. - internal_nid = self._next_nid() - - # Get the old notification to replace, if any. - notification_to_replace = self.current_notifications.get(internal_nid) - - if notification_to_replace: - replaces_nid = notification_to_replace.identifier - else: - replaces_nid = 0 - - # Create list of actions with default and user-supplied. - actions = ["default", "default"] - - for button_name in notification.buttons.keys(): - actions += [button_name, button_name] - - try: - # Post the new notification and record the platform ID assigned to it. - platform_nid = await self.interface.call_notify( - self.app_name, # app_name - replaces_nid, # replaces_id - notification.icon or "", # app_icon - notification.title, # summary - notification.message, # body - actions, # actions - {"urgency": self._to_native_urgency[notification.urgency]}, # hints - -1, # expire_timeout (-1 = default) - ) - except Exception: - # This may fail for several reasons: there may not be a systemd service - # file for 'org.freedesktop.Notifications' or the system configuration - # may have changed after DesktopNotifierFreedesktopDBus was initialized. - logger.warning("Notification failed", exc_info=True) - else: - # Store the notification for future replacement and to keep track of - # user-supplied callbacks. - notification.identifier = platform_nid - self.current_notifications[internal_nid] = notification - - def _on_action(self, nid, action_key) -> None: - - # Get the notification instance from the platform ID. - nid = int(nid) - action_key = str(action_key) - notification = next( - iter(n for n in self.current_notifications.values() if n.identifier == nid), - None, - ) - - # Execute any callbacks for button clicks. - if notification: - if action_key == "default" and notification.action: - notification.action() - else: - callback = notification.buttons.get(action_key) - - if callback: - callback() - - -Impl = DBusDesktopNotifier diff --git a/src/maestral/notify/macos.py b/src/maestral/notify/macos.py deleted file mode 100644 index a08d30c55..000000000 --- a/src/maestral/notify/macos.py +++ /dev/null @@ -1,419 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Notification backend for macOS. Includes three implementations, in order of preference: - -1) UNUserNotificationCenter: Introduced in macOS 10.14 and cross-platform with iOS and - iPadOS. Only available from signed app bundles if called from the main executable. - Not available from interactive Python interpreter. -2) NSUserNotificationCenter: Deprecated but still available in macOS 11.0. Can be used - from Python framework. -3) Apple Script: Always available but notifications are sent from Apple Script and not - Python or Maestral app. No callbacks when the user clicks on notification. - -The first two implementations require a running CFRunLoop to invoke callbacks. -""" - -# system imports -import uuid -import platform -import subprocess -import shutil -import logging -from concurrent.futures import Future, wait -from typing import Type, Optional, Dict, Tuple - -# external imports -from packaging.version import Version -from rubicon.objc import ObjCClass, objc_method, py_from_ns # type: ignore -from rubicon.objc.runtime import load_library, objc_id, objc_block # type: ignore - -# local imports -from ..constants import FROZEN -from .base import Notification, DesktopNotifierBase - - -__all__ = ["Impl"] - -logger = logging.getLogger(__name__) -macos_version, *_ = platform.mac_ver() - -foundation = load_library("Foundation") - -NSObject = ObjCClass("NSObject") - - -Impl: Type[DesktopNotifierBase] = DesktopNotifierBase - - -if FROZEN and Version(macos_version) >= Version("10.14.0"): - - uns = load_library("UserNotifications") - - UNUserNotificationCenter = ObjCClass("UNUserNotificationCenter") - UNMutableNotificationContent = ObjCClass("UNMutableNotificationContent") - UNNotificationRequest = ObjCClass("UNNotificationRequest") - UNNotificationAction = ObjCClass("UNNotificationAction") - UNNotificationCategory = ObjCClass("UNNotificationCategory") - - NSSet = ObjCClass("NSSet") - - UNNotificationDefaultActionIdentifier = ( - "com.apple.UNNotificationDefaultActionIdentifier" - ) - UNNotificationDismissActionIdentifier = ( - "com.apple.UNNotificationDismissActionIdentifier" - ) - - UNAuthorizationOptionBadge = 1 << 0 - UNAuthorizationOptionSound = 1 << 1 - UNAuthorizationOptionAlert = 1 << 2 - - UNNotificationActionOptionForeground = 1 << 2 - - UNNotificationCategoryOptionNone = 0 - - UNAuthorizationStatusAuthorized = 2 - UNAuthorizationStatusProvisional = 3 - UNAuthorizationStatusEphemeral = 4 - - class NotificationCenterDelegate(NSObject): # type: ignore - """Delegate to handle user interactions with notifications""" - - @objc_method - def userNotificationCenter_didReceiveNotificationResponse_withCompletionHandler_( - self, center, response, completion_handler: objc_block - ) -> None: - - # Get the notification which was clicked from the platform ID. - internal_nid = py_from_ns( - response.notification.request.content.userInfo["internal_nid"] - ) - notification = self.interface.current_notifications[internal_nid] - - # Get and call the callback which corresponds to the user interaction. - if response.actionIdentifier == UNNotificationDefaultActionIdentifier: - - callback = notification.action - - if callback: - callback() - - elif response.actionIdentifier != UNNotificationDismissActionIdentifier: - - action_id_str = py_from_ns(response.actionIdentifier) - - callback = notification.buttons.get(action_id_str) - - if callback: - callback() - - completion_handler() - - class CocoaNotificationCenter(DesktopNotifierBase): - """UNUserNotificationCenter backend for macOS - - Can be used with macOS Catalina and newer. Both app name and bundle identifier - will be ignored. The notification center automatically uses the values provided - by the app bundle. This implementation only works from within signed app bundles - and if called from the main executable. - - :param app_name: The name of the app. Does not have any effect because the app - name is automatically determined from the bundle or framework. - """ - - _notification_categories: Dict[Tuple[str, ...], str] - - def __init__(self, app_name: str) -> None: - super().__init__(app_name) - self.nc = UNUserNotificationCenter.currentNotificationCenter() - self.nc_delegate = NotificationCenterDelegate.alloc().init() - self.nc_delegate.interface = self - self.nc.delegate = self.nc_delegate - self._did_request_authorisation = False - - self._notification_categories = {} - - def _request_authorisation(self) -> None: - def on_auth_completed(granted: bool, error: objc_id) -> None: - if granted: - logger.debug("UNUserNotificationCenter: authorisation granted") - else: - logger.debug("UNUserNotificationCenter: authorisation denied") - - if error: - error = py_from_ns(error) - logger.warning("UNUserNotificationCenter: %s", str(error)) - - self.nc.requestAuthorizationWithOptions( - UNAuthorizationOptionAlert - | UNAuthorizationOptionSound - | UNAuthorizationOptionBadge, - completionHandler=on_auth_completed, - ) - - self._did_request_authorisation = True - - @property - def _has_authorisation(self) -> bool: - - # get existing notification categories - - future: Future = Future() - - def handler(settings: objc_id) -> None: - settings = py_from_ns(settings) - settings.retain() - future.set_result(settings) - - self.nc.getNotificationSettingsWithCompletionHandler(handler) - - wait([future]) - settings = future.result() - - authorized = settings.authorizationStatus in ( - UNAuthorizationStatusAuthorized, - UNAuthorizationStatusProvisional, - UNAuthorizationStatusEphemeral, - ) - - settings.release() - - return authorized - - def send(self, notification: Notification) -> None: - """ - Sends a notification. - - :param notification: Notification to send. - """ - - if not self._did_request_authorisation: - self._request_authorisation() - - if not self._has_authorisation: - return - - # Get an internal ID for the notifications. This will recycle an old ID if - # we are above the max number of notifications. - internal_nid = self._next_nid() - - # Get the old notification to replace, if any. - notification_to_replace = self.current_notifications.get(internal_nid) - - if notification_to_replace: - platform_nid = notification_to_replace.identifier - else: - platform_nid = str(uuid.uuid4()) - - # Set up buttons for notification. On macOS, we need need to register a new - # notification category for every unique set of buttons. - button_names = tuple(notification.buttons.keys()) - category_id = self._category_id_for_button_names(button_names) - - # Create the native notification + notification request. - content = UNMutableNotificationContent.alloc().init() - content.title = notification.title - content.body = notification.message - content.categoryIdentifier = category_id - content.userInfo = {"internal_nid": internal_nid} - - notification_request = UNNotificationRequest.requestWithIdentifier( - platform_nid, content=content, trigger=None - ) - - # Post the notification. - self.nc.addNotificationRequest( - notification_request, withCompletionHandler=None - ) - - # Store the notification for future replacement and to keep track of - # user-supplied callbacks. - notification.identifier = platform_nid - self.current_notifications[internal_nid] = notification - - def _category_id_for_button_names( - self, button_names: Tuple[str, ...] - ) -> Optional[str]: - """ - Creates and registers a new notification category with the given buttons - or retrieves an existing one. - """ - - if not button_names: - return None - - try: - return self._notification_categories[button_names] - except KeyError: - actions = [] - - for name in button_names: - action = UNNotificationAction.actionWithIdentifier( - name, title=name, options=UNNotificationActionOptionForeground - ) - actions.append(action) - - # get existing notification categories - - future: Future = Future() - - def handler(categories: objc_id) -> None: - categories = py_from_ns(categories) - categories.retain() - future.set_result(categories) - - self.nc.getNotificationCategoriesWithCompletionHandler(handler) - - wait([future]) - categories = future.result() - - # add category for new set of buttons - - category_id = str(uuid.uuid4()) - new_categories = categories.setByAddingObject( - UNNotificationCategory.categoryWithIdentifier( - category_id, - actions=actions, - intentIdentifiers=[], - options=UNNotificationCategoryOptionNone, - ) - ) - self.nc.setNotificationCategories(new_categories) - self._notification_categories[button_names] = category_id - - categories.release() - - return category_id - - if UNUserNotificationCenter.currentNotificationCenter(): - Impl = CocoaNotificationCenter - - -elif Version(macos_version) < Version("12.0.0"): - - NSUserNotification = ObjCClass("NSUserNotification") - NSUserNotificationCenter = ObjCClass("NSUserNotificationCenter") - NSDate = ObjCClass("NSDate") - - NSUserNotificationActivationTypeContentsClicked = 1 - NSUserNotificationActivationTypeActionButtonClicked = 2 - NSUserNotificationActivationTypeAdditionalActionClicked = 4 - - class NotificationCenterDelegate(NSObject): # type: ignore - """Delegate to handle user interactions with notifications""" - - # subclass UNUserNotificationCenter and define delegate method - # to handle clicked notifications - - @objc_method - def userNotificationCenter_didActivateNotification_( - self, center, notification - ) -> None: - - internal_nid = py_from_ns(notification.userInfo["internal_nid"]) - notification_info = self.interface.current_notifications[internal_nid] - - if ( - notification.activationType - == NSUserNotificationActivationTypeContentsClicked - ): - - if notification_info.action: - notification_info.action() - - elif ( - notification.activationType - == NSUserNotificationActivationTypeActionButtonClicked - ): - - button_title = py_from_ns(notification.actionButtonTitle) - callback = notification_info.buttons.get(button_title) - - if callback: - callback() - - class CocoaNotificationCenterLegacy(DesktopNotifierBase): - """NSUserNotificationCenter backend for macOS - - Should be used for macOS High Sierra and earlier or outside of app bundles. - Supports only a single button per notification. Both app name and bundle - identifier will be ignored. The notification center automatically uses the - values provided by the app bundle or the Python framework. - - :param app_name: The name of the app. Does not have any effect because the app - name is automatically determined from the bundle or framework. - """ - - def __init__(self, app_name: str) -> None: - super().__init__(app_name) - - self.nc = NSUserNotificationCenter.defaultUserNotificationCenter - self.nc_delegate = NotificationCenterDelegate.alloc().init() - self.nc.delegate = self.nc_delegate - self.nc.delegate.interface = self - - def send(self, notification: Notification) -> None: - """ - Sends a notification. - - :param notification: Notification to send. - """ - - internal_nid = self._next_nid() - notification_to_replace = self.current_notifications.get(internal_nid) - - if notification_to_replace: - platform_nid = notification_to_replace.identifier - else: - platform_nid = str(uuid.uuid4()) - - n = NSUserNotification.alloc().init() - n.title = notification.title - n.informativeText = notification.message - n.identifier = platform_nid - n.userInfo = {"internal_nid": internal_nid} - n.deliveryDate = NSDate.dateWithTimeInterval(0, sinceDate=NSDate.date()) - - if notification.buttons: - if len(notification.buttons) > 1: - logger.debug( - "NSUserNotificationCenter: only a single button is supported" - ) - n.hasActionButton = True - n.actionButtonTitle = list(notification.buttons.keys())[0] - - self.nc.scheduleNotification(n) - - notification.identifier = platform_nid - self.current_notifications[internal_nid] = notification - - if NSUserNotificationCenter.defaultUserNotificationCenter: - Impl = CocoaNotificationCenterLegacy - - -if Impl is None and shutil.which("osascript"): - - # fall back to apple script - - class DesktopNotifierOsaScript(DesktopNotifierBase): - """Apple script backend for macOS - - Sends desktop notifications via apple script. Does not support buttons or - callbacks. Apple script will always appear as the sending application. - """ - - def send(self, notification: Notification) -> None: - """ - Sends a notification. - - :param notification: Notification to send. - """ - - script = ( - f'display notification "{notification.message}" ' - f'with title "{notification.title}"' - ) - - subprocess.call(["osascript", "-e", script]) - - Impl = DesktopNotifierOsaScript From d0dc5745be7861ea25d27e1f116748fc93a6390e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 20 Jan 2021 12:01:05 +0000 Subject: [PATCH 195/374] added desktop-notifier dependency --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 51fc36a4d..ccb3d4d54 100644 --- a/setup.py +++ b/setup.py @@ -8,6 +8,7 @@ install_requires = [ "alembic>=1.3,<1.5", "click>=7.1.1,<8.0", + "desktop-notifier", "dropbox>=10.9.0,<12.0", "dbus-next>=0.1.4;sys_platform=='linux'", "fasteners>=0.15", From 6000c983599201a314c24d2b9173e68eb5b60af5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 20 Jan 2021 17:12:31 +0000 Subject: [PATCH 196/374] Revert "[oauth] don't log errors if we raise them" This reverts commit d272e494176c4f763446ba4eb5e878f906bae05d. --- src/maestral/oauth.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/maestral/oauth.py b/src/maestral/oauth.py index d2be7d1e1..ef671ad20 100644 --- a/src/maestral/oauth.py +++ b/src/maestral/oauth.py @@ -149,14 +149,18 @@ def _get_keyring_backend(self) -> KeyringBackend: try: ring = load_keyring(keyring_class) - except Exception: - # reset the keyring and bomb out with an exception + except Exception as exc: + # reset the keyring and prompt to relink + # them bomb out with an exception self._conf.set("app", "keyring", "automatic") title = f"Cannot load keyring {keyring_class}" message = "Please relink Maestral to get a new access token" - new_exc = KeyringAccessError(title, message) + new_exc = KeyringAccessError(title, message).with_traceback( + exc.__traceback__ + ) + logger.error(title, exc_info=_exc_info(new_exc)) raise new_exc else: return ring @@ -298,7 +302,10 @@ def load_token(self) -> None: elif access_type == "offline": self._refresh_token = token else: - raise RuntimeError("Invalid token access type in state file.") + msg = "Invalid token access type in state file." + err = RuntimeError("Invalid token access type in state file.") + logger.error(msg, exc_info=_exc_info(err)) + raise err self._token_access_type = access_type @@ -306,6 +313,7 @@ def load_token(self) -> None: title = f"Could not load auth token, {self.keyring.name} is locked" msg = "Please unlock the keyring and try again." exc = KeyringAccessError(title, msg) + logger.error(title, exc_info=_exc_info(exc)) raise exc def get_auth_url(self) -> str: @@ -389,6 +397,7 @@ def delete_creds(self) -> None: title = f"Could not delete auth token, {self.keyring.name} is locked" msg = "Please unlock the keyring and try again." exc = KeyringAccessError(title, msg) + logger.error(title, exc_info=_exc_info(exc)) raise exc except PasswordDeleteError as exc: # password does not exist in keyring @@ -408,3 +417,7 @@ def __repr__(self) -> str: f"<{self.__class__.__name__}(config={self._config_name!r}, " f"account_id={self._account_id})>" ) + + +def _exc_info(exc): + return type(exc), exc, exc.__traceback__ From 2f0128e3f0d77e5a780a8dbec970a81d782ed611 Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Thu, 21 Jan 2021 06:46:21 +0000 Subject: [PATCH 197/374] Bump sphinx-autoapi from 1.5.1 to 1.6.0 Bumps [sphinx-autoapi](https://github.com/readthedocs/sphinx-autoapi) from 1.5.1 to 1.6.0. - [Release notes](https://github.com/readthedocs/sphinx-autoapi/releases) - [Changelog](https://github.com/readthedocs/sphinx-autoapi/blob/master/CHANGELOG.rst) - [Commits](https://github.com/readthedocs/sphinx-autoapi/compare/v1.5.1...v1.6.0) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index fc555f647..02a4ae03f 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 sphinx==3.4.3 -sphinx-autoapi==1.5.1 +sphinx-autoapi==1.6.0 sphinx_rtd_theme==0.5.1 \ No newline at end of file From b7cca1910dcedab547df7c46abe1b0291298ac04 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 25 Jan 2021 00:16:44 +0000 Subject: [PATCH 198/374] bump to keyring >=22, <23 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index e218d4860..c074d613b 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ "fasteners>=0.15", "importlib_metadata;python_version<'3.8'", "importlib_resources;python_version<'3.9'", - "keyring>=19,<22", + "keyring>=22,<23", "keyrings.alt>=3.1.0,<5.0", "packaging", "pathspec>=0.5.8", From 68fffc0ce71248559eb164b289cf992bf9e7dc0c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 25 Jan 2021 00:16:58 +0000 Subject: [PATCH 199/374] [oauth] adapt keyring imports --- src/maestral/oauth.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/oauth.py b/src/maestral/oauth.py index ef671ad20..ac44f24d6 100644 --- a/src/maestral/oauth.py +++ b/src/maestral/oauth.py @@ -11,7 +11,7 @@ # external imports import keyring.backends # type: ignore -import keyring.backends.OS_X # type: ignore +import keyring.backends.macOS # type: ignore import keyring.backends.SecretService # type: ignore import keyring.backends.kwallet # type: ignore from keyring.backend import KeyringBackend # type: ignore @@ -33,7 +33,7 @@ logger = logging.getLogger(__name__) supported_keyring_backends = ( - keyring.backends.OS_X.Keyring, + keyring.backends.macOS.Keyring, keyring.backends.SecretService.Keyring, keyring.backends.kwallet.DBusKeyring, keyring.backends.kwallet.DBusKeyringKWallet4, From a520bbb02b5fa28c1ba5e46cbea9173da4cfc78e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 25 Jan 2021 00:17:24 +0000 Subject: [PATCH 200/374] [sync] migrate keyring backend entry in config file --- src/maestral/main.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/maestral/main.py b/src/maestral/main.py index db53f3f3c..7529c7e02 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -1409,6 +1409,8 @@ def _check_and_run_post_update_scripts(self) -> None: self._update_from_pre_v1_2_0() elif Version(updated_from) < Version("1.2.1"): self._update_from_pre_v1_2_1() + elif Version(updated_from) < Version("1.3.2"): + self._update_from_pre_v1_3_2() self.set_state("app", "updated_scripts_completed", __version__) @@ -1463,6 +1465,12 @@ def _update_from_pre_v1_2_1(self) -> None: batch_op.drop_constraint(constraint_name=name, type_="unique") + def _update_from_pre_v1_3_2(self) -> None: + + if self._conf.get("app", "keyring") == "keyring.backends.OS_X.Keyring": + logger.info("Migrating keyring after update from pre v1.3.2") + self._conf.set("app", "keyring", "keyring.backends.macOS.Keyring") + # ==== period async jobs =========================================================== def _schedule_task(self, coro: Awaitable) -> None: From ab42fa07cdb8c0171d50fe38307e7f8a5c758277 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 25 Jan 2021 00:17:38 +0000 Subject: [PATCH 201/374] [sync] code cleanup --- src/maestral/main.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 7529c7e02..be0688ae5 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -135,11 +135,9 @@ def __init__( self._setup_logging() # set up sync infrastructure - self.client = DropboxClient( - config_name=self.config_name - ) # interface to Dbx SDK - self.monitor = SyncMonitor(self.client) # coordinates sync threads - self.sync = self.monitor.sync # provides core sync functionality + self.client = DropboxClient(config_name=self.config_name) + self.monitor = SyncMonitor(self.client) + self.sync = self.monitor.sync self._check_and_run_post_update_scripts() From e2c6ff13e9f40add28fa98768a5e9e006286047c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 25 Jan 2021 00:20:04 +0000 Subject: [PATCH 202/374] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f7d69746..9a859f384 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ #### Dependencies: * Bumped survey to version >=3.2.2,<4.0. +* Bumped keyring to version >=22,<23. * Removed bugsnag dependency. ## v1.3.1 From 0141e586d95e8894ce778109abc5466922b17b83 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 27 Jan 2021 17:02:14 +0000 Subject: [PATCH 203/374] don't set maximum version for keyring --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index c074d613b..a436e64e6 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ "fasteners>=0.15", "importlib_metadata;python_version<'3.8'", "importlib_resources;python_version<'3.9'", - "keyring>=22,<23", + "keyring>=22", "keyrings.alt>=3.1.0,<5.0", "packaging", "pathspec>=0.5.8", From 34f7cd02d7a914588d3ef7219c210c69380184b5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 27 Jan 2021 18:44:01 +0000 Subject: [PATCH 204/374] [cli] tweak formatting of start / stop messages --- src/maestral/cli.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 951089548..49f5c86b7 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -44,13 +44,13 @@ def stop_daemon_with_cli_feedback(config_name: str) -> None: click.echo("Stopping Maestral...", nl=False) res = stop_maestral_daemon_process(config_name) if res == Stop.Ok: - click.echo(" " * 8 + OK) + click.echo("\rStopping Maestral... " + OK) elif res == Stop.NotRunning: click.echo("\rMaestral daemon is not running.") elif res == Stop.Killed: - click.echo(" " * 8 + KILLED) + click.echo("\rStopping Maestral... " + KILLED) elif res == Stop.Failed: - click.echo(" " * 8 + FAILED) + click.echo("\rStopping Maestral... " + FAILED) def select_dbx_path_dialog( @@ -535,11 +535,11 @@ def start(foreground: bool, verbose: bool, config_name: str) -> None: res = start_maestral_daemon_process(config_name) if res == Start.Ok: - cli.echo(" " * 8 + OK) + cli.echo("\rStarting Maestral... " + OK) elif res == Start.AlreadyRunning: - cli.echo(" " * 8 + "Already running.") + cli.echo("\rStarting Maestral... " + "Already running.") else: - cli.echo(" " * 8 + FAILED) + cli.echo("\rStarting Maestral... " + FAILED) cli.echo("Please check logs for more information.") return From 4994f4746f70c2a60b3a61f8dd8dbda5ea930576 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 13:40:01 +0000 Subject: [PATCH 205/374] add some log messages --- src/maestral/client.py | 1 + src/maestral/daemon.py | 5 ++--- src/maestral/main.py | 2 ++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index bb50dc455..02537e167 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -1006,6 +1006,7 @@ def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: # keep track of last longpoll, back off if requested by SDK if result.backoff: + logger.debug("Backoff requested for %s sec", result.backoff) self._backoff_until = time.time() + result.backoff + 5.0 else: self._backoff_until = 0 diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 1d393cb39..fc6361f0a 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -11,7 +11,6 @@ import signal import enum import subprocess -import traceback import threading import fcntl import struct @@ -551,8 +550,8 @@ async def periodic_watchdog() -> None: # prevent housekeeping from blocking shutdown daemon.transportServer.housekeeper = None - except Exception: - traceback.print_exc() + except Exception as exc: + logger.error(exc.args[0], exc_info=True) finally: if NOTIFY_SOCKET: diff --git a/src/maestral/main.py b/src/maestral/main.py index db53f3f3c..d4eec3cad 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -928,6 +928,8 @@ def restore(self, dbx_path: str, rev: str) -> StoneType: self._check_linked() + logger.info(f"Restoring '{dbx_path} to {rev}'") + res = self.client.restore(dbx_path, rev) return dropbox_stone_to_dict(res) From 5717e0a6dcb093a2b09aebb7d3a5adb0aee1d99a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 21:29:13 +0000 Subject: [PATCH 206/374] [autostart] remove spaces around "=" for desktop entry see #284 --- src/maestral/autostart.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/autostart.py b/src/maestral/autostart.py index fae916dfa..481cffce5 100644 --- a/src/maestral/autostart.py +++ b/src/maestral/autostart.py @@ -210,7 +210,7 @@ def __init__( def enable(self) -> None: with open(self.destination, "w") as f: - self.config.write(f) + self.config.write(f, space_around_delimiters=False) st = os.stat(self.destination) os.chmod(self.destination, st.st_mode | stat.S_IEXEC) From 4503021358682afea07c00a199cb83bf69700af9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 21:29:49 +0000 Subject: [PATCH 207/374] [autostart] remove Categories key from desktop entry --- src/maestral/autostart.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/autostart.py b/src/maestral/autostart.py index 481cffce5..431350ec6 100644 --- a/src/maestral/autostart.py +++ b/src/maestral/autostart.py @@ -307,7 +307,6 @@ def __init__(self, config_name: str) -> None: TryExec=self.maestral_path, Icon="maestral", Terminal="false", - Categories="Network;FileTransfer;", GenericName="File Synchronizer", Comment="Sync your files with Dropbox", ) From 66de5d692fd4387316defbe77c8909dbcb9b051c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 29 Jan 2021 23:56:13 +0000 Subject: [PATCH 208/374] [sync] don't raise an error if we cannot chmod see #272 --- src/maestral/sync.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index a335dc3b7..c8a1f6ce2 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1025,7 +1025,12 @@ def _new_tmp_file(self) -> str: self._ensure_cache_dir_present() try: with NamedTemporaryFile(dir=self.file_cache_path, delete=False) as f: - os.chmod(f.fileno(), 0o666 & ~umask) + try: + os.chmod(f.fileno(), 0o666 & ~umask) + except OSError as exc: + # Can occur on file system's that don't support POSIX permissions + # such as NTFS mounted without the permissions option. + logger.debug("Cannot set permissions: errno %s", exc.errno) return f.name except OSError as err: raise CacheDirError( From d56251d38d0082918718f2cf953dd7c9ae12aecb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 29 Jan 2021 23:59:12 +0000 Subject: [PATCH 209/374] updated changelog --- CHANGELOG.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a859f384..a018ebc0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,18 +10,20 @@ * Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. * Performance has been improved by avoiding scanning of objects matching an - `.mignore` pattern (file watches will still be added however). A resulting behavioral change - is that **maestral will remove existing matching files from Dropbox as well**. After this change - it will be immaterial if an `.mignore` pattern is added before or after having matching files - in Dropbox. - + `.mignore` pattern (file watches will still be added however). A resulting behavioral + change is that **maestral will remove existing matching files from Dropbox as well**. + After this change it will be immaterial if an `.mignore` pattern is added before or + after having matching files in Dropbox. + #### Fixes: * Fixes an issue with CLI on Python 3.6 where commands that print datetimes 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. + #### Removed: * Removed automatic error reporting via bugsnag. Please file issues directly on GitHub @@ -31,7 +33,7 @@ #### Dependencies: * Bumped survey to version >=3.2.2,<4.0. -* Bumped keyring to version >=22,<23. +* Bumped keyring to version >=22. * Removed bugsnag dependency. ## v1.3.1 From 1d49b5e48bfa0dd1fbf08a77e325fd4bc580be53 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 00:56:18 +0000 Subject: [PATCH 210/374] [sync] minor code cleanup --- src/maestral/sync.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index c8a1f6ce2..29653345f 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1475,14 +1475,13 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa # check if item was created or modified since last sync # but before we started the FileEventHandler (~snapshot_time) stats = snapshot.stat_info(path) - ctime_check = ( - snapshot_time > stats.st_ctime > self.get_last_sync(dbx_path_lower) - ) + last_sync = self.get_last_sync(dbx_path_lower) + ctime_check = snapshot_time > stats.st_ctime > last_sync # always upload untracked items, check ctime of tracked items local_entry = self.get_index_entry(dbx_path_lower) is_new = local_entry is None - is_modified = ctime_check and local_entry is not None + is_modified = ctime_check and not is_new if is_new: if snapshot.isdir(path): From 273c147cf868101a445ac253b3d10a0dfb08c14a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 14:34:31 +0000 Subject: [PATCH 211/374] update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a018ebc0c..fc9b77aba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,8 @@ 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. #### Removed: From 76b4abb4209a86b13a25919843788a77d4af0180 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 20:36:13 +0000 Subject: [PATCH 212/374] run tests in verbose mode --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e0933f897..51dfd8c3b 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -116,7 +116,7 @@ jobs: - name: Test with pytest run: | - pytest --reruns 5 --cov=maestral --cov-report=xml tests/linked + pytest -v --reruns 5 --cov=maestral --cov-report=xml tests/linked - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 From c925da634807137f8c479f1e3eaefe759ad350d9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 16:11:49 +0000 Subject: [PATCH 213/374] [client] reduce duplicate code Non-iterative calls now just wrap the corresponding calls which return an iterator. --- src/maestral/client.py | 126 ++++++++++++++--------------------------- 1 file changed, 44 insertions(+), 82 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 02537e167..cb2f68373 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -843,7 +843,6 @@ def get_latest_cursor( return res.cursor - @convert_api_errors_decorator(dbx_path_arg=1) def list_folder( self, dbx_path: str, @@ -852,7 +851,9 @@ def list_folder( **kwargs, ) -> files.ListFolderResult: """ - Lists the contents of a folder on Dropbox. + Lists the contents of a folder on Dropbox. Similar to + :meth:`list_folder_iterator` but returns all entries in a single + :class:`files.ListFolderResult` instance. :param dbx_path: Path of folder on Dropbox. :param max_retries_on_timeout: Number of times to try again if Dropbox servers @@ -864,44 +865,14 @@ def list_folder( :returns: Content of given folder. """ - dbx_path = "" if dbx_path == "/" else dbx_path - - results = [] - - res = self.dbx.files_list_folder( + iterator = self.list_folder_iterator( dbx_path, - include_non_downloadable_files=include_non_downloadable_files, + max_retries_on_timeout, + include_non_downloadable_files, **kwargs, ) - results.append(res) - - idx = 0 - - while results[-1].has_more: - - idx += len(results[-1].entries) - logger.info(f"Indexing {idx}...") - attempt = 0 - - while True: - try: - more_results = self.dbx.files_list_folder_continue( - results[-1].cursor - ) - results.append(more_results) - break - except requests.exceptions.ReadTimeout: - attempt += 1 - if attempt <= max_retries_on_timeout: - time.sleep(5.0) - else: - raise - - if idx > 0: - logger.info(IDLE) - - return self.flatten_results(results) + return self.flatten_results(list(iterator)) def list_folder_iterator( self, @@ -911,11 +882,10 @@ def list_folder_iterator( **kwargs, ) -> Iterator[files.ListFolderResult]: """ - Lists the contents of a folder on Dropbox. Does the same as :meth:`list_folder` - but returns an iterator yielding :class:`files.ListFolderResult` instances. The - number of entries returned in each iteration corresponds to the number of - entries returned by a single Dropbox API call and will be typically around 500. - This is useful to save memory when indexing a large number of items. + Lists the contents of a folder on Dropbox. Returns an iterator yielding + :class:`files.ListFolderResult` instances. The number of entries returned in + each iteration corresponds to the number of entries returned by a single Dropbox + API call and will be typically around 500. :param dbx_path: Path of folder on Dropbox. :param max_retries_on_timeout: Number of times to try again if Dropbox servers @@ -963,28 +933,6 @@ def list_folder_iterator( if idx > 0: logger.info(IDLE) - @staticmethod - def flatten_results( - results: List[files.ListFolderResult], - ) -> files.ListFolderResult: - """ - Flattens a list of :class:`files.ListFolderResult` instances to a single - instance with the cursor of the last entry in the list. - - :param results: List of :class:`files.ListFolderResult` instances. - :returns: Flattened list folder result. - """ - entries_all = [] - for result in results: - entries_all += result.entries - - results_flattened = files.ListFolderResult( - entries=entries_all, cursor=results[-1].cursor, has_more=False - ) - - return results_flattened - - @convert_api_errors_decorator() def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: """ Waits for remote changes since ``last_cursor``. Call this method after @@ -1013,37 +961,30 @@ def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: return result.changes - @convert_api_errors_decorator() def list_remote_changes(self, last_cursor: str) -> files.ListFolderResult: """ - Lists changes to remote Dropbox since ``last_cursor``. Call this after - :meth:`wait_for_remote_changes` returns ``True``. + Lists changes to remote Dropbox since ``last_cursor``. Same as + :meth:`list_remote_changes_iterator` but fetches all changes first and returns + a single :class:`files.ListFolderResult`. This may be useful if you want to + fetch all changes before starting to process them. :param last_cursor: Last to cursor to compare for changes. :returns: Remote changes since given cursor. """ - results = [self.dbx.files_list_folder_continue(last_cursor)] - - while results[-1].has_more: - more_results = self.dbx.files_list_folder_continue(results[-1].cursor) - results.append(more_results) - - # combine all results into one - results = self.flatten_results(results) - - return results + iterator = self.list_remote_changes_iterator(last_cursor) + return self.flatten_results(list(iterator)) def list_remote_changes_iterator( self, last_cursor: str ) -> Iterator[files.ListFolderResult]: """ - Lists changes to the remote Dropbox since ``last_cursor``. Does the same as - :meth:`list_remote_changes` but returns an iterator yielding - :class:`files.ListFolderResult` instances. The number of entries returned in - each iteration corresponds to the number of entries returned by a single Dropbox - API call and will be typically around 500. This is useful to save memory when - indexing a large number of items. + Lists changes to the remote Dropbox since ``last_cursor``. Returns an iterator + yielding :class:`files.ListFolderResult` instances. The number of entries + returned in each iteration corresponds to the number of entries returned by a + single Dropbox API call and will be typically around 500. + + Call this after :meth:`wait_for_remote_changes` returns ``True``. :param last_cursor: Last to cursor to compare for changes. :returns: Iterator over remote changes since given cursor. @@ -1059,6 +1000,27 @@ def list_remote_changes_iterator( result = self.dbx.files_list_folder_continue(result.cursor) yield result + @staticmethod + def flatten_results( + results: List[files.ListFolderResult], + ) -> files.ListFolderResult: + """ + Flattens a list of :class:`files.ListFolderResult` instances to a single + instance with the cursor of the last entry in the list. + + :param results: List of :class:`files.ListFolderResult` instances. + :returns: Flattened list folder result. + """ + entries_all = [] + for result in results: + entries_all += result.entries + + results_flattened = files.ListFolderResult( + entries=entries_all, cursor=results[-1].cursor, has_more=False + ) + + return results_flattened + # ==== conversion functions to generate error messages and types ======================= From 733b44c45b6015959a215157d6834ad4ec39f314 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 16:29:19 +0000 Subject: [PATCH 214/374] [client] remove `convert_api_errors_decorator`, use `convert_api_errors` instead --- src/maestral/client.py | 382 +++++++++++++++++++---------------------- 1 file changed, 175 insertions(+), 207 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index cb2f68373..212edd39b 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -10,7 +10,6 @@ import os.path as osp import time import logging -import functools import contextlib from datetime import datetime, timezone from typing import ( @@ -194,40 +193,6 @@ def convert_api_errors( raise os_to_maestral_error(exc, dbx_path, local_path) -def convert_api_errors_decorator( - dbx_path_arg: Optional[int] = None, local_path_arg: Optional[int] = None -) -> Callable[[_FT], _FT]: - """ - Returns a decorator that catches and re-raises instances of :class:`OSError` and - :class:`exceptions.DropboxException` as :class:`errors.MaestralApiError` or - :class:`ConnectionError`. - - :param dbx_path_arg: Argument number to take as dbx_path for exception. - :param local_path_arg: Argument number to take as local_path_arg for exception. - """ - - def decorator(func: _FT) -> _FT: - @functools.wraps(func) - def wrapper(*args, **kwargs) -> Any: - - try: - dbx_path = args[dbx_path_arg] # type: ignore - except (IndexError, TypeError): - dbx_path = None - - try: - local_path = args[local_path_arg] # type: ignore - except (IndexError, TypeError): - local_path = None - - with convert_api_errors(dbx_path, local_path): - return func(*args, **kwargs) - - return wrapper - - return decorator - - class DropboxClient: """Client for the Dropbox SDK @@ -332,7 +297,6 @@ def link(self, token: str) -> int: return res - @convert_api_errors_decorator() def unlink(self) -> None: """ Unlinks the Dropbox account. @@ -340,8 +304,10 @@ def unlink(self) -> None: :raises KeyringAccessError: if keyring access fails. :raises DropboxAuthError: if we cannot authenticate with Dropbox. """ - self.dbx.auth_token_revoke() - self.auth.delete_creds() + + with convert_api_errors(): + self.dbx.auth_token_revoke() + self.auth.delete_creds() def _init_sdk_with_token( self, @@ -379,7 +345,6 @@ def account_id(self) -> Optional[str]: # ---- SDK wrappers ---------------------------------------------------------------- - @convert_api_errors_decorator() def get_account_info(self, dbid: Optional[str] = None) -> users.FullAccount: """ Gets current account information. @@ -388,10 +353,12 @@ def get_account_info(self, dbid: Optional[str] = None) -> users.FullAccount: currently linked account. :returns: Account info. """ - if dbid: - res = self.dbx.users_get_account(dbid) - else: - res = self.dbx.users_get_current_account() + + with convert_api_errors(): + if dbid: + res = self.dbx.users_get_account(dbid) + else: + res = self.dbx.users_get_current_account() if not dbid: # save our own account info to config @@ -411,12 +378,12 @@ def get_account_info(self, dbid: Optional[str] = None) -> users.FullAccount: return res - @convert_api_errors_decorator() def get_space_usage(self) -> SpaceUsage: """ :returns: The space usage of the currently linked account. """ - res = self.dbx.users_get_space_usage() + with convert_api_errors(): + res = self.dbx.users_get_space_usage() # convert from users.SpaceUsage to SpaceUsage space_usage = SpaceUsage.from_dbx_space_usage(res) @@ -427,7 +394,6 @@ def get_space_usage(self) -> SpaceUsage: return space_usage - @convert_api_errors_decorator(dbx_path_arg=1) def get_metadata(self, dbx_path: str, **kwargs) -> Optional[files.Metadata]: """ Gets metadata for an item on Dropbox or returns ``False`` if no metadata is @@ -440,16 +406,11 @@ def get_metadata(self, dbx_path: str, **kwargs) -> Optional[files.Metadata]: """ try: - return self.dbx.files_get_metadata(dbx_path, **kwargs) - except exceptions.ApiError as exc: + with convert_api_errors(dbx_path=dbx_path): + return self.dbx.files_get_metadata(dbx_path, **kwargs) + except (NotFoundError, PathError): + return None - if isinstance(exc.error, files.GetMetadataError): - # this will be only lookup errors - return None - else: - raise exc - - @convert_api_errors_decorator(dbx_path_arg=1) def list_revisions( self, dbx_path: str, mode: str = "path", limit: int = 10 ) -> files.ListRevisionsResult: @@ -463,10 +424,10 @@ def list_revisions( :returns: File revision history. """ - mode = files.ListRevisionsMode(mode) - return self.dbx.files_list_revisions(dbx_path, mode=mode, limit=limit) + with convert_api_errors(dbx_path=dbx_path): + mode = files.ListRevisionsMode(mode) + return self.dbx.files_list_revisions(dbx_path, mode=mode, limit=limit) - @convert_api_errors_decorator(dbx_path_arg=1) def restore(self, dbx_path: str, rev: str) -> files.FileMetadata: """ Restore an old revision of a file. @@ -477,9 +438,9 @@ def restore(self, dbx_path: str, rev: str) -> files.FileMetadata: :returns: Metadata of restored file. """ - return self.dbx.files_restore(dbx_path, rev) + with convert_api_errors(dbx_path=dbx_path): + return self.dbx.files_restore(dbx_path, rev) - @convert_api_errors_decorator(dbx_path_arg=1) def download( self, dbx_path: str, @@ -497,23 +458,25 @@ def download( :param kwargs: Keyword arguments for Dropbox SDK files_download_to_file. :returns: Metadata of downloaded item. """ - # create local directory if not present - dst_path_directory = osp.dirname(local_path) - try: - os.makedirs(dst_path_directory) - except FileExistsError: - pass - md, http_resp = self.dbx.files_download(dbx_path, **kwargs) + with convert_api_errors(dbx_path=dbx_path): - chunksize = 2 ** 13 + dst_path_directory = osp.dirname(local_path) + try: + os.makedirs(dst_path_directory) + except FileExistsError: + pass - with open(local_path, "wb") as f: - with contextlib.closing(http_resp): - for c in http_resp.iter_content(chunksize): - f.write(c) - if sync_event: - sync_event.completed = f.tell() + md, http_resp = self.dbx.files_download(dbx_path, **kwargs) + + chunksize = 2 ** 13 + + with open(local_path, "wb") as f: + with contextlib.closing(http_resp): + for c in http_resp.iter_content(chunksize): + f.write(c) + if sync_event: + sync_event.completed = f.tell() # dropbox SDK provides naive datetime in UTC client_mod_timestamp = md.client_modified.replace( @@ -530,7 +493,6 @@ def download( return md - @convert_api_errors_decorator(local_path_arg=1, dbx_path_arg=2) def upload( self, local_path: str, @@ -554,83 +516,86 @@ def upload( chunk_size = clamp(chunk_size, 10 ** 5, 150 * 10 ** 6) - size = osp.getsize(local_path) + with convert_api_errors(dbx_path=dbx_path, local_path=local_path): - # dropbox SDK takes naive datetime in UTC - mtime = osp.getmtime(local_path) - mtime_dt = datetime.utcfromtimestamp(mtime) + size = osp.getsize(local_path) - if size <= chunk_size: - with open(local_path, "rb") as f: - md = self.dbx.files_upload( - f.read(), dbx_path, client_modified=mtime_dt, **kwargs - ) - if sync_event: - sync_event.completed = f.tell() - return md - else: - # Note: We currently do not support resuming interrupted uploads. Dropbox - # keeps upload sessions open for 48h so this could be done in the future. - with open(local_path, "rb") as f: - session_start = self.dbx.files_upload_session_start(f.read(chunk_size)) - uploaded = f.tell() - - cursor = files.UploadSessionCursor( - session_id=session_start.session_id, offset=uploaded - ) - commit = files.CommitInfo( - path=dbx_path, client_modified=mtime_dt, **kwargs - ) - - if sync_event: - sync_event.completed = uploaded + # dropbox SDK takes naive datetime in UTC + mtime = osp.getmtime(local_path) + mtime_dt = datetime.utcfromtimestamp(mtime) - while True: - try: - if size - f.tell() <= chunk_size: - md = self.dbx.files_upload_session_finish( - f.read(chunk_size), cursor, commit - ) - - else: - self.dbx.files_upload_session_append_v2( - f.read(chunk_size), cursor - ) - md = None - - # housekeeping - uploaded = f.tell() - if sync_event: - sync_event.completed = uploaded - - if md: - return md - else: - cursor.offset = uploaded - - except exceptions.DropboxException as exc: - error = getattr(exc, "error", None) - if ( - isinstance(error, files.UploadSessionFinishError) - and error.is_lookup_failed() - ): - session_lookup_error = error.get_lookup_failed() - elif isinstance(error, files.UploadSessionLookupError): - session_lookup_error = error - else: - raise exc + if size <= chunk_size: + with open(local_path, "rb") as f: + md = self.dbx.files_upload( + f.read(), dbx_path, client_modified=mtime_dt, **kwargs + ) + if sync_event: + sync_event.completed = f.tell() + return md + else: + # Note: We currently do not support resuming interrupted uploads. + # Dropbox keeps upload sessions open for 48h so this could be done in + # the future. + with open(local_path, "rb") as f: + data = f.read(chunk_size) + session_start = self.dbx.files_upload_session_start(data) + uploaded = f.tell() + + cursor = files.UploadSessionCursor( + session_id=session_start.session_id, offset=uploaded + ) + commit = files.CommitInfo( + path=dbx_path, client_modified=mtime_dt, **kwargs + ) - if session_lookup_error.is_incorrect_offset(): - o = ( - session_lookup_error.get_incorrect_offset().correct_offset - ) - # reset position in file - f.seek(o) - cursor.offset = f.tell() - else: - raise exc + if sync_event: + sync_event.completed = uploaded + + while True: + try: + + if size - f.tell() <= chunk_size: + # Wrap up upload session and return metadata. + data = f.read(chunk_size) + md = self.dbx.files_upload_session_finish( + data, cursor, commit + ) + if sync_event: + sync_event.completed = sync_event.size + return md + else: + # Append to upload session. + data = f.read(chunk_size) + self.dbx.files_upload_session_append_v2(data, cursor) + + uploaded = f.tell() + cursor.offset = uploaded + + if sync_event: + sync_event.completed = uploaded + + except exceptions.DropboxException as exc: + error = getattr(exc, "error", None) + if ( + isinstance(error, files.UploadSessionFinishError) + and error.is_lookup_failed() + ): + session_lookup_error = error.get_lookup_failed() + elif isinstance(error, files.UploadSessionLookupError): + session_lookup_error = error + else: + raise exc + + if session_lookup_error.is_incorrect_offset(): + # reset position in file + offset = ( + session_lookup_error.get_incorrect_offset().correct_offset + ) + f.seek(offset) + cursor.offset = f.tell() + else: + raise exc - @convert_api_errors_decorator(dbx_path_arg=1) def remove(self, dbx_path: str, **kwargs) -> files.Metadata: """ Removes a file / folder from Dropbox. @@ -639,13 +604,11 @@ def remove(self, dbx_path: str, **kwargs) -> files.Metadata: :param kwargs: Keyword arguments for Dropbox SDK files_delete_v2. :returns: Metadata of deleted item. """ - # try to remove file (response will be metadata, probably) - res = self.dbx.files_delete_v2(dbx_path, **kwargs) - md = res.metadata - return md + with convert_api_errors(dbx_path=dbx_path): + res = self.dbx.files_delete_v2(dbx_path, **kwargs) + return res.metadata - @convert_api_errors_decorator() def remove_batch( self, entries: List[Tuple[str, str]], batch_size: int = 900 ) -> List[Union[files.Metadata, MaestralApiError]]: @@ -671,7 +634,9 @@ def remove_batch( for chunk in chunks(entries, n=batch_size): arg = [files.DeleteArg(e[0], e[1]) for e in chunk] - res = self.dbx.files_delete_batch(arg) + + with convert_api_errors(): + res = self.dbx.files_delete_batch(arg) if res.is_complete(): batch_res = res.get_complete() @@ -681,13 +646,16 @@ def remove_batch( async_job_id = res.get_async_job_id() time.sleep(1.0) - res = self.dbx.files_delete_batch_check(async_job_id) + + with convert_api_errors(): + res = self.dbx.files_delete_batch_check(async_job_id) check_interval = round(len(chunk) / 100, 1) while res.is_in_progress(): time.sleep(check_interval) - res = self.dbx.files_delete_batch_check(async_job_id) + with convert_api_errors(): + res = self.dbx.files_delete_batch_check(async_job_id) if res.is_complete(): batch_res = res.get_complete() @@ -718,7 +686,6 @@ def remove_batch( return result_list - @convert_api_errors_decorator(dbx_path_arg=2) def move(self, dbx_path: str, new_path: str, **kwargs) -> files.Metadata: """ Moves / renames files or folders on Dropbox. @@ -728,18 +695,17 @@ def move(self, dbx_path: str, new_path: str, **kwargs) -> files.Metadata: :param kwargs: Keyword arguments for Dropbox SDK files_move_v2. :returns: Metadata of moved item. """ - res = self.dbx.files_move_v2( - dbx_path, - new_path, - allow_shared_folder=True, - allow_ownership_transfer=True, - **kwargs, - ) - md = res.metadata - return md + with convert_api_errors(dbx_path=new_path): + res = self.dbx.files_move_v2( + dbx_path, + new_path, + allow_shared_folder=True, + allow_ownership_transfer=True, + **kwargs, + ) + return res.metadata - @convert_api_errors_decorator(dbx_path_arg=1) def make_dir(self, dbx_path: str, **kwargs) -> files.FolderMetadata: """ Creates a folder on Dropbox. @@ -748,12 +714,11 @@ def make_dir(self, dbx_path: str, **kwargs) -> files.FolderMetadata: :param kwargs: Keyword arguments for Dropbox SDK files_create_folder_v2. :returns: Metadata of created folder. """ - res = self.dbx.files_create_folder_v2(dbx_path, **kwargs) - md = res.metadata - return md + with convert_api_errors(dbx_path=dbx_path): + res = self.dbx.files_create_folder_v2(dbx_path, **kwargs) + return res.metadata - @convert_api_errors_decorator() def make_dir_batch( self, dbx_paths: List[str], batch_size: int = 900, **kwargs ) -> List[Union[files.Metadata, MaestralApiError]]: @@ -772,36 +737,38 @@ def make_dir_batch( entries = [] result_list = [] - # up two ~ 1,000 entries allowed per batch according to - # https://www.dropbox.com/developers/reference/data-ingress-guide - for chunk in chunks(dbx_paths, n=batch_size): - res = self.dbx.files_create_folder_batch(chunk, **kwargs) - if res.is_complete(): - batch_res = res.get_complete() - entries.extend(batch_res.entries) - elif res.is_async_job_id(): - async_job_id = res.get_async_job_id() - - time.sleep(1.0) - res = self.dbx.files_create_folder_batch_check(async_job_id) - - check_interval = round(len(chunk) / 100, 1) - - while res.is_in_progress(): - time.sleep(check_interval) - res = self.dbx.files_create_folder_batch_check(async_job_id) + with convert_api_errors(): + # up two ~ 1,000 entries allowed per batch according to + # https://www.dropbox.com/developers/reference/data-ingress-guide + for chunk in chunks(dbx_paths, n=batch_size): + res = self.dbx.files_create_folder_batch(chunk, **kwargs) if res.is_complete(): batch_res = res.get_complete() entries.extend(batch_res.entries) + elif res.is_async_job_id(): + async_job_id = res.get_async_job_id() - elif res.is_failed(): - error = res.get_failed() - if error.is_too_many_files(): - res_list = self.make_dir_batch( - chunk, batch_size=round(batch_size / 2), **kwargs - ) - result_list.extend(res_list) + time.sleep(1.0) + res = self.dbx.files_create_folder_batch_check(async_job_id) + + check_interval = round(len(chunk) / 100, 1) + + while res.is_in_progress(): + time.sleep(check_interval) + res = self.dbx.files_create_folder_batch_check(async_job_id) + + if res.is_complete(): + batch_res = res.get_complete() + entries.extend(batch_res.entries) + + elif res.is_failed(): + error = res.get_failed() + if error.is_too_many_files(): + res_list = self.make_dir_batch( + chunk, batch_size=round(batch_size / 2), **kwargs + ) + result_list.extend(res_list) for i, entry in enumerate(entries): if entry.is_success(): @@ -818,7 +785,6 @@ def make_dir_batch( return result_list - @convert_api_errors_decorator(dbx_path_arg=1) def get_latest_cursor( self, dbx_path: str, include_non_downloadable_files: bool = False, **kwargs ) -> str: @@ -834,12 +800,13 @@ def get_latest_cursor( dbx_path = "" if dbx_path == "/" else dbx_path - res = self.dbx.files_list_folder_get_latest_cursor( - dbx_path, - include_non_downloadable_files=include_non_downloadable_files, - recursive=True, - **kwargs, - ) + with convert_api_errors(dbx_path=dbx_path): + res = self.dbx.files_list_folder_get_latest_cursor( + dbx_path, + include_non_downloadable_files=include_non_downloadable_files, + recursive=True, + **kwargs, + ) return res.cursor @@ -950,16 +917,17 @@ def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: time_to_backoff = max(self._backoff_until - time.time(), 0) time.sleep(time_to_backoff) - result = self.dbx.files_list_folder_longpoll(last_cursor, timeout=timeout) + with convert_api_errors(): + res = self.dbx.files_list_folder_longpoll(last_cursor, timeout=timeout) # keep track of last longpoll, back off if requested by SDK - if result.backoff: - logger.debug("Backoff requested for %s sec", result.backoff) - self._backoff_until = time.time() + result.backoff + 5.0 + if res.backoff: + logger.debug("Backoff requested for %s sec", res.backoff) + self._backoff_until = time.time() + res.backoff + 5.0 else: self._backoff_until = 0 - return result.changes + return res.changes def list_remote_changes(self, last_cursor: str) -> files.ListFolderResult: """ From 0f9f0ad74e468e7eaa3cfffd548154c5280b44c6 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 18:38:00 +0000 Subject: [PATCH 215/374] [sync] refactor sync cycle * Introduce SyncEngine methods for full sync cycles * Allow resuming a download sync from any cursor, even from interrupted indexing. * Remove unused code. --- src/maestral/sync.py | 220 +++++++++++++++++++------------------------ 1 file changed, 96 insertions(+), 124 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 29653345f..b84c34592 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1433,12 +1433,14 @@ def upload_local_changes_while_inactive(self) -> None: return if len(events) > 0: - self.apply_local_changes(sync_events, local_cursor) + self.apply_local_changes(sync_events) logger.debug("Uploaded local changes while inactive") else: - self.local_cursor = local_cursor logger.debug("No local changes while inactive") + if not self.cancel_pending.is_set(): + self.local_cursor = local_cursor + def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], float]: """ Retrieves all local changes since the last sync by performing a full scan of the @@ -1525,26 +1527,46 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa return changes, snapshot_time - def wait_for_local_changes( - self, timeout: float = 40, delay: float = 1 - ) -> Tuple[List[SyncEvent], float]: + def wait_for_local_changes(self, timeout: float = 40) -> bool: + + with self.fs_events.local_file_event_queue.not_empty: + return self.fs_events.local_file_event_queue.not_empty.wait(timeout) + + def upload_sync_cycle(self): + """ + Performs a full upload sync cycle by calling in order: + + 1) :meth:`list_local_changes` + 2) :meth:`apply_local_changes` + + Handles updating the local cursor for you. If monitoring for local file events + was interrupted, call :meth:`upload_local_changes_while_inactive` instead. + """ + + changes, cursor = self.list_local_changes() + self.apply_local_changes(changes) + + if not self.cancel_pending.is_set(): + # Save local cursor if not sync was not aborted by user. + # Failed uploads will be tracked and retried individually. + self.local_cursor = cursor + + del changes + self.free_memory() + + def list_local_changes(self, delay: float = 1) -> Tuple[List[SyncEvent], float]: """ Waits for local file changes. Returns a list of local changes with at most one entry per path. - :param timeout: If no changes are detected within timeout (sec), an empty list - is returned. :param delay: Delay in sec to wait for subsequent changes before returning. :returns: (list of sync times events, time_stamp) """ self.ensure_dropbox_folder_present() - try: - events = [self.fs_events.local_file_event_queue.get(timeout=timeout)] - local_cursor = time.time() - except Empty: - return [], time.time() + events = [] + local_cursor = time.time() # keep collecting events until idle for `delay` while True: @@ -1562,15 +1584,12 @@ def wait_for_local_changes( return sync_events, local_cursor - def apply_local_changes( - self, sync_events: List[SyncEvent], local_cursor: float - ) -> List[SyncEvent]: + def apply_local_changes(self, sync_events: List[SyncEvent]) -> List[SyncEvent]: """ Applies locally detected changes to the remote Dropbox. Changes which should be ignored (mignore or always ignored files) are skipped. :param sync_events: List of local file system events. - :param local_cursor: Time stamp of last event in ``events``. """ with self.sync_lock: @@ -1634,11 +1653,6 @@ def apply_local_changes( self._clean_history() - if not self.cancel_pending.is_set(): - # always save local cursor if not aborted by user, - # failed uploads will be tracked and retried individually - self.local_cursor = local_cursor - return results def _filter_excluded_changes_local( @@ -2371,10 +2385,8 @@ def _on_local_deleted(self, event: SyncEvent) -> Optional[Metadata]: def get_remote_folder(self, dbx_path: str = "/") -> bool: """ - Gets all files/folders from Dropbox and writes them to the local folder - :attr:`dropbox_path`. Call this method on first run of the Maestral. Indexing - and downloading may take several minutes, depending on the size of the user's - Dropbox folder. + Gets all files/folders from a Dropbox folder and writes them to the local folder + :attr:`dropbox_path`. :param dbx_path: Path relative to Dropbox folder. Defaults to root ('/'). :returns: Whether download was successful. @@ -2383,13 +2395,9 @@ def get_remote_folder(self, dbx_path: str = "/") -> bool: with self.sync_lock: dbx_path = dbx_path or "/" - is_dbx_root = dbx_path == "/" success = True - if is_dbx_root: - logger.info("Fetching remote Dropbox") - else: - logger.info(f"Syncing ↓ {dbx_path}") + logger.info(f"Syncing ↓ {dbx_path}") if any(is_child(folder, dbx_path) for folder in self.excluded_items): # if there are excluded subfolders, index and download only included @@ -2398,8 +2406,6 @@ def get_remote_folder(self, dbx_path: str = "/") -> bool: skip_excluded = False try: - # get a cursor and list the folder content - cursor = self.client.get_latest_cursor(dbx_path) # iterate over index and download results list_iter = self.client.list_folder_iterator( @@ -2413,7 +2419,7 @@ def get_remote_folder(self, dbx_path: str = "/") -> bool: sync_events = [ SyncEvent.from_dbx_metadata(md, self) for md in res.entries ] - download_res = self.apply_remote_changes(sync_events, cursor=None) + download_res = self.apply_remote_changes(sync_events) s = all( e.status in (SyncStatus.Done, SyncStatus.Skipped) @@ -2439,12 +2445,6 @@ def get_remote_folder(self, dbx_path: str = "/") -> bool: self._handle_sync_error(e, direction=SyncDirection.Down) return False - if is_dbx_root: - # always save remote cursor if this is the root folder, - # failed downloads will be tracked and retried individually - self.remote_cursor = cursor - self._state.set("sync", "last_reindex", time.time()) - return success def get_remote_item(self, dbx_path: str) -> bool: @@ -2488,63 +2488,76 @@ def get_remote_item(self, dbx_path: str) -> bool: return success - def wait_for_remote_changes( - self, last_cursor: str, timeout: int = 40, delay: float = 2 - ) -> bool: + def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: """ Blocks until changes to the remote Dropbox are available. :param last_cursor: Cursor form last sync. :param timeout: Timeout in seconds before returning even if there are no changes. Dropbox adds random jitter of up to 90 sec to this value. - :param delay: Delay in sec to wait for subsequent changes that may be - duplicates. This delay is typically only necessary folders are shared / - un-shared with other Dropbox accounts. """ logger.debug("Waiting for remote changes since cursor:\n%s", last_cursor) has_changes = self.client.wait_for_remote_changes(last_cursor, timeout=timeout) - time.sleep(delay) + + # For for 2 sec. This delay is typically only necessary folders are shared / + # un-shared with other Dropbox accounts. + time.sleep(2) + logger.debug("Detected remote changes: %s", has_changes) return has_changes - def list_remote_changes(self, last_cursor: str) -> Tuple[List[SyncEvent], str]: + def download_sync_cycle(self) -> None: """ - Lists remote changes since the last download sync. + Performs a full download sync cycle by calling in order: - :param last_cursor: Cursor from last download sync. - :returns: Tuple with remote changes and corresponding cursor + 1) :meth:`list_remote_changes_iterator` + 2) :meth:`apply_remote_changes` + 3) :meth:`notify_user` + + Handles updating the remote cursor and resuming interrupted syncs for you. + Calling this method will perform a full indexing if this is the first download. """ - logger.info("Fetching remote changes...") - changes = self.client.list_remote_changes(last_cursor) - logger.debug("Listed remote changes:\n%s", entries_repr(changes.entries)) + changes_iter = self.list_remote_changes_iterator(self.remote_cursor) - clean_changes = self._clean_remote_changes(changes) - logger.debug("Cleaned remote changes:\n%s", entries_repr(clean_changes.entries)) + # download changes in chunks to reduce memory usage + for changes, cursor in changes_iter: + downloaded = self.apply_remote_changes(changes) + self.notify_user(downloaded) - clean_changes.entries.sort(key=lambda x: x.path_lower.count("/")) - sync_events = [ - SyncEvent.from_dbx_metadata(md, self) for md in clean_changes.entries - ] - logger.debug("Converted remote changes to SyncEvents") + if self.cancel_pending.is_set(): + break + else: + # Save (incremental) remote cursor. + self.remote_cursor = cursor - return sync_events, changes.cursor + del changes + del downloaded + + self.free_memory() def list_remote_changes_iterator( self, last_cursor: str - ) -> Iterator[Tuple[List[SyncEvent], Optional[str]]]: + ) -> Iterator[Tuple[List[SyncEvent], str]]: """ - Lists remote changes since the last download sync. Works the same as - :meth:`list_remote_changes` but returns an iterator over remote changes. Only - the last result will have a valid cursor which is not None. + Get remote changes since the last download sync, as specified by + ``last_cursor``. If the ``last_cursor`` is from paginating through a previous + set of changes, continue where we left off. If ``last_cursor`` is an emtpy + string, tart a full indexing of the Dropbox folder. :param last_cursor: Cursor from last download sync. :returns: Iterator yielding tuples with remote changes and corresponding cursor. """ - logger.info("Fetching remote changes...") - - changes_iter = self.client.list_remote_changes_iterator(last_cursor) + if last_cursor == "": + # We are starting from the beginning, do a full indexing. + logger.info("Fetching remote Dropbox") + changes_iter = self.client.list_folder_iterator("/", recursive=True) + else: + # Pick up where we left off. This may be an interrupted indexing / + # pagination through changes or a completely new set of changes. + logger.info("Fetching remote changes...") + changes_iter = self.client.list_remote_changes_iterator(last_cursor) for changes in changes_iter: @@ -2562,12 +2575,9 @@ def list_remote_changes_iterator( logger.debug("Converted remote changes to SyncEvents") - cursor = changes.cursor if not changes.has_more else None - yield sync_events, cursor + yield sync_events, changes.cursor - def apply_remote_changes( - self, sync_events: List[SyncEvent], cursor: Optional[str] - ) -> List[SyncEvent]: + def apply_remote_changes(self, sync_events: List[SyncEvent]) -> List[SyncEvent]: """ Applies remote changes to local folder. Call this on the result of :meth:`list_remote_changes`. The saved cursor is updated after a set of changes @@ -2575,9 +2585,6 @@ def apply_remote_changes( successful completion. :param sync_events: List of remote changes. - :param cursor: Remote cursor corresponding to changes. Take care to only pass - cursors which represent the state of the entire Dropbox. Pass None instead - if you are only downloading a subset of changes. :returns: List of changes that were made to local files and bool indicating if all download syncs were successful. """ @@ -2665,11 +2672,6 @@ def apply_remote_changes( throttled_log(logger, f"Syncing ↓ {n + 1}/{n_items}") results.append(r) - if cursor and not self.cancel_pending.is_set(): - # always save remote cursor if not aborted by user, - # failed downloads will be tracked and retried individually - self.remote_cursor = cursor - self._clean_history() return results @@ -3411,21 +3413,10 @@ def download_worker( if has_changes: logger.info(SYNCING) - - changes_iter = sync.list_remote_changes_iterator(sync.remote_cursor) - - # download changes in chunks to reduce memory usage - for changes, cursor in changes_iter: - downloaded = sync.apply_remote_changes(changes, cursor) - sync.notify_user(downloaded) - - sync.client.get_space_usage() # update space usage + sync.download_sync_cycle() logger.info(IDLE) - # free memory - del changes - del downloaded - sync.free_memory() + sync.client.get_space_usage() # update space usage def download_worker_added_item( @@ -3486,24 +3477,17 @@ def upload_worker( syncing.wait() with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): - changes, local_cursor = sync.wait_for_local_changes() + has_changes = sync.wait_for_local_changes() with sync.sync_lock: if not (running.is_set() and syncing.is_set()): continue - if len(changes) > 0: + if has_changes: logger.info(SYNCING) - - sync.apply_local_changes(changes, local_cursor) - - if len(changes) > 0: + sync.upload_sync_cycle() logger.info(IDLE) - # free some memory - del changes - sync.free_memory() - def startup_worker( sync: SyncEngine, @@ -3529,19 +3513,12 @@ def startup_worker( startup.wait() with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with sync.sync_lock: - # run / resume initial download - # local changes during this download will be registered by the local - # FileSystemObserver but only uploaded after `syncing` has been set if sync.remote_cursor == "": sync.clear_sync_errors() - sync.get_remote_folder() - sync.local_cursor = time.time() - - if not running.is_set(): - continue - # retry failed downloads + # Retry failed downloads. if len(sync.download_errors) > 0: logger.info("Retrying failed syncs...") @@ -3549,7 +3526,7 @@ def startup_worker( logger.info(f"Syncing ↓ {dbx_path}") sync.get_remote_item(dbx_path) - # resume interrupted downloads + # Resume interrupted downloads. if len(sync.pending_downloads) > 0: logger.info("Resuming interrupted syncs...") @@ -3565,13 +3542,13 @@ def startup_worker( # for dbx_path in list(sync.upload_errors): # sync.rescan(sync.to_local_path(dbx_path)) - # upload changes while inactive sync.upload_local_changes_while_inactive() - # enforce immediate check for remote changes - changes, remote_cursor = sync.list_remote_changes(sync.remote_cursor) - downloaded = sync.apply_remote_changes(changes, remote_cursor) - sync.notify_user(downloaded) + if not running.is_set(): + continue + + # Download remote changes / indexing. + sync.download_sync_cycle() if not running.is_set(): continue @@ -3582,11 +3559,6 @@ def startup_worker( startup.clear() logger.info(IDLE) - # free some memory - del changes - del downloaded - sync.free_memory() - # ====================================================================================== # Main Monitor class to start, stop and coordinate threads From 07001dc6a27254f2d7d603e027c57eea9cc39033 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 28 Jan 2021 18:55:54 +0000 Subject: [PATCH 216/374] [sync] simplify locking --- src/maestral/sync.py | 268 ++++++++++++++++++++++--------------------- 1 file changed, 135 insertions(+), 133 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index b84c34592..3325de6c1 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -410,7 +410,6 @@ def __init__(self, client: DropboxClient, fs_events_handler: FSEventHandler): self.client = client self.config_name = self.client.config_name - self.cancel_pending = Event() self.fs_events = fs_events_handler self.sync_lock = RLock() @@ -442,6 +441,7 @@ def __init__(self, client: DropboxClient, fs_events_handler: FSEventHandler): # data structures for internal communication self.sync_errors = set() + self._cancel_requested = Event() # data structures for user information self.syncing = [] @@ -1285,6 +1285,19 @@ def _slow_down(self) -> None: while cpu_usage > self._max_cpu_percent: cpu_usage = cpu_usage_percent(0.5 + 2 * random.random()) + def cancel_sync(self): + """ + Cancels all pending sync jobs and returns when idle. + """ + + self._cancel_requested.set() + + # Wait until we can acquire the sync lock => we are idle. + self.sync_lock.acquire() + self.sync_lock.release() + + self._cancel_requested.clear() + def busy(self) -> bool: """ Checks if we are currently syncing. @@ -1438,7 +1451,7 @@ def upload_local_changes_while_inactive(self) -> None: else: logger.debug("No local changes while inactive") - if not self.cancel_pending.is_set(): + if not self._cancel_requested.is_set(): self.local_cursor = local_cursor def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], float]: @@ -1543,16 +1556,18 @@ def upload_sync_cycle(self): was interrupted, call :meth:`upload_local_changes_while_inactive` instead. """ - changes, cursor = self.list_local_changes() - self.apply_local_changes(changes) + with self.sync_lock: - if not self.cancel_pending.is_set(): - # Save local cursor if not sync was not aborted by user. - # Failed uploads will be tracked and retried individually. - self.local_cursor = cursor + changes, cursor = self.list_local_changes() + self.apply_local_changes(changes) - del changes - self.free_memory() + if not self._cancel_requested.is_set(): + # Save local cursor if not sync was not aborted by user. + # Failed uploads will be tracked and retried individually. + self.local_cursor = cursor + + del changes + self.free_memory() def list_local_changes(self, delay: float = 1) -> Tuple[List[SyncEvent], float]: """ @@ -1592,68 +1607,66 @@ def apply_local_changes(self, sync_events: List[SyncEvent]) -> List[SyncEvent]: :param sync_events: List of local file system events. """ - with self.sync_lock: - - results = [] + results = [] - if len(sync_events) > 0: + if len(sync_events) > 0: - sync_events, _ = self._filter_excluded_changes_local(sync_events) + sync_events, _ = self._filter_excluded_changes_local(sync_events) - deleted: List[SyncEvent] = [] - dir_moved: List[SyncEvent] = [] - other: List[SyncEvent] = [] # file created + moved, dir created + deleted: List[SyncEvent] = [] + dir_moved: List[SyncEvent] = [] + other: List[SyncEvent] = [] # file created + moved, dir created - for event in sync_events: - if event.is_deleted: - deleted.append(event) - elif event.is_directory and event.is_moved: - dir_moved.append(event) - else: - other.append(event) + for event in sync_events: + if event.is_deleted: + deleted.append(event) + elif event.is_directory and event.is_moved: + dir_moved.append(event) + else: + other.append(event) - # housekeeping - self.syncing.append(event) + # housekeeping + self.syncing.append(event) - # apply deleted events first, folder moved events second - # neither event type requires an actual upload - if deleted: - logger.info("Uploading deletions...") + # apply deleted events first, folder moved events second + # neither event type requires an actual upload + if deleted: + logger.info("Uploading deletions...") - with ThreadPoolExecutor( - max_workers=self._num_threads, - thread_name_prefix="maestral-upload-pool", - ) as executor: - res = executor.map(self._create_remote_entry, deleted) + with ThreadPoolExecutor( + max_workers=self._num_threads, + thread_name_prefix="maestral-upload-pool", + ) as executor: + res = executor.map(self._create_remote_entry, deleted) - n_items = len(deleted) - for n, r in enumerate(res): - throttled_log(logger, f"Deleting {n + 1}/{n_items}...") - results.append(r) + n_items = len(deleted) + for n, r in enumerate(res): + throttled_log(logger, f"Deleting {n + 1}/{n_items}...") + results.append(r) - if dir_moved: - logger.info("Moving folders...") + if dir_moved: + logger.info("Moving folders...") - for event in dir_moved: - logger.info(f"Moving {event.dbx_path_from}...") - res = self._create_remote_entry(event) - results.append(res) + for event in dir_moved: + logger.info(f"Moving {event.dbx_path_from}...") + res = self._create_remote_entry(event) + results.append(res) - # apply other events in parallel since order does not matter - with ThreadPoolExecutor( - max_workers=self._num_threads, - thread_name_prefix="maestral-upload-pool", - ) as executor: - res = executor.map(self._create_remote_entry, other) + # apply other events in parallel since order does not matter + with ThreadPoolExecutor( + max_workers=self._num_threads, + thread_name_prefix="maestral-upload-pool", + ) as executor: + res = executor.map(self._create_remote_entry, other) - n_items = len(other) - for n, r in enumerate(res): - throttled_log(logger, f"Syncing ↑ {n + 1}/{n_items}") - results.append(r) + n_items = len(other) + for n, r in enumerate(res): + throttled_log(logger, f"Syncing ↑ {n + 1}/{n_items}") + results.append(r) - self._clean_history() + self._clean_history() - return results + return results def _filter_excluded_changes_local( self, sync_events: List[SyncEvent] @@ -1986,7 +1999,7 @@ def _create_remote_entry(self, event: SyncEvent) -> SyncEvent: :returns: SyncEvent with updated status. """ - if self.cancel_pending.is_set(): + if self._cancel_requested.is_set(): event.status = SyncStatus.Aborted self.syncing.remove(event) return event @@ -2518,23 +2531,25 @@ def download_sync_cycle(self) -> None: Calling this method will perform a full indexing if this is the first download. """ - changes_iter = self.list_remote_changes_iterator(self.remote_cursor) + with self.sync_lock: - # download changes in chunks to reduce memory usage - for changes, cursor in changes_iter: - downloaded = self.apply_remote_changes(changes) - self.notify_user(downloaded) + changes_iter = self.list_remote_changes_iterator(self.remote_cursor) - if self.cancel_pending.is_set(): - break - else: - # Save (incremental) remote cursor. - self.remote_cursor = cursor + # download changes in chunks to reduce memory usage + for changes, cursor in changes_iter: + downloaded = self.apply_remote_changes(changes) + self.notify_user(downloaded) - del changes - del downloaded + if self._cancel_requested.is_set(): + break + else: + # Save (incremental) remote cursor. + self.remote_cursor = cursor + + del changes + del downloaded - self.free_memory() + self.free_memory() def list_remote_changes_iterator( self, last_cursor: str @@ -2990,7 +3005,7 @@ def _create_local_entry(self, event: SyncEvent) -> SyncEvent: :class:`errors.SyncError` and ``None`` if cancelled. """ - if self.cancel_pending.is_set(): + if self._cancel_requested.is_set(): event.status = SyncStatus.Aborted self.syncing.remove(event) return event @@ -3406,17 +3421,15 @@ def download_worker( with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_remote_changes(sync.remote_cursor) - with sync.sync_lock: + if not (running.is_set() and syncing.is_set()): + continue - if not (running.is_set() and syncing.is_set()): - continue - - if has_changes: - logger.info(SYNCING) - sync.download_sync_cycle() - logger.info(IDLE) + if has_changes: + logger.info(SYNCING) + sync.download_sync_cycle() + logger.info(IDLE) - sync.client.get_space_usage() # update space usage + sync.client.get_space_usage() # update space usage def download_worker_added_item( @@ -3479,14 +3492,13 @@ def upload_worker( with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_local_changes() - with sync.sync_lock: - if not (running.is_set() and syncing.is_set()): - continue + if not (running.is_set() and syncing.is_set()): + continue - if has_changes: - logger.info(SYNCING) - sync.upload_sync_cycle() - logger.info(IDLE) + if has_changes: + logger.info(SYNCING) + sync.upload_sync_cycle() + logger.info(IDLE) def startup_worker( @@ -3514,50 +3526,49 @@ def startup_worker( with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): - with sync.sync_lock: - if sync.remote_cursor == "": - sync.clear_sync_errors() + if sync.remote_cursor == "": + sync.clear_sync_errors() - # Retry failed downloads. - if len(sync.download_errors) > 0: - logger.info("Retrying failed syncs...") + # Retry failed downloads. + if len(sync.download_errors) > 0: + logger.info("Retrying failed syncs...") - for dbx_path in list(sync.download_errors): - logger.info(f"Syncing ↓ {dbx_path}") - sync.get_remote_item(dbx_path) + for dbx_path in list(sync.download_errors): + logger.info(f"Syncing ↓ {dbx_path}") + sync.get_remote_item(dbx_path) - # Resume interrupted downloads. - if len(sync.pending_downloads) > 0: - logger.info("Resuming interrupted syncs...") + # Resume interrupted downloads. + if len(sync.pending_downloads) > 0: + logger.info("Resuming interrupted syncs...") - for dbx_path in list(sync.pending_downloads): - logger.info(f"Syncing ↓ {dbx_path}") - sync.get_remote_item(dbx_path) - sync.pending_downloads.discard(dbx_path) + for dbx_path in list(sync.pending_downloads): + logger.info(f"Syncing ↓ {dbx_path}") + sync.get_remote_item(dbx_path) + sync.pending_downloads.discard(dbx_path) - # retry failed / interrupted uploads by scheduling additional events - # if len(sync.upload_errors) > 0: - # logger.debug('Retrying failed uploads...') - # - # for dbx_path in list(sync.upload_errors): - # sync.rescan(sync.to_local_path(dbx_path)) + # retry failed / interrupted uploads by scheduling additional events + # if len(sync.upload_errors) > 0: + # logger.debug('Retrying failed uploads...') + # + # for dbx_path in list(sync.upload_errors): + # sync.rescan(sync.to_local_path(dbx_path)) - sync.upload_local_changes_while_inactive() + sync.upload_local_changes_while_inactive() - if not running.is_set(): - continue + if not running.is_set(): + continue - # Download remote changes / indexing. - sync.download_sync_cycle() + # Download remote changes / indexing. + sync.download_sync_cycle() - if not running.is_set(): - continue + if not running.is_set(): + continue - if not paused_by_user.is_set(): - syncing.set() + if not paused_by_user.is_set(): + syncing.set() - startup.clear() - logger.info(IDLE) + startup.clear() + logger.info(IDLE) # ====================================================================================== @@ -3749,9 +3760,7 @@ def pause(self) -> None: self.paused_by_user.set() self.syncing.clear() - self.sync.cancel_pending.set() - self._wait_for_idle() - self.sync.cancel_pending.clear() + self.sync.cancel_sync() logger.info(PAUSED) @@ -3779,9 +3788,7 @@ def stop(self) -> None: self.paused_by_user.clear() self.startup.clear() - self.sync.cancel_pending.set() - self._wait_for_idle() - self.sync.cancel_pending.clear() + self.sync.cancel_sync() self.local_observer_thread.stop() # self.local_observer_thread.join() @@ -3859,11 +3866,6 @@ def rebuild_index(self) -> None: else: self.resume() - def _wait_for_idle(self) -> None: - - self.sync.sync_lock.acquire() - self.sync.sync_lock.release() - # ====================================================================================== # Helper functions From 16e09fccae4dd44c24dc3811a57e9d1fb801ab6a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 29 Jan 2021 22:45:37 +0000 Subject: [PATCH 217/374] [sync] move check for local folder --- src/maestral/sync.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 3325de6c1..0afacdd56 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1578,8 +1578,6 @@ def list_local_changes(self, delay: float = 1) -> Tuple[List[SyncEvent], float]: :returns: (list of sync times events, time_stamp) """ - self.ensure_dropbox_folder_present() - events = [] local_cursor = time.time() @@ -3420,6 +3418,7 @@ def download_worker( with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_remote_changes(sync.remote_cursor) + sync.ensure_dropbox_folder_present() if not (running.is_set() and syncing.is_set()): continue @@ -3491,6 +3490,7 @@ def upload_worker( with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_local_changes() + sync.ensure_dropbox_folder_present() if not (running.is_set() and syncing.is_set()): continue @@ -3529,6 +3529,8 @@ def startup_worker( if sync.remote_cursor == "": sync.clear_sync_errors() + sync.ensure_dropbox_folder_present() + # Retry failed downloads. if len(sync.download_errors) > 0: logger.info("Retrying failed syncs...") @@ -3804,6 +3806,7 @@ def connection_monitor(self) -> None: """ while True: + if check_connection("www.dropbox.com"): self.on_connect() else: From 44d3fc04ea4ffff7b93e5231a6984ca2c7534433 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 29 Jan 2021 23:06:31 +0000 Subject: [PATCH 218/374] [sync] rename _handle_sync_thread_errors -> handle_sync_thread_errors --- src/maestral/sync.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 0afacdd56..669d788f8 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3375,7 +3375,7 @@ def _dir_snapshot_with_mignore(self, path: str) -> DirectorySnapshot: @contextmanager -def _handle_sync_thread_errors( +def handle_sync_thread_errors( syncing: Event, running: Event, connected: Event, @@ -3416,7 +3416,8 @@ def download_worker( syncing.wait() - with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + has_changes = sync.wait_for_remote_changes(sync.remote_cursor) sync.ensure_dropbox_folder_present() @@ -3453,7 +3454,8 @@ def download_worker_added_item( syncing.wait() - with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + dbx_path = added_item_queue.get() sync.pending_downloads.add(dbx_path.lower()) # protect against crashes @@ -3488,7 +3490,8 @@ def upload_worker( syncing.wait() - with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + has_changes = sync.wait_for_local_changes() sync.ensure_dropbox_folder_present() @@ -3524,7 +3527,7 @@ def startup_worker( startup.wait() - with _handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(syncing, running, connected, sync.notifier): if sync.remote_cursor == "": sync.clear_sync_errors() From e897f2770002a9cd8b2d39c25ed4c6f83980389b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 11:30:47 +0000 Subject: [PATCH 219/374] [sync] remove recursive option from `get_remote_folder` --- src/maestral/sync.py | 34 ++++------------------------------ 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 669d788f8..fae156c21 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2394,34 +2394,23 @@ def _on_local_deleted(self, event: SyncEvent) -> Optional[Metadata]: # ==== Download sync =============================================================== - def get_remote_folder(self, dbx_path: str = "/") -> bool: + def get_remote_folder(self, dbx_path: str) -> bool: """ Gets all files/folders from a Dropbox folder and writes them to the local folder :attr:`dropbox_path`. - :param dbx_path: Path relative to Dropbox folder. Defaults to root ('/'). + :param dbx_path: Path relative to Dropbox folder. :returns: Whether download was successful. """ with self.sync_lock: - dbx_path = dbx_path or "/" - success = True - logger.info(f"Syncing ↓ {dbx_path}") - if any(is_child(folder, dbx_path) for folder in self.excluded_items): - # if there are excluded subfolders, index and download only included - skip_excluded = True - else: - skip_excluded = False - try: # iterate over index and download results - list_iter = self.client.list_folder_iterator( - dbx_path, recursive=not skip_excluded, include_deleted=False - ) + list_iter = self.client.list_folder_iterator(dbx_path, recursive=True) for res in list_iter: res.entries.sort(key=lambda x: x.path_lower.count("/")) @@ -2432,25 +2421,10 @@ def get_remote_folder(self, dbx_path: str = "/") -> bool: ] download_res = self.apply_remote_changes(sync_events) - s = all( + success = all( e.status in (SyncStatus.Done, SyncStatus.Skipped) for e in download_res ) - success = s and success - - if skip_excluded: - # list and download sub-folder contents if not excluded - included_subfolders = [ - md - for md in res.entries - if isinstance(md, FolderMetadata) - and not self.is_excluded_by_user(md.path_display) - ] - for md in included_subfolders: - s = self.get_remote_folder(md.path_display) - success = s and success - - del included_subfolders except SyncError as e: self._handle_sync_error(e, direction=SyncDirection.Down) From 4c34bceda56d6ed84b291299231103fb51f7d354 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 11:31:14 +0000 Subject: [PATCH 220/374] [sync] don't send desktop notifications while indexing --- src/maestral/sync.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index fae156c21..9d3700205 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2497,7 +2497,6 @@ def download_sync_cycle(self) -> None: 1) :meth:`list_remote_changes_iterator` 2) :meth:`apply_remote_changes` - 3) :meth:`notify_user` Handles updating the remote cursor and resuming interrupted syncs for you. Calling this method will perform a full indexing if this is the first download. @@ -2505,12 +2504,17 @@ def download_sync_cycle(self) -> None: with self.sync_lock: + is_indexing = self.remote_cursor == "" + changes_iter = self.list_remote_changes_iterator(self.remote_cursor) - # download changes in chunks to reduce memory usage + # Download changes in chunks to reduce memory usage. for changes, cursor in changes_iter: downloaded = self.apply_remote_changes(changes) - self.notify_user(downloaded) + + if not is_indexing: + # Don't send desktop notifications during indexing. + self.notify_user(downloaded) if self._cancel_requested.is_set(): break From 5ef2cac9653d569b959504ea8ea614f64b9ff360 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 13:02:20 +0000 Subject: [PATCH 221/374] added changelog entry on indexing --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc9b77aba..fa353d494 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ change is that **maestral will remove existing matching files from Dropbox as well**. 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 the + beginning. +* Indexing will no longer skip excluded folders. This is necessary for the above change. #### Fixes: From b43ef12b7470e40fd7d82c006375c852019da8c0 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 17:54:19 +0000 Subject: [PATCH 222/374] [sync] reverse startup order: fetch remote changes first, upload local changes second --- src/maestral/sync.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 9d3700205..23db91b18 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3507,11 +3507,11 @@ def startup_worker( with handle_sync_thread_errors(syncing, running, connected, sync.notifier): - if sync.remote_cursor == "": - sync.clear_sync_errors() - sync.ensure_dropbox_folder_present() + # Download remote changes / indexing. + sync.download_sync_cycle() + # Retry failed downloads. if len(sync.download_errors) > 0: logger.info("Retrying failed syncs...") @@ -3541,9 +3541,6 @@ def startup_worker( if not running.is_set(): continue - # Download remote changes / indexing. - sync.download_sync_cycle() - if not running.is_set(): continue From 9781b8fd805c013eec0f4b171c9f0afc9934cc19 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 20:30:23 +0000 Subject: [PATCH 223/374] [sync] move check for deleted folder --- src/maestral/sync.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 23db91b18..6c1a4dd34 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3397,11 +3397,12 @@ def download_worker( with handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_remote_changes(sync.remote_cursor) - sync.ensure_dropbox_folder_present() if not (running.is_set() and syncing.is_set()): continue + sync.ensure_dropbox_folder_present() + if has_changes: logger.info(SYNCING) sync.download_sync_cycle() @@ -3471,11 +3472,12 @@ def upload_worker( with handle_sync_thread_errors(syncing, running, connected, sync.notifier): has_changes = sync.wait_for_local_changes() - sync.ensure_dropbox_folder_present() if not (running.is_set() and syncing.is_set()): continue + sync.ensure_dropbox_folder_present() + if has_changes: logger.info(SYNCING) sync.upload_sync_cycle() @@ -3507,8 +3509,6 @@ def startup_worker( with handle_sync_thread_errors(syncing, running, connected, sync.notifier): - sync.ensure_dropbox_folder_present() - # Download remote changes / indexing. sync.download_sync_cycle() From 2d22b159ff48296e0e85c0b5cf7f5ded988305d9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 20:30:39 +0000 Subject: [PATCH 224/374] update test fixtures --- tests/linked/conftest.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 09e059b8e..9010a1a95 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -130,7 +130,9 @@ def wait_for_idle(m: Maestral, minimum: int = 4): t0 = time.time() while time.time() - t0 < minimum: if m.sync.busy(): - m.monitor._wait_for_idle() + # Wait until we can acquire the sync lock => we are idle. + m.sync.sync_lock.acquire() + m.sync.sync_lock.release() t0 = time.time() else: time.sleep(0.1) From 10a90b1403918f4577619599c2c327156c6e2a50 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 21:05:41 +0000 Subject: [PATCH 225/374] adapt tests --- tests/offline/test_ignoring_events.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/offline/test_ignoring_events.py b/tests/offline/test_ignoring_events.py index 3a5e78985..ee0bcdd99 100644 --- a/tests/offline/test_ignoring_events.py +++ b/tests/offline/test_ignoring_events.py @@ -19,7 +19,8 @@ def test_receiving_events(sync): new_dir = Path(sync.dropbox_path) / "parent" new_dir.mkdir() - sync_events, local_cursor = sync.wait_for_local_changes() + sync.wait_for_local_changes() + sync_events, _ = sync.list_local_changes() assert len(sync_events) == 1 @@ -46,7 +47,8 @@ def test_ignore_tree_creation(sync): file = new_dir / f"test_{i}" file.touch() - sync_events, local_cursor = sync.wait_for_local_changes() + sync.wait_for_local_changes() + sync_events, _ = sync.list_local_changes() assert len(sync_events) == 0 @@ -60,13 +62,15 @@ def test_ignore_tree_move(sync): file.touch() sync.wait_for_local_changes() + sync.list_local_changes() new_dir_1 = Path(sync.dropbox_path) / "parent2" with sync.fs_events.ignore(DirMovedEvent(str(new_dir), str(new_dir_1))): move(new_dir, new_dir_1) - sync_events, local_cursor = sync.wait_for_local_changes() + sync.wait_for_local_changes() + sync_events, _ = sync.list_local_changes() assert len(sync_events) == 0 @@ -81,5 +85,6 @@ def test_catching_non_ignored_events(sync): file = new_dir / f"test_{i}" file.touch() - sync_events, local_cursor = sync.wait_for_local_changes() + sync.wait_for_local_changes() + sync_events, _ = sync.list_local_changes() assert all(not si.is_directory for si in sync_events) From 17594b1b4cd27232d20a886f2aca404a92feb005 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 30 Jan 2021 21:15:15 +0000 Subject: [PATCH 226/374] [sync] always catch NotADirectoryError alongside FileNotFoundError NotADirectoryError will be raised if an ancestor in the given path points to a file instead of a folder --- src/maestral/sync.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 6c1a4dd34..586b46f87 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1441,7 +1441,7 @@ def upload_local_changes_while_inactive(self) -> None: sync_events = [ SyncEvent.from_file_system_event(e, self) for e in events ] - except FileNotFoundError: + except (FileNotFoundError, NotADirectoryError): self.ensure_dropbox_folder_present() return @@ -2852,7 +2852,7 @@ def _ctime_newer_than_last_sync(self, local_path: str) -> bool: try: stat = os.stat(local_path) - except FileNotFoundError: + except (FileNotFoundError, NotADirectoryError): # don't check ctime for deleted items (os won't give stat info) # but confirm absence from index return index_entry is not None @@ -2907,7 +2907,7 @@ def _get_ctime(self, local_path: str) -> float: return ctime else: return os.stat(local_path).st_ctime - except FileNotFoundError: + except (FileNotFoundError, NotADirectoryError): return -1.0 def _clean_remote_changes( @@ -3210,7 +3210,7 @@ def _on_remote_deleted(self, event: SyncEvent) -> Optional[SyncEvent]: self.update_index_from_sync_event(event) logger.debug('Deleted local item "%s"', event.dbx_path) return event - elif isinstance(exc, FileNotFoundError): + elif isinstance(exc, (FileNotFoundError, NotADirectoryError)): self.update_index_from_sync_event(event) logger.debug('Deletion failed: "%s" not found', event.dbx_path) return None From 5137a7bfc4695dc834583d575baac84f6c66b73e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 01:11:42 +0000 Subject: [PATCH 227/374] [sync] renamed some local variables --- src/maestral/sync.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 586b46f87..33adfb599 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1494,8 +1494,8 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa ctime_check = snapshot_time > stats.st_ctime > last_sync # always upload untracked items, check ctime of tracked items - local_entry = self.get_index_entry(dbx_path_lower) - is_new = local_entry is None + index_entry = self.get_index_entry(dbx_path_lower) + is_new = index_entry is None is_modified = ctime_check and not is_new if is_new: @@ -1506,10 +1506,10 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa changes.append(event) elif is_modified: - if snapshot.isdir(path) and local_entry.is_directory: # type: ignore + if snapshot.isdir(path) and index_entry.is_directory: # type: ignore event = DirModifiedEvent(path) changes.append(event) - elif not snapshot.isdir(path) and not local_entry.is_directory: # type: ignore + elif not snapshot.isdir(path) and not index_entry.is_directory: # type: ignore event = FileModifiedEvent(path) changes.append(event) elif snapshot.isdir(path): @@ -1522,8 +1522,9 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa changes += [event0, event1] # get deleted items + dbx_root_lower = self.dropbox_path.lower() for entry in entries: - local_path_uncased = f"{self.dropbox_path}{entry.dbx_path_lower}".lower() + local_path_uncased = f"{dbx_root_lower}{entry.dbx_path_lower}" if local_path_uncased not in lowercase_snapshot_paths: local_path = self.to_local_path_from_cased(entry.dbx_path_cased) if entry.is_directory: From 52baf43f4da4748199d485399259e5ddead5c7c9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 01:44:02 +0000 Subject: [PATCH 228/374] [sync] retry errors before startup --- src/maestral/sync.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 33adfb599..887457c38 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3510,9 +3510,6 @@ def startup_worker( with handle_sync_thread_errors(syncing, running, connected, sync.notifier): - # Download remote changes / indexing. - sync.download_sync_cycle() - # Retry failed downloads. if len(sync.download_errors) > 0: logger.info("Retrying failed syncs...") @@ -3537,6 +3534,7 @@ def startup_worker( # for dbx_path in list(sync.upload_errors): # sync.rescan(sync.to_local_path(dbx_path)) + sync.download_sync_cycle() sync.upload_local_changes_while_inactive() if not running.is_set(): From 1149a058795adcf99c7033a513a6056e53b462f7 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 01:50:42 +0000 Subject: [PATCH 229/374] [tests] removed unused braces --- tests/linked/test_sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index 915016bed..c7b0e8a8d 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -545,7 +545,7 @@ def test_selective_sync_conflict(m): m.exclude_item("/sync_tests/folder") wait_for_idle(m) - assert not (osp.exists(m.test_folder_local + "/folder")) + assert not osp.exists(m.test_folder_local + "/folder") # recreate 'folder' locally os.mkdir(m.test_folder_local + "/folder") From 9840308e98dc157be83dc46318e3e9e41675e9e5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 01:50:56 +0000 Subject: [PATCH 230/374] [sync] added debug message --- src/maestral/sync.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 887457c38..4a50ef696 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1543,6 +1543,8 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa def wait_for_local_changes(self, timeout: float = 40) -> bool: + logger.debug("Waiting for local changes since cursor: %s", self.local_cursor) + with self.fs_events.local_file_event_queue.not_empty: return self.fs_events.local_file_event_queue.not_empty.wait(timeout) From 909533b92a0fa7e4b7abd439c18ab5013f0e8f73 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 11:16:15 +0000 Subject: [PATCH 231/374] [sync] fix waiting for local changes --- src/maestral/sync.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 4a50ef696..ade09dd5a 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1545,8 +1545,13 @@ def wait_for_local_changes(self, timeout: float = 40) -> bool: logger.debug("Waiting for local changes since cursor: %s", self.local_cursor) - with self.fs_events.local_file_event_queue.not_empty: - return self.fs_events.local_file_event_queue.not_empty.wait(timeout) + try: + event = self.fs_events.local_file_event_queue.get(timeout=timeout) + except Empty: + return False + + self.fs_events.local_file_event_queue.queue.append(event) + return True def upload_sync_cycle(self): """ From 284a0382c902c85b98b4c9db517c11cd9d6c612c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 11:40:22 +0000 Subject: [PATCH 232/374] [main] verify revs before requesting diff --- src/maestral/main.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/maestral/main.py b/src/maestral/main.py index e8096ecad..199c4fc4c 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -863,7 +863,16 @@ def download_rev(rev: str) -> Tuple[List[str], FileMetadata]: return content, md + md_new = self.client.get_metadata(f"rev:{new_rev}", include_deleted=True) md_old = self.client.get_metadata(f"rev:{old_rev}", include_deleted=True) + + if md_new is None or md_old is None: + missing_rev = new_rev if md_new is None else old_rev + raise NotFoundError( + f"Could not a file with revision {missing_rev}", + "Use 'list_revisions' to list past revisions of a file.", + ) + dbx_path = self.sync.correct_case(md_old.path_display) local_path = self.sync.to_local_path(md_old.path_display) From daaf0b78c885b7c396841edec94f9f4b6671b82c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 16 Nov 2020 20:04:14 +0000 Subject: [PATCH 233/374] [client] add API to create, list and revoke shared links --- src/maestral/client.py | 90 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 83 insertions(+), 7 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 212edd39b..1073529ea 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -31,6 +31,7 @@ Dropbox, create_session, files, + sharing, users, exceptions, async_, @@ -479,15 +480,11 @@ def download( sync_event.completed = f.tell() # dropbox SDK provides naive datetime in UTC - client_mod_timestamp = md.client_modified.replace( - tzinfo=timezone.utc - ).timestamp() - server_mod_timestamp = md.server_modified.replace( - tzinfo=timezone.utc - ).timestamp() + client_mod = md.client_modified.replace(tzinfo=timezone.utc) + server_mod = md.server_modified.replace(tzinfo=timezone.utc) # enforce client_modified < server_modified - timestamp = min(client_mod_timestamp, server_mod_timestamp, time.time()) + timestamp = min(client_mod.timestamp(), server_mod.timestamp(), time.time()) # set mtime of downloaded file os.utime(local_path, (time.time(), timestamp)) @@ -968,6 +965,85 @@ def list_remote_changes_iterator( result = self.dbx.files_list_folder_continue(result.cursor) yield result + @convert_api_errors_decorator(dbx_path_arg=1) + def create_shared_link( + self, + dbx_path: str, + visibility: sharing.RequestedVisibility = sharing.RequestedVisibility.public, + password: Optional[str] = None, + expires: Optional[datetime] = None, + ) -> sharing.SharedLinkMetadata: + """ + Creates a shared link for the given path. Some options are only available for + Professional and Business accounts + + :param dbx_path: Dropbox path to file or folder to share. + :param visibility: The visibility of the shared item. Can be public, team-only, + or password protected. In case of the latter, the password argument must be + given. Only available for Professional and Business accounts. + :param password: Password to protect shared link. Is required if visibility + is set to password protected and will be ignored otherwise + :param expires: Expiry time for shared link. Only available for Professional and + Business accounts. + :returns: Metadata for shared link. + """ + + if visibility.is_password() and not password: + raise MaestralApiError( + "Invalid shared link setting", + "Password is required to share a password-protected link", + ) + + if not visibility.is_password(): + password = None + + # convert timestamp to utc time if not naive + if expires is not None: + has_timezone = expires.tzinfo and expires.tzinfo.utcoffset(expires) + if has_timezone: + expires.astimezone(timezone.utc) + + settings = sharing.SharedLinkSettings( + requested_visibility=visibility, + link_password=password, + expires=expires, + ) + + with convert_api_errors(dbx_path=dbx_path): + res = self.dbx.sharing_create_shared_link_with_settings(dbx_path, settings) + + return res + + def revoke_shared_link(self, url: str) -> None: + """ + Revokes a shared link. + + :param url: URL to revoke. + """ + with convert_api_errors(): + self.dbx.sharing_revoke_shared_link(url) + + def list_shared_links(self, dbx_path: str) -> sharing.ListSharedLinksResult: + """ + Lists all shared links for a given Dropbox path (file or folder). + + :param dbx_path: Dropbox path to file or folder. + :returns: Shared links for a path, including any shared links for parents + through which this path is accessible. + """ + + results = [] + + with convert_api_errors(dbx_path=dbx_path): + res = self.dbx.sharing_list_shared_links(dbx_path) + results.append(res) + + while results[-1].has_more: + res = self.dbx.sharing_list_shared_links(dbx_path, results[-1].cursor) + results.append(res) + + return self.flatten_results(results, attribute_name="links") + @staticmethod def flatten_results( results: List[files.ListFolderResult], From 918c1b6549288ce45538077897c1e644f55cc99b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 19 Nov 2020 19:15:54 +0000 Subject: [PATCH 234/374] [client] improved typing --- src/maestral/client.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 1073529ea..b1f197e4d 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -22,9 +22,15 @@ Iterator, TypeVar, Optional, + cast, TYPE_CHECKING, ) +try: + from typing import Protocol # type: ignore +except ImportError: + from typing_extensions import Protocol # type: ignore + # external imports import requests from dropbox import ( # type: ignore @@ -121,8 +127,20 @@ FileSizeError, ] ] -_FT = Callable[..., Any] -_T = TypeVar("_T") +FT = TypeVar("FT", bound=Callable[..., Any]) + + +class ResultType(Protocol): + def __init__(self, entries: list, cursor: str, has_more: bool) -> None: + ... + + @property + def cursor(self) -> str: + ... + + @property + def has_more(self) -> bool: + ... # create single requests session for all clients From 30bafd4a71493066c0de1343498ca1ed05dd2a2d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 15:17:52 +0000 Subject: [PATCH 235/374] [client] corrections after rebase to develop --- src/maestral/client.py | 56 +++++++++++++++++------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index b1f197e4d..616a2ce4f 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -22,15 +22,9 @@ Iterator, TypeVar, Optional, - cast, TYPE_CHECKING, ) -try: - from typing import Protocol # type: ignore -except ImportError: - from typing_extensions import Protocol # type: ignore - # external imports import requests from dropbox import ( # type: ignore @@ -127,22 +121,9 @@ FileSizeError, ] ] +PaginationResultType = Union[sharing.ListSharedLinksResult, files.ListFolderResult] FT = TypeVar("FT", bound=Callable[..., Any]) - -class ResultType(Protocol): - def __init__(self, entries: list, cursor: str, has_more: bool) -> None: - ... - - @property - def cursor(self) -> str: - ... - - @property - def has_more(self) -> bool: - ... - - # create single requests session for all clients SESSION = create_session() _major_minor_version = ".".join(__version__.split(".")[:2]) @@ -854,7 +835,7 @@ def list_folder( **kwargs, ) - return self.flatten_results(list(iterator)) + return self.flatten_results(list(iterator), attribute_name="entries") def list_folder_iterator( self, @@ -956,7 +937,7 @@ def list_remote_changes(self, last_cursor: str) -> files.ListFolderResult: """ iterator = self.list_remote_changes_iterator(last_cursor) - return self.flatten_results(list(iterator)) + return self.flatten_results(list(iterator), attribute_name="entries") def list_remote_changes_iterator( self, last_cursor: str @@ -983,7 +964,6 @@ def list_remote_changes_iterator( result = self.dbx.files_list_folder_continue(result.cursor) yield result - @convert_api_errors_decorator(dbx_path_arg=1) def create_shared_link( self, dbx_path: str, @@ -1064,22 +1044,30 @@ def list_shared_links(self, dbx_path: str) -> sharing.ListSharedLinksResult: @staticmethod def flatten_results( - results: List[files.ListFolderResult], - ) -> files.ListFolderResult: + results: List[PaginationResultType], attribute_name: str + ) -> PaginationResultType: """ - Flattens a list of :class:`files.ListFolderResult` instances to a single - instance with the cursor of the last entry in the list. + Flattens a list of Dropbox API results from a pagination to a single result with + the cursor of the last entry in the list. - :param results: List of :class:`files.ListFolderResult` instances. - :returns: Flattened list folder result. + :param results: List of :results to flatten. + :param attribute_name: Name of attribute to flatten. + :returns: Flattened result. """ - entries_all = [] + + all_entries = [] + for result in results: - entries_all += result.entries + all_entries += getattr(result, attribute_name) - results_flattened = files.ListFolderResult( - entries=entries_all, cursor=results[-1].cursor, has_more=False - ) + kwargs = { + attribute_name: all_entries, + "cursor": results[-1].cursor, + "has_more": False, + } + + result_cls = type(results[0]) + results_flattened = result_cls(**kwargs) return results_flattened From 20360abf35589ad60fc16ff0ac37d34a4212276c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 19:24:04 +0000 Subject: [PATCH 236/374] [cli] use DropboxPath where appropriate --- src/maestral/cli.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 49f5c86b7..c3cb7a487 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -934,7 +934,7 @@ def history(config_name: str) -> None: @main.command(section="Information", help="List contents of a Dropbox directory.") -@click.argument("dropbox_path", type=click.Path(), default="") +@click.argument("dropbox_path", type=DropboxPath(), default="") @click.option( "-l", "--long", @@ -1159,7 +1159,7 @@ def excluded_list(config_name: str) -> None: name="add", help="Add a file or folder to the excluded list and re-sync.", ) -@click.argument("dropbox_path", type=click.Path()) +@click.argument("dropbox_path", type=DropboxPath()) @existing_config_option @catch_maestral_errors def excluded_add(dropbox_path: str, config_name: str) -> None: @@ -1186,7 +1186,7 @@ def excluded_add(dropbox_path: str, config_name: str) -> None: folder will be included as well (but no other items inside it). """, ) -@click.argument("dropbox_path", type=click.Path()) +@click.argument("dropbox_path", type=DropboxPath()) @existing_config_option @catch_maestral_errors def excluded_remove(dropbox_path: str, config_name: str) -> None: @@ -1509,7 +1509,7 @@ def color(ind: int, line: str) -> str: If no revision number is given, old revisions will be listed. """, ) -@click.argument("dropbox_path", type=click.Path()) +@click.argument("dropbox_path", type=DropboxPath()) @click.option("-v", "--rev", help="Revision to restore.", default="") @click.option( "-l", From 8a2923ef74787dfd06e8dfed33cf2969d8fbccac Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 19:25:32 +0000 Subject: [PATCH 237/374] [cli] allow lower case choice parameters --- src/maestral/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c3cb7a487..0173eb669 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1219,7 +1219,7 @@ def notify(): @click.argument( "level_name", required=False, - type=click.Choice(["ERROR", "SYNCISSUE", "FILECHANGE"]), + type=click.Choice(["ERROR", "SYNCISSUE", "FILECHANGE"], case_sensitive=False), ) @existing_config_option def notify_level(level_name: str, config_name: str) -> None: @@ -1615,7 +1615,7 @@ def log_clear(config_name: str) -> None: @click.argument( "level_name", required=False, - type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR"]), + type=click.Choice(["DEBUG", "INFO", "WARNING", "ERROR"], case_sensitive=False), ) @existing_config_option def log_level(level_name: str, config_name: str) -> None: From 61db924ea3a0641e292fc23f14e870cbf6693f38 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 19:25:46 +0000 Subject: [PATCH 238/374] [cli] fix typo --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 0173eb669..3dd004013 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -721,7 +721,7 @@ def link(relink: bool, config_name: str) -> None: @main.command( section="Core Commands", help=""" -Unlinks your Dropbox account. +Unlink your Dropbox account. If Maestral is running, it will be stopped before unlinking. """, From abbdb0938acadca2d6d83140971d1ba63a30c011 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 19:48:00 +0000 Subject: [PATCH 239/374] [cli] import datetime globally --- src/maestral/cli.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 3dd004013..28e745a80 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -11,6 +11,7 @@ import os.path as osp import functools import time +from datetime import datetime from typing import Optional, Dict, List, Tuple, Callable, Union, cast, TYPE_CHECKING # external imports @@ -905,7 +906,6 @@ def curses_loop(screen) -> None: # no type hints for screen provided yet @catch_maestral_errors def history(config_name: str) -> None: - from datetime import datetime from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -953,7 +953,6 @@ def history(config_name: str) -> None: @catch_maestral_errors def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) -> None: - from datetime import datetime from .utils import natural_size from .daemon import MaestralProxy @@ -1332,7 +1331,6 @@ def rebuild_index(config_name: str) -> None: @catch_maestral_errors def revs(dropbox_path: str, limit: int, config_name: str) -> None: - from datetime import datetime from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -1396,7 +1394,6 @@ def diff( config_name: str, ) -> None: - from datetime import datetime from .daemon import MaestralProxy # Reason for rel_dbx_path: os.path.join does not like leading / @@ -1522,7 +1519,7 @@ def color(ind: int, line: str) -> str: @existing_config_option @catch_maestral_errors def restore(dropbox_path: str, rev: str, limit: int, config_name: str) -> None: - from datetime import datetime + from .daemon import MaestralProxy if not dropbox_path.startswith("/"): From ee7d6b6b91232dea204afbe4f2493a63ea33fd2d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 23:43:44 +0000 Subject: [PATCH 240/374] [client] update doc strings and kwarg handling --- src/maestral/client.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 616a2ce4f..59ba45e83 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -401,7 +401,7 @@ def get_metadata(self, dbx_path: str, **kwargs) -> Optional[files.Metadata]: call. :param dbx_path: Path of folder on Dropbox. - :param kwargs: Keyword arguments for Dropbox SDK files_download_to_file. + :param kwargs: Keyword arguments for Dropbox SDK files_get_metadata. :returns: Metadata of item at the given path or ``None`` if item cannot be found. """ @@ -455,7 +455,7 @@ def download( :param local_path: Path to local download destination. :param sync_event: If given, the sync event will be updated with the number of downloaded bytes. - :param kwargs: Keyword arguments for Dropbox SDK files_download_to_file. + :param kwargs: Keyword arguments for Dropbox SDK files_download. :returns: Metadata of downloaded item. """ @@ -970,19 +970,25 @@ def create_shared_link( visibility: sharing.RequestedVisibility = sharing.RequestedVisibility.public, password: Optional[str] = None, expires: Optional[datetime] = None, + **kwargs, ) -> sharing.SharedLinkMetadata: """ Creates a shared link for the given path. Some options are only available for - Professional and Business accounts + Professional and Business accounts. Note that the requested visibility as access + level for the link may not be granted, depending on the Dropbox folder or team + settings. Check the returned link metadata to verify the visibility and access + level. :param dbx_path: Dropbox path to file or folder to share. - :param visibility: The visibility of the shared item. Can be public, team-only, + :param visibility: The visibility of the shared link. Can be public, team-only, or password protected. In case of the latter, the password argument must be given. Only available for Professional and Business accounts. :param password: Password to protect shared link. Is required if visibility is set to password protected and will be ignored otherwise :param expires: Expiry time for shared link. Only available for Professional and Business accounts. + :param kwargs: Additional keyword arguments for the + :class:`dropbox.sharing.SharedLinkSettings`. :returns: Metadata for shared link. """ @@ -1005,6 +1011,7 @@ def create_shared_link( requested_visibility=visibility, link_password=password, expires=expires, + **kwargs, ) with convert_api_errors(dbx_path=dbx_path): From 8321a795815a2e9455c5c938fe93df17a65623a2 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 23:48:20 +0000 Subject: [PATCH 241/374] [main] add shared link API --- src/maestral/main.py | 71 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 199c4fc4c..b9343ed27 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -27,13 +27,13 @@ import mimetypes import difflib - # external imports import requests from watchdog.events import DirDeletedEvent, FileDeletedEvent # type: ignore from packaging.version import Version from datetime import datetime, timezone from dropbox.files import FileMetadata +from dropbox.sharing import RequestedVisibility try: from systemd import journal # type: ignore @@ -1299,6 +1299,75 @@ def create_dropbox_directory(self, path: str) -> None: if resume: self.resume_sync() + def create_shared_link( + self, + dbx_path: str, + visibility: str = "public", + password: Optional[str] = None, + expires: Optional[float] = None, + ) -> StoneType: + """ + Creates a shared link for the given ``dbx_path``. Returns a dictionary with + information regarding the link, including the URL, access permissions, expiry + time, etc. The shared link will grant read / download access only. + + :param dbx_path: Path to item on Dropbox. + :param visibility: Requested visibility of the shared link. Must be "public", + "team_only" or "password". The actual visibility may be different, depending + on the team and folder settings. Inspect the "link_permissions" entry of the + returned dictionary. + :param password: An optional password required to access the link. Will be + ignored if the visibility is not "password". + :param expires: An optional expiry time for the link as POSIX timestamp. + :returns: Shared link information as dict. See + :class:`dropbox.sharing.SharedLinkMetadata` for keys and values. + :raises DropboxAuthError: in case of an invalid access token. + :raises DropboxServerError: for internal Dropbox errors. + :raises ConnectionError: if the connection to Dropbox fails. + """ + + self._check_linked() + + link_info = self.client.create_shared_link( + dbx_path=dbx_path, + visibility=RequestedVisibility(visibility), + password=password, + expires=datetime.utcfromtimestamp(expires) if expires else None, + ) + + return dropbox_stone_to_dict(link_info) + + def revoke_shared_link(self, url: str) -> None: + """ + Revokes the given shared link. Note that any other links to the same file or + folder will remain valid. + + :param url: URL of shared link to revoke. + :raises DropboxAuthError: in case of an invalid access token. + :raises DropboxServerError: for internal Dropbox errors. + :raises ConnectionError: if the connection to Dropbox fails. + """ + + self._check_linked() + self.client.revoke_shared_link(url) + + def list_shared_links(self, dbx_path: str) -> List[StoneType]: + """ + Returns a list of all shared links for the given Dropbox path. + + :param dbx_path: Path to item on Dropbox. + :returns: List of shared link information as dictionaries. See + :class:`dropbox.sharing.SharedLinkMetadata` for keys and values. + :raises DropboxAuthError: in case of an invalid access token. + :raises DropboxServerError: for internal Dropbox errors. + :raises ConnectionError: if the connection to Dropbox fails. + """ + + self._check_linked() + res = self.client.list_shared_links(dbx_path) + + return [dropbox_stone_to_dict(link) for link in res.links] + # ==== utility methods for front ends ============================================== def to_local_path(self, dbx_path: str) -> str: From 3792190a6416de4acd2e9cabda0c50b38a88afcf Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 31 Jan 2021 23:51:16 +0000 Subject: [PATCH 242/374] [cli] add shared link CLI --- src/maestral/cli.py | 106 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 28e745a80..8fe541491 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -745,6 +745,112 @@ def unlink(yes: bool, config_name: str) -> None: cli.ok("Unlinked Maestral.") +@main.group(section="Core Commands", help="Create and manage shared links.") +def sharedlink(): + pass + + +@sharedlink.command(name="create", help="Create a shared link for a file or folder.") +@click.argument("dropbox_path", type=DropboxPath()) +@click.option( + "-p", + "--password", + help="Optional password for the link.", +) +@click.option( + "-e", + "--expiry", + metavar="DATE", + type=click.DateTime(formats=["%Y-%m-%d", "%Y-%m-%dT%H:%M", "%Y-%m-%d %H:%M"]), + help="Expiry time for the link (e.g. '2025-07-24 20:50').", +) +@existing_config_option +def sharedlink_create( + dropbox_path: str, + password: str, + expiry: Optional[datetime], + config_name: str, +) -> None: + + from .daemon import MaestralProxy + + if not dropbox_path.startswith("/"): + dropbox_path = "/" + dropbox_path + + expiry_dt: Optional[float] + + if expiry: + expiry_dt = expiry.timestamp() + else: + expiry_dt = None + + if password: + visibility = "password" + else: + visibility = "public" + + with MaestralProxy(config_name, fallback=True) as m: + link_info = m.create_shared_link(dropbox_path, visibility, password, expiry_dt) + + cli.echo(link_info["url"]) + + +@sharedlink.command(name="revoke", help="Revoke a shared link.") +@click.argument("url") +@existing_config_option +def sharedlink_revoke(url: str, config_name: str) -> None: + + from .daemon import MaestralProxy + + with MaestralProxy(config_name, fallback=True) as m: + m.revoke_shared_link(url) + + cli.echo("Revoked shared link.") + + +@sharedlink.command(name="list", help="List all shared links for a file or folder.") +@click.argument("dropbox_path", type=DropboxPath()) +@existing_config_option +def sharedlink_list(dropbox_path: str, config_name: str) -> None: + + from .daemon import MaestralProxy + + if not dropbox_path.startswith("/"): + dropbox_path = "/" + dropbox_path + + with MaestralProxy(config_name, fallback=True) as m: + links = m.list_shared_links(dropbox_path) + + link_table = cli.Table( + [cli.Column("URL"), cli.Column("Visibility"), cli.Column("Expires")] + ) + + for link in links: + url = cast(str, link["url"]) + visibility = cast(str, link["link_permissions"]["resolved_visibility"][".tag"]) + + dt_field: cli.Field + + if "expires" in link: + # replacing Z with +0000 is required for Python 3.6 + expires = cast(str, link["expires"]).replace("Z", "+0000") + dt = datetime.strptime(expires, "%Y-%m-%dT%H:%M:%S%z").astimezone() + dt_field = cli.DateField(dt) + else: + dt_field = cli.TextField("-") + + link_table.append([url, visibility, dt_field]) + + cli.echo("") + link_table.echo() + cli.echo("") + + +# ====================================================================================== +# Information commands +# ====================================================================================== + + @main.command(section="Information", help="Show the status of the daemon.") @existing_config_option @catch_maestral_errors From 17c506880dd8f9d2456500024534cb56e39f7f99 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 01:29:52 +0000 Subject: [PATCH 243/374] [errors] add SharedLinkError --- src/maestral/errors.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/maestral/errors.py b/src/maestral/errors.py index 8b659ec6e..69bc51d55 100644 --- a/src/maestral/errors.py +++ b/src/maestral/errors.py @@ -249,6 +249,12 @@ class UnsupportedFileTypeForDiff(MaestralApiError): pass +class SharedLinkError(MaestralApiError): + """Raised when creating a shared link fails.""" + + pass + + # connection errors are handled as warnings # sync errors only appear in the sync errors list # all other errors raise an error dialog in the GUI @@ -270,6 +276,7 @@ class UnsupportedFileTypeForDiff(MaestralApiError): OutOfMemoryError, BusyError, UnsupportedFileTypeForDiff, + SharedLinkError, ) SYNC_ERRORS = ( From b10ae800c627b9cc22887687f82314cc2bf7d7b5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 18 Jan 2021 16:42:32 +0000 Subject: [PATCH 244/374] [sync] whitelist which event types are handled --- src/maestral/sync.py | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index ade09dd5a..16dc4b04e 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -50,7 +50,12 @@ import dropbox # type: ignore from dropbox.files import Metadata, DeletedMetadata, FileMetadata, FolderMetadata # type: ignore from watchdog.events import FileSystemEventHandler # type: ignore -from watchdog.events import EVENT_TYPE_CREATED, EVENT_TYPE_DELETED, EVENT_TYPE_MOVED +from watchdog.events import ( + EVENT_TYPE_CREATED, + EVENT_TYPE_DELETED, + EVENT_TYPE_MOVED, + EVENT_TYPE_MODIFIED, +) from watchdog.events import ( DirModifiedEvent, FileModifiedEvent, @@ -188,8 +193,16 @@ class FSEventHandler(FileSystemEventHandler): to be uploaded by :meth:`upload_worker`. This acts as a translation layer between :class:`watchdog.Observer` and :class:`SyncEngine`. + White lists of event types to handle are supplied as ``file_event_types`` and + ``dir_event_types``. This is for forward compatibility as additional event types + may be added to watchdog in the future. + :param syncing: Set when syncing is running. :param startup: Set when startup is running. + :param file_event_types: Types of file events to handle. This acts as a whitelist. + By default, only FileClosedEvents are ignored. + :param dir_event_types: Types of directory events to handle. This acts as a + whitelist. By default, only DirModifiedEvents are ignored. :cvar float ignore_timeout: Timeout in seconds after which ignored paths will be discarded. @@ -198,11 +211,29 @@ class FSEventHandler(FileSystemEventHandler): _ignored_events: List[_Ignore] local_file_event_queue: "Queue[FileSystemEvent]" - def __init__(self, syncing: Event, startup: Event) -> None: + def __init__( + self, + syncing: Event, + startup: Event, + file_event_types: Tuple[str, ...] = ( + EVENT_TYPE_CREATED, + EVENT_TYPE_DELETED, + EVENT_TYPE_MODIFIED, + EVENT_TYPE_MOVED, + ), + dir_event_types: Tuple[str, ...] = ( + EVENT_TYPE_CREATED, + EVENT_TYPE_DELETED, + EVENT_TYPE_MOVED, + ), + ) -> None: self.syncing = syncing self.startup = startup + self.file_event_types = file_event_types + self.dir_event_types = dir_event_types + self._ignored_events = [] self.ignore_timeout = 2.0 self.local_file_event_queue = Queue() @@ -310,8 +341,12 @@ def on_any_event(self, event: FileSystemEvent) -> None: if not (self.syncing.is_set() or self.startup.is_set()): return - # ignore all DirMovedEvents - if isinstance(event, DirModifiedEvent): + # handle only whitelisted dir event types + if event.is_directory and event.event_type not in self.dir_event_types: + return + + # handle only whitelisted file event types + if not event.is_directory and event.event_type not in self.file_event_types: return # check if event should be ignored From a6d015bcccfb50c557429230cae8ed07b64780b8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 02:14:21 +0000 Subject: [PATCH 245/374] relax pinned dependencies where possible see #250 --- setup.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/setup.py b/setup.py index a436e64e6..e71ae1a7f 100644 --- a/setup.py +++ b/setup.py @@ -6,8 +6,8 @@ # proceed with actual install install_requires = [ - "alembic>=1.3,<1.6", - "click>=7.1.1,<8.0", + "alembic>=1.3", + "click>=7.1.1", "desktop-notifier", "dropbox>=10.9.0,<12.0", "dbus-next>=0.1.4;sys_platform=='linux'", @@ -15,17 +15,18 @@ "importlib_metadata;python_version<'3.8'", "importlib_resources;python_version<'3.9'", "keyring>=22", - "keyrings.alt>=3.1.0,<5.0", + "keyrings.alt>=3.1.0", "packaging", "pathspec>=0.5.8", "Pyro5>=5.10", "requests>=2.16.2", - "rubicon-objc>=0.3.1;sys_platform=='darwin'", + "rubicon-objc>=0.4.0;sys_platform=='darwin'", "sdnotify>=0.3.2", "setuptools", - "sqlalchemy>=1.3,<1.4", + "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog>=0.10.0,<=0.10.3", + "watchdog>=0.10.0,<=0.10.3;sys_platform=='darwin'", + "watchdog>=0.10.0;sys_platform=='linux'", ] gui_requires = [ From f86afcdb2cb3c5e37188fd198ec51bb8938a4e5a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 02:24:51 +0000 Subject: [PATCH 246/374] [sevents] guard against import error in new release --- src/maestral/fsevents/__init__.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/maestral/fsevents/__init__.py b/src/maestral/fsevents/__init__.py index f6336b014..f93cceb01 100644 --- a/src/maestral/fsevents/__init__.py +++ b/src/maestral/fsevents/__init__.py @@ -57,7 +57,6 @@ from watchdog.utils import platform # type: ignore from watchdog.utils import UnsupportedLibc -from watchdog.utils import unicode_paths if platform.is_darwin(): @@ -70,8 +69,6 @@ else: from watchdog.observers import Observer # type: ignore -__all__ = ["Observer"] - # patch encoding / decoding of paths in watchdog @@ -88,5 +85,13 @@ def _patched_encode(path: Union[str, bytes]) -> bytes: return path -unicode_paths.decode = _patched_decode -unicode_paths.encode = _patched_encode +try: + from watchdog.utils import unicode_paths +except ImportError: + pass +else: + unicode_paths.decode = _patched_decode + unicode_paths.encode = _patched_encode + + +__all__ = ["Observer"] From fbd35d445e42931310046ab336c9f38188b205de Mon Sep 17 00:00:00 2001 From: "dependabot-preview[bot]" <27856297+dependabot-preview[bot]@users.noreply.github.com> Date: Mon, 1 Feb 2021 07:17:04 +0000 Subject: [PATCH 247/374] Bump sphinx-autoapi from 1.6.0 to 1.7.0 Bumps [sphinx-autoapi](https://github.com/readthedocs/sphinx-autoapi) from 1.6.0 to 1.7.0. - [Release notes](https://github.com/readthedocs/sphinx-autoapi/releases) - [Changelog](https://github.com/readthedocs/sphinx-autoapi/blob/master/CHANGELOG.rst) - [Commits](https://github.com/readthedocs/sphinx-autoapi/compare/v1.6.0...v1.7.0) Signed-off-by: dependabot-preview[bot] --- docs/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/requirements.txt b/docs/requirements.txt index 02a4ae03f..ca5bf54a9 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -1,4 +1,4 @@ m2r2 sphinx==3.4.3 -sphinx-autoapi==1.6.0 +sphinx-autoapi==1.7.0 sphinx_rtd_theme==0.5.1 \ No newline at end of file From b9f6dc28eedae993e96f2a372da33b97a6a07205 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 01:42:12 +0000 Subject: [PATCH 248/374] [client] added error handling for shared link api --- src/maestral/client.py | 56 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 59ba45e83..3476a9585 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -69,6 +69,7 @@ InotifyError, NotLinkedError, InvalidDbidError, + SharedLinkError, ) from .config import MaestralState from .constants import DROPBOX_APP_KEY, IDLE @@ -1516,13 +1517,54 @@ def dropbox_to_maestral_error( ) err_cls = MaestralApiError - else: - err_cls = MaestralApiError - title = "An unexpected error occurred" - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) + elif isinstance(error, sharing.CreateSharedLinkWithSettingsError): + title = "Could not create shared link" + + if error.is_access_denied(): + text = "You do not have access to create shared links for this path." + err_cls = InsufficientPermissionsError + elif error.is_email_not_verified(): + text = "Please verify you email address before creating shared links" + err_cls = SharedLinkError + elif error.is_path(): + lookup_error = error.get_path() + text, err_cls = _get_lookup_error_msg(lookup_error) + elif error.is_settings_error(): + settings_error = error.get_settings_error() + err_cls = SharedLinkError + if settings_error.is_invalid_settings(): + text = "Please check if the settings are valid." + elif settings_error.is_not_authorized(): + text = "Basic accounts do not support passwords or expiry dates." + elif error.is_shared_link_already_exists(): + text = "The shared link already exists." + err_cls = SharedLinkError + + elif isinstance(error, sharing.RevokeSharedLinkError): + title = "Could not revoke shared link" + + if error.is_shared_link_not_found(): + text = "The given link does not exist." + err_cls = NotFoundError + elif error.is_shared_link_access_denied(): + text = "You do not have access to revoke the shared link." + err_cls = InsufficientPermissionsError + elif error.is_shared_link_malformed(): + text = "The shared link is malformed." + err_cls = SharedLinkError + elif error.is_unsupported_link_type(): + text = "The link type is not supported." + err_cls = SharedLinkError + + elif isinstance(error, sharing.ListSharedLinksError): + title = "Could not list shared links" + + if error.is_path(): + lookup_error = error.get_path() + text, err_cls = _get_lookup_error_msg(lookup_error) + elif error.is_reset(): + text = "Please try again later." + err_cls = SharedLinkError # ---- Authentication errors ------------------------------------------------------- elif isinstance(exc, exceptions.AuthError): From 17d2a51449966142fe41c09c90026dd3ed601829 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 01:42:56 +0000 Subject: [PATCH 249/374] [client] simplified error conversion logic --- src/maestral/client.py | 81 +++++------------------------------------- 1 file changed, 9 insertions(+), 72 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 3476a9585..ac1982b58 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -1227,7 +1227,10 @@ def dropbox_to_maestral_error( :returns: :class:`MaestralApiError` instance. """ - err_cls: Type[MaestralApiError] + title = "An unexpected error occurred" + text = "Please contact the developer with the traceback information from the logs." + err_cls = MaestralApiError + # ---- Dropbox API Errors ---------------------------------------------------------- if isinstance(exc, exceptions.ApiError): @@ -1332,7 +1335,6 @@ def dropbox_to_maestral_error( elif error.is_properties_error(): # this is a programming error in maestral text = "Invalid property group provided." - err_cls = MaestralApiError else: text = "Please check the logs or traceback for more information" err_cls = SyncError @@ -1342,11 +1344,9 @@ def dropbox_to_maestral_error( if error.is_concurrent_session_close_not_allowed(): # this is a programming error in maestral text = "Can not start a closed concurrent upload session." - err_cls = MaestralApiError elif error.is_concurrent_session_data_not_allowed(): # this is a programming error in maestral text = "Uploading data not allowed when starting concurrent upload session." - err_cls = MaestralApiError else: text = "Please check the logs or traceback for more information" err_cls = SyncError @@ -1362,7 +1362,6 @@ def dropbox_to_maestral_error( elif error.is_properties_error(): # this is a programming error in maestral text = "Invalid property group provided." - err_cls = MaestralApiError elif error.is_too_many_write_operations(): text = ( "There are too many write operations happening in your " @@ -1394,12 +1393,6 @@ def dropbox_to_maestral_error( if error.is_path(): lookup_error = error.get_path() text, err_cls = _get_lookup_error_msg(lookup_error) - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, files.ListFolderContinueError): title = "Could not list folder contents" @@ -1412,12 +1405,6 @@ def dropbox_to_maestral_error( "Maestral's index to re-sync your Dropbox." ) err_cls = CursorResetError - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, files.ListFolderLongpollError): title = "Could not get Dropbox changes" @@ -1427,12 +1414,6 @@ def dropbox_to_maestral_error( "Maestral's index to re-sync your Dropbox." ) err_cls = CursorResetError - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, async_.PollError): @@ -1446,13 +1427,9 @@ def dropbox_to_maestral_error( ) err_cls = DropboxServerError else: - # Other tags include invalid_async_job_id. Neither should occur in our - # SDK usage. - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError + # Other tags include invalid_async_job_id. + # Neither should occur in our SDK usage. + pass elif isinstance(error, files.ListRevisionsError): @@ -1461,12 +1438,6 @@ def dropbox_to_maestral_error( if error.is_path(): lookup_error = error.get_path() text, err_cls = _get_lookup_error_msg(lookup_error) - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, files.RestoreError): @@ -1481,12 +1452,6 @@ def dropbox_to_maestral_error( elif error.is_path_write(): write_error = error.get_path_write() text, err_cls = _get_write_error_msg(write_error) - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, files.GetMetadataError): title = "Could not get metadata" @@ -1494,12 +1459,6 @@ def dropbox_to_maestral_error( if error.is_path(): lookup_error = error.get_path() text, err_cls = _get_lookup_error_msg(lookup_error) - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, users.GetAccountError): title = "Could not get account info" @@ -1510,12 +1469,6 @@ def dropbox_to_maestral_error( "exist or has been deleted" ) err_cls = InvalidDbidError - else: - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - err_cls = MaestralApiError elif isinstance(error, sharing.CreateSharedLinkWithSettingsError): title = "Could not create shared link" @@ -1592,19 +1545,12 @@ def dropbox_to_maestral_error( # Other tags are invalid_select_admin, invalid_select_user, # missing_scope, route_access_denied. Neither should occur in our SDK # usage. - err_cls = MaestralApiError - title = "An unexpected error occurred" - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) + pass else: err_cls = DropboxAuthError title = "Authentication error" - text = ( - "Please check if you can log into your account on the Dropbox website." - ) + text = "Please check if you can log in on the Dropbox website." # ---- OAuth2 flow errors ---------------------------------------------------------- elif isinstance(exc, requests.HTTPError): @@ -1639,15 +1585,6 @@ def dropbox_to_maestral_error( "again if it failed." ) - # ---- Everything else ------------------------------------------------------------- - else: - err_cls = MaestralApiError - title = "An unexpected error occurred" - text = ( - "Please contact the developer with the traceback " - "information from the logs." - ) - maestral_exc = err_cls(title, text, dbx_path=dbx_path, local_path=local_path) maestral_exc.__cause__ = exc From be773ee0afdc4cfe168174107d6b9c0878f91e06 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 12:11:51 +0000 Subject: [PATCH 250/374] [cli] show account type in status --- src/maestral/cli.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 49f5c86b7..8ab82d51d 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -756,15 +756,21 @@ def status(config_name: str) -> None: try: with MaestralProxy(config_name) as m: + email = m.get_state("account", "email") + account_type = m.get_state("account", "type").capitalize() + + status_info = m.status if m.running else "Stopped" + usage = m.get_state("account", "usage") + n_errors = len(m.sync_errors) color = "red" if n_errors > 0 else "green" n_errors_str = click.style(str(n_errors), fg=color) + cli.echo("") - cli.echo("Account: {}".format(m.get_state("account", "email"))) - cli.echo("Usage: {}".format(m.get_state("account", "usage"))) - cli.echo("Status: {}".format(m.status)) - cli.echo("Sync threads: {}".format("Running" if m.running else "Stopped")) - cli.echo("Sync errors: {}".format(n_errors_str)) + cli.echo(f"Account: {email} ({account_type})") + cli.echo(f"Usage: {usage}") + cli.echo(f"Status: {status_info}") + cli.echo(f"Sync errors: {n_errors_str}") cli.echo("") check_for_fatal_errors(m) From e0b4c83c97d9291d69da07a45aa1299086381efd Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 01:43:27 +0000 Subject: [PATCH 251/374] allow listing all shared links --- src/maestral/cli.py | 16 ++++++++++++---- src/maestral/client.py | 7 +++++-- src/maestral/main.py | 18 +++++++++++++++--- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 8fe541491..f43a5244b 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -808,14 +808,22 @@ def sharedlink_revoke(url: str, config_name: str) -> None: cli.echo("Revoked shared link.") -@sharedlink.command(name="list", help="List all shared links for a file or folder.") -@click.argument("dropbox_path", type=DropboxPath()) +@sharedlink.command( + name="list", + help=""" +List shared links. + +Lists all shared links for a file or folder. If not path is given, lists all links for +the Dropbox. +""", +) +@click.argument("dropbox_path", required=False, type=DropboxPath()) @existing_config_option -def sharedlink_list(dropbox_path: str, config_name: str) -> None: +def sharedlink_list(dropbox_path: Optional[str], config_name: str) -> None: from .daemon import MaestralProxy - if not dropbox_path.startswith("/"): + if dropbox_path and not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path with MaestralProxy(config_name, fallback=True) as m: diff --git a/src/maestral/client.py b/src/maestral/client.py index ac1982b58..27e464071 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -1029,9 +1029,12 @@ def revoke_shared_link(self, url: str) -> None: with convert_api_errors(): self.dbx.sharing_revoke_shared_link(url) - def list_shared_links(self, dbx_path: str) -> sharing.ListSharedLinksResult: + def list_shared_links( + self, dbx_path: Optional[str] = None + ) -> sharing.ListSharedLinksResult: """ - Lists all shared links for a given Dropbox path (file or folder). + Lists all shared links for a given Dropbox path (file or folder). If no path is + given, list all shared links for the account, up to a maximum of 1,000 links. :param dbx_path: Dropbox path to file or folder. :returns: Shared links for a path, including any shared links for parents diff --git a/src/maestral/main.py b/src/maestral/main.py index b9343ed27..8a50f73fc 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -1309,7 +1309,8 @@ def create_shared_link( """ Creates a shared link for the given ``dbx_path``. Returns a dictionary with information regarding the link, including the URL, access permissions, expiry - time, etc. The shared link will grant read / download access only. + time, etc. The shared link will grant read / download access only. Note that + basic accounts do not support password protection or expiry times. :param dbx_path: Path to item on Dropbox. :param visibility: Requested visibility of the shared link. Must be "public", @@ -1321,13 +1322,21 @@ def create_shared_link( :param expires: An optional expiry time for the link as POSIX timestamp. :returns: Shared link information as dict. See :class:`dropbox.sharing.SharedLinkMetadata` for keys and values. + :raises ValueError: if visibility is 'password' but no password is provided. :raises DropboxAuthError: in case of an invalid access token. :raises DropboxServerError: for internal Dropbox errors. :raises ConnectionError: if the connection to Dropbox fails. + :raises NotLinkedError: if no Dropbox account is linked. """ self._check_linked() + if visibility not in ("public", "team_only", "password"): + raise ValueError("Visibility must be 'public', 'team_only', or 'password'") + + if visibility == "password" and not password: + raise ValueError("Please specify a password") + link_info = self.client.create_shared_link( dbx_path=dbx_path, visibility=RequestedVisibility(visibility), @@ -1346,14 +1355,16 @@ def revoke_shared_link(self, url: str) -> None: :raises DropboxAuthError: in case of an invalid access token. :raises DropboxServerError: for internal Dropbox errors. :raises ConnectionError: if the connection to Dropbox fails. + :raises NotLinkedError: if no Dropbox account is linked. """ self._check_linked() self.client.revoke_shared_link(url) - def list_shared_links(self, dbx_path: str) -> List[StoneType]: + def list_shared_links(self, dbx_path: Optional[str] = None) -> List[StoneType]: """ - Returns a list of all shared links for the given Dropbox path. + Returns a list of all shared links for the given Dropbox path. If no path is + given, return all shared links for the account, up to a maximum of 1,000 links. :param dbx_path: Path to item on Dropbox. :returns: List of shared link information as dictionaries. See @@ -1361,6 +1372,7 @@ def list_shared_links(self, dbx_path: str) -> List[StoneType]: :raises DropboxAuthError: in case of an invalid access token. :raises DropboxServerError: for internal Dropbox errors. :raises ConnectionError: if the connection to Dropbox fails. + :raises NotLinkedError: if no Dropbox account is linked. """ self._check_linked() From 0e69ac9738d84dcf9e8963f4675e22039fa589ab Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 02:05:10 +0000 Subject: [PATCH 252/374] [cli] fix error handling --- src/maestral/cli.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index f43a5244b..a6626a34d 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -765,6 +765,7 @@ def sharedlink(): help="Expiry time for the link (e.g. '2025-07-24 20:50').", ) @existing_config_option +@catch_maestral_errors def sharedlink_create( dropbox_path: str, password: str, @@ -798,6 +799,7 @@ def sharedlink_create( @sharedlink.command(name="revoke", help="Revoke a shared link.") @click.argument("url") @existing_config_option +@catch_maestral_errors def sharedlink_revoke(url: str, config_name: str) -> None: from .daemon import MaestralProxy @@ -819,6 +821,7 @@ def sharedlink_revoke(url: str, config_name: str) -> None: ) @click.argument("dropbox_path", required=False, type=DropboxPath()) @existing_config_option +@catch_maestral_errors def sharedlink_list(dropbox_path: Optional[str], config_name: str) -> None: from .daemon import MaestralProxy @@ -829,12 +832,11 @@ def sharedlink_list(dropbox_path: Optional[str], config_name: str) -> None: with MaestralProxy(config_name, fallback=True) as m: links = m.list_shared_links(dropbox_path) - link_table = cli.Table( - [cli.Column("URL"), cli.Column("Visibility"), cli.Column("Expires")] - ) + link_table = cli.Table(["URL", "Item", "Visibility", "Expires"]) for link in links: url = cast(str, link["url"]) + file_name = cast(str, link["name"]) visibility = cast(str, link["link_permissions"]["resolved_visibility"][".tag"]) dt_field: cli.Field @@ -847,7 +849,7 @@ def sharedlink_list(dropbox_path: Optional[str], config_name: str) -> None: else: dt_field = cli.TextField("-") - link_table.append([url, visibility, dt_field]) + link_table.append([url, file_name, visibility, dt_field]) cli.echo("") link_table.echo() From c71b323e2d5917c46c5d45907646f4749bc896fc Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 11:31:43 +0000 Subject: [PATCH 253/374] [cli] rename sharedlink -> sharelink --- src/maestral/cli.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index a6626a34d..b38909af3 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -746,11 +746,11 @@ def unlink(yes: bool, config_name: str) -> None: @main.group(section="Core Commands", help="Create and manage shared links.") -def sharedlink(): +def sharelink(): pass -@sharedlink.command(name="create", help="Create a shared link for a file or folder.") +@sharelink.command(name="create", help="Create a shared link for a file or folder.") @click.argument("dropbox_path", type=DropboxPath()) @click.option( "-p", @@ -766,7 +766,7 @@ def sharedlink(): ) @existing_config_option @catch_maestral_errors -def sharedlink_create( +def sharelink_create( dropbox_path: str, password: str, expiry: Optional[datetime], @@ -796,11 +796,11 @@ def sharedlink_create( cli.echo(link_info["url"]) -@sharedlink.command(name="revoke", help="Revoke a shared link.") +@sharelink.command(name="revoke", help="Revoke a shared link.") @click.argument("url") @existing_config_option @catch_maestral_errors -def sharedlink_revoke(url: str, config_name: str) -> None: +def sharelink_revoke(url: str, config_name: str) -> None: from .daemon import MaestralProxy @@ -810,7 +810,7 @@ def sharedlink_revoke(url: str, config_name: str) -> None: cli.echo("Revoked shared link.") -@sharedlink.command( +@sharelink.command( name="list", help=""" List shared links. @@ -822,7 +822,7 @@ def sharedlink_revoke(url: str, config_name: str) -> None: @click.argument("dropbox_path", required=False, type=DropboxPath()) @existing_config_option @catch_maestral_errors -def sharedlink_list(dropbox_path: Optional[str], config_name: str) -> None: +def sharelink_list(dropbox_path: Optional[str], config_name: str) -> None: from .daemon import MaestralProxy From bc4869c4199e436e70046c7cdfebcb65c1b2932f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 12:10:14 +0000 Subject: [PATCH 254/374] [tests] added tests for sharedlink API --- tests/linked/conftest.py | 6 ++++ tests/linked/test_main.py | 65 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 9010a1a95..6cb3bf8d6 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -101,6 +101,12 @@ def m(): except NotFoundError: pass + # remove all shared links + res = m.client.list_shared_links() + + for link in res.links: + m.revoke_shared_link(link.url) + # remove creds from system keyring m.client.auth.delete_creds() diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 2ecd3c3ad..090ddce6c 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- import os -import shutil import os.path as osp +import shutil +import requests import pytest -from maestral.errors import NotFoundError, UnsupportedFileTypeForDiff +from maestral.errors import NotFoundError, UnsupportedFileTypeForDiff, SharedLinkError from maestral.main import FileStatus, IDLE from maestral.main import logger as maestral_logger from maestral.utils.path import delete @@ -289,3 +290,63 @@ def test_restore_failed(m): with pytest.raises(NotFoundError): m.restore("/sync_tests/restored-file", "015982ea314dac40000000154e40990") + + +def test_sharedlink_lifecycle(m): + + # create a folder to share + dbx_path = "/sync_tests/shared_folder" + m.client.make_dir(dbx_path) + + # test creating a shared link + link_data = m.create_shared_link(dbx_path) + + resp = requests.get(link_data["url"]) + assert resp.status_code == 200 + + links = m.list_shared_links(dbx_path) + assert link_data in links + + # test revoking a shared link + m.revoke_shared_link(link_data["url"]) + links = m.list_shared_links(dbx_path) + assert link_data not in links + + +def test_sharedlink_errors(m): + + dbx_path = "/sync_tests/shared_folder" + m.client.make_dir(dbx_path) + + # test creating a shared link with password, no password provided + with pytest.raises(ValueError): + m.create_shared_link(dbx_path, visibility="password") + + # test creating a shared link with password fails on basic account + account_info = m.get_account_info() + + if account_info["account_type"][".tag"] == "basic": + with pytest.raises(SharedLinkError): + m.create_shared_link(dbx_path, visibility="password", password="secret") + + # test creating a shared link with the same settings as an existing link + m.create_shared_link(dbx_path) + + with pytest.raises(SharedLinkError): + m.create_shared_link(dbx_path) + + # test creating a shared link with an invalid path + with pytest.raises(NotFoundError): + m.create_shared_link("/this_is_not_a_file.txt") + + # test listing shared links for an invalid path + with pytest.raises(NotFoundError): + m.list_shared_links("/this_is_not_a_file.txt") + + # test revoking a non existent link + with pytest.raises(NotFoundError): + m.revoke_shared_link("https://www.dropbox.com/sh/48r2qxq748jfk5x/AAAS-niuW") + + # test revoking a malformed link + with pytest.raises(SharedLinkError): + m.revoke_shared_link("https://www.testlink.de") From c0ab11cfbfe617a7763fdd4ad60f6ca73684f97f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 12:26:33 +0000 Subject: [PATCH 255/374] [cli] tweak sharelink cli output --- src/maestral/cli.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index b38909af3..1b80745b4 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -811,13 +811,7 @@ def sharelink_revoke(url: str, config_name: str) -> None: @sharelink.command( - name="list", - help=""" -List shared links. - -Lists all shared links for a file or folder. If not path is given, lists all links for -the Dropbox. -""", + name="list", help="List shared links for a path or all shared links." ) @click.argument("dropbox_path", required=False, type=DropboxPath()) @existing_config_option @@ -832,7 +826,7 @@ def sharelink_list(dropbox_path: Optional[str], config_name: str) -> None: with MaestralProxy(config_name, fallback=True) as m: links = m.list_shared_links(dropbox_path) - link_table = cli.Table(["URL", "Item", "Visibility", "Expires"]) + link_table = cli.Table(["URL", "Item", "Access", "Expires"]) for link in links: url = cast(str, link["url"]) From b9fd6e5f7feb211e3214c75bc8f5b34816b09f39 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 12:46:02 +0000 Subject: [PATCH 256/374] update changelog --- CHANGELOG.md | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa353d494..5759fb8fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,20 +2,27 @@ #### Added: -* Add a command `maestral diff` to compare different versions of a text file. The +* Added a command `maestral diff` to compare different versions of a text file. The resulting diff is printed to the console. Thanks to @OrangeFran. -* Resurrected the command `maestral revs` to list previous versions or a file. +* Resurrected the command `maestral revs` to list previous versions 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 `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. #### Changed: -* Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. -* Performance has been improved by avoiding scanning of objects matching an - `.mignore` pattern (file watches will still be added however). A resulting behavioral - change is that **maestral will remove existing matching files from Dropbox as well**. - After this change it will be immaterial if an `.mignore` pattern is added before or - after having matching files in Dropbox. +* Avoiding 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 the + 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. From 2491e693f2640135f0c7d1b9b63cde3bbd385b96 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 15:12:48 +0000 Subject: [PATCH 257/374] [cli] import CommunicationError from maestral.daemon --- src/maestral/cli.py | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 1b80745b4..d65a515f3 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -16,7 +16,6 @@ # external imports import click -import Pyro5.errors # type: ignore # local imports from . import __version__ @@ -670,20 +669,21 @@ def gui(config_name: str) -> None: @existing_config_option def pause(config_name: str) -> None: - from .daemon import MaestralProxy + from .daemon import MaestralProxy, CommunicationError try: with MaestralProxy(config_name) as m: m.pause_sync() cli.ok("Syncing paused.") - except Pyro5.errors.CommunicationError: + except CommunicationError: cli.echo("Maestral daemon is not running.") @main.command(section="Core Commands", help="Resume syncing.") @existing_config_option def resume(config_name: str) -> None: - from .daemon import MaestralProxy + + from .daemon import MaestralProxy, CommunicationError try: with MaestralProxy(config_name) as m: @@ -691,7 +691,7 @@ def resume(config_name: str) -> None: m.resume_sync() cli.ok("Syncing resumed.") - except Pyro5.errors.CommunicationError: + except CommunicationError: cli.echo("Maestral daemon is not running.") @@ -706,6 +706,7 @@ def resume(config_name: str) -> None: @config_option @catch_maestral_errors def link(relink: bool, config_name: str) -> None: + from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -860,7 +861,7 @@ def sharelink_list(dropbox_path: Optional[str], config_name: str) -> None: @catch_maestral_errors def status(config_name: str) -> None: - from .daemon import MaestralProxy + from .daemon import MaestralProxy, CommunicationError check_for_updates() @@ -896,7 +897,7 @@ def status(config_name: str) -> None: table.echo() cli.echo("") - except Pyro5.errors.CommunicationError: + except CommunicationError: cli.echo("Maestral daemon is not running.") @@ -915,14 +916,14 @@ def status(config_name: str) -> None: @existing_config_option def file_status(local_path: str, config_name: str) -> None: - from .daemon import MaestralProxy + from .daemon import MaestralProxy, CommunicationError try: with MaestralProxy(config_name) as m: stat = m.get_file_status(local_path) cli.echo(stat) - except Pyro5.errors.CommunicationError: + except CommunicationError: cli.echo("unwatched") @@ -933,7 +934,7 @@ def activity(config_name: str) -> None: import curses from .utils import natural_size - from .daemon import MaestralProxy + from .daemon import MaestralProxy, CommunicationError try: with MaestralProxy(config_name) as m: @@ -1007,7 +1008,7 @@ def curses_loop(screen) -> None: # no type hints for screen provided yet # enter curses event loop curses.wrapper(curses_loop) - except Pyro5.errors.CommunicationError: + except CommunicationError: cli.echo("Maestral daemon is not running.") @@ -1250,6 +1251,7 @@ def excluded(): @excluded.command(name="list", help="List all excluded files and folders.") @existing_config_option def excluded_list(config_name: str) -> None: + from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -1272,6 +1274,7 @@ def excluded_list(config_name: str) -> None: @existing_config_option @catch_maestral_errors def excluded_add(dropbox_path: str, config_name: str) -> None: + from .daemon import MaestralProxy if not dropbox_path.startswith("/"): @@ -1299,7 +1302,8 @@ def excluded_add(dropbox_path: str, config_name: str) -> None: @existing_config_option @catch_maestral_errors def excluded_remove(dropbox_path: str, config_name: str) -> None: - from .daemon import MaestralProxy + + from .daemon import MaestralProxy, CommunicationError if not dropbox_path.startswith("/"): dropbox_path = "/" + dropbox_path @@ -1312,7 +1316,7 @@ def excluded_remove(dropbox_path: str, config_name: str) -> None: m.include_item(dropbox_path) cli.ok(f"Included '{dropbox_path}'. Now downloading...") - except Pyro5.errors.CommunicationError: + except CommunicationError: raise cli.CliException("Daemon must be running to download folders.") @@ -1333,7 +1337,7 @@ def notify(): @existing_config_option def notify_level(level_name: str, config_name: str) -> None: - from . import notify as _notify # prevent conflict with notify command group + from . import notify as _notify from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -1352,12 +1356,13 @@ def notify_level(level_name: str, config_name: str) -> None: @click.argument("minutes", type=click.IntRange(min=0)) @existing_config_option def notify_snooze(minutes: int, config_name: str) -> None: - from .daemon import MaestralProxy + + from .daemon import MaestralProxy, CommunicationError try: with MaestralProxy(config_name) as m: m.notification_snooze = minutes - except Pyro5.errors.CommunicationError: + except CommunicationError: cli.echo("Maestral daemon is not running.") else: if minutes > 0: @@ -1377,6 +1382,7 @@ def notify_snooze(minutes: int, config_name: str) -> None: @click.argument("new_path", required=False, type=click.Path(writable=True)) @existing_config_option def move_dir(new_path: str, config_name: str) -> None: + from .daemon import MaestralProxy new_path = new_path or select_dbx_path_dialog(config_name) From fb4724ee2121785b0f21258ae3a7f0f843f89640 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 15:13:16 +0000 Subject: [PATCH 258/374] [cli] move datetime conversions to separate function --- src/maestral/cli.py | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index d65a515f3..a084782c0 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -11,7 +11,6 @@ import os.path as osp import functools import time -from datetime import datetime from typing import Optional, Dict, List, Tuple, Callable, Union, cast, TYPE_CHECKING # external imports @@ -22,6 +21,7 @@ from .utils import cli if TYPE_CHECKING: + from datetime import datetime from .main import Maestral from .daemon import MaestralProxy @@ -232,6 +232,19 @@ def wrapper(*args, **kwargs): return wrapper +def _datetime_from_iso_str(time_str: str) -> "datetime": + """ + Converts an ISO 8601 time string such as '2015-05-15T15:50:38Z' to a timezone aware + datetime object in the local time zone. + """ + + from datetime import datetime + + # replace Z with +0000, required for Python 3.6 compatibility + time_str = time_str.replace("Z", "+0000") + return datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%S%z").astimezone() + + # ====================================================================================== # Custom parameter types # ====================================================================================== @@ -770,7 +783,7 @@ def sharelink(): def sharelink_create( dropbox_path: str, password: str, - expiry: Optional[datetime], + expiry: Optional["datetime"], config_name: str, ) -> None: @@ -837,10 +850,8 @@ def sharelink_list(dropbox_path: Optional[str], config_name: str) -> None: dt_field: cli.Field if "expires" in link: - # replacing Z with +0000 is required for Python 3.6 - expires = cast(str, link["expires"]).replace("Z", "+0000") - dt = datetime.strptime(expires, "%Y-%m-%dT%H:%M:%S%z").astimezone() - dt_field = cli.DateField(dt) + expires = cast(str, link["expires"]) + dt_field = cli.DateField(_datetime_from_iso_str(expires)) else: dt_field = cli.TextField("-") @@ -1017,6 +1028,7 @@ def curses_loop(screen) -> None: # no type hints for screen provided yet @catch_maestral_errors def history(config_name: str) -> None: + from datetime import datetime from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -1123,10 +1135,8 @@ def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) - dt_field: cli.Field if "client_modified" in entry: - # replacing Z with +0000 is required for Python 3.6 - cm = cast(str, entry["client_modified"]).replace("Z", "+0000") - dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() - dt_field = cli.DateField(dt) + cm = cast(str, entry["client_modified"]) + dt_field = cli.DateField(_datetime_from_iso_str(cm)) else: dt_field = cli.TextField("-") @@ -1154,6 +1164,7 @@ def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) - @main.command(section="Information", help="Show linked Dropbox account information.") @existing_config_option def account_info(config_name: str) -> None: + from .daemon import MaestralProxy with MaestralProxy(config_name, fallback=True) as m: @@ -1457,8 +1468,7 @@ def revs(dropbox_path: str, limit: int, config_name: str) -> None: for entry in entries: rev = cast(str, entry["rev"]) - cm = cast(str, entry["client_modified"]).replace("Z", "+0000") - dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() + dt = _datetime_from_iso_str(cast(str, entry["client_modified"])) table.append([cli.TextField(rev), cli.DateField(dt)]) @@ -1565,9 +1575,8 @@ def color(ind: int, line: str) -> str: entries = m.list_revisions(dropbox_path, limit=limit) for entry in entries: - cm = cast(str, entry["client_modified"]).replace("Z", "+0000") - dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() - field = cli.DateField(dt) + cm = cast(str, entry["client_modified"]) + field = cli.DateField(_datetime_from_iso_str(cm)) entry["desc"] = field.format(40)[0] dbx_path = cast(str, entries[0]["path_display"]) @@ -1648,9 +1657,8 @@ def restore(dropbox_path: str, rev: str, limit: int, config_name: str) -> None: entries = m.list_revisions(dropbox_path, limit=limit) dates = [] for entry in entries: - cm = cast(str, entry["client_modified"]).replace("Z", "+0000") - dt = datetime.strptime(cm, "%Y-%m-%dT%H:%M:%S%z").astimezone() - field = cli.DateField(dt) + cm = cast(str, entry["client_modified"]) + field = cli.DateField(_datetime_from_iso_str(cm)) dates.append(field.format(40)[0]) index = cli.select( From bb73faada2507436c0ee64cd9a76acb55e069b0a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 00:22:07 +0000 Subject: [PATCH 259/374] [cli] removed restart command --- src/maestral/cli.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 3d1f75aa9..b41e6ee5f 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -611,24 +611,6 @@ def stop(config_name: str) -> None: stop_daemon_with_cli_feedback(config_name) -@main.command(section="Core Commands", help="Restart the sync daemon.") -@click.option( - "--foreground", - "-f", - is_flag=True, - default=False, - help="Start the sync daemon in the foreground.", -) -@click.option( - "--verbose", "-v", is_flag=True, default=False, help="Print log messages to stdout." -) -@existing_config_option -@click.pass_context -def restart(ctx, foreground: bool, verbose: bool, config_name: str) -> None: - stop_daemon_with_cli_feedback(config_name) - ctx.forward(start) - - @main.command(section="Core Commands", help="Run the GUI if installed.") @config_option def gui(config_name: str) -> None: From e4e89d5f7b30291da11b32855fc8e8df69372df4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 00:27:29 +0000 Subject: [PATCH 260/374] [cli] renames file_status -> filestatus --- src/maestral/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index b41e6ee5f..648020f87 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -913,7 +913,7 @@ def status(config_name: str) -> None: ) @click.argument("local_path", type=click.Path(exists=True, resolve_path=True)) @existing_config_option -def file_status(local_path: str, config_name: str) -> None: +def filestatus(local_path: str, config_name: str) -> None: from .daemon import MaestralProxy, CommunicationError From 928b8a2d8743accbca4ed3204913c1c56a70baa3 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 12:04:25 +0000 Subject: [PATCH 261/374] [docs] updated docs on sync event handling --- docs/background/sync_logic.rst | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/docs/background/sync_logic.rst b/docs/background/sync_logic.rst index 39769c5aa..20bcb4d40 100644 --- a/docs/background/sync_logic.rst +++ b/docs/background/sync_logic.rst @@ -22,7 +22,7 @@ Maestral processes remote events as follows: 1) :meth:`SyncEngine.wait_for_remote_changes` blocks until remote changes are available. -2) :meth:`SyncEngine.get_remote_changes` lists all remote changes since the last sync. +2) :meth:`SyncEngine.list_remote_changes` lists all remote changes since the last sync. Those events are processed at follows: * Events for entries which are excluded by selective sync and hard-coded file names @@ -49,7 +49,9 @@ Local file events come in eight types: For both files and folders we collect cre moved, modified and deleted events. They are processed as follows: 1) :meth:`SyncEngine.wait_for_local_changes`: Blocks until local changes are - registered by :class:`FSEventHandler` and returns those changes. Events are + registered by :class:`FSEventHandler`. + +2) :meth:`SyncEngine.list_local_changes`: Lists all local file events. Those are processed as follows: * Events ignored by a "mignore" pattern as well as hard-coded file names and @@ -62,8 +64,13 @@ moved, modified and deleted events. They are processed as follows: moved or deleted events for its children. 2) :meth:`SyncEngine.apply_local_changes`: Sorts local changes hierarchically and - applies events in the order of deleted, folders and files. Deletions and creations - will be carried out in parallel with up to 6 threads. + applies events in the order of deleted, folders and files. Deleted, created and + modified events will be applies to the remote Dropbox in parallel with up to 6 + threads. Moves will be carried out synchronously. + +Before processing, we convert all Dropbox metadata and local file events to a unified +format of :class:`maestral.database.SyncEvent` instances which are also used to store +the sync history data in our SQLite database. Detection of sync conflicts *************************** From ff5c52f833459bdbe388d28ac531a6ccf5c22150 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 12:42:22 +0000 Subject: [PATCH 262/374] [daemon] added type hint for *argv --- src/maestral/daemon.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index fc6361f0a..183ef9fc1 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -78,7 +78,7 @@ EXECUTABLE = [sys.executable, "-OO"] -def set_executable(executable: str, *argv) -> None: +def set_executable(executable: str, *argv: str) -> None: """ Sets the path of the Python executable to use when starting the daemon. By default :obj:`sys.executable` is used. Can be used when embedding the daemon. From f1876d6d09ef3a2f759d397d6ccce9f85e4dfe6d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 13:47:26 +0000 Subject: [PATCH 263/374] [docs] reordered TOC --- docs/{ => background}/contributing.rst | 2 +- docs/background/index.rst | 15 ------------- docs/index.rst | 31 ++++++++++++++++++++++---- 3 files changed, 28 insertions(+), 20 deletions(-) rename docs/{ => background}/contributing.rst (66%) delete mode 100644 docs/background/index.rst diff --git a/docs/contributing.rst b/docs/background/contributing.rst similarity index 66% rename from docs/contributing.rst rename to docs/background/contributing.rst index 1d6be9b98..60b6c129b 100644 --- a/docs/contributing.rst +++ b/docs/background/contributing.rst @@ -4,4 +4,4 @@ Contributing Thank you for your interest in contributing! -.. mdinclude:: ../CONTRIBUTING.md +.. mdinclude:: ../../CONTRIBUTING.md diff --git a/docs/background/index.rst b/docs/background/index.rst deleted file mode 100644 index e6b62be56..000000000 --- a/docs/background/index.rst +++ /dev/null @@ -1,15 +0,0 @@ - -Background -========== - -This section introduces some of the design principles and functionality of the different -modules, including the sync functionality and how index and state data is stored locally. - -.. toctree:: - :caption: Contents - :maxdepth: 1 - - sync_logic - logging - config_files - state_files diff --git a/docs/index.rst b/docs/index.rst index df40781dd..1c7820bab 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,12 +8,35 @@ For a user manual and an overview of Maestral's functionality, please refer to the `wiki `_. .. toctree:: - :caption: Contents + :hidden: + :caption: Background :maxdepth: 2 - background/index - API Reference - contributing + background/sync_logic + background/logging + background/config_files + background/state_files + background/contributing + +.. toctree:: + :hidden: + :caption: Reference + :maxdepth: 2 + + autoapi/maestral/cli/index + autoapi/maestral/client/index + autoapi/maestral/config/index + autoapi/maestral/constants/index + autoapi/maestral/daemon/index + autoapi/maestral/database/index + autoapi/maestral/errors/index + autoapi/maestral/fsevents/index + autoapi/maestral/logging/index + autoapi/maestral/main/index + autoapi/maestral/notify/index + autoapi/maestral/oauth/index + autoapi/maestral/sync/index + autoapi/maestral/utils/index Getting started *************** From 92b0fb4a58ad87313da0b32ff123c79c9462eb29 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 17:54:40 +0000 Subject: [PATCH 264/374] [cli] move account management and info to auth command group --- src/maestral/cli.py | 60 +++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 27 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 648020f87..afaf48fc1 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -149,7 +149,7 @@ def link_dialog(m: Union["MaestralProxy", "Maestral"]) -> None: elif res == 1: cli.warn("Invalid token, please try again") elif res == 2: - cli.warn(" Could not connect to Dropbox, please try again") + cli.warn("Could not connect to Dropbox, please try again") def check_for_updates() -> None: @@ -690,7 +690,12 @@ def resume(config_name: str) -> None: cli.echo("Maestral daemon is not running.") -@main.command(section="Core Commands", help="Link with a Dropbox account.") +@main.group(section="Core Commands", help="Link, unlink and view the Dropbox account.") +def auth(): + pass + + +@auth.command(name="link", help="Link a new Dropbox account.") @click.option( "-r", "relink", @@ -700,7 +705,7 @@ def resume(config_name: str) -> None: ) @config_option @catch_maestral_errors -def link(relink: bool, config_name: str) -> None: +def auth_link(relink: bool, config_name: str) -> None: from .daemon import MaestralProxy @@ -710,13 +715,13 @@ def link(relink: bool, config_name: str) -> None: link_dialog(m) else: cli.echo( - "Maestral is already linked. Use the option " - "'-r' to relink to the same account." + "Maestral is already linked. Use '-r' to relink to the same " + "account or specify a new config name with '-c'." ) -@main.command( - section="Core Commands", +@auth.command( + name="unlink", help=""" Unlink your Dropbox account. @@ -726,7 +731,7 @@ def link(relink: bool, config_name: str) -> None: @click.option("--yes", "-Y", is_flag=True, default=False) @existing_config_option @catch_maestral_errors -def unlink(yes: bool, config_name: str) -> None: +def auth_unlink(yes: bool, config_name: str) -> None: if not yes: yes = cli.confirm("Are you sure you want unlink your account?", default=False) @@ -741,6 +746,26 @@ def unlink(yes: bool, config_name: str) -> None: cli.ok("Unlinked Maestral.") +@auth.command(name="status", help="View authentication status.") +@existing_config_option +def auth_status(config_name: str) -> None: + + from .config import MaestralConfig, MaestralState + + conf = MaestralConfig(config_name) + state = MaestralState(config_name) + + email = state.get("account", "email") + account_type = state.get("account", "type").capitalize() + dbid = conf.get("account", "account_id") + + cli.echo("") + cli.echo(f"Email: {email}") + cli.echo(f"Account-type: {account_type}") + cli.echo(f"Dropbox-ID: {dbid}") + cli.echo("") + + @main.group(section="Core Commands", help="Create and manage shared links.") def sharelink(): pass @@ -1149,25 +1174,6 @@ def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) - grid.echo() -@main.command(section="Information", help="Show linked Dropbox account information.") -@existing_config_option -def account_info(config_name: str) -> None: - - from .daemon import MaestralProxy - - with MaestralProxy(config_name, fallback=True) as m: - - email = m.get_state("account", "email") - account_type = m.get_state("account", "type").capitalize() - dbid = m.get_conf("account", "account_id") - - cli.echo("") - cli.echo(f"Email: {email}") - cli.echo(f"Account-type: {account_type}") - cli.echo(f"Dropbox-ID: {dbid}") - cli.echo("") - - @main.command(section="Information", help="List all configured Dropbox accounts.") def configs() -> None: From 7baa7906292dbc4a569f4c7e4014a7af2ff03384 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 2 Feb 2021 18:46:10 +0000 Subject: [PATCH 265/374] updated changelog --- CHANGELOG.md | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5759fb8fe..770e849d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ #### Added: * Added a command `maestral diff` to compare different versions of a text file. The - resulting diff is printed to the console. Thanks to @OrangeFran. + resulting diff is printed to the console. Credit goes to @OrangeFran. * Resurrected the command `maestral revs` to list previous versions of a file. * Added a command group `maestral sharelink` to create and manage shared links. Subcommands are: @@ -12,7 +12,6 @@ * `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 `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. #### Changed: @@ -25,8 +24,11 @@ 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. +* Moved linking and unlinking to a new command group `maestral auth` with subcommands + `link`, `unlink` and `status`. +* Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. -#### Fixes: +#### Fixed: * Fixes an issue with CLI on Python 3.6 where commands that print datetimes to the console would raise an exception. @@ -42,6 +44,8 @@ * Removed automatic error reporting via bugsnag. Please file issues directly on GitHub instead. This allows following up on errors and investigating their cause while removing third party access to potentially private information. +* Removed the `maestral restart` command. Use `stop` and `start` instead. +* Removed the `maestral account-info` command. Use `maestral auth status` instead. #### Dependencies: @@ -51,7 +55,7 @@ ## v1.3.1 -#### Fixes: +#### Fixed: * Fixes an incorrect entry point for the Qt GUI. @@ -93,7 +97,7 @@ series of bug fixes for GUI and daemon. * The `Maestral.excluded_items` property is no longer read-only. * Some refactoring of the `cli` module to prepare for shell completion support. -#### Fixes: +#### 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. @@ -145,7 +149,7 @@ series of bug fixes for GUI and daemon. 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. -#### Changes: +#### Changed: - `maestral file-status` now accepts relative paths. - Runs the daemon in a Python interpreter with -OO flags. This strips docstrings and saves @@ -163,7 +167,7 @@ usage has been improved when syncing a Dropbox folder with a large number of ite - Switch from PyInstaller to [briefcase](https://github.com/beeware/briefcase) for packaging on macOS. -#### Fixes: +#### Fixed: - Fixes an issue which would prevent the daemon from starting on macOS when running with Python 3.6. @@ -206,7 +210,7 @@ full compatibility from macOS 10.13 High Sierra to macOS 11.0 Big Sur. - Improves log messages when the connection to Dropbox is lost. - Performance improvements to `maestral activity` in case of very large sync queues. -#### Fixes: +#### 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 From db8d56a563f9ee4ce87a7d4560bc1a8422fdf821 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:24:53 +0000 Subject: [PATCH 266/374] [tests] adapt tests --- tests/linked/test_cli.py | 4 ++-- tests/offline/test_cli.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/linked/test_cli.py b/tests/linked/test_cli.py index 6c83df5d9..3b647f150 100644 --- a/tests/linked/test_cli.py +++ b/tests/linked/test_cli.py @@ -53,14 +53,14 @@ def test_status(proxy): assert "Stopped" in result.output -def test_file_status(proxy): +def test_filestatus(proxy): runner = CliRunner() proxy.start_sync() wait_for_idle(proxy) local_path = proxy.to_local_path("/sync_tests") - result = runner.invoke(main, ["file-status", local_path, "-c", proxy.config_name]) + result = runner.invoke(main, ["filestatus", local_path, "-c", proxy.config_name]) assert result.exit_code == 0 assert result.output == "up to date\n" diff --git a/tests/offline/test_cli.py b/tests/offline/test_cli.py index 21eb499de..02609c6cc 100644 --- a/tests/offline/test_cli.py +++ b/tests/offline/test_cli.py @@ -53,14 +53,14 @@ def test_stop(config_name): assert result.exit_code == 0 -def test_file_status(m): +def test_filestatus(m): runner = CliRunner() - result = runner.invoke(main, ["file-status", "/usr", "-c", m.config_name]) + result = runner.invoke(main, ["filestatus", "/usr", "-c", m.config_name]) assert result.exit_code == 0 assert result.output == "unwatched\n" - result = runner.invoke(main, ["file-status", "/invalid-dir", "-c", m.config_name]) + result = runner.invoke(main, ["filestatus", "/invalid-dir", "-c", m.config_name]) # the exception will be already raised by click's argument check assert result.exit_code == 2 From 2e77a6788d171b92d5785233382f470da081950b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:26:25 +0000 Subject: [PATCH 267/374] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 770e849d8..309d1165b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ * Indexing will no longer skip excluded folders. This is necessary for the above change. * Moved linking and unlinking to a new command group `maestral auth` with subcommands `link`, `unlink` and `status`. +* Renamed command `file-status` to `filestatus`. * Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. #### Fixed: From c09cbef27b851e9dc445b60ba587e2200203d648 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:13:12 +0000 Subject: [PATCH 268/374] [constants] added CONNECTED and CONNECTING --- src/maestral/constants.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maestral/constants.py b/src/maestral/constants.py index 89d185761..bf2adc370 100644 --- a/src/maestral/constants.py +++ b/src/maestral/constants.py @@ -62,7 +62,9 @@ SYNCING = "Syncing..." PAUSED = "Syncing paused" STOPPED = "Syncing stopped" -DISCONNECTED = "Connecting..." +CONNECTED = "Connected" +DISCONNECTED = "Connection lost" +CONNECTING = "Connecting..." SYNC_ERROR = "Sync error" ERROR = "Fatal error" From 2acf9987d554c8fd4efa92e222b2cdf0d2fd0a82 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:13:41 +0000 Subject: [PATCH 269/374] [sync] remove pause / resume methods always start and stop threads --- src/maestral/sync.py | 319 +++++++++++++++++++------------------------ 1 file changed, 143 insertions(+), 176 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 16dc4b04e..cf7f65598 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -76,9 +76,10 @@ from .constants import ( IDLE, SYNCING, - PAUSED, STOPPED, + CONNECTED, DISCONNECTED, + CONNECTING, EXCLUDED_FILE_NAMES, EXCLUDED_DIR_NAMES, MIGNORE_FILE, @@ -197,8 +198,6 @@ class FSEventHandler(FileSystemEventHandler): ``dir_event_types``. This is for forward compatibility as additional event types may be added to watchdog in the future. - :param syncing: Set when syncing is running. - :param startup: Set when startup is running. :param file_event_types: Types of file events to handle. This acts as a whitelist. By default, only FileClosedEvents are ignored. :param dir_event_types: Types of directory events to handle. This acts as a @@ -213,8 +212,6 @@ class FSEventHandler(FileSystemEventHandler): def __init__( self, - syncing: Event, - startup: Event, file_event_types: Tuple[str, ...] = ( EVENT_TYPE_CREATED, EVENT_TYPE_DELETED, @@ -228,9 +225,7 @@ def __init__( ), ) -> None: - self.syncing = syncing - self.startup = startup - + self._enabled = False self.file_event_types = file_event_types self.dir_event_types = dir_event_types @@ -238,6 +233,18 @@ def __init__( self.ignore_timeout = 2.0 self.local_file_event_queue = Queue() + def enable(self) -> None: + self._enabled = True + + def disable(self) -> None: + self._enabled = False + + while True: + try: + self.local_file_event_queue.get_nowait() + except Empty: + break + @contextmanager def ignore( self, *events: FileSystemEvent, recursive: bool = True @@ -337,8 +344,8 @@ def on_any_event(self, event: FileSystemEvent) -> None: :param event: Watchdog file event. """ - # ignore events if we are not during startup or sync - if not (self.syncing.is_set() or self.startup.is_set()): + # ignore events if asked to do so + if not self._enabled: return # handle only whitelisted dir event types @@ -3397,9 +3404,8 @@ def _dir_snapshot_with_mignore(self, path: str) -> DirectorySnapshot: @contextmanager def handle_sync_thread_errors( - syncing: Event, running: Event, - connected: Event, + autostart: Event, notifier: notify.MaestralDesktopNotifier, ) -> Iterator[None]: @@ -3408,13 +3414,14 @@ def handle_sync_thread_errors( except DropboxServerError: logger.info("Dropbox server error", exc_info=True) except ConnectionError: - syncing.clear() - connected.clear() - logger.debug("Connection error", exc_info=True) logger.info(DISCONNECTED) + logger.debug("Connection error", exc_info=True) + running.clear() + autostart.set() + logger.info(CONNECTING) except Exception as err: running.clear() - syncing.clear() + autostart.clear() title = getattr(err, "title", "Unexpected error") message = getattr(err, "message", "Please restart to continue syncing") logger.error(title, exc_info=True) @@ -3422,27 +3429,30 @@ def handle_sync_thread_errors( def download_worker( - sync: SyncEngine, syncing: Event, running: Event, connected: Event + sync: SyncEngine, + running: Event, + startup_completed: Event, + autostart: Event, ) -> None: """ Worker to sync changes of remote Dropbox with local folder. :param sync: Instance of :class:`SyncEngine`. - :param syncing: Event that indicates if workers are running or paused. :param running: Event to shutdown local file event handler and worker threads. - :param connected: Event that indicates if we can connect to Dropbox. + :param startup_completed: Set when startup sync is completed. + :param autostart: Set when syncing should automatically resume on connection. """ - while running.is_set(): + startup_completed.wait() - syncing.wait() + while running.is_set(): - with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(running, autostart, sync.notifier): has_changes = sync.wait_for_remote_changes(sync.remote_cursor) - if not (running.is_set() and syncing.is_set()): - continue + if not running.is_set(): + return sync.ensure_dropbox_folder_present() @@ -3456,68 +3466,75 @@ def download_worker( def download_worker_added_item( sync: SyncEngine, - syncing: Event, running: Event, - connected: Event, + startup_completed: Event, + autostart: Event, added_item_queue: "Queue[str]", ) -> None: """ Worker to download items which have been newly included in sync. :param sync: Instance of :class:`SyncEngine`. - :param syncing: Event that indicates if workers are running or paused. :param running: Event to shutdown local file event handler and worker threads. - :param connected: Event that indicates if we can connect to Dropbox. + :param startup_completed: Set when startup sync is completed. + :param autostart: Set when syncing should automatically resume on connection. :param added_item_queue: Queue with newly added items to download. Entries are Dropbox paths. """ - while running.is_set(): + startup_completed.wait() - syncing.wait() + while running.is_set(): - with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(running, autostart, sync.notifier): - dbx_path = added_item_queue.get() - sync.pending_downloads.add(dbx_path.lower()) # protect against crashes + try: + dbx_path = added_item_queue.get(timeout=40) + except Empty: + pass + else: + # protect against crashes + sync.pending_downloads.add(dbx_path.lower()) - with sync.sync_lock: + if not running.is_set(): + return - if not (running.is_set() and syncing.is_set()): - # try again later - continue + with sync.sync_lock: - sync.get_remote_item(dbx_path) - sync.pending_downloads.discard(dbx_path) + sync.get_remote_item(dbx_path) + sync.pending_downloads.discard(dbx_path) - logger.info(IDLE) + logger.info(IDLE) - # free some memory - sync.free_memory() + # free some memory + sync.free_memory() def upload_worker( - sync: SyncEngine, syncing: Event, running: Event, connected: Event + sync: SyncEngine, + running: Event, + startup_completed: Event, + autostart: Event, ) -> None: """ Worker to sync local changes to remote Dropbox. :param sync: Instance of :class:`SyncEngine`. - :param syncing: Event that indicates if workers are running or paused. :param running: Event to shutdown local file event handler and worker threads. - :param connected: Event that indicates if we can connect to Dropbox. + :param startup_completed: Set when startup sync is completed. + :param autostart: Set when syncing should automatically resume on connection. """ - while running.is_set(): + startup_completed.wait() - syncing.wait() + while running.is_set(): - with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + with handle_sync_thread_errors(running, autostart, sync.notifier): has_changes = sync.wait_for_local_changes() - if not (running.is_set() and syncing.is_set()): - continue + if not running.is_set(): + return sync.ensure_dropbox_folder_present() @@ -3529,67 +3546,53 @@ def upload_worker( def startup_worker( sync: SyncEngine, - syncing: Event, running: Event, - connected: Event, - startup: Event, - paused_by_user: Event, + startup_completed: Event, + autostart: Event, ) -> None: """ Worker to sync local changes to remote Dropbox. :param sync: Instance of :class:`SyncEngine`. - :param syncing: Event that indicates if workers are running or paused. :param running: Event to shutdown local file event handler and worker threads. - :param connected: Event that indicates if we can connect to Dropbox. - :param startup: Set when we should run startup routines. - :param paused_by_user: Set when syncing has been paused by the user. + :param startup_completed: Set when startup sync is completed. + :param autostart: Set when syncing should automatically resume on connection. """ - while running.is_set(): - - startup.wait() + with handle_sync_thread_errors(running, autostart, sync.notifier): - with handle_sync_thread_errors(syncing, running, connected, sync.notifier): + # Retry failed downloads. + if len(sync.download_errors) > 0: + logger.info("Retrying failed syncs...") - # Retry failed downloads. - if len(sync.download_errors) > 0: - logger.info("Retrying failed syncs...") - - for dbx_path in list(sync.download_errors): - logger.info(f"Syncing ↓ {dbx_path}") - sync.get_remote_item(dbx_path) + for dbx_path in list(sync.download_errors): + logger.info(f"Syncing ↓ {dbx_path}") + sync.get_remote_item(dbx_path) - # Resume interrupted downloads. - if len(sync.pending_downloads) > 0: - logger.info("Resuming interrupted syncs...") + # Resume interrupted downloads. + if len(sync.pending_downloads) > 0: + logger.info("Resuming interrupted syncs...") - for dbx_path in list(sync.pending_downloads): - logger.info(f"Syncing ↓ {dbx_path}") - sync.get_remote_item(dbx_path) - sync.pending_downloads.discard(dbx_path) + for dbx_path in list(sync.pending_downloads): + logger.info(f"Syncing ↓ {dbx_path}") + sync.get_remote_item(dbx_path) + sync.pending_downloads.discard(dbx_path) - # retry failed / interrupted uploads by scheduling additional events - # if len(sync.upload_errors) > 0: - # logger.debug('Retrying failed uploads...') - # - # for dbx_path in list(sync.upload_errors): - # sync.rescan(sync.to_local_path(dbx_path)) + if not running.is_set(): + startup_completed.set() + return - sync.download_sync_cycle() - sync.upload_local_changes_while_inactive() + sync.download_sync_cycle() - if not running.is_set(): - continue + if not running.is_set(): + startup_completed.set() + return - if not running.is_set(): - continue + sync.upload_local_changes_while_inactive() - if not paused_by_user.is_set(): - syncing.set() + logger.info(IDLE) - startup.clear() - logger.info(IDLE) + startup_completed.set() # ====================================================================================== @@ -3610,26 +3613,24 @@ def __init__(self, client: DropboxClient): self.client = client self.config_name = self.client.config_name - self._conf = MaestralConfig(self.config_name) - self.startup = Event() - self.connected = Event() - self.syncing = Event() - self.running = Event() - self.paused_by_user = Event() - self.paused_by_user.set() + self._lock = RLock() - self.added_item_queue = Queue() # entries are dbx_paths + self.running = Event() + self.startup_completed = Event() + self.autostart = Event() - self._lock = RLock() + self.added_item_queue = Queue() - self.fs_event_handler = FSEventHandler(self.syncing, self.startup) + self.fs_event_handler = FSEventHandler() self.sync = SyncEngine(self.client, self.fs_event_handler) self._startup_time = -1.0 self.connection_check_interval = 10 + self.connected = False + self._connection_helper_running = True self.connection_helper = Thread( target=self.connection_monitor, name="maestral-connection-helper", @@ -3686,11 +3687,12 @@ def idle_time(self) -> float: def start(self) -> None: """Creates observer threads and starts syncing.""" - if self.running.is_set() or self.startup.is_set(): - # do nothing if already started + if self.running.is_set(): return - self.running = Event() # create new event to let old threads shut down + # create a new set of events to let old threads die down + self.running = Event() + self.startup_completed = Event() self.local_observer_thread = Observer(timeout=40) self.local_observer_thread.setName("maestral-fsobserver") @@ -3705,11 +3707,9 @@ def start(self) -> None: daemon=True, args=( self.sync, - self.syncing, self.running, - self.connected, - self.startup, - self.paused_by_user, + self.startup_completed, + self.autostart, ), name="maestral-sync-startup", ) @@ -3719,9 +3719,9 @@ def start(self) -> None: daemon=True, args=( self.sync, - self.syncing, self.running, - self.connected, + self.startup_completed, + self.autostart, ), name="maestral-download", ) @@ -3731,9 +3731,9 @@ def start(self) -> None: daemon=True, args=( self.sync, - self.syncing, self.running, - self.connected, + self.startup_completed, + self.autostart, self.added_item_queue, ), name="maestral-folder-download", @@ -3744,9 +3744,9 @@ def start(self) -> None: daemon=True, args=( self.sync, - self.syncing, self.running, - self.connected, + self.startup_completed, + self.autostart, ), name="maestral-upload", ) @@ -3761,40 +3761,16 @@ def start(self) -> None: self.sync.notifier.notify(title, message, level=notify.ERROR) self.running.set() - self.syncing.clear() - self.connected.set() - self.startup.set() + self.autostart.set() + self.fs_event_handler.enable() self.startup_thread.start() self.upload_thread.start() self.download_thread.start() self.download_thread_added_folder.start() - self.paused_by_user.clear() - self._startup_time = time.time() - @_with_lock - def pause(self) -> None: - """Pauses syncing.""" - - self.paused_by_user.set() - self.syncing.clear() - - self.sync.cancel_sync() - - logger.info(PAUSED) - - @_with_lock - def resume(self) -> None: - """Checks for changes while idle and starts syncing.""" - - if not self.paused_by_user.is_set(): - return - - self.startup.set() - self.paused_by_user.clear() - @_with_lock def stop(self) -> None: """Stops syncing and destroys worker threads.""" @@ -3804,16 +3780,14 @@ def stop(self) -> None: logger.info("Shutting down threads...") + self.fs_event_handler.disable() self.running.clear() - self.syncing.clear() - self.paused_by_user.clear() - self.startup.clear() + self.startup_completed.clear() + self.autostart.clear() self.sync.cancel_sync() self.local_observer_thread.stop() - # self.local_observer_thread.join() - # self.upload_thread.join() logger.info(STOPPED) @@ -3824,39 +3798,25 @@ def connection_monitor(self) -> None: the user. """ - while True: - - if check_connection("www.dropbox.com"): - self.on_connect() - else: - self.on_disconnect() - - time.sleep(self.connection_check_interval) + while self._connection_helper_running: - @_with_lock - def on_connect(self) -> None: - """Callback to run when we have lost the connection to Dropbox""" - - if self.running.is_set(): - if not self.connected.is_set() and not self.paused_by_user.is_set(): - self.startup.set() - self.connected.set() - - @_with_lock - def on_disconnect(self) -> None: - """Callback to run when we have reestablished the connection to Dropbox""" + self.connected = check_connection("www.dropbox.com") - if self.running.is_set(): - if self.connected.is_set(): + if self.connected and not self.running.is_set() and self.autostart.is_set(): + logger.info(CONNECTED) + self.start() + elif not self.connected and self.running.is_set(): logger.info(DISCONNECTED) - self.syncing.clear() - self.connected.clear() - self.startup.clear() + self.stop() + self.autostart.set() + logger.info(CONNECTING) + + time.sleep(self.connection_check_interval) def reset_sync_state(self) -> None: """Resets all saved sync state. Settings are not affected.""" - if self.syncing.is_set() or self.startup.is_set() or self.sync.busy(): + if self.running.is_set() or self.sync.busy(): raise RuntimeError("Cannot reset sync state while syncing.") self.sync.remote_cursor = "" @@ -3878,15 +3838,22 @@ def rebuild_index(self) -> None: logger.info("Rebuilding index...") - self.pause() + was_running = self.running.is_set() + + self.stop() self.sync.remote_cursor = "" self.sync.clear_index() - if not self.running.is_set(): + if was_running: self.start() - else: - self.resume() + + def __del__(self): + try: + self.stop() + self._connection_helper_running = False + except Exception: + pass # ====================================================================================== From 0652dfe2757fa9d91c287be3d655c19fa10db2ba Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:13:58 +0000 Subject: [PATCH 270/374] [main] adapt to new monitor API --- src/maestral/main.py | 42 ++++++------------------------------------ 1 file changed, 6 insertions(+), 36 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 8a50f73fc..0136fe5f6 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -497,21 +497,11 @@ def pending_first_download(self) -> bool: """Indicates if the initial download has already occurred (read only).""" return self.sync.local_cursor == 0 or self.sync.remote_cursor == "" - @property - def syncing(self) -> bool: - """Indicates if Maestral is syncing (read only). It will be ``True`` if syncing - is not paused by the user *and* Maestral is connected to the internet.""" - return ( - self.monitor.syncing.is_set() - or self.monitor.startup.is_set() - or self.sync.busy() - ) - @property def paused(self) -> bool: """Indicates if syncing is paused by the user (read only). This is set by calling :meth:`pause`.""" - return self.monitor.paused_by_user.is_set() and not self.sync.busy() + return not self.monitor.autostart.is_set() and not self.sync.busy() @property def running(self) -> bool: @@ -527,7 +517,7 @@ def connected(self) -> bool: if self.pending_link: return False else: - return self.monitor.connected.is_set() + return self.monitor.connected @property def status(self) -> str: @@ -600,7 +590,7 @@ def get_file_status(self, local_path: str) -> str: 'up to date', 'error', or 'unwatched' (for files outside of the Dropbox directory). This will always be 'unwatched' if syncing is paused. """ - if not self.syncing: + if not self.running: return FileStatus.Unwatched.value local_path = osp.realpath(local_path) @@ -981,26 +971,6 @@ def start_sync(self) -> None: if not self.running: self.monitor.start() - def resume_sync(self) -> None: - """ - Resumes syncing if paused. - - :raises NotLinkedError: if no Dropbox account is linked. - :raises NoDropboxDirError: if local Dropbox folder is not set up. - """ - - self._check_linked() - self._check_dropbox_dir() - - self.monitor.resume() - - def pause_sync(self) -> None: - """ - Pauses the syncing if running. - """ - if not self.paused: - self.monitor.pause() - def stop_sync(self) -> None: """ Stops all syncing threads if running. Call :meth:`start_sync` to restart @@ -1281,8 +1251,8 @@ def create_dropbox_directory(self, path: str) -> None: # pause syncing resume = False - if self.syncing: - self.pause_sync() + if self.running: + self.stop_sync() resume = True # housekeeping @@ -1297,7 +1267,7 @@ def create_dropbox_directory(self, path: str) -> None: # resume syncing if resume: - self.resume_sync() + self.start_sync() def create_shared_link( self, From eac1c43043e6cfa6440d4bae4f995a34d28d1d1d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:14:20 +0000 Subject: [PATCH 271/374] [cli] adapt to new main API without pause / resume --- src/maestral/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index afaf48fc1..915da8df5 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -668,7 +668,7 @@ def pause(config_name: str) -> None: try: with MaestralProxy(config_name) as m: - m.pause_sync() + m.stop_sync() cli.ok("Syncing paused.") except CommunicationError: cli.echo("Maestral daemon is not running.") @@ -683,7 +683,7 @@ def resume(config_name: str) -> None: try: with MaestralProxy(config_name) as m: if not check_for_fatal_errors(m): - m.resume_sync() + m.start_sync() cli.ok("Syncing resumed.") except CommunicationError: @@ -889,7 +889,7 @@ def status(config_name: str) -> None: email = m.get_state("account", "email") account_type = m.get_state("account", "type").capitalize() - status_info = m.status if m.running else "Stopped" + status_info = m.status if m.running else "Paused" usage = m.get_state("account", "usage") n_errors = len(m.sync_errors) From 574733ae169e59f8dcad27499ec2c5ee341f59bc Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:14:33 +0000 Subject: [PATCH 272/374] [daemon] adapt to new main API without pause / resume --- src/maestral/daemon.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index 183ef9fc1..ca3ef5a1d 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -506,8 +506,6 @@ async def periodic_watchdog() -> None: ExposedMaestral.start_sync = oneway(ExposedMaestral.start_sync) ExposedMaestral.stop_sync = oneway(ExposedMaestral.stop_sync) - ExposedMaestral.pause_sync = oneway(ExposedMaestral.pause_sync) - ExposedMaestral.resume_sync = oneway(ExposedMaestral.resume_sync) ExposedMaestral.shutdown_daemon = oneway(ExposedMaestral.shutdown_daemon) maestral_daemon = ExposedMaestral(config_name, log_to_stdout=log_to_stdout) From db116478ae92246306f3a6a80803db98a573e9ce Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:14:45 +0000 Subject: [PATCH 273/374] [constants] removed PAUSED --- src/maestral/constants.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/constants.py b/src/maestral/constants.py index bf2adc370..26900053c 100644 --- a/src/maestral/constants.py +++ b/src/maestral/constants.py @@ -60,7 +60,6 @@ # state messages IDLE = "Up to date" SYNCING = "Syncing..." -PAUSED = "Syncing paused" STOPPED = "Syncing stopped" CONNECTED = "Connected" DISCONNECTED = "Connection lost" From 151bee5ded17b53d47fd27276c3d1563171755c8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 12:24:21 +0000 Subject: [PATCH 274/374] [tests] adapt tests --- tests/linked/test_cli.py | 6 ++-- tests/linked/test_main.py | 13 ++++---- tests/linked/test_sync.py | 62 +++++++++++++++++++-------------------- tests/offline/conftest.py | 8 ++--- 4 files changed, 43 insertions(+), 46 deletions(-) diff --git a/tests/linked/test_cli.py b/tests/linked/test_cli.py index 3b647f150..0a01edcf9 100644 --- a/tests/linked/test_cli.py +++ b/tests/linked/test_cli.py @@ -6,7 +6,7 @@ from click.testing import CliRunner from maestral.cli import main -from maestral.constants import IDLE, PAUSED, STOPPED, ERROR +from maestral.constants import IDLE, STOPPED, ERROR from maestral.daemon import MaestralProxy @@ -18,7 +18,7 @@ def wait_for_idle(m: MaestralProxy, minimum: int = 2): while True: current_status = m.status - if current_status in (IDLE, PAUSED, STOPPED, ERROR, ""): + if current_status in (IDLE, STOPPED, ERROR, ""): m.status_change_longpoll(timeout=minimum) if m.status == current_status: # status did not change, we are done @@ -50,7 +50,7 @@ def test_status(proxy): result = runner.invoke(main, ["status", "-c", proxy.config_name]) assert result.exit_code == 0 - assert "Stopped" in result.output + assert "Paused" in result.output def test_filestatus(proxy): diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index 090ddce6c..bd55cecac 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -30,7 +30,6 @@ def test_status_properties(m): assert m.status == IDLE assert m.running assert m.connected - assert m.syncing assert not m.paused assert not m.sync_errors assert not m.fatal_errors @@ -51,16 +50,16 @@ def test_file_status(m): # test unwatched non-existent file_status = m.get_file_status("/this is not a folder") - assert file_status == FileStatus.Unwatched.value, file_status + assert file_status == FileStatus.Unwatched.value # test unwatched when paused - m.pause_sync() + m.stop_sync() wait_for_idle(m) file_status = m.get_file_status(m.test_folder_local) assert file_status == FileStatus.Unwatched.value - m.resume_sync() + m.start_sync() wait_for_idle(m) # test error status @@ -83,7 +82,7 @@ def test_move_dropbox_folder(m): wait_for_idle(m) # assert that sync was resumed after moving folder - assert m.syncing + assert m.running def test_move_dropbox_folder_to_itself(m): @@ -91,7 +90,7 @@ def test_move_dropbox_folder_to_itself(m): m.move_dropbox_directory(m.dropbox_path) # assert that sync is still running - assert m.syncing + assert m.running def test_move_dropbox_folder_to_existing(m): @@ -106,7 +105,7 @@ def test_move_dropbox_folder_to_existing(m): m.move_dropbox_directory(new_dir) # assert that sync is still running - assert m.syncing + assert m.running finally: # cleanup diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index c7b0e8a8d..9ef7a19bd 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -85,7 +85,7 @@ def test_file_conflict(m): shutil.copy(resources + "/file.txt", m.test_folder_local) wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # modify file.txt locally @@ -100,7 +100,7 @@ def test_file_conflict(m): ) # resume syncing and check for conflicting copy - m.resume_sync() + m.start_sync() wait_for_idle(m) @@ -122,7 +122,7 @@ def test_parallel_deletion_when_paused(m): wait_for_idle(m) assert_synced(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # delete local file @@ -131,7 +131,7 @@ def test_parallel_deletion_when_paused(m): # delete remote file m.client.remove("/sync_tests/file.txt") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -144,7 +144,7 @@ def test_parallel_deletion_when_paused(m): def test_local_and_remote_creation_with_equal_content(m): """Tests parallel and equal remote and local changes of an item.""" - m.pause_sync() + m.stop_sync() wait_for_idle(m) # create local file @@ -152,7 +152,7 @@ def test_local_and_remote_creation_with_equal_content(m): # create remote file with equal content m.client.upload(resources + "/file.txt", "/sync_tests/file.txt") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -166,7 +166,7 @@ def test_local_and_remote_creation_with_equal_content(m): def test_local_and_remote_creation_with_different_content(m): """Tests parallel and different remote and local changes of an item.""" - m.pause_sync() + m.stop_sync() wait_for_idle(m) # create local file @@ -174,7 +174,7 @@ def test_local_and_remote_creation_with_different_content(m): # create remote file with different content m.client.upload(resources + "/file1.txt", "/sync_tests/file.txt") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -310,14 +310,14 @@ def test_remote_file_replaced_by_folder(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace remote file with folder m.client.remove("/sync_tests/file.txt") m.client.make_dir("/sync_tests/file.txt") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -337,7 +337,7 @@ def test_remote_file_replaced_by_folder_and_unsynced_local_changes(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace remote file with folder @@ -348,7 +348,7 @@ def test_remote_file_replaced_by_folder_and_unsynced_local_changes(m): with open(m.test_folder_local + "/file.txt", "a") as f: f.write(" modified") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -366,14 +366,14 @@ def test_remote_folder_replaced_by_file(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace remote folder with file m.client.remove("/sync_tests/folder") m.client.upload(resources + "/file.txt", "/sync_tests/folder") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -393,7 +393,7 @@ def test_remote_folder_replaced_by_file_and_unsynced_local_changes(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace remote folder with file @@ -403,7 +403,7 @@ def test_remote_folder_replaced_by_file_and_unsynced_local_changes(m): # create local changes os.mkdir(m.test_folder_local + "/folder/subfolder") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -421,13 +421,13 @@ def test_local_folder_replaced_by_file(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.pause_sync() + m.stop_sync() # replace local folder with file delete(m.test_folder_local + "/folder") shutil.copy(resources + "/file.txt", m.test_folder_local + "/folder") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -449,7 +449,7 @@ def test_local_folder_replaced_by_file_and_unsynced_remote_changes(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace local folder with file @@ -459,7 +459,7 @@ def test_local_folder_replaced_by_file_and_unsynced_remote_changes(m): # create remote changes m.client.upload(resources + "/file1.txt", "/sync_tests/folder/file.txt") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -476,14 +476,14 @@ def test_local_file_replaced_by_folder(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace local file with folder os.unlink(m.test_folder_local + "/file.txt") os.mkdir(m.test_folder_local + "/file.txt") - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -506,7 +506,7 @@ def test_local_file_replaced_by_folder_and_unsynced_remote_changes(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.pause_sync() + m.stop_sync() wait_for_idle(m) # replace local file with folder @@ -520,7 +520,7 @@ def test_local_file_replaced_by_folder_and_unsynced_remote_changes(m): mode=WriteMode.overwrite, ) - m.resume_sync() + m.start_sync() wait_for_idle(m) assert_synced(m) @@ -752,8 +752,8 @@ def test_download_sync_issues(m): # 2) Check that the sync is retried after pause / resume - m.pause_sync() - m.resume_sync() + m.stop_sync() + m.start_sync() wait_for_idle(m) @@ -878,8 +878,8 @@ def test_unknown_path_encoding(m, capsys): # This requires that our logic to save failed paths in our state file and retry the # sync on startup can handle strings with surrogate escapes. - m.pause_sync() - m.resume_sync() + m.stop_sync() + m.start_sync() wait_for_idle(m) @@ -911,7 +911,7 @@ def test_indexing_performance(m): # generate tree with 5 entries shutil.copytree(resources + "/test_folder", m.test_folder_local + "/test_folder") wait_for_idle(m) - m.pause_sync() + m.stop_sync() res = m.client.list_folder("/sync_tests", recursive=True) @@ -945,8 +945,8 @@ def test_invalid_pending_download(m): m.sync.pending_downloads.add(bogus_path) # trigger a resync - m.pause_sync() - m.resume_sync() + m.stop_sync() + m.start_sync() wait_for_idle(m) # assert that there are no sync errors / fatal errors and that the invalid path diff --git a/tests/offline/conftest.py b/tests/offline/conftest.py index bd90e01b8..a0c7059cb 100644 --- a/tests/offline/conftest.py +++ b/tests/offline/conftest.py @@ -3,7 +3,6 @@ import os import os.path as osp import logging -from threading import Event import pytest @@ -29,15 +28,14 @@ def m(): @pytest.fixture def sync(): - syncing = Event() - startup = Event() - syncing.set() local_dir = osp.join(get_home_dir(), "dummy_dir") os.mkdir(local_dir) - sync = SyncEngine(DropboxClient("test-config"), FSEventHandler(syncing, startup)) + fs_events_handler = FSEventHandler() + fs_events_handler.enable() + sync = SyncEngine(DropboxClient("test-config"), fs_events_handler) sync.dropbox_path = local_dir observer = Observer() From ecaee51645e0d680668bcaccdd63d830af64a20d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 13:23:51 +0000 Subject: [PATCH 275/374] updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 309d1165b..69e20cbb2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,8 @@ 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 sync cycle. #### Removed: @@ -47,6 +49,8 @@ removing third party access to potentially private information. * Removed the `maestral restart` command. Use `stop` and `start` instead. * Removed the `maestral account-info` command. Use `maestral auth status` instead. +* Removed main API `Maestral.resume_sync` and `Maestral.pause_sync`. Use + `Maestral.start_sync` and `Maestral.stop_sync` instead. #### Dependencies: From 23e3f39b208938f706b88cf3a55a5ce33902fa40 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 13:24:50 +0000 Subject: [PATCH 276/374] bumped GUI requirements --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index e71ae1a7f..f14d08577 100644 --- a/setup.py +++ b/setup.py @@ -30,8 +30,8 @@ ] gui_requires = [ - "maestral-qt>=1.3.1;sys_platform=='linux'", - "maestral-cocoa>=1.3.0;sys_platform=='darwin'", + "maestral-qt>=1.3.2.dev0;sys_platform=='linux'", + "maestral-cocoa>=1.3.2.dev0;sys_platform=='darwin'", ] syslog_requires = ["systemd-python"] From 00e094621d24a1cc9b3b74e44414b89622522751 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 15:31:32 +0000 Subject: [PATCH 277/374] [sync] fix race condition when waiting for local changes --- src/maestral/sync.py | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index cf7f65598..116b4fe3d 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -16,7 +16,7 @@ import enum import pprint import gc -from threading import Thread, Event, RLock, current_thread +from threading import Thread, Event, Condition, RLock, current_thread from concurrent.futures import ThreadPoolExecutor from queue import Queue, Empty from collections import abc @@ -226,6 +226,8 @@ def __init__( ) -> None: self._enabled = False + self.has_events = Condition() + self.file_event_types = file_event_types self.dir_event_types = dir_event_types @@ -233,10 +235,17 @@ def __init__( self.ignore_timeout = 2.0 self.local_file_event_queue = Queue() + @property + def enabled(self) -> bool: + """Whether queuing of events is enabled.""" + return self._enabled + def enable(self) -> None: + """Turn on queueing of events.""" self._enabled = True def disable(self) -> None: + """Turn off queueing of new events and remove all events from queue.""" self._enabled = False while True: @@ -360,7 +369,9 @@ def on_any_event(self, event: FileSystemEvent) -> None: if self._is_ignored(event): return - self.local_file_event_queue.put(event) + with self.has_events: + self.local_file_event_queue.put(event) + self.has_events.notify_all() class PersistentStateMutableSet(abc.MutableSet): @@ -1584,16 +1595,22 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa return changes, snapshot_time def wait_for_local_changes(self, timeout: float = 40) -> bool: + """ + Blocks until local changes are available. + + :param timeout: Maximum time in seconds to wait. + :returns: ``True`` if changes are available, ``False`` otherwise. + """ logger.debug("Waiting for local changes since cursor: %s", self.local_cursor) - try: - event = self.fs_events.local_file_event_queue.get(timeout=timeout) - except Empty: - return False + if self.fs_events.local_file_event_queue.qsize() > 0: + return True - self.fs_events.local_file_event_queue.queue.append(event) - return True + with self.fs_events.has_events: + self.fs_events.has_events.wait(timeout) + + return self.fs_events.local_file_event_queue.qsize() > 0 def upload_sync_cycle(self): """ @@ -2530,6 +2547,7 @@ def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: :param last_cursor: Cursor form last sync. :param timeout: Timeout in seconds before returning even if there are no changes. Dropbox adds random jitter of up to 90 sec to this value. + :returns: ``True`` if changes are available, ``False`` otherwise. """ logger.debug("Waiting for remote changes since cursor:\n%s", last_cursor) has_changes = self.client.wait_for_remote_changes(last_cursor, timeout=timeout) @@ -3362,6 +3380,9 @@ def rescan(self, local_path: str) -> None: FileDeletedEvent(local_path) ) + with self.fs_events.has_events: + self.fs_events.has_events.notify_all() + def _clean_history(self): """Commits new events and removes all events older than ``_keep_history`` from history.""" From b9bcd590bdfa3ade0a33e5409babac1d73e27688 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 4 Feb 2021 22:23:19 +0000 Subject: [PATCH 278/374] [tests] run on macos-11.0 and ubuntu-20.04 --- .github/workflows/test.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 51dfd8c3b..d69b5e5cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: name: offline strategy: matrix: - platform: [ubuntu-latest, macos-latest] + platform: [ubuntu-20.04, macos-11.0] python-version: [3.6, 3.7, 3.8, 3.9] runs-on: ${{ matrix.platform }} @@ -53,7 +53,7 @@ jobs: file: ./coverage.xml flags: pytest env_vars: OS,PYTHON,TYPE - name: pytests + name: pytests -v env: OS: ${{ matrix.platform }} PYTHON: ${{ matrix.python-version }} @@ -66,14 +66,14 @@ jobs: max-parallel: 2 fail-fast: false matrix: - platform: [ubuntu-latest, macos-latest] + platform: [ubuntu-20.04, macos-11.0] python-version: [3.6, ] include: # use two different Dropbox accounts to run tests in parallel - - platform: ubuntu-latest + - platform: ubuntu-20.04 token: DROPBOX_REFRESH_TOKEN_1 - - platform: macos-latest + - platform: macos-11.0 token: DROPBOX_REFRESH_TOKEN_2 runs-on: ${{ matrix.platform }} From 7e29faa8715236ba44ceb484b986c98db1672951 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 5 Feb 2021 11:37:32 +0000 Subject: [PATCH 279/374] moved indexing log messages from client to sync module --- src/maestral/client.py | 10 +--------- src/maestral/sync.py | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 27e464071..1cece699a 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -72,7 +72,7 @@ SharedLinkError, ) from .config import MaestralState -from .constants import DROPBOX_APP_KEY, IDLE +from .constants import DROPBOX_APP_KEY from .utils import natural_size, chunks, clamp if TYPE_CHECKING: @@ -873,13 +873,8 @@ def list_folder_iterator( yield res - idx = 0 - while res.has_more: - idx += len(res.entries) - logger.info(f"Indexing {idx}...") - attempt = 0 while True: @@ -894,9 +889,6 @@ def list_folder_iterator( else: raise - if idx > 0: - logger.info(IDLE) - def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: """ Waits for remote changes since ``last_cursor``. Call this method after diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 116b4fe3d..be9af4927 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2476,10 +2476,16 @@ def get_remote_folder(self, dbx_path: str) -> bool: try: + idx = 0 + # iterate over index and download results list_iter = self.client.list_folder_iterator(dbx_path, recursive=True) for res in list_iter: + + idx += len(res.entries) + logger.info(f"Indexing {idx}...") + res.entries.sort(key=lambda x: x.path_lower.count("/")) # convert metadata to sync_events @@ -2608,6 +2614,8 @@ def list_remote_changes_iterator( :returns: Iterator yielding tuples with remote changes and corresponding cursor. """ + idx = 0 + if last_cursor == "": # We are starting from the beginning, do a full indexing. logger.info("Fetching remote Dropbox") @@ -2620,6 +2628,9 @@ def list_remote_changes_iterator( for changes in changes_iter: + idx += len(changes.entries) + logger.info(f"Indexing {idx}...") + logger.debug("Listed remote changes:\n%s", entries_repr(changes.entries)) clean_changes = self._clean_remote_changes(changes) @@ -2636,6 +2647,9 @@ def list_remote_changes_iterator( yield sync_events, changes.cursor + if idx > 0: + logger.info(IDLE) + def apply_remote_changes(self, sync_events: List[SyncEvent]) -> List[SyncEvent]: """ Applies remote changes to local folder. Call this on the result of From a6c36af15d1733a11a71be7653e7e386b00ad68d Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 5 Feb 2021 13:24:17 +0000 Subject: [PATCH 280/374] [sync] update `last_reindex` timestamp see https://github.com/SamSchott/maestral/pull/296 and https://github.com/SamSchott/maestral/issues/289 --- src/maestral/sync.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index be9af4927..0283b76d9 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2619,6 +2619,7 @@ def list_remote_changes_iterator( if last_cursor == "": # We are starting from the beginning, do a full indexing. logger.info("Fetching remote Dropbox") + self._state.set("sync", "last_reindex", time.time()) changes_iter = self.client.list_folder_iterator("/", recursive=True) else: # Pick up where we left off. This may be an interrupted indexing / From 5918ef76a2fcd50d3cf0b442189b09e74cf4cbfb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 7 Feb 2021 12:31:09 +0000 Subject: [PATCH 281/374] [notify] adapt to changes in desktop-notifier --- src/maestral/notify.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify.py b/src/maestral/notify.py index 9bbaa5253..625c48537 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -26,7 +26,11 @@ "MaestralDesktopNotifier", ] -_desktop_notifier = DesktopNotifier(APP_NAME) +_desktop_notifier = DesktopNotifier( + app_name=APP_NAME, + app_icon=f"file://{APP_ICON_PATH}", + notification_limit=10, +) NONE = 100 @@ -126,7 +130,6 @@ def notify( _desktop_notifier.send( title=title, message=message, - icon=APP_ICON_PATH, urgency=urgency, action=on_click, buttons=buttons, From 1d770c038e31600e2bf7f68de368c02720eea7e8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 8 Feb 2021 10:58:33 +0000 Subject: [PATCH 282/374] remove dbus-next dependency --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index f14d08577..6904059bc 100644 --- a/setup.py +++ b/setup.py @@ -10,7 +10,6 @@ "click>=7.1.1", "desktop-notifier", "dropbox>=10.9.0,<12.0", - "dbus-next>=0.1.4;sys_platform=='linux'", "fasteners>=0.15", "importlib_metadata;python_version<'3.8'", "importlib_resources;python_version<'3.9'", From a35d6ed6023a61a44dc1f977aa10466d2beacda2 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 8 Feb 2021 11:07:14 +0000 Subject: [PATCH 283/374] expanded acknowledgements section --- README.md | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ce5cfac3..e4a105a35 100644 --- a/README.md +++ b/README.md @@ -168,6 +168,22 @@ month to offset the cost of an Apple Developer account to sign and notarize the # Acknowledgements +Maestral directly uses code from the following projects: + - The config module uses code from the [Spyder IDE](https://github.com/spyder-ide) -- The DropboxClient is inspired by work from [Orphilia](https://github.com/ksiazkowicz/orphilia-dropbox) -- Error reporting is powered by bugsnag. +- The DropboxClient module is inspired by work from [Orphilia](https://github.com/ksiazkowicz/orphilia-dropbox) + +It also would not be possible without the following excellent Python packages: + +- Communication between sync daemon and frontends uses [Pyro5](https://github.com/irmen/Pyro5). +- The command line interface is built with [click](https://github.com/pallets/click) and + uses beautiful interactive prompts by [survey](https://github.com/Exahilosys/survey). +- The Cocoa GUI is built using [toga](https://github.com/beeware/toga) and the macOS app + bundle is built using [briefcase](https://github.com/beeware/briefcase), both part of + the [beeware](https://beeware.org) project for writing cross-platform Python applications. +- Credential storage uses system keychains via [keyring](https://github.com/jaraco/keyring). +- [watchdog](https://github.com/gorakhargosh/watchdog) allows us to receive local file + system events. +- Error reporting is generously provided by [bugsnag](https://www.bugsnag.com). +- Many more well known libraries that have become the backbone of Python projects + such as requests, sqlalchemy, etc. From b154534bce195e907694a1abb8e04b66ebcce5eb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 4 Feb 2021 17:58:44 +0000 Subject: [PATCH 284/374] [utils.integration] added method to get state of AC power supply --- src/maestral/main.py | 6 +- src/maestral/utils/integration.py | 113 ++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 src/maestral/utils/integration.py diff --git a/src/maestral/main.py b/src/maestral/main.py index 0136fe5f6..d1f13b35c 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -70,6 +70,7 @@ ErrorType, ) from .utils.appdirs import get_log_path, get_cache_path, get_data_path +from .utils.integration import get_ac_state, ACState from .constants import IDLE, FileStatus, GITHUB_RELEASES_API @@ -1571,10 +1572,13 @@ async def _period_reindexing(self) -> None: if self.monitor.running.is_set(): elapsed = time.time() - self.sync.last_reindex + ac_state = get_ac_state() + reindexing_due = elapsed > self.monitor.reindex_interval is_idle = self.monitor.idle_time > 20 * 60 + has_ac_power = ac_state in (ACState.Connected, ACState.Undetermined) - if reindexing_due and is_idle: + if reindexing_due and is_idle and has_ac_power: self.monitor.rebuild_index() await sleep_rand(60 * 5) diff --git a/src/maestral/utils/integration.py b/src/maestral/utils/integration.py new file mode 100644 index 000000000..7a7e7e348 --- /dev/null +++ b/src/maestral/utils/integration.py @@ -0,0 +1,113 @@ +# -*- coding: utf-8 -*- +""" +This module provides some basic platform integration. At the moment, it only provides +code to determine if the device is connected to AC power. +""" + +import os +import platform +import enum +from pathlib import Path +from typing import Union + + +__all__ = ["get_ac_state", "ACState"] + + +LINUX_POWER_SUPPLY_PATH = "/sys/class/power_supply" + + +def multi_cat(*paths: Path) -> Union[int, bytes, None]: + """ + Attempts to read the content of multiple files which may not exist. Returns the + content of the first file which can be read. If none of them can be read return + None. Returns an integer if the content is a digit. + """ + + for path in paths: + try: + ret = path.read_bytes().strip() + except OSError: + pass + else: + return int(ret) if ret.isdigit() else ret + + return None + + +class ACState(enum.Enum): + """Enumeration of AC power states""" + + Connected = "Connected" + Disconnected = "Disconnected" + Undetermined = "Undetermined" + + +def get_ac_state() -> ACState: + """ + Checks if the current device has AC power or is running on battery. + + :returns: ``True`` if the device has AC power, ``False`` otherwise. + """ + + if platform.system() == "Darwin": + + from ctypes import c_double + from rubicon.objc.runtime import load_library + + iokit = load_library("IOKit") + kIOPSTimeRemainingUnlimited = -2.0 + + iokit.IOPSGetTimeRemainingEstimate.restype = c_double + + remaining_time = iokit.IOPSGetTimeRemainingEstimate() + + if remaining_time == kIOPSTimeRemainingUnlimited: + return ACState.Connected + else: + return ACState.Disconnected + + elif platform.system() == "Linux": + + # taken from https://github.com/giampaolo/psutil + + supplies = list(os.scandir(LINUX_POWER_SUPPLY_PATH)) + + ac_paths = [ + Path(s.path) + for s in supplies + if s.name.startswith("A") or "ac" in s.name.lower() + ] + + bat_paths = [ + Path(s.path) + for s in supplies + if s.name.startswith("B") or "battery" in s.name.lower() + ] + + online = multi_cat(*iter(path / "online" for path in ac_paths)) + + if online is not None: + if online == 1: + return ACState.Connected + else: + return ACState.Disconnected + + elif len(bat_paths) > 0: + + # Get the first available battery. Usually this is "BAT0", except + # some rare exceptions: + # https://github.com/giampaolo/psutil/issues/1238 + bat0 = sorted(bat_paths)[0] + + try: + status = (bat0 / "status").read_text().strip().lower() + except OSError: + status = "" + + if status == "discharging": + return ACState.Disconnected + elif status in ("charging", "full"): + return ACState.Connected + + return ACState.Undetermined From 554bb8ce1efaec6c821f09078a2f6355bae28c44 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 11:23:52 +0000 Subject: [PATCH 285/374] [main] updated doc strings --- src/maestral/main.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/maestral/main.py b/src/maestral/main.py index d1f13b35c..a34acae56 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -1535,11 +1535,13 @@ def _update_from_pre_v1_3_2(self) -> None: # ==== period async jobs =========================================================== def _schedule_task(self, coro: Awaitable) -> None: + """Schedules a task in our asyncio loop.""" task = self._loop.create_task(coro) self._tasks.add(task) async def _periodic_refresh_info(self) -> None: + """Periodically refresh the account information from Dropbox servers.""" await asyncio.sleep(60 * 5) @@ -1555,6 +1557,7 @@ async def _periodic_refresh_info(self) -> None: await sleep_rand(60 * 45) async def _period_update_check(self) -> None: + """Periodically check for software updates.""" await asyncio.sleep(60 * 3) @@ -1567,6 +1570,10 @@ async def _period_update_check(self) -> None: await sleep_rand(60 * 60) async def _period_reindexing(self) -> None: + """ + Trigger periodic reindexing, determined by the 'reindex_interval' setting. Don't + reindex if we are running on battery power. + """ while True: From e1a021275abae4e411654c03b3862895593d04ec Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 11:24:06 +0000 Subject: [PATCH 286/374] updated changelog --- CHANGELOG.md | 44 +++++++++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 69e20cbb2..0d4315be1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,19 +15,24 @@ #### Changed: -* Avoiding 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. -* Moved linking and unlinking to a new command group `maestral auth` with subcommands - `link`, `unlink` and `status`. -* Renamed command `file-status` to `filestatus`. -* Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. +* Changes to indexing: + * Avoiding 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 we the device is not + connected to an AC power supply. +* Changes to CLI: + * Moved linking and unlinking to a new command group `maestral auth` with subcommands + `link`, `unlink` and `status`. + * Renamed command `file-status` to `filestatus`. + * Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. #### Fixed: @@ -47,15 +52,16 @@ * Removed automatic error reporting via bugsnag. Please file issues directly on GitHub instead. This allows following up on errors and investigating their cause while removing third party access to potentially private information. -* Removed the `maestral restart` command. Use `stop` and `start` instead. -* Removed the `maestral account-info` command. Use `maestral auth status` instead. +* Removed from CLI: + * The `maestral restart` command. Use `stop` and `start` instead. + * The `maestral account-info` command. Use `maestral auth status` instead. * Removed main API `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 keyring to version >=22. * Removed bugsnag dependency. ## v1.3.1 @@ -85,7 +91,7 @@ series of bug fixes for GUI and daemon. #### Changed: * Significant improvements to the command line interface: - * Overhauled all CLI dialogs with nicer formatting and more interactive prompts + * 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. @@ -115,10 +121,10 @@ series of bug fixes for GUI and daemon. * 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 +* 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 +* 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 From 673a36b98466ac91b6291e87d3927a8831088a6a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 15:15:20 +0000 Subject: [PATCH 287/374] [logger] tweak waiting for log message --- src/maestral/logging.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/maestral/logging.py b/src/maestral/logging.py index 4442912c5..3765548c2 100644 --- a/src/maestral/logging.py +++ b/src/maestral/logging.py @@ -3,7 +3,7 @@ import logging from collections import deque -from concurrent.futures import Future, wait +from concurrent.futures import Future from typing import Deque, Optional, List try: @@ -111,9 +111,13 @@ def wait_for_emit(self, timeout: Optional[float]) -> bool: :param timeout: Maximum time to block before returning. :returns: ``True`` if there was a status change, ``False`` in case of a timeout. """ - done, not_done = wait([self._emit_future], timeout=timeout) + try: + self._emit_future.result(timeout=timeout) + except TimeoutError: + return False + self._emit_future = Future() # reset future - return len(done) == 1 + return True def getLastMessage(self) -> str: """ From f6e90d379494c17ffae62e0f7ad710a5ae2fc601 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 22:16:24 +0000 Subject: [PATCH 288/374] adapt to changes in desktop-notifier 2.0 --- CHANGELOG.md | 2 ++ setup.py | 2 +- src/maestral/notify.py | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d4315be1..19b024918 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,8 @@ * Bumped survey to version >=3.2.2,<4.0. * Bumped keyring to version >=22. +* Added desktop-notifier dependency. This is spin-off from Maestral, built on + the code from the `notify` module. * Removed bugsnag dependency. ## v1.3.1 diff --git a/setup.py b/setup.py index 6904059bc..184039df7 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ install_requires = [ "alembic>=1.3", "click>=7.1.1", - "desktop-notifier", + "desktop-notifier>=2.0", "dropbox>=10.9.0,<12.0", "fasteners>=0.15", "importlib_metadata;python_version<'3.8'", diff --git a/src/maestral/notify.py b/src/maestral/notify.py index 625c48537..706edeb37 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -131,6 +131,6 @@ def notify( title=title, message=message, urgency=urgency, - action=on_click, + on_clicked=on_click, buttons=buttons, ) From f91c70c8eabbb11a52ed5220a336fc9e06f07738 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 10 Feb 2021 19:54:34 +0000 Subject: [PATCH 289/374] suppress "Indexing 0..." log message --- src/maestral/sync.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 0283b76d9..53140c3e8 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2484,7 +2484,9 @@ def get_remote_folder(self, dbx_path: str) -> bool: for res in list_iter: idx += len(res.entries) - logger.info(f"Indexing {idx}...") + + if idx > 0: + logger.info(f"Indexing {idx}...") res.entries.sort(key=lambda x: x.path_lower.count("/")) From e5bb1f69dddb362515b50860989938f92b6fcdd9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 11 Feb 2021 13:47:32 +0000 Subject: [PATCH 290/374] adapt to desktop-notifier changes --- setup.py | 2 +- src/maestral/notify.py | 20 ++++++++++++-------- src/maestral/sync.py | 4 ++-- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index 184039df7..bfef98682 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ install_requires = [ "alembic>=1.3", "click>=7.1.1", - "desktop-notifier>=2.0", + "desktop-notifier>=3.1", "dropbox>=10.9.0,<12.0", "fasteners>=0.15", "importlib_metadata;python_version<'3.8'", diff --git a/src/maestral/notify.py b/src/maestral/notify.py index 706edeb37..5ca27daf4 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -9,7 +9,7 @@ from typing import Optional, Dict, Callable # external imports -from desktop_notifier import DesktopNotifier, NotificationLevel +from desktop_notifier import DesktopNotifier, Urgency, Button # local imports from .config import MaestralConfig @@ -106,7 +106,7 @@ def notify( message: str, level: int = FILECHANGE, on_click: Optional[Callable] = None, - buttons: Optional[Dict[str, Callable]] = None, + actions: Optional[Dict[str, Callable]] = None, ) -> None: """ Sends a desktop notification. @@ -116,18 +116,22 @@ def notify( :param level: Notification level of the message. :param on_click: A callback to execute when the notification is clicked. The provided callable must not take any arguments. - :param buttons: A dictionary with button names and callbacks for the + :param actions: A dictionary with button names and callbacks for the notification. """ ignore = self.snoozed and level == FILECHANGE - if level == ERROR: - urgency = NotificationLevel.Critical - else: - urgency = NotificationLevel.Normal if level >= self.notify_level and not ignore: - _desktop_notifier.send( + + urgency = Urgency.Critical if level == ERROR else Urgency.Normal + + if actions: + buttons = [Button(name, handler) for name, handler in actions.items()] + else: + buttons = [] + + _desktop_notifier.send_sync( title=title, message=message, urgency=urgency, diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 53140c3e8..01dec8a70 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1403,7 +1403,7 @@ def callback(): "Sync error", f"Could not sync {file_name}", level=notify.SYNCISSUE, - buttons={"Show": callback}, + actions={"Show": callback}, ) self.sync_errors.add(err) @@ -2827,7 +2827,7 @@ def callback(): else: msg = f"{file_name} {change_type}" - self.notifier.notify("Items synced", msg, buttons=buttons) + self.notifier.notify("Items synced", msg, actions=buttons) def _filter_excluded_changes_remote( self, changes: List[SyncEvent] From 0cf7f2773473751769af4793cbb7ab4790ffb95c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 16:23:48 +0000 Subject: [PATCH 291/374] fix timeout error handling --- src/maestral/logging.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/maestral/logging.py b/src/maestral/logging.py index 3765548c2..1fb908fc6 100644 --- a/src/maestral/logging.py +++ b/src/maestral/logging.py @@ -3,6 +3,7 @@ import logging from collections import deque +import concurrent.futures from concurrent.futures import Future from typing import Deque, Optional, List @@ -113,7 +114,7 @@ def wait_for_emit(self, timeout: Optional[float]) -> bool: """ try: self._emit_future.result(timeout=timeout) - except TimeoutError: + except concurrent.futures.TimeoutError: return False self._emit_future = Future() # reset future From 3fb04f0d7ead2055851a6641a2ee58e8e7db5444 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 10:34:32 +0000 Subject: [PATCH 292/374] move tests back to macos-latest and ubuntu-latest macos-latest runners are often not available --- .github/workflows/test.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d69b5e5cb..e26202536 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,7 +14,7 @@ jobs: name: offline strategy: matrix: - platform: [ubuntu-20.04, macos-11.0] + platform: [ubuntu-latest, macos-latest] python-version: [3.6, 3.7, 3.8, 3.9] runs-on: ${{ matrix.platform }} @@ -66,14 +66,14 @@ jobs: max-parallel: 2 fail-fast: false matrix: - platform: [ubuntu-20.04, macos-11.0] + platform: [ubuntu-latest, macos-latest] python-version: [3.6, ] include: # use two different Dropbox accounts to run tests in parallel - - platform: ubuntu-20.04 + - platform: ubuntu-latest token: DROPBOX_REFRESH_TOKEN_1 - - platform: macos-11.0 + - platform: macos-latest token: DROPBOX_REFRESH_TOKEN_2 runs-on: ${{ matrix.platform }} From 6605ef79d54ff2f7413ec43c9fb9a0f5f9035b2f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 11 Dec 2020 23:22:00 +0000 Subject: [PATCH 293/374] remove our own fsevents module --- src/maestral/fsevents/__init__.py | 97 ------------------------------ src/maestral/fsevents/fsevents.py | 99 ------------------------------- src/maestral/fsevents/polling.py | 91 ---------------------------- src/maestral/sync.py | 3 +- 4 files changed, 2 insertions(+), 288 deletions(-) delete mode 100644 src/maestral/fsevents/__init__.py delete mode 100644 src/maestral/fsevents/fsevents.py delete mode 100644 src/maestral/fsevents/polling.py diff --git a/src/maestral/fsevents/__init__.py b/src/maestral/fsevents/__init__.py deleted file mode 100644 index f93cceb01..000000000 --- a/src/maestral/fsevents/__init__.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module provides custom event emitters for the :obj:`watchdog` package that sort -file system events in an order which can be applied to reproduce the new state from the -old state. This is only required for event emitters which internally use -:class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff` to generate file system -events. This includes the macOS FSEvents emitter and the Polling emitter but not inotify -emitters. - -Looking at the source code for :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff`, -the event types are categorised as follows: - -* Created event: The inode is unique to the new snapshot. The path may be unique to the - new snapshot or exist in both. In the second case, there will be a preceding Deleted - event or a Moved event with the path as starting point (the old item was deleted or - moved away). - -* Deleted event: The inode is unique to the old snapshot. The path may be unique to the - old snapshot or exist in both. In the second case, there will be a subsequent Created - event or a Moved event with the path as end point (something else was created at or - moved to the location). - -* Moved event: The inode exists in both snapshots but with different paths. - -* Modified event: The inode exists in both snapshots and the mtime or file size are - different. DirectorySnapshotDiff will always use the inode’s path from the old - snapshot. - -From the above classification, there can be at most two created/deleted/moved events -that share the same path in one snapshot diff: - - * Deleted(path1) + Created(path1) - * Moved(path1, path2) + Created(path1) - * Deleted(path1) + Moved(path0, path1) - -Any Modified event will come before a Moved event or stand alone. Modified events will -never be combined by themselves with created or deleted events because they require the -inode to be present in both snapshots. - -From the above, we can achieve correct ordering for unique path by always adding Deleted -events to the queue first, Modified events second, Moved events third and Created events -last: - - Deleted -> Modified -> Moved -> Created - -The ordering won’t be correct between unrelated paths and between files and folder. The -first does not matter for syncing. We solve the second by assuming that when a directory -is deleted, so are its children. And before a child is created, its parent dircetory -must exist. - -MovedEvents which are not unique (their paths appear in other events) will be split -into Deleted and Created events by Maestral. -""" - -import os -from typing import Union - -from watchdog.utils import platform # type: ignore -from watchdog.utils import UnsupportedLibc - - -if platform.is_darwin(): - from .fsevents import OrderedFSEventsObserver as Observer -elif platform.is_linux(): - try: - from watchdog.observers.inotify import InotifyObserver as Observer # type: ignore - except UnsupportedLibc: - from .polling import OrderedPollingObserver as Observer -else: - from watchdog.observers import Observer # type: ignore - - -# patch encoding / decoding of paths in watchdog - - -def _patched_decode(path: Union[str, bytes]) -> str: - if isinstance(path, bytes): - return os.fsdecode(path) - return path - - -def _patched_encode(path: Union[str, bytes]) -> bytes: - if isinstance(path, str): - return os.fsencode(path) - return path - - -try: - from watchdog.utils import unicode_paths -except ImportError: - pass -else: - unicode_paths.decode = _patched_decode - unicode_paths.encode = _patched_encode - - -__all__ = ["Observer"] diff --git a/src/maestral/fsevents/fsevents.py b/src/maestral/fsevents/fsevents.py deleted file mode 100644 index f9d98924b..000000000 --- a/src/maestral/fsevents/fsevents.py +++ /dev/null @@ -1,99 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from watchdog.observers.fsevents import ( # type: ignore - FSEventsEmitter, - FSEventsObserver, - FileDeletedEvent, - FileModifiedEvent, - FileMovedEvent, - FileCreatedEvent, - DirDeletedEvent, - DirModifiedEvent, - DirMovedEvent, - DirCreatedEvent, - DEFAULT_OBSERVER_TIMEOUT, - BaseObserver, -) -from watchdog.utils.dirsnapshot import DirectorySnapshot - - -class OrderedFSEventsEmitter(FSEventsEmitter): - """Ordered file system event emitter for macOS - - This subclasses FSEventsEmitter to guarantee an order of events which can be applied - to reproduce the new state from the old state. - """ - - def queue_events(self, timeout): - with self._lock: - if not self.watch.is_recursive and self.watch.path not in self.pathnames: - return - new_snapshot = DirectorySnapshot(self.watch.path, self.watch.is_recursive) - diff = new_snapshot - self.snapshot - - # add metadata modified events which will be missed by regular diff - try: - ctime_files_modified = set() - - for path in self.snapshot.paths & new_snapshot.paths: - if not self.snapshot.isdir(path): - if self.snapshot.inode(path) == new_snapshot.inode(path): - if ( - self.snapshot.stat_info(path).st_ctime - != new_snapshot.stat_info(path).st_ctime - ): - ctime_files_modified.add(path) - - files_modified = set(ctime_files_modified) | set(diff.files_modified) - except Exception as exc: - print(exc) - - # replace cached snapshot - self.snapshot = new_snapshot - - # Files. - for src_path in diff.files_deleted: - self.queue_event(FileDeletedEvent(src_path)) - for src_path in files_modified: - self.queue_event(FileModifiedEvent(src_path)) - for src_path, dest_path in diff.files_moved: - self.queue_event(FileMovedEvent(src_path, dest_path)) - for src_path in diff.files_created: - self.queue_event(FileCreatedEvent(src_path)) - - # Directories. - for src_path in diff.dirs_deleted: - self.queue_event(DirDeletedEvent(src_path)) - for src_path in diff.dirs_modified: - self.queue_event(DirModifiedEvent(src_path)) - for src_path, dest_path in diff.dirs_moved: - self.queue_event(DirMovedEvent(src_path, dest_path)) - for src_path in diff.dirs_created: - self.queue_event(DirCreatedEvent(src_path)) - - # free some memory - del diff - del files_modified - - -class OrderedFSEventsObserver(FSEventsObserver): - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__( - self, emitter_class=OrderedFSEventsEmitter, timeout=timeout - ) diff --git a/src/maestral/fsevents/polling.py b/src/maestral/fsevents/polling.py deleted file mode 100644 index 3577714e0..000000000 --- a/src/maestral/fsevents/polling.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from watchdog.observers.polling import ( # type: ignore - PollingEmitter, - PollingObserver, - FileDeletedEvent, - FileModifiedEvent, - FileMovedEvent, - FileCreatedEvent, - DirDeletedEvent, - DirModifiedEvent, - DirMovedEvent, - DirCreatedEvent, - DEFAULT_OBSERVER_TIMEOUT, - BaseObserver, -) -from watchdog.utils.dirsnapshot import DirectorySnapshotDiff - - -class OrderedPollingEmitter(PollingEmitter): - """Ordered polling file system event emitter - - Platform-independent emitter that polls a directory to detect file system changes. - Events are emitted in an order which can be used to produce the new file system - state from the old one. - """ - - def queue_events(self, timeout): - # We don't want to hit the disk continuously. - # timeout behaves like an interval for polling emitters. - if self.stopped_event.wait(timeout): - return - - with self._lock: - if not self.should_keep_running(): - return - - # Get event diff between fresh snapshot and previous snapshot. - # Update snapshot. - try: - new_snapshot = self._take_snapshot() - except OSError: - self.queue_event(DirDeletedEvent(self.watch.path)) - self.stop() - return - - events = DirectorySnapshotDiff(self._snapshot, new_snapshot) - self._snapshot = new_snapshot - - # Files. - for src_path in events.files_deleted: - self.queue_event(FileDeletedEvent(src_path)) - for src_path in events.files_modified: - self.queue_event(FileModifiedEvent(src_path)) - for src_path, dest_path in events.files_moved: - self.queue_event(FileMovedEvent(src_path, dest_path)) - for src_path in events.files_created: - self.queue_event(FileCreatedEvent(src_path)) - - # Directories. - for src_path in events.dirs_deleted: - self.queue_event(DirDeletedEvent(src_path)) - for src_path in events.dirs_modified: - self.queue_event(DirModifiedEvent(src_path)) - for src_path, dest_path in events.dirs_moved: - self.queue_event(DirMovedEvent(src_path, dest_path)) - for src_path in events.dirs_created: - self.queue_event(DirCreatedEvent(src_path)) - - -class OrderedPollingObserver(PollingObserver): - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__( - self, emitter_class=OrderedPollingEmitter, timeout=timeout - ) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 01dec8a70..434a274ee 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -49,6 +49,7 @@ import pathspec # type: ignore import dropbox # type: ignore from dropbox.files import Metadata, DeletedMetadata, FileMetadata, FolderMetadata # type: ignore +from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # type: ignore from watchdog.events import ( EVENT_TYPE_CREATED, @@ -72,7 +73,7 @@ # local imports from . import notify from .config import MaestralConfig, MaestralState -from .fsevents import Observer +from .notify import MaestralDesktopNotifier from .constants import ( IDLE, SYNCING, From 9079098bc72fa1f7d6c18030ffe3a5c79613cd02 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 11 Dec 2020 23:24:17 +0000 Subject: [PATCH 294/374] [sync] detect deleted dropbox folder through DirDeletedEvent --- src/maestral/sync.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 434a274ee..4e88eacb1 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2140,6 +2140,9 @@ def _on_local_moved(self, event: SyncEvent) -> Optional[Metadata]: :raises MaestralApiError: For any issues when syncing the item. """ + if event.local_path_from == self.dropbox_path: + self.ensure_dropbox_folder_present() + # fail fast on badly decoded paths validate_encoding(event.local_path) @@ -2396,6 +2399,9 @@ def _on_local_deleted(self, event: SyncEvent) -> Optional[Metadata]: :raises MaestralApiError: For any issues when syncing the item. """ + if event.local_path == self.dropbox_path: + self.ensure_dropbox_folder_present() + if self.is_excluded_by_user(event.dbx_path): logger.debug( 'Not deleting "%s": is excluded by selective sync', event.dbx_path From 670866eedd3623520eda5c90e0e64c1b642053d0 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 7 Jan 2021 22:06:54 +0000 Subject: [PATCH 295/374] bump watchdog to branch with macos fixes --- setup.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/setup.py b/setup.py index bfef98682..f7ec2c8cf 100644 --- a/setup.py +++ b/setup.py @@ -24,8 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog>=0.10.0,<=0.10.3;sys_platform=='darwin'", - "watchdog>=0.10.0;sys_platform=='linux'", + "watchdog@git+https://github.com/CCP-Aporia/watchdog.git@handle-coalesced-fsevents", ] gui_requires = [ From 58eafd6e7f2373983b7b46003d979966bfad66fb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 8 Jan 2021 16:42:51 +0000 Subject: [PATCH 296/374] [sync] add nice repr to `_Ignore` --- src/maestral/sync.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 4e88eacb1..a3487e05c 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -187,6 +187,12 @@ def __init__( self.ttl = ttl self.recursive = recursive + def __repr__(self) -> str: + return ( + f"<{self.__class__.__name__}(event={self.event}, " + f"recursive={self.recursive}, ttl={self.ttl})>" + ) + class FSEventHandler(FileSystemEventHandler): """A local file event handler From 3ee23501318af157ca5c25fe1ef2446657b8d430 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 8 Jan 2021 16:52:24 +0000 Subject: [PATCH 297/374] [sync] ignore up to two FileCreatedEvents on move on macOS --- src/maestral/sync.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index a3487e05c..271f71c0d 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -85,6 +85,7 @@ EXCLUDED_DIR_NAMES, MIGNORE_FILE, FILE_CACHE, + IS_MACOS, ) from .errors import ( SyncError, @@ -3181,10 +3182,12 @@ def _on_remote_file(self, event: SyncEvent) -> Optional[SyncEvent]: else: preserve_permissions = False - ignore_events = [ - FileMovedEvent(tmp_fname, local_path), - FileCreatedEvent(local_path), # sometimes emitted on macOS - ] + ignore_events = [FileMovedEvent(tmp_fname, local_path)] + + if IS_MACOS: + # up to two created events are sometimes emitted on macOS + ignore_events.append(FileCreatedEvent(local_path)) + ignore_events.append(FileCreatedEvent(local_path)) if preserve_permissions: # ignore FileModifiedEvent when changing permissions From f048dd265707a4b2efe7ef401e5674779377f374 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 8 Jan 2021 17:10:22 +0000 Subject: [PATCH 298/374] [tests] minor cleanup --- tests/linked/test_sync.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index 9ef7a19bd..b9fe33351 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -238,8 +238,9 @@ def test_rapid_remote_changes(m): mode=WriteMode.update(md.rev), ) + # reset file content with open(resources + "/file.txt", "w") as f: - f.write("content") # reset file content + f.write("content") wait_for_idle(m) @@ -672,14 +673,14 @@ def test_mignore(m): os.mkdir(m.test_folder_local + "/foo") wait_for_idle(m) - assert not (m.client.get_metadata("/sync_tests/foo")) + assert not m.client.get_metadata("/sync_tests/foo") # 3) test that renaming an item excludes it move(m.test_folder_local + "/bar", m.test_folder_local + "/build") wait_for_idle(m) - assert not (m.client.get_metadata("/sync_tests/build")) + assert not m.client.get_metadata("/sync_tests/build") # 4) test that renaming an item includes it From e3cc731a2bff60f2ac36e16bcb346b916c4c4a53 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 18 Jan 2021 16:42:32 +0000 Subject: [PATCH 299/374] [sync] whitelist which event types are handled --- src/maestral/sync.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 271f71c0d..80bbffcba 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -239,6 +239,9 @@ def __init__( self.file_event_types = file_event_types self.dir_event_types = dir_event_types + self.file_event_types = file_event_types + self.dir_event_types = dir_event_types + self._ignored_events = [] self.ignore_timeout = 2.0 self.local_file_event_queue = Queue() From 600e12bd4afc27db50e7ce7291f34189662c4cdd Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 18 Jan 2021 19:26:18 +0000 Subject: [PATCH 300/374] [tests] increase time to wait for idle this accommodates waiting for delayed events --- tests/linked/conftest.py | 2 +- tests/linked/test_sync.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 6cb3bf8d6..3cc348bb1 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -130,7 +130,7 @@ def proxy(m): # helper functions -def wait_for_idle(m: Maestral, minimum: int = 4): +def wait_for_idle(m: Maestral, minimum: int = 6): """Blocks until Maestral instance is idle for at least `minimum` sec.""" t0 = time.time() diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index b9fe33351..02516303b 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -296,7 +296,7 @@ def test_folder_tree_created_remote(m): # test deleting remote tree m.client.remove("/sync_tests/nested_folder") - wait_for_idle(m, 10) + wait_for_idle(m, 15) assert_synced(m) assert_child_count(m, "/sync_tests", 0) From 151bad7089f2d3e6bb62ff426fb55bc8327f7f3c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 18 Jan 2021 19:26:33 +0000 Subject: [PATCH 301/374] [tests] prefer creating folder remotely --- tests/linked/test_sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index 02516303b..cb7897be7 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -364,7 +364,7 @@ def test_remote_file_replaced_by_folder_and_unsynced_local_changes(m): def test_remote_folder_replaced_by_file(m): """Tests the download sync when a folder is replaced by a file.""" - os.mkdir(m.test_folder_local + "/folder") + m.client.make_dir("/sync_tests/folder") wait_for_idle(m) m.stop_sync() From 07e963f609388ee991172b1993c94f1fe07bbeae Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 11:58:03 +0000 Subject: [PATCH 302/374] [tests] increase test timeouts --- tests/linked/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 3cc348bb1..cfd26c4ec 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -130,7 +130,7 @@ def proxy(m): # helper functions -def wait_for_idle(m: Maestral, minimum: int = 6): +def wait_for_idle(m: Maestral, minimum: int = 10): """Blocks until Maestral instance is idle for at least `minimum` sec.""" t0 = time.time() From dad62086a79c14f25605ea56c571a30382e456f8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 12:46:32 +0000 Subject: [PATCH 303/374] install watchdog from master branch --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f7ec2c8cf..abe4a0823 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog@git+https://github.com/CCP-Aporia/watchdog.git@handle-coalesced-fsevents", + "watchdog@git+https://github.com/CCP-Aporia/watchdog", ] gui_requires = [ From 84e5791ded28e87f3a37111b5cff9d3ebe189b37 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 20 Jan 2021 22:25:40 +0000 Subject: [PATCH 304/374] [sync] remove unused import --- src/maestral/sync.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 80bbffcba..229c8e921 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -73,7 +73,6 @@ # local imports from . import notify from .config import MaestralConfig, MaestralState -from .notify import MaestralDesktopNotifier from .constants import ( IDLE, SYNCING, From d43aa389baab0ef183fa59095e1218bbadf9066c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 21 Jan 2021 18:53:21 +0000 Subject: [PATCH 305/374] switch to main watchdog repo --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index abe4a0823..1e5c13369 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog@git+https://github.com/CCP-Aporia/watchdog", + "watchdog@git+https://github.com/gorakhargosh/watchdog", ] gui_requires = [ From ed912ee6a551336b329c51a2022b0e9739eca9d7 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 21:21:29 +0000 Subject: [PATCH 306/374] [fsevents] use our own polling observer again --- src/maestral/fsevents/__init__.py | 67 +++++++++++++++++++++++ src/maestral/fsevents/polling.py | 91 +++++++++++++++++++++++++++++++ src/maestral/sync.py | 2 +- 3 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 src/maestral/fsevents/__init__.py create mode 100644 src/maestral/fsevents/polling.py diff --git a/src/maestral/fsevents/__init__.py b/src/maestral/fsevents/__init__.py new file mode 100644 index 000000000..20c32173b --- /dev/null +++ b/src/maestral/fsevents/__init__.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +""" +This module provides a custom polling file system event emitter for the +:obj:`watchdog` package that sorts file system events in an order which can be applied +to reproduce the new state from the old state. This is only required for the polling +emitter which uses period directory snapshots and compares them with a +:class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff` to generate file system +events. + +Looking at the source code for :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff`, +the event types are categorised as follows: + +* Created event: The inode is unique to the new snapshot. The path may be unique to the + new snapshot or exist in both. In the second case, there will be a preceding Deleted + event or a Moved event with the path as starting point (the old item was deleted or + moved away). + +* Deleted event: The inode is unique to the old snapshot. The path may be unique to the + old snapshot or exist in both. In the second case, there will be a subsequent Created + event or a Moved event with the path as end point (something else was created at or + moved to the location). + +* Moved event: The inode exists in both snapshots but with different paths. + +* Modified event: The inode exists in both snapshots and the mtime or file size are + different. DirectorySnapshotDiff will always use the inode’s path from the old + snapshot. + +From the above classification, there can be at most two created/deleted/moved events +that share the same path in one snapshot diff: + + * Deleted(path1) + Created(path1) + * Moved(path1, path2) + Created(path1) + * Deleted(path1) + Moved(path0, path1) + +Any Modified event will come before a Moved event or stand alone. Modified events will +never be combined by themselves with created or deleted events because they require the +inode to be present in both snapshots. + +From the above, we can achieve correct ordering for unique path by always adding Deleted +events to the queue first, Modified events second, Moved events third and Created events +last: + + Deleted -> Modified -> Moved -> Created + +The ordering won’t be correct between unrelated paths and between files and folder. The +first does not matter for syncing. We solve the second by assuming that when a directory +is deleted, so are its children. And before a child is created, its parent directory +must exist. + +MovedEvents which are not unique (their paths appear in other events) will be split +into Deleted and Created events by Maestral. +""" + +from watchdog.utils import platform # type: ignore +from watchdog.utils import UnsupportedLibc + + +if platform.is_linux(): + try: + from watchdog.observers.inotify import InotifyObserver as Observer # type: ignore + except UnsupportedLibc: + from .polling import OrderedPollingObserver as Observer +else: + from watchdog.observers import Observer # type: ignore + +__all__ = ["Observer"] diff --git a/src/maestral/fsevents/polling.py b/src/maestral/fsevents/polling.py new file mode 100644 index 000000000..3577714e0 --- /dev/null +++ b/src/maestral/fsevents/polling.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2011 Yesudeep Mangalapilly +# Copyright 2012 Google, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from watchdog.observers.polling import ( # type: ignore + PollingEmitter, + PollingObserver, + FileDeletedEvent, + FileModifiedEvent, + FileMovedEvent, + FileCreatedEvent, + DirDeletedEvent, + DirModifiedEvent, + DirMovedEvent, + DirCreatedEvent, + DEFAULT_OBSERVER_TIMEOUT, + BaseObserver, +) +from watchdog.utils.dirsnapshot import DirectorySnapshotDiff + + +class OrderedPollingEmitter(PollingEmitter): + """Ordered polling file system event emitter + + Platform-independent emitter that polls a directory to detect file system changes. + Events are emitted in an order which can be used to produce the new file system + state from the old one. + """ + + def queue_events(self, timeout): + # We don't want to hit the disk continuously. + # timeout behaves like an interval for polling emitters. + if self.stopped_event.wait(timeout): + return + + with self._lock: + if not self.should_keep_running(): + return + + # Get event diff between fresh snapshot and previous snapshot. + # Update snapshot. + try: + new_snapshot = self._take_snapshot() + except OSError: + self.queue_event(DirDeletedEvent(self.watch.path)) + self.stop() + return + + events = DirectorySnapshotDiff(self._snapshot, new_snapshot) + self._snapshot = new_snapshot + + # Files. + for src_path in events.files_deleted: + self.queue_event(FileDeletedEvent(src_path)) + for src_path in events.files_modified: + self.queue_event(FileModifiedEvent(src_path)) + for src_path, dest_path in events.files_moved: + self.queue_event(FileMovedEvent(src_path, dest_path)) + for src_path in events.files_created: + self.queue_event(FileCreatedEvent(src_path)) + + # Directories. + for src_path in events.dirs_deleted: + self.queue_event(DirDeletedEvent(src_path)) + for src_path in events.dirs_modified: + self.queue_event(DirModifiedEvent(src_path)) + for src_path, dest_path in events.dirs_moved: + self.queue_event(DirMovedEvent(src_path, dest_path)) + for src_path in events.dirs_created: + self.queue_event(DirCreatedEvent(src_path)) + + +class OrderedPollingObserver(PollingObserver): + def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): + BaseObserver.__init__( + self, emitter_class=OrderedPollingEmitter, timeout=timeout + ) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 229c8e921..5839bc4e3 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -49,7 +49,6 @@ import pathspec # type: ignore import dropbox # type: ignore from dropbox.files import Metadata, DeletedMetadata, FileMetadata, FolderMetadata # type: ignore -from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # type: ignore from watchdog.events import ( EVENT_TYPE_CREATED, @@ -115,6 +114,7 @@ ItemType, ChangeType, ) +from .fsevents import Observer from .utils import removeprefix, sanitize_string from .utils.caches import LRUCache from .utils.path import ( From 475b7fb56ee8bb85ff4f5a22a2c25ebb1fb96df5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 22:45:32 +0000 Subject: [PATCH 307/374] [sync] remove special event ignores for macOS --- src/maestral/sync.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 5839bc4e3..89cfc8c76 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -83,7 +83,6 @@ EXCLUDED_DIR_NAMES, MIGNORE_FILE, FILE_CACHE, - IS_MACOS, ) from .errors import ( SyncError, @@ -3186,11 +3185,6 @@ def _on_remote_file(self, event: SyncEvent) -> Optional[SyncEvent]: ignore_events = [FileMovedEvent(tmp_fname, local_path)] - if IS_MACOS: - # up to two created events are sometimes emitted on macOS - ignore_events.append(FileCreatedEvent(local_path)) - ignore_events.append(FileCreatedEvent(local_path)) - if preserve_permissions: # ignore FileModifiedEvent when changing permissions ignore_events.append(FileModifiedEvent(local_path)) From 35cb31c3ae741adcca8175256b308ce1f4357cbe Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 21:34:22 +0000 Subject: [PATCH 308/374] [sync] simplify notification for local events --- src/maestral/sync.py | 75 ++++++++++++++++++++++++++------------------ 1 file changed, 44 insertions(+), 31 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 89cfc8c76..43f06f1d0 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -378,10 +378,42 @@ def on_any_event(self, event: FileSystemEvent) -> None: if self._is_ignored(event): return + self.queue_event(event) + + def queue_event(self, event: FileSystemEvent) -> None: + """ + Queues an individual file system event. Notifies / wakes up all threads that are + waiting with :meth:`wait_for_event`. + + :param event: File system event to queue. + """ with self.has_events: self.local_file_event_queue.put(event) self.has_events.notify_all() + def wait_for_event(self, timeout: float = 40) -> bool: + """ + Blocks until an event is available in the queue or a timeout occurs, whichever + comes first. You can use with method to wait for file system events in another + thread. + + .. note:: If there are multiple threads waiting for events, all of them will be + notified. If one of those threads starts getting events from + :attr:`local_file_event_queue`, other threads may find that queue empty. You + should therefore always be prepared to handle an empty queue, if if this + method returns ``True``. + + :param timeout: Maximum time to block in seconds. + :returns: ``True`` if an event is available, ``False`` if the call returns due + to a timeout. + """ + + with self.has_events: + if self.local_file_event_queue.qsize() > 0: + return True + self.has_events.wait(timeout) + return self.local_file_event_queue.qsize() > 0 + class PersistentStateMutableSet(abc.MutableSet): """Wraps a list in our state file as a MutableSet @@ -1613,13 +1645,7 @@ def wait_for_local_changes(self, timeout: float = 40) -> bool: logger.debug("Waiting for local changes since cursor: %s", self.local_cursor) - if self.fs_events.local_file_event_queue.qsize() > 0: - return True - - with self.fs_events.has_events: - self.fs_events.has_events.wait(timeout) - - return self.fs_events.local_file_event_queue.qsize() > 0 + return self.fs_events.wait_for_event(timeout) def upload_sync_cycle(self): """ @@ -3353,7 +3379,7 @@ def rescan(self, local_path: str) -> None: logger.debug('Rescanning "%s"', local_path) if osp.isfile(local_path): - self.fs_events.local_file_event_queue.put(FileModifiedEvent(local_path)) + self.fs_events.queue_event(FileModifiedEvent(local_path)) elif osp.isdir(local_path): # add created and deleted events of children as appropriate @@ -3364,9 +3390,9 @@ def rescan(self, local_path: str) -> None: for path in snapshot.paths: if snapshot.isdir(path): - self.fs_events.local_file_event_queue.put(DirCreatedEvent(path)) + self.fs_events.queue_event(DirCreatedEvent(path)) else: - self.fs_events.local_file_event_queue.put(FileModifiedEvent(path)) + self.fs_events.queue_event(FileModifiedEvent(path)) # add deleted events @@ -3377,22 +3403,16 @@ def rescan(self, local_path: str) -> None: .all() ) + dbx_root_lower = self.dropbox_path.lower() + for entry in entries: - child_path_uncased = ( - f"{self.dropbox_path}{entry.dbx_path_lower}".lower() - ) + child_path_uncased = f"{dbx_root_lower}{entry.dbx_path_lower}" if child_path_uncased not in lowercase_snapshot_paths: - local_child_path = self.to_local_path_from_cased( - entry.dbx_path_cased - ) + local_child = self.to_local_path_from_cased(entry.dbx_path_cased) if entry.is_directory: - self.fs_events.local_file_event_queue.put( - DirDeletedEvent(local_child_path) - ) + self.fs_events.queue_event(DirDeletedEvent(local_child)) else: - self.fs_events.local_file_event_queue.put( - FileDeletedEvent(local_child_path) - ) + self.fs_events.queue_event(FileDeletedEvent(local_child)) elif not osp.exists(local_path): dbx_path = self.to_dbx_path(local_path) @@ -3401,16 +3421,9 @@ def rescan(self, local_path: str) -> None: if local_entry: if local_entry.is_directory: - self.fs_events.local_file_event_queue.put( - DirDeletedEvent(local_path) - ) + self.fs_events.queue_event(DirDeletedEvent(local_path)) else: - self.fs_events.local_file_event_queue.put( - FileDeletedEvent(local_path) - ) - - with self.fs_events.has_events: - self.fs_events.has_events.notify_all() + self.fs_events.queue_event(FileDeletedEvent(local_path)) def _clean_history(self): """Commits new events and removes all events older than ``_keep_history`` from From 7eb78b8e0cbafdec560b76c545e4976a668957c0 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 4 Feb 2021 13:12:22 +0000 Subject: [PATCH 309/374] [sync] move FSEventHandler to SyncEngine --- src/maestral/main.py | 2 +- src/maestral/sync.py | 14 ++++++-------- tests/linked/test_sync.py | 2 +- tests/offline/conftest.py | 8 +++----- tests/offline/test_cleaning_events.py | 2 +- 5 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index a34acae56..8bde98e7d 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -1071,7 +1071,7 @@ def _remove_after_excluded(self, dbx_path: str) -> None: pass else: event_cls = DirDeletedEvent if osp.isdir(local_path) else FileDeletedEvent - with self.monitor.fs_event_handler.ignore(event_cls(local_path)): + with self.monitor.sync.fs_events.ignore(event_cls(local_path)): delete(local_path) def include_item(self, dbx_path: str) -> None: diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 43f06f1d0..90e00fd43 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -490,7 +490,6 @@ class SyncEngine: conflict resolution and updates to our index. :param client: Dropbox API client instance. - :param fs_events_handler: File system event handler to inform us of local events. """ sync_errors: Set[SyncError] @@ -500,11 +499,11 @@ class SyncEngine: _max_history = 1000 _num_threads = min(32, cpu_count * 3) - def __init__(self, client: DropboxClient, fs_events_handler: FSEventHandler): + def __init__(self, client: DropboxClient): self.client = client self.config_name = self.client.config_name - self.fs_events = fs_events_handler + self.fs_events = FSEventHandler() self.sync_lock = RLock() self._db_lock = RLock() @@ -3686,8 +3685,7 @@ def __init__(self, client: DropboxClient): self.added_item_queue = Queue() - self.fs_event_handler = FSEventHandler() - self.sync = SyncEngine(self.client, self.fs_event_handler) + self.sync = SyncEngine(self.client) self._startup_time = -1.0 @@ -3760,7 +3758,7 @@ def start(self) -> None: self.local_observer_thread = Observer(timeout=40) self.local_observer_thread.setName("maestral-fsobserver") self._watch = self.local_observer_thread.schedule( - self.fs_event_handler, self.sync.dropbox_path, recursive=True + self.sync.fs_events, self.sync.dropbox_path, recursive=True ) for i, emitter in enumerate(self.local_observer_thread.emitters): emitter.setName(f"maestral-fsemitter-{i}") @@ -3826,7 +3824,7 @@ def start(self) -> None: self.running.set() self.autostart.set() - self.fs_event_handler.enable() + self.sync.fs_events.enable() self.startup_thread.start() self.upload_thread.start() self.download_thread.start() @@ -3843,7 +3841,7 @@ def stop(self) -> None: logger.info("Shutting down threads...") - self.fs_event_handler.disable() + self.sync.fs_events.disable() self.running.clear() self.startup_completed.clear() self.autostart.clear() diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index cb7897be7..a21b5989b 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -191,7 +191,7 @@ def test_local_deletion_during_upload(m): # we mimic a deletion during upload by queueing a fake FileCreatedEvent fake_created_event = FileCreatedEvent(m.test_folder_local + "/file.txt") - m.monitor.fs_event_handler.local_file_event_queue.put(fake_created_event) + m.monitor.sync.fs_events.queue_event(fake_created_event) wait_for_idle(m) diff --git a/tests/offline/conftest.py b/tests/offline/conftest.py index a0c7059cb..dc1c8ca8e 100644 --- a/tests/offline/conftest.py +++ b/tests/offline/conftest.py @@ -7,7 +7,7 @@ import pytest from maestral.main import Maestral, logger -from maestral.sync import SyncEngine, Observer, FSEventHandler +from maestral.sync import SyncEngine, Observer from maestral.client import DropboxClient from maestral.config import list_configs, remove_configuration from maestral.daemon import stop_maestral_daemon_process, Stop @@ -32,10 +32,8 @@ def sync(): local_dir = osp.join(get_home_dir(), "dummy_dir") os.mkdir(local_dir) - fs_events_handler = FSEventHandler() - fs_events_handler.enable() - - sync = SyncEngine(DropboxClient("test-config"), fs_events_handler) + sync = SyncEngine(DropboxClient("test-config")) + sync.fs_events.enable() sync.dropbox_path = local_dir observer = Observer() diff --git a/tests/offline/test_cleaning_events.py b/tests/offline/test_cleaning_events.py index fe3ba97e0..5b608115a 100644 --- a/tests/offline/test_cleaning_events.py +++ b/tests/offline/test_cleaning_events.py @@ -20,7 +20,7 @@ @pytest.fixture def sync(): - sync = SyncEngine(DropboxClient("test-config"), None) + sync = SyncEngine(DropboxClient("test-config")) sync.dropbox_path = "/" yield sync From e005ee0c426a76045d50e4870162cfb93531a0f4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 4 Feb 2021 19:22:08 +0000 Subject: [PATCH 310/374] [sync] added additional debug message --- src/maestral/sync.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 90e00fd43..1ad1d69d2 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2667,6 +2667,7 @@ def list_remote_changes_iterator( # Pick up where we left off. This may be an interrupted indexing / # pagination through changes or a completely new set of changes. logger.info("Fetching remote changes...") + logger.debug("Fetching remote changes since cursor: %s", last_cursor) changes_iter = self.client.list_remote_changes_iterator(last_cursor) for changes in changes_iter: From 89691cd893392bfeb8707ad13d0a7d24468e63f5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 4 Feb 2021 22:17:33 +0000 Subject: [PATCH 311/374] [sync] don't emit DirModifiedEvent on startup scan --- src/maestral/sync.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 1ad1d69d2..876e2edd4 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1600,8 +1600,8 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa elif is_modified: if snapshot.isdir(path) and index_entry.is_directory: # type: ignore - event = DirModifiedEvent(path) - changes.append(event) + # We don't emit `DirModifiedEvent`s. + pass elif not snapshot.isdir(path) and not index_entry.is_directory: # type: ignore event = FileModifiedEvent(path) changes.append(event) From 714656fde08a3d9337090b1849babf2139561434 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 4 Feb 2021 22:18:02 +0000 Subject: [PATCH 312/374] [database] show item type in SyncEvent repr --- src/maestral/database.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/maestral/database.py b/src/maestral/database.py index cb51ae61f..b0218b6d3 100644 --- a/src/maestral/database.py +++ b/src/maestral/database.py @@ -280,7 +280,8 @@ def is_download(self) -> bool: def __repr__(self): return ( f"<{self.__class__.__name__}(direction={self.direction.name}, " - f"change_type={self.change_type.name}, dbx_path='{self.dbx_path}')>" + f"change_type={self.change_type.name}, item_type={self.item_type}, " + f"dbx_path='{self.dbx_path}')>" ) @classmethod From 3e1bfe21d60a583b41cd9bfc76a84fcc8415b34b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 11 Dec 2020 23:22:00 +0000 Subject: [PATCH 313/374] remove our own fsevents module --- src/maestral/fsevents/__init__.py | 67 ----------------------- src/maestral/fsevents/polling.py | 91 ------------------------------- src/maestral/sync.py | 1 + 3 files changed, 1 insertion(+), 158 deletions(-) delete mode 100644 src/maestral/fsevents/__init__.py delete mode 100644 src/maestral/fsevents/polling.py diff --git a/src/maestral/fsevents/__init__.py b/src/maestral/fsevents/__init__.py deleted file mode 100644 index 20c32173b..000000000 --- a/src/maestral/fsevents/__init__.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -""" -This module provides a custom polling file system event emitter for the -:obj:`watchdog` package that sorts file system events in an order which can be applied -to reproduce the new state from the old state. This is only required for the polling -emitter which uses period directory snapshots and compares them with a -:class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff` to generate file system -events. - -Looking at the source code for :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff`, -the event types are categorised as follows: - -* Created event: The inode is unique to the new snapshot. The path may be unique to the - new snapshot or exist in both. In the second case, there will be a preceding Deleted - event or a Moved event with the path as starting point (the old item was deleted or - moved away). - -* Deleted event: The inode is unique to the old snapshot. The path may be unique to the - old snapshot or exist in both. In the second case, there will be a subsequent Created - event or a Moved event with the path as end point (something else was created at or - moved to the location). - -* Moved event: The inode exists in both snapshots but with different paths. - -* Modified event: The inode exists in both snapshots and the mtime or file size are - different. DirectorySnapshotDiff will always use the inode’s path from the old - snapshot. - -From the above classification, there can be at most two created/deleted/moved events -that share the same path in one snapshot diff: - - * Deleted(path1) + Created(path1) - * Moved(path1, path2) + Created(path1) - * Deleted(path1) + Moved(path0, path1) - -Any Modified event will come before a Moved event or stand alone. Modified events will -never be combined by themselves with created or deleted events because they require the -inode to be present in both snapshots. - -From the above, we can achieve correct ordering for unique path by always adding Deleted -events to the queue first, Modified events second, Moved events third and Created events -last: - - Deleted -> Modified -> Moved -> Created - -The ordering won’t be correct between unrelated paths and between files and folder. The -first does not matter for syncing. We solve the second by assuming that when a directory -is deleted, so are its children. And before a child is created, its parent directory -must exist. - -MovedEvents which are not unique (their paths appear in other events) will be split -into Deleted and Created events by Maestral. -""" - -from watchdog.utils import platform # type: ignore -from watchdog.utils import UnsupportedLibc - - -if platform.is_linux(): - try: - from watchdog.observers.inotify import InotifyObserver as Observer # type: ignore - except UnsupportedLibc: - from .polling import OrderedPollingObserver as Observer -else: - from watchdog.observers import Observer # type: ignore - -__all__ = ["Observer"] diff --git a/src/maestral/fsevents/polling.py b/src/maestral/fsevents/polling.py deleted file mode 100644 index 3577714e0..000000000 --- a/src/maestral/fsevents/polling.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright 2011 Yesudeep Mangalapilly -# Copyright 2012 Google, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from watchdog.observers.polling import ( # type: ignore - PollingEmitter, - PollingObserver, - FileDeletedEvent, - FileModifiedEvent, - FileMovedEvent, - FileCreatedEvent, - DirDeletedEvent, - DirModifiedEvent, - DirMovedEvent, - DirCreatedEvent, - DEFAULT_OBSERVER_TIMEOUT, - BaseObserver, -) -from watchdog.utils.dirsnapshot import DirectorySnapshotDiff - - -class OrderedPollingEmitter(PollingEmitter): - """Ordered polling file system event emitter - - Platform-independent emitter that polls a directory to detect file system changes. - Events are emitted in an order which can be used to produce the new file system - state from the old one. - """ - - def queue_events(self, timeout): - # We don't want to hit the disk continuously. - # timeout behaves like an interval for polling emitters. - if self.stopped_event.wait(timeout): - return - - with self._lock: - if not self.should_keep_running(): - return - - # Get event diff between fresh snapshot and previous snapshot. - # Update snapshot. - try: - new_snapshot = self._take_snapshot() - except OSError: - self.queue_event(DirDeletedEvent(self.watch.path)) - self.stop() - return - - events = DirectorySnapshotDiff(self._snapshot, new_snapshot) - self._snapshot = new_snapshot - - # Files. - for src_path in events.files_deleted: - self.queue_event(FileDeletedEvent(src_path)) - for src_path in events.files_modified: - self.queue_event(FileModifiedEvent(src_path)) - for src_path, dest_path in events.files_moved: - self.queue_event(FileMovedEvent(src_path, dest_path)) - for src_path in events.files_created: - self.queue_event(FileCreatedEvent(src_path)) - - # Directories. - for src_path in events.dirs_deleted: - self.queue_event(DirDeletedEvent(src_path)) - for src_path in events.dirs_modified: - self.queue_event(DirModifiedEvent(src_path)) - for src_path, dest_path in events.dirs_moved: - self.queue_event(DirMovedEvent(src_path, dest_path)) - for src_path in events.dirs_created: - self.queue_event(DirCreatedEvent(src_path)) - - -class OrderedPollingObserver(PollingObserver): - def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): - BaseObserver.__init__( - self, emitter_class=OrderedPollingEmitter, timeout=timeout - ) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 876e2edd4..cdcde2b01 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -49,6 +49,7 @@ import pathspec # type: ignore import dropbox # type: ignore from dropbox.files import Metadata, DeletedMetadata, FileMetadata, FolderMetadata # type: ignore +from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # type: ignore from watchdog.events import ( EVENT_TYPE_CREATED, From 98ab28621ba681cf9c7411c6f18724a07c9e775e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 7 Jan 2021 22:06:54 +0000 Subject: [PATCH 314/374] bump watchdog to branch with macos fixes --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1e5c13369..f7ec2c8cf 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog@git+https://github.com/gorakhargosh/watchdog", + "watchdog@git+https://github.com/CCP-Aporia/watchdog.git@handle-coalesced-fsevents", ] gui_requires = [ From 4621fae106c326b36091358249a9e03cbc0d23a6 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 8 Jan 2021 16:52:24 +0000 Subject: [PATCH 315/374] [sync] ignore up to two FileCreatedEvents on move on macOS --- src/maestral/sync.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index cdcde2b01..c23cfae4a 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -84,6 +84,7 @@ EXCLUDED_DIR_NAMES, MIGNORE_FILE, FILE_CACHE, + IS_MACOS, ) from .errors import ( SyncError, @@ -3212,6 +3213,11 @@ def _on_remote_file(self, event: SyncEvent) -> Optional[SyncEvent]: ignore_events = [FileMovedEvent(tmp_fname, local_path)] + if IS_MACOS: + # up to two created events are sometimes emitted on macOS + ignore_events.append(FileCreatedEvent(local_path)) + ignore_events.append(FileCreatedEvent(local_path)) + if preserve_permissions: # ignore FileModifiedEvent when changing permissions ignore_events.append(FileModifiedEvent(local_path)) From 63a4e58049f3d9efcbb401e585b0d28975e69a47 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 18 Jan 2021 19:26:18 +0000 Subject: [PATCH 316/374] [tests] increase time to wait for idle this accommodates waiting for delayed events --- tests/linked/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index cfd26c4ec..3cc348bb1 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -130,7 +130,7 @@ def proxy(m): # helper functions -def wait_for_idle(m: Maestral, minimum: int = 10): +def wait_for_idle(m: Maestral, minimum: int = 6): """Blocks until Maestral instance is idle for at least `minimum` sec.""" t0 = time.time() From 01e1a03dc7c92f5aa5ddb8195a9695c391e46555 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 11:58:03 +0000 Subject: [PATCH 317/374] [tests] increase test timeouts --- tests/linked/conftest.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index 3cc348bb1..cfd26c4ec 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -130,7 +130,7 @@ def proxy(m): # helper functions -def wait_for_idle(m: Maestral, minimum: int = 6): +def wait_for_idle(m: Maestral, minimum: int = 10): """Blocks until Maestral instance is idle for at least `minimum` sec.""" t0 = time.time() From cd81374f9ff8cea9c3ec9f49f3357834bead36a9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 19 Jan 2021 12:46:32 +0000 Subject: [PATCH 318/374] install watchdog from master branch --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f7ec2c8cf..abe4a0823 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog@git+https://github.com/CCP-Aporia/watchdog.git@handle-coalesced-fsevents", + "watchdog@git+https://github.com/CCP-Aporia/watchdog", ] gui_requires = [ From d03e7bd17156fc6d651feef8ac12f987f7a11913 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 21 Jan 2021 18:53:21 +0000 Subject: [PATCH 319/374] switch to main watchdog repo --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index abe4a0823..1e5c13369 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog@git+https://github.com/CCP-Aporia/watchdog", + "watchdog@git+https://github.com/gorakhargosh/watchdog", ] gui_requires = [ From f49d1ac4b0b1fb6d02a9d255fac81d2b0756573c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 21:21:29 +0000 Subject: [PATCH 320/374] [fsevents] use our own polling observer again --- src/maestral/fsevents/__init__.py | 67 +++++++++++++++++++++++ src/maestral/fsevents/polling.py | 91 +++++++++++++++++++++++++++++++ src/maestral/sync.py | 1 - 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 src/maestral/fsevents/__init__.py create mode 100644 src/maestral/fsevents/polling.py diff --git a/src/maestral/fsevents/__init__.py b/src/maestral/fsevents/__init__.py new file mode 100644 index 000000000..20c32173b --- /dev/null +++ b/src/maestral/fsevents/__init__.py @@ -0,0 +1,67 @@ +# -*- coding: utf-8 -*- +""" +This module provides a custom polling file system event emitter for the +:obj:`watchdog` package that sorts file system events in an order which can be applied +to reproduce the new state from the old state. This is only required for the polling +emitter which uses period directory snapshots and compares them with a +:class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff` to generate file system +events. + +Looking at the source code for :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff`, +the event types are categorised as follows: + +* Created event: The inode is unique to the new snapshot. The path may be unique to the + new snapshot or exist in both. In the second case, there will be a preceding Deleted + event or a Moved event with the path as starting point (the old item was deleted or + moved away). + +* Deleted event: The inode is unique to the old snapshot. The path may be unique to the + old snapshot or exist in both. In the second case, there will be a subsequent Created + event or a Moved event with the path as end point (something else was created at or + moved to the location). + +* Moved event: The inode exists in both snapshots but with different paths. + +* Modified event: The inode exists in both snapshots and the mtime or file size are + different. DirectorySnapshotDiff will always use the inode’s path from the old + snapshot. + +From the above classification, there can be at most two created/deleted/moved events +that share the same path in one snapshot diff: + + * Deleted(path1) + Created(path1) + * Moved(path1, path2) + Created(path1) + * Deleted(path1) + Moved(path0, path1) + +Any Modified event will come before a Moved event or stand alone. Modified events will +never be combined by themselves with created or deleted events because they require the +inode to be present in both snapshots. + +From the above, we can achieve correct ordering for unique path by always adding Deleted +events to the queue first, Modified events second, Moved events third and Created events +last: + + Deleted -> Modified -> Moved -> Created + +The ordering won’t be correct between unrelated paths and between files and folder. The +first does not matter for syncing. We solve the second by assuming that when a directory +is deleted, so are its children. And before a child is created, its parent directory +must exist. + +MovedEvents which are not unique (their paths appear in other events) will be split +into Deleted and Created events by Maestral. +""" + +from watchdog.utils import platform # type: ignore +from watchdog.utils import UnsupportedLibc + + +if platform.is_linux(): + try: + from watchdog.observers.inotify import InotifyObserver as Observer # type: ignore + except UnsupportedLibc: + from .polling import OrderedPollingObserver as Observer +else: + from watchdog.observers import Observer # type: ignore + +__all__ = ["Observer"] diff --git a/src/maestral/fsevents/polling.py b/src/maestral/fsevents/polling.py new file mode 100644 index 000000000..3577714e0 --- /dev/null +++ b/src/maestral/fsevents/polling.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright 2011 Yesudeep Mangalapilly +# Copyright 2012 Google, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from watchdog.observers.polling import ( # type: ignore + PollingEmitter, + PollingObserver, + FileDeletedEvent, + FileModifiedEvent, + FileMovedEvent, + FileCreatedEvent, + DirDeletedEvent, + DirModifiedEvent, + DirMovedEvent, + DirCreatedEvent, + DEFAULT_OBSERVER_TIMEOUT, + BaseObserver, +) +from watchdog.utils.dirsnapshot import DirectorySnapshotDiff + + +class OrderedPollingEmitter(PollingEmitter): + """Ordered polling file system event emitter + + Platform-independent emitter that polls a directory to detect file system changes. + Events are emitted in an order which can be used to produce the new file system + state from the old one. + """ + + def queue_events(self, timeout): + # We don't want to hit the disk continuously. + # timeout behaves like an interval for polling emitters. + if self.stopped_event.wait(timeout): + return + + with self._lock: + if not self.should_keep_running(): + return + + # Get event diff between fresh snapshot and previous snapshot. + # Update snapshot. + try: + new_snapshot = self._take_snapshot() + except OSError: + self.queue_event(DirDeletedEvent(self.watch.path)) + self.stop() + return + + events = DirectorySnapshotDiff(self._snapshot, new_snapshot) + self._snapshot = new_snapshot + + # Files. + for src_path in events.files_deleted: + self.queue_event(FileDeletedEvent(src_path)) + for src_path in events.files_modified: + self.queue_event(FileModifiedEvent(src_path)) + for src_path, dest_path in events.files_moved: + self.queue_event(FileMovedEvent(src_path, dest_path)) + for src_path in events.files_created: + self.queue_event(FileCreatedEvent(src_path)) + + # Directories. + for src_path in events.dirs_deleted: + self.queue_event(DirDeletedEvent(src_path)) + for src_path in events.dirs_modified: + self.queue_event(DirModifiedEvent(src_path)) + for src_path, dest_path in events.dirs_moved: + self.queue_event(DirMovedEvent(src_path, dest_path)) + for src_path in events.dirs_created: + self.queue_event(DirCreatedEvent(src_path)) + + +class OrderedPollingObserver(PollingObserver): + def __init__(self, timeout=DEFAULT_OBSERVER_TIMEOUT): + BaseObserver.__init__( + self, emitter_class=OrderedPollingEmitter, timeout=timeout + ) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index c23cfae4a..9f135d10e 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -49,7 +49,6 @@ import pathspec # type: ignore import dropbox # type: ignore from dropbox.files import Metadata, DeletedMetadata, FileMetadata, FolderMetadata # type: ignore -from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler # type: ignore from watchdog.events import ( EVENT_TYPE_CREATED, From be39d621186d866bee286fc2ee455de801d0bca5 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Wed, 3 Feb 2021 22:45:32 +0000 Subject: [PATCH 321/374] [sync] remove special event ignores for macOS --- src/maestral/sync.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 9f135d10e..876e2edd4 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -83,7 +83,6 @@ EXCLUDED_DIR_NAMES, MIGNORE_FILE, FILE_CACHE, - IS_MACOS, ) from .errors import ( SyncError, @@ -3212,11 +3211,6 @@ def _on_remote_file(self, event: SyncEvent) -> Optional[SyncEvent]: ignore_events = [FileMovedEvent(tmp_fname, local_path)] - if IS_MACOS: - # up to two created events are sometimes emitted on macOS - ignore_events.append(FileCreatedEvent(local_path)) - ignore_events.append(FileCreatedEvent(local_path)) - if preserve_permissions: # ignore FileModifiedEvent when changing permissions ignore_events.append(FileModifiedEvent(local_path)) From 690d2a8d32cce7fa7cc5d71e6a7daa98862889f9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 5 Feb 2021 01:14:48 +0000 Subject: [PATCH 322/374] [tests] reduce wait_for_idle time --- tests/linked/conftest.py | 2 +- tests/linked/test_sync.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index cfd26c4ec..d90922313 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -130,7 +130,7 @@ def proxy(m): # helper functions -def wait_for_idle(m: Maestral, minimum: int = 10): +def wait_for_idle(m: Maestral, minimum: int = 5): """Blocks until Maestral instance is idle for at least `minimum` sec.""" t0 = time.time() diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index a21b5989b..ea68a8180 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -521,6 +521,8 @@ def test_local_file_replaced_by_folder_and_unsynced_remote_changes(m): mode=WriteMode.overwrite, ) + wait_for_idle(m) + m.start_sync() wait_for_idle(m) From 0218f2662ef50abe604d783bbe8a3c233f4ef429 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 11 Feb 2021 13:49:59 +0000 Subject: [PATCH 323/374] bump to watchdog 2.0 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1e5c13369..617b46efc 100644 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ "setuptools", "sqlalchemy>=1.3", "survey>=3.2.2,<4.0", - "watchdog@git+https://github.com/gorakhargosh/watchdog", + "watchdog>=2.0", ] gui_requires = [ From 78b262244993a10c9bedb7f7abd9d9be6ac3b514 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 11 Feb 2021 13:52:26 +0000 Subject: [PATCH 324/374] [fsevents] moved doc strings for polling emitter --- src/maestral/fsevents/__init__.py | 44 ---------------------------- src/maestral/fsevents/polling.py | 48 +++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/src/maestral/fsevents/__init__.py b/src/maestral/fsevents/__init__.py index 20c32173b..24102c880 100644 --- a/src/maestral/fsevents/__init__.py +++ b/src/maestral/fsevents/__init__.py @@ -6,50 +6,6 @@ emitter which uses period directory snapshots and compares them with a :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff` to generate file system events. - -Looking at the source code for :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff`, -the event types are categorised as follows: - -* Created event: The inode is unique to the new snapshot. The path may be unique to the - new snapshot or exist in both. In the second case, there will be a preceding Deleted - event or a Moved event with the path as starting point (the old item was deleted or - moved away). - -* Deleted event: The inode is unique to the old snapshot. The path may be unique to the - old snapshot or exist in both. In the second case, there will be a subsequent Created - event or a Moved event with the path as end point (something else was created at or - moved to the location). - -* Moved event: The inode exists in both snapshots but with different paths. - -* Modified event: The inode exists in both snapshots and the mtime or file size are - different. DirectorySnapshotDiff will always use the inode’s path from the old - snapshot. - -From the above classification, there can be at most two created/deleted/moved events -that share the same path in one snapshot diff: - - * Deleted(path1) + Created(path1) - * Moved(path1, path2) + Created(path1) - * Deleted(path1) + Moved(path0, path1) - -Any Modified event will come before a Moved event or stand alone. Modified events will -never be combined by themselves with created or deleted events because they require the -inode to be present in both snapshots. - -From the above, we can achieve correct ordering for unique path by always adding Deleted -events to the queue first, Modified events second, Moved events third and Created events -last: - - Deleted -> Modified -> Moved -> Created - -The ordering won’t be correct between unrelated paths and between files and folder. The -first does not matter for syncing. We solve the second by assuming that when a directory -is deleted, so are its children. And before a child is created, its parent directory -must exist. - -MovedEvents which are not unique (their paths appear in other events) will be split -into Deleted and Created events by Maestral. """ from watchdog.utils import platform # type: ignore diff --git a/src/maestral/fsevents/polling.py b/src/maestral/fsevents/polling.py index 3577714e0..3768674bf 100644 --- a/src/maestral/fsevents/polling.py +++ b/src/maestral/fsevents/polling.py @@ -1,6 +1,50 @@ -#!/usr/bin/env python # -*- coding: utf-8 -*- -# +""" +Looking at the source code for :class:`watchdog.utils.dirsnapshot.DirectorySnapshotDiff`, +the event types are categorised as follows: + +* Created event: The inode is unique to the new snapshot. The path may be unique to the + new snapshot or exist in both. In the second case, there will be a preceding Deleted + event or a Moved event with the path as starting point (the old item was deleted or + moved away). + +* Deleted event: The inode is unique to the old snapshot. The path may be unique to the + old snapshot or exist in both. In the second case, there will be a subsequent Created + event or a Moved event with the path as end point (something else was created at or + moved to the location). + +* Moved event: The inode exists in both snapshots but with different paths. + +* Modified event: The inode exists in both snapshots and the mtime or file size are + different. DirectorySnapshotDiff will always use the inode’s path from the old + snapshot. + +From the above classification, there can be at most two created/deleted/moved events +that share the same path in one snapshot diff: + + * Deleted(path1) + Created(path1) + * Moved(path1, path2) + Created(path1) + * Deleted(path1) + Moved(path0, path1) + +Any Modified event will come before a Moved event or stand alone. Modified events will +never be combined by themselves with created or deleted events because they require the +inode to be present in both snapshots. + +From the above, we can achieve correct ordering for unique path by always adding Deleted +events to the queue first, Modified events second, Moved events third and Created events +last: + + Deleted -> Modified -> Moved -> Created + +The ordering won’t be correct between unrelated paths and between files and folder. The +first does not matter for syncing. We solve the second by assuming that when a directory +is deleted, so are its children. And before a child is created, its parent directory +must exist. + +MovedEvents which are not unique (their paths appear in other events) will be split +into Deleted and Created events by Maestral. +""" + # Copyright 2011 Yesudeep Mangalapilly # Copyright 2012 Google, Inc. # From 4cbcacb9f184b949d98eb5dbf43434d8f65a2c7e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 11 Feb 2021 14:43:58 +0000 Subject: [PATCH 325/374] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19b024918..6e15916a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,6 +62,7 @@ * 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 from Maestral, built on the code from the `notify` module. * Removed bugsnag dependency. From a0d231ff473d0f565404abe82db6a4b1a43bb989 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Thu, 11 Feb 2021 22:50:00 +0000 Subject: [PATCH 326/374] bump desktop-notifier to 3.1.2 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 617b46efc..e6ff2bbdd 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ install_requires = [ "alembic>=1.3", "click>=7.1.1", - "desktop-notifier>=3.1", + "desktop-notifier>=3.1.2", "dropbox>=10.9.0,<12.0", "fasteners>=0.15", "importlib_metadata;python_version<'3.8'", From 4417257e773310482ae04a6708ae3579f7b0bd9e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 01:11:51 +0000 Subject: [PATCH 327/374] [tests] record fsevents log --- tests/linked/conftest.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/linked/conftest.py b/tests/linked/conftest.py index d90922313..281621828 100644 --- a/tests/linked/conftest.py +++ b/tests/linked/conftest.py @@ -27,6 +27,8 @@ resources = os.path.dirname(__file__) + "/resources" +fsevents_logger = logging.getLogger("fsevents") +fsevents_logger.setLevel(logging.DEBUG) logger.setLevel(logging.DEBUG) From 4c81529d073da88e3bc7531ab946e56b3d35d4fb Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 01:12:03 +0000 Subject: [PATCH 328/374] [tests] use sync_lock instead of start / stop --- tests/linked/test_sync.py | 107 ++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 62 deletions(-) diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index ea68a8180..1206e9d20 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -311,14 +311,12 @@ def test_remote_file_replaced_by_folder(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) + with m.sync.sync_lock: - # replace remote file with folder - m.client.remove("/sync_tests/file.txt") - m.client.make_dir("/sync_tests/file.txt") + # replace remote file with folder + m.client.remove("/sync_tests/file.txt") + m.client.make_dir("/sync_tests/file.txt") - m.start_sync() wait_for_idle(m) assert_synced(m) @@ -338,18 +336,16 @@ def test_remote_file_replaced_by_folder_and_unsynced_local_changes(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) + with m.sync.sync_lock: - # replace remote file with folder - m.client.remove("/sync_tests/file.txt") - m.client.make_dir("/sync_tests/file.txt") + # replace remote file with folder + m.client.remove("/sync_tests/file.txt") + m.client.make_dir("/sync_tests/file.txt") - # create local changes - with open(m.test_folder_local + "/file.txt", "a") as f: - f.write(" modified") + # create local changes + with open(m.test_folder_local + "/file.txt", "a") as f: + f.write(" modified") - m.start_sync() wait_for_idle(m) assert_synced(m) @@ -367,14 +363,12 @@ def test_remote_folder_replaced_by_file(m): m.client.make_dir("/sync_tests/folder") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) - # replace remote folder with file - m.client.remove("/sync_tests/folder") - m.client.upload(resources + "/file.txt", "/sync_tests/folder") - m.start_sync() + with m.sync.sync_lock: + m.client.remove("/sync_tests/folder") + m.client.upload(resources + "/file.txt", "/sync_tests/folder") + wait_for_idle(m) assert_synced(m) @@ -394,17 +388,15 @@ def test_remote_folder_replaced_by_file_and_unsynced_local_changes(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) + with m.sync.sync_lock: - # replace remote folder with file - m.client.remove("/sync_tests/folder") - m.client.upload(resources + "/file.txt", "/sync_tests/folder") + # replace remote folder with file + m.client.remove("/sync_tests/folder") + m.client.upload(resources + "/file.txt", "/sync_tests/folder") - # create local changes - os.mkdir(m.test_folder_local + "/folder/subfolder") + # create local changes + os.mkdir(m.test_folder_local + "/folder/subfolder") - m.start_sync() wait_for_idle(m) assert_synced(m) @@ -422,13 +414,12 @@ def test_local_folder_replaced_by_file(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.stop_sync() + with m.sync.sync_lock: - # replace local folder with file - delete(m.test_folder_local + "/folder") - shutil.copy(resources + "/file.txt", m.test_folder_local + "/folder") + # replace local folder with file + delete(m.test_folder_local + "/folder") + shutil.copy(resources + "/file.txt", m.test_folder_local + "/folder") - m.start_sync() wait_for_idle(m) assert_synced(m) @@ -450,17 +441,15 @@ def test_local_folder_replaced_by_file_and_unsynced_remote_changes(m): os.mkdir(m.test_folder_local + "/folder") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) + with m.sync.sync_lock: - # replace local folder with file - delete(m.test_folder_local + "/folder") - shutil.copy(resources + "/file.txt", m.test_folder_local + "/folder") + # replace local folder with file + delete(m.test_folder_local + "/folder") + shutil.copy(resources + "/file.txt", m.test_folder_local + "/folder") - # create remote changes - m.client.upload(resources + "/file1.txt", "/sync_tests/folder/file.txt") + # create remote changes + m.client.upload(resources + "/file1.txt", "/sync_tests/folder/file.txt") - m.start_sync() wait_for_idle(m) assert_synced(m) @@ -477,14 +466,12 @@ def test_local_file_replaced_by_folder(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) + with m.sync.sync_lock: - # replace local file with folder - os.unlink(m.test_folder_local + "/file.txt") - os.mkdir(m.test_folder_local + "/file.txt") + # replace local file with folder + os.unlink(m.test_folder_local + "/file.txt") + os.mkdir(m.test_folder_local + "/file.txt") - m.start_sync() wait_for_idle(m) assert_synced(m) @@ -507,23 +494,19 @@ def test_local_file_replaced_by_folder_and_unsynced_remote_changes(m): shutil.copy(resources + "/file.txt", m.test_folder_local + "/file.txt") wait_for_idle(m) - m.stop_sync() - wait_for_idle(m) + with m.sync.sync_lock: - # replace local file with folder - os.unlink(m.test_folder_local + "/file.txt") - os.mkdir(m.test_folder_local + "/file.txt") + # replace local file with folder + os.unlink(m.test_folder_local + "/file.txt") + os.mkdir(m.test_folder_local + "/file.txt") - # create remote changes - m.client.upload( - resources + "/file1.txt", - "/sync_tests/file.txt", - mode=WriteMode.overwrite, - ) - - wait_for_idle(m) + # create remote changes + m.client.upload( + resources + "/file1.txt", + "/sync_tests/file.txt", + mode=WriteMode.overwrite, + ) - m.start_sync() wait_for_idle(m) assert_synced(m) From 1640cee80fc97eda3a222a54cc6cb9c1f3de51e1 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 11:48:34 +0000 Subject: [PATCH 329/374] slightly relax performance requirement GH runners on macOS are sometimes a bit slow... --- tests/linked/test_sync.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/linked/test_sync.py b/tests/linked/test_sync.py index 1206e9d20..eaa013972 100644 --- a/tests/linked/test_sync.py +++ b/tests/linked/test_sync.py @@ -916,7 +916,7 @@ def generate_sync_events(): duration = timeit.timeit(stmt=generate_sync_events, setup=setup, number=n_loops) - assert duration < 3 # expected ~ 1.8 sec + assert duration < 4 # expected ~ 1.8 sec def test_invalid_pending_download(m): From 50accf7970b0fe2213116504d9a148fb7046ce46 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 8 Feb 2021 01:05:02 +0000 Subject: [PATCH 330/374] improve fswatch error handling see #305 --- src/maestral/client.py | 55 ------------------------ src/maestral/sync.py | 94 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 87 insertions(+), 62 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index 1cece699a..fad65fbb5 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -65,8 +65,6 @@ TokenRevokedError, CursorResetError, DropboxServerError, - NoDropboxDirError, - InotifyError, NotLinkedError, InvalidDbidError, SharedLinkError, @@ -84,7 +82,6 @@ "DropboxClient", "dropbox_to_maestral_error", "os_to_maestral_error", - "fswatch_to_maestral_error", "convert_api_errors", ] @@ -1155,58 +1152,6 @@ def os_to_maestral_error( return maestral_exc -def fswatch_to_maestral_error(exc: OSError) -> LocalError: - """ - Converts a :class:`OSError` when starting a file system watch to a - :class:`MaestralApiError` and tries to add a reasonably informative error title and - message. Error messages and types differ from :func:`os_to_maestral_error`. - - :param exc: Python Exception. - :returns: :class:`MaestralApiError` instance or :class:`OSError` instance. - """ - - error_number = getattr(exc, "errno", -1) - err_cls: Type[MaestralApiError] - - if isinstance(exc, NotADirectoryError): - title = "Dropbox folder has been moved or deleted" - msg = ( - "Please move the Dropbox folder back to its original location " - "or restart Maestral to set up a new folder." - ) - - err_cls = NoDropboxDirError - elif isinstance(exc, PermissionError): - title = "Insufficient permissions for Dropbox folder" - msg = ( - "Please ensure that you have read and write permissions " - "for the selected Dropbox folder." - ) - err_cls = InsufficientPermissionsError - - elif error_number in (errno.ENOSPC, errno.EMFILE): - title = "Inotify limit reached" - if error_number == errno.ENOSPC: - new_config = "fs.inotify.max_user_watches=524288" - else: - new_config = "fs.inotify.max_user_instances=512" - msg = ( - "Changes to your Dropbox folder cannot be monitored because it " - "contains too many items. Please increase the inotify limit in " - "your system by adding the following line to /etc/sysctl.conf: " - + new_config - ) - err_cls = InotifyError - - else: - return exc - - maestral_exc = err_cls(title, msg) - maestral_exc.__cause__ = exc - - return maestral_exc - - def dropbox_to_maestral_error( exc: exceptions.DropboxException, dbx_path: Optional[str] = None, diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 876e2edd4..02daae7ab 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -5,6 +5,7 @@ import sys import os import os.path as osp +import errno from stat import S_ISDIR import socket import resource @@ -85,6 +86,7 @@ FILE_CACHE, ) from .errors import ( + MaestralApiError, SyncError, NoDropboxDirError, CacheDirError, @@ -95,12 +97,13 @@ FolderConflictError, InvalidDbidError, DatabaseError, + InsufficientPermissionsError, + InotifyError, ) from .client import ( DropboxClient, os_to_maestral_error, convert_api_errors, - fswatch_to_maestral_error, ) from .database import ( Base, @@ -749,6 +752,16 @@ def iter_index(self) -> Iterator[IndexEntry]: for entry in self._db_session.query(IndexEntry).yield_per(1000): yield entry + def index_count(self) -> int: + """ + Returns the number if items in our index without loading any items. + + :returns: Number of index entries. + """ + + with self._database_access(): + return self._db_session.query(IndexEntry).count() + def get_local_rev(self, dbx_path: str) -> Optional[str]: """ Gets revision number of local file. @@ -3815,12 +3828,55 @@ def start(self) -> None: try: self.local_observer_thread.start() - except OSError as err: - new_err = fswatch_to_maestral_error(err) - title = getattr(err, "title", "Unexpected error") - message = getattr(err, "message", "Please restart to continue syncing") - logger.error(f"{title}: {message}", exc_info=exc_info_tuple(new_err)) - self.sync.notifier.notify(title, message, level=notify.ERROR) + except OSError as exc: + + err_cls: Type[MaestralApiError] + + if isinstance(exc, NotADirectoryError): + title = "Dropbox folder has been moved or deleted" + msg = ( + "Please move the Dropbox folder back to its original location " + "or restart Maestral to set up a new folder." + ) + + err_cls = NoDropboxDirError + elif isinstance(exc, PermissionError): + title = "Insufficient permissions for Dropbox folder" + msg = ( + "Please ensure that you have read and write permissions " + "for the selected Dropbox folder." + ) + err_cls = InsufficientPermissionsError + + elif exc.errno in (errno.ENOSPC, errno.EMFILE): + title = "Inotify limit reached" + + try: + max_user_watches, max_user_instances, _ = get_intofy_limits() + except OSError: + max_user_watches, max_user_instances = 2 ** 18, 2 ** 9 + + if exc.errno == errno.ENOSPC: + n_new = max(2 ** 19, 2 * max_user_watches) + new_config = f"fs.inotify.max_user_watches={n_new}" + else: + n_new = max(2 ** 10, 2 * max_user_instances) + new_config = f"fs.inotify.max_user_instances={n_new}" + + msg = ( + "Changes to your Dropbox folder cannot be monitored because it " + "contains too many items. Please increase the inotify limit in " + "your system by adding the following line to /etc/sysctl.conf and " + "restart your PC: " + new_config + ) + err_cls = InotifyError + + else: + title = "Could not start watch of local directory" + msg = exc.strerror + err_cls = MaestralApiError + + raise err_cls(title, msg) self.running.set() self.autostart.set() @@ -4103,3 +4159,27 @@ def validate_encoding(local_path: str) -> None: error.local_path = local_path raise error + + +def get_intofy_limits() -> Tuple[int, int, int]: + """ + Returns the current inotify limit settings as tuple. + + :returns: ``(max_user_watches, max_user_instances, max_queued_events)`` + :raises OSError: if the settings cannot be read from /proc/sys/fs/inotify. This may + happen if /proc/sys is left out of the kernel image or simply not mounted. + """ + + from pathlib import Path + + root = Path("/proc/sys/fs/inotify") + + max_user_watches_path = root / "max_user_watches" + max_user_instances_path = root / "max_user_instances" + max_queued_events_path = root / "max_queued_events" + + max_user_watches = int(max_user_watches_path.read_bytes().strip()) + max_user_instances = int(max_user_instances_path.read_bytes().strip()) + max_queued_events = int(max_queued_events_path.read_bytes().strip()) + + return max_user_watches, max_user_instances, max_queued_events From f667b6fd9b1b5b8172ce8fa8bc32dc1625ffc2e9 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 15:23:58 +0000 Subject: [PATCH 331/374] moved all platform integrations to integration module --- src/maestral/sync.py | 102 ++++------------------------- src/maestral/utils/integration.py | 105 ++++++++++++++++++++++++++++-- 2 files changed, 112 insertions(+), 95 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 02daae7ab..35adc10b8 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -7,8 +7,6 @@ import os.path as osp import errno from stat import S_ISDIR -import socket -import resource import logging import time import random @@ -119,6 +117,12 @@ from .fsevents import Observer from .utils import removeprefix, sanitize_string from .utils.caches import LRUCache +from .utils.integration import ( + get_inotify_limits, + cpu_usage_percent, + check_connection, + CPU_COUNT, +) from .utils.path import ( generate_cc_name, cased_path_candidates, @@ -153,7 +157,7 @@ logger = logging.getLogger(__name__) -cpu_count = os.cpu_count() or 1 # os.cpu_count can return None + umask = os.umask(0o22) os.umask(umask) @@ -500,7 +504,7 @@ class SyncEngine: _case_conversion_cache: LRUCache _max_history = 1000 - _num_threads = min(32, cpu_count * 3) + _num_threads = min(32, CPU_COUNT * 3) def __init__(self, client: DropboxClient): @@ -568,7 +572,7 @@ def __init__(self, client: DropboxClient): self._is_case_sensitive = is_fs_case_sensitive(get_home_dir()) self._mignore_rules = self._load_mignore_rules_form_file() self._excluded_items = self._conf.get("main", "excluded_items") - self._max_cpu_percent = self._conf.get("sync", "max_cpu_percent") * cpu_count + self._max_cpu_percent = self._conf.get("sync", "max_cpu_percent") * CPU_COUNT # caches self._case_conversion_cache = LRUCache(capacity=5000) @@ -664,7 +668,7 @@ def max_cpu_percent(self) -> float: def max_cpu_percent(self, percent: float) -> None: """Setter: max_cpu_percent.""" self._max_cpu_percent = percent - self._conf.set("app", "max_cpu_percent", percent // cpu_count) + self._conf.set("app", "max_cpu_percent", percent // CPU_COUNT) # ==== sync state ================================================================== @@ -3852,7 +3856,7 @@ def start(self) -> None: title = "Inotify limit reached" try: - max_user_watches, max_user_instances, _ = get_intofy_limits() + max_user_watches, max_user_instances, _ = get_inotify_limits() except OSError: max_user_watches, max_user_instances = 2 ** 18, 2 ** 9 @@ -4069,66 +4073,6 @@ def throttled_log( _last_emit = time.time() -def cpu_usage_percent(interval: float = 0.1) -> float: - """ - Returns a float representing the CPU utilization of the current process as a - percentage. This duplicates the similar method from psutil to avoid the psutil - dependency. - - Compares process times to system CPU times elapsed before and after the interval - (blocking). It is recommended for accuracy that this function be called with an - interval of at least 0.1 sec. - - A value > 100.0 can be returned in case of processes running multiple threads on - different CPU cores. The returned value is explicitly NOT split evenly between all - available logical CPUs. This means that a busy loop process running on a system with - 2 logical CPUs will be reported as having 100% CPU utilization instead of 50%. - - :param interval: Interval in sec between comparisons of CPU times. - :returns: CPU usage during interval in percent. - """ - - if not interval > 0: - raise ValueError(f"interval is not positive (got {interval!r})") - - def timer(): - return time.monotonic() * cpu_count - - st1 = timer() - rt1 = resource.getrusage(resource.RUSAGE_SELF) - time.sleep(interval) - st2 = timer() - rt2 = resource.getrusage(resource.RUSAGE_SELF) - - delta_proc = (rt2.ru_utime - rt1.ru_utime) + (rt2.ru_stime - rt1.ru_stime) - delta_time = st2 - st1 - - try: - overall_cpus_percent = (delta_proc / delta_time) * 100 - except ZeroDivisionError: - return 0.0 - else: - single_cpu_percent = overall_cpus_percent * cpu_count - return round(single_cpu_percent, 1) - - -def check_connection(hostname: str) -> bool: - """ - A low latency check for an internet connection. - - :param hostname: Hostname to use for connection check. - :returns: Connection availability. - """ - try: - host = socket.gethostbyname(hostname) - s = socket.create_connection((host, 80), 2) - s.close() - return True - except Exception: - logger.debug("Connection error", exc_info=True) - return False - - def validate_encoding(local_path: str) -> None: """ Validate that the path contains only characters in the reported file system @@ -4159,27 +4103,3 @@ def validate_encoding(local_path: str) -> None: error.local_path = local_path raise error - - -def get_intofy_limits() -> Tuple[int, int, int]: - """ - Returns the current inotify limit settings as tuple. - - :returns: ``(max_user_watches, max_user_instances, max_queued_events)`` - :raises OSError: if the settings cannot be read from /proc/sys/fs/inotify. This may - happen if /proc/sys is left out of the kernel image or simply not mounted. - """ - - from pathlib import Path - - root = Path("/proc/sys/fs/inotify") - - max_user_watches_path = root / "max_user_watches" - max_user_instances_path = root / "max_user_instances" - max_queued_events_path = root / "max_queued_events" - - max_user_watches = int(max_user_watches_path.read_bytes().strip()) - max_user_instances = int(max_user_instances_path.read_bytes().strip()) - max_queued_events = int(max_queued_events_path.read_bytes().strip()) - - return max_user_watches, max_user_instances, max_queued_events diff --git a/src/maestral/utils/integration.py b/src/maestral/utils/integration.py index 7a7e7e348..cd98ba825 100644 --- a/src/maestral/utils/integration.py +++ b/src/maestral/utils/integration.py @@ -1,19 +1,32 @@ # -*- coding: utf-8 -*- """ -This module provides some basic platform integration. At the moment, it only provides -code to determine if the device is connected to AC power. +This module provides functions for platform integration. Most of the functionality here +could also be achieved with psutils but we want to avoid the large dependency. """ import os import platform import enum +import resource +import socket +import time +import logging from pathlib import Path -from typing import Union +from typing import Union, Tuple +__all__ = [ + "get_ac_state", + "ACState", + "get_inotify_limits", + "CPU_COUNT", + "cpu_usage_percent", + "check_connection", +] -__all__ = ["get_ac_state", "ACState"] +logger = logging.getLogger(__name__) +CPU_COUNT = os.cpu_count() or 1 # os.cpu_count can return None LINUX_POWER_SUPPLY_PATH = "/sys/class/power_supply" @@ -111,3 +124,87 @@ def get_ac_state() -> ACState: return ACState.Connected return ACState.Undetermined + + +def get_inotify_limits() -> Tuple[int, int, int]: + """ + Returns the current inotify limit settings as tuple. + + :returns: ``(max_user_watches, max_user_instances, max_queued_events)`` + :raises OSError: if the settings cannot be read from /proc/sys/fs/inotify. This may + happen if /proc/sys is left out of the kernel image or simply not mounted. + """ + + from pathlib import Path + + root = Path("/proc/sys/fs/inotify") + + max_user_watches_path = root / "max_user_watches" + max_user_instances_path = root / "max_user_instances" + max_queued_events_path = root / "max_queued_events" + + max_user_watches = int(max_user_watches_path.read_bytes().strip()) + max_user_instances = int(max_user_instances_path.read_bytes().strip()) + max_queued_events = int(max_queued_events_path.read_bytes().strip()) + + return max_user_watches, max_user_instances, max_queued_events + + +def cpu_usage_percent(interval: float = 0.1) -> float: + """ + Returns a float representing the CPU utilization of the current process as a + percentage. This duplicates the similar method from psutil to avoid the psutil + dependency. + + Compares process times to system CPU times elapsed before and after the interval + (blocking). It is recommended for accuracy that this function be called with an + interval of at least 0.1 sec. + + A value > 100.0 can be returned in case of processes running multiple threads on + different CPU cores. The returned value is explicitly NOT split evenly between all + available logical CPUs. This means that a busy loop process running on a system with + 2 logical CPUs will be reported as having 100% CPU utilization instead of 50%. + + :param interval: Interval in sec between comparisons of CPU times. + :returns: CPU usage during interval in percent. + """ + + if not interval > 0: + raise ValueError(f"interval is not positive (got {interval!r})") + + def timer(): + return time.monotonic() * CPU_COUNT + + st1 = timer() + rt1 = resource.getrusage(resource.RUSAGE_SELF) + time.sleep(interval) + st2 = timer() + rt2 = resource.getrusage(resource.RUSAGE_SELF) + + delta_proc = (rt2.ru_utime - rt1.ru_utime) + (rt2.ru_stime - rt1.ru_stime) + delta_time = st2 - st1 + + try: + overall_cpus_percent = (delta_proc / delta_time) * 100 + except ZeroDivisionError: + return 0.0 + else: + single_cpu_percent = overall_cpus_percent * CPU_COUNT + return round(single_cpu_percent, 1) + + +def check_connection(hostname: str) -> bool: + """ + A low latency check for an internet connection. + + :param hostname: Hostname to use for connection check. + :returns: Connection availability. + """ + try: + host = socket.gethostbyname(hostname) + s = socket.create_connection((host, 80), 2) + s.close() + return True + except Exception: + logger.debug("Connection error", exc_info=True) + return False From 2e17d0ce4895fee69ed44441f9601e1b7ce22b93 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 15:30:47 +0000 Subject: [PATCH 332/374] advise to reload instead of reboot --- src/maestral/sync.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 35adc10b8..3405c0a66 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3869,9 +3869,9 @@ def start(self) -> None: msg = ( "Changes to your Dropbox folder cannot be monitored because it " - "contains too many items. Please increase the inotify limit in " - "your system by adding the following line to /etc/sysctl.conf and " - "restart your PC: " + new_config + "contains too many items. Please increase the inotify limit by " + "adding the following line to /etc/sysctl.conf, then apply the " + 'settings with "sysctl -p":\n\n' + new_config ) err_cls = InotifyError From 8621caf9910ac81aaa9b32c8f283894fba5ba71a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 15:37:31 +0000 Subject: [PATCH 333/374] added changelog entry --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e15916a6..f26968602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ `link`, `unlink` and `status`. * Renamed command `file-status` to `filestatus`. * Added a `--yes, -Y` flag to the `unlink` to command to skip the confirmation prompt. +* Improved error message when the user is running out of inotify watches: Recommend + default values of `max_user_watches = 524,288` and `max_user_instances = 1024` or + double the current values, whichever is higher. Advise to apply the changes with + `sysctl -p`. #### Fixed: From 47d7f6726cf182e5d372dfba5fc7f4a74b5e5910 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Tue, 9 Feb 2021 16:24:05 +0000 Subject: [PATCH 334/374] don't raise InotifyError during startup --- src/maestral/daemon.py | 3 ++- src/maestral/sync.py | 28 +++++++++------------------- 2 files changed, 11 insertions(+), 20 deletions(-) diff --git a/src/maestral/daemon.py b/src/maestral/daemon.py index ca3ef5a1d..cb6a88128 100644 --- a/src/maestral/daemon.py +++ b/src/maestral/daemon.py @@ -403,7 +403,8 @@ def start_maestral_daemon( :param config_name: The name of the Maestral configuration to use. :param log_to_stdout: If ``True``, write logs to stdout. - :param start_sync: If ``True``, start syncing once the daemon has started. + :param start_sync: If ``True``, start syncing once the daemon has started. If the + ``start_sync`` call fails, an error will be logged but not raised. :raises RuntimeError: if a daemon for the given ``config_name`` is already running. """ diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 3405c0a66..268f8b61a 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -95,7 +95,6 @@ FolderConflictError, InvalidDbidError, DatabaseError, - InsufficientPermissionsError, InotifyError, ) from .client import ( @@ -3836,23 +3835,7 @@ def start(self) -> None: err_cls: Type[MaestralApiError] - if isinstance(exc, NotADirectoryError): - title = "Dropbox folder has been moved or deleted" - msg = ( - "Please move the Dropbox folder back to its original location " - "or restart Maestral to set up a new folder." - ) - - err_cls = NoDropboxDirError - elif isinstance(exc, PermissionError): - title = "Insufficient permissions for Dropbox folder" - msg = ( - "Please ensure that you have read and write permissions " - "for the selected Dropbox folder." - ) - err_cls = InsufficientPermissionsError - - elif exc.errno in (errno.ENOSPC, errno.EMFILE): + if exc.errno in (errno.ENOSPC, errno.EMFILE): title = "Inotify limit reached" try: @@ -3875,12 +3858,19 @@ def start(self) -> None: ) err_cls = InotifyError + elif PermissionError: + title = "Insufficient permissions to monitor local changes" + msg = "Please check the permissions for your local Dropbox folder" + err_cls = InotifyError + else: title = "Could not start watch of local directory" msg = exc.strerror err_cls = MaestralApiError - raise err_cls(title, msg) + new_error = err_cls(title, msg) + logger.error(title, exc_info=exc_info_tuple(new_error)) + self.sync.notifier.notify(title, msg, level=notify.ERROR) self.running.set() self.autostart.set() From 9329a64a6a0c6e478b597fd978a064d492378154 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 12:59:50 +0000 Subject: [PATCH 335/374] [tests] added test for inotify error --- tests/linked/test_main.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/tests/linked/test_main.py b/tests/linked/test_main.py index bd55cecac..3e4f693dc 100644 --- a/tests/linked/test_main.py +++ b/tests/linked/test_main.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- +import sys import os import os.path as osp import shutil import requests +import subprocess import pytest @@ -11,6 +13,7 @@ from maestral.main import FileStatus, IDLE from maestral.main import logger as maestral_logger from maestral.utils.path import delete +from maestral.utils.integration import get_inotify_limits from .conftest import wait_for_idle, resources @@ -349,3 +352,34 @@ def test_sharedlink_errors(m): # test revoking a malformed link with pytest.raises(SharedLinkError): m.revoke_shared_link("https://www.testlink.de") + + +@pytest.mark.skipif(sys.platform != "linux", reason="inotify specific test") +@pytest.mark.skipif(os.getenv("CI", False) is False, reason="Only running on CI") +def test_inotify_error(m): + + max_user_watches, max_user_instances, _ = get_inotify_limits() + + try: + subprocess.check_call(["sudo", "sysctl", "-w", "fs.inotify.max_user_watches=1"]) + except subprocess.CalledProcessError: + return + + try: + m.stop_sync() + wait_for_idle(m) + m.start_sync() + + assert len(m.fatal_errors) > 0 + + last_error = m.fatal_errors[-1] + + assert last_error["type"] == "InotifyError" + assert not m.monitor.local_observer_thread.is_alive() + assert m.monitor.upload_thread.is_alive() + assert m.monitor.download_thread.is_alive() + + finally: + subprocess.check_call( + ["sudo", "sysctl", "-w", f"fs.inotify.max_user_watches={max_user_watches}"] + ) From 5093fd6cb32c78da0622c66f955d3bcf49ec1bb2 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 16:30:05 +0000 Subject: [PATCH 336/374] [sync] make `save_local_hash` private --- src/maestral/sync.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 268f8b61a..32cb78506 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -852,11 +852,11 @@ def get_local_hash(self, local_path: str) -> Optional[str]: with convert_api_errors(local_path=local_path): hash_str, mtime = content_hash(local_path) - self.save_local_hash(local_path, hash_str, mtime) + self._save_local_hash(local_path, hash_str, mtime) return hash_str - def save_local_hash( + def _save_local_hash( self, local_path: str, hash_str: Optional[str], mtime: Optional[float] ) -> None: """ @@ -3249,7 +3249,7 @@ def _on_remote_file(self, event: SyncEvent) -> Optional[SyncEvent]: ) self.update_index_from_sync_event(event) - self.save_local_hash(event.local_path, event.content_hash, mtime) + self._save_local_hash(event.local_path, event.content_hash, mtime) logger.debug('Created local file "%s"', event.dbx_path) From 60a5ad3e7c9c1b1f4b84cd784a535d50d427b37b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 16:35:39 +0000 Subject: [PATCH 337/374] [sync] updated some doc strings and type hints --- src/maestral/sync.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 32cb78506..f23777aa7 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1252,7 +1252,10 @@ def to_local_path_from_cased(self, dbx_path_cased: str) -> str: def to_local_path(self, dbx_path: str) -> str: """ Converts a Dropbox path to the corresponding local path. Only the basename must - be correctly cased. This is slower than :meth:`to_local_path_from_cased`. + be correctly cased, as guaranteed by the Dropbox API for the ``display_path`` + attribute of file or folder metadata. + + This method slower than :meth:`to_local_path_from_cased`. :param dbx_path: Path relative to Dropbox folder, must be correctly cased in its basename. @@ -1394,9 +1397,9 @@ def _slow_down(self) -> None: while cpu_usage > self._max_cpu_percent: cpu_usage = cpu_usage_percent(0.5 + 2 * random.random()) - def cancel_sync(self): + def cancel_sync(self) -> None: """ - Cancels all pending sync jobs and returns when idle. + Cancels all pending sync jobs and blocks until the sync cycle is complete. """ self._cancel_requested.set() From 28b13aeae2fb5d0b7ef3293b944d5d262b757122 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 16:36:46 +0000 Subject: [PATCH 338/374] [sync] make SnyEngine.free_memory private --- src/maestral/sync.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index f23777aa7..71f107c4d 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1518,7 +1518,7 @@ def _database_access(self, log_errors: bool = False) -> Iterator[None]: else: raise new_exc - def free_memory(self) -> None: + def _free_memory(self) -> None: """ Frees memory by resetting our database session and the requests session, clearing out case-conversion cache and clearing all expired event ignores and. @@ -1687,7 +1687,7 @@ def upload_sync_cycle(self): self.local_cursor = cursor del changes - self.free_memory() + self._free_memory() def list_local_changes(self, delay: float = 1) -> Tuple[List[SyncEvent], float]: """ @@ -2605,6 +2605,8 @@ def get_remote_item(self, dbx_path: str) -> bool: e = self._create_local_entry(event) success = e.status in (SyncStatus.Done, SyncStatus.Skipped) + self._free_memory() + return success def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: @@ -2660,7 +2662,7 @@ def download_sync_cycle(self) -> None: del changes del downloaded - self.free_memory() + self._free_memory() def list_remote_changes_iterator( self, last_cursor: str @@ -3588,9 +3590,6 @@ def download_worker_added_item( logger.info(IDLE) - # free some memory - sync.free_memory() - def upload_worker( sync: SyncEngine, From 84ff937001b314ea4b051cbc5be9e8f2cc70cd15 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 16:38:42 +0000 Subject: [PATCH 339/374] [sync] make SyncEngine.get_remote_folder private --- src/maestral/sync.py | 89 ++++++++++++++++++++++---------------------- 1 file changed, 45 insertions(+), 44 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 71f107c4d..5bf69ca21 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2520,7 +2520,50 @@ def _on_local_deleted(self, event: SyncEvent) -> Optional[Metadata]: # ==== Download sync =============================================================== - def get_remote_folder(self, dbx_path: str) -> bool: + def get_remote_item(self, dbx_path: str) -> bool: + """ + Downloads a remote file or folder and updates its local rev. If the remote item + does not exist, any corresponding local items will be deleted. If ``dbx_path`` + refers to a folder, the download will be handled by :meth:`_get_remote_folder`. + If it refers to a single file, the download will be performed by + :meth:`_create_local_entry`. + + This method can be used to fetch individual items outside of the regular sync + cycle, for instance when including a previously excluded file or folder. + + :param dbx_path: Path relative to Dropbox folder. + :returns: Whether download was successful. + """ + + with self.sync_lock: + + md = self.client.get_metadata(dbx_path, include_deleted=True) + + if md is None: + # create a fake deleted event + index_entry = self.get_index_entry(dbx_path) + cased_path = index_entry.dbx_path_cased if index_entry else dbx_path + + md = DeletedMetadata( + name=osp.basename(dbx_path), + path_lower=dbx_path.lower(), + path_display=cased_path, + ) + + event = SyncEvent.from_dbx_metadata(md, self) + + if event.is_directory: + success = self._get_remote_folder(dbx_path) + else: + self.syncing.append(event) + e = self._create_local_entry(event) + success = e.status in (SyncStatus.Done, SyncStatus.Skipped) + + self._free_memory() + + return success + + def _get_remote_folder(self, dbx_path: str) -> bool: """ Gets all files/folders from a Dropbox folder and writes them to the local folder :attr:`dropbox_path`. @@ -2535,6 +2578,7 @@ def get_remote_folder(self, dbx_path: str) -> bool: try: + idx = 0 # iterate over index and download results @@ -2566,49 +2610,6 @@ def get_remote_folder(self, dbx_path: str) -> bool: return success - def get_remote_item(self, dbx_path: str) -> bool: - """ - Downloads a remote file or folder and updates its local rev. If the remote item - does not exist, any corresponding local items will be deleted. If ``dbx_path`` - refers to a folder, the download will be handled by :meth:`get_remote_folder`. - If it refers to a single file, the download will be performed by - :meth:`_create_local_entry`. - - This method can be used to fetch individual items outside of the regular sync - cycle, for instance when including a previously excluded file or folder. - - :param dbx_path: Path relative to Dropbox folder. - :returns: Whether download was successful. - """ - - with self.sync_lock: - - md = self.client.get_metadata(dbx_path, include_deleted=True) - - if md is None: - # create a fake deleted event - index_entry = self.get_index_entry(dbx_path) - cased_path = index_entry.dbx_path_cased if index_entry else dbx_path - - md = DeletedMetadata( - name=osp.basename(dbx_path), - path_lower=dbx_path.lower(), - path_display=cased_path, - ) - - event = SyncEvent.from_dbx_metadata(md, self) - - if event.is_directory: - success = self.get_remote_folder(dbx_path) - else: - self.syncing.append(event) - e = self._create_local_entry(event) - success = e.status in (SyncStatus.Done, SyncStatus.Skipped) - - self._free_memory() - - return success - def wait_for_remote_changes(self, last_cursor: str, timeout: int = 40) -> bool: """ Blocks until changes to the remote Dropbox are available. From a23239d8daa2875ca16863127e2ec69d0bcaf49e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Mon, 1 Feb 2021 16:42:32 +0000 Subject: [PATCH 340/374] [sync] remove `SnyEngine._dir_snapshot_with_mignore` move functionality inline --- src/maestral/sync.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 5bf69ca21..590738eb4 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1582,7 +1582,9 @@ def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], floa changes = [] snapshot_time = time.time() - snapshot = self._dir_snapshot_with_mignore(self.dropbox_path) + snapshot = DirectorySnapshot( + self.dropbox_path, listdir=self._scandir_with_mignore + ) lowercase_snapshot_paths: Set[str] = set() # don't use iterator here but pre-fetch all entries @@ -3406,7 +3408,7 @@ def rescan(self, local_path: str) -> None: # add created and deleted events of children as appropriate - snapshot = self._dir_snapshot_with_mignore(local_path) + snapshot = DirectorySnapshot(local_path, listdir=self._scandir_with_mignore) lowercase_snapshot_paths = {x.lower() for x in snapshot.paths} local_path_lower = local_path.lower() @@ -3475,12 +3477,6 @@ def _scandir_with_mignore(self, path: str) -> List: if not self._is_mignore_path(self.to_dbx_path(f.path), f.is_dir()) ] - def _dir_snapshot_with_mignore(self, path: str) -> DirectorySnapshot: - return DirectorySnapshot( - path, - listdir=self._scandir_with_mignore, - ) - # ====================================================================================== # Workers for upload, download and connection monitoring threads From 39e4e042a492711e802067d302ddc81b790fec5b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 14:19:04 +0000 Subject: [PATCH 341/374] [sync] suppress "Indexing 0..." message --- src/maestral/sync.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 590738eb4..707683d5a 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2580,7 +2580,6 @@ def _get_remote_folder(self, dbx_path: str) -> bool: try: - idx = 0 # iterate over index and download results @@ -2697,7 +2696,9 @@ def list_remote_changes_iterator( for changes in changes_iter: idx += len(changes.entries) - logger.info(f"Indexing {idx}...") + + if idx > 0: + logger.info(f"Indexing {idx}...") logger.debug("Listed remote changes:\n%s", entries_repr(changes.entries)) From bd0816c13b48057c12c2454e2630d548d843042f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 14:49:36 +0000 Subject: [PATCH 342/374] [sync] move expiry of ignore events --- src/maestral/sync.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 707683d5a..c456c82b0 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -308,6 +308,8 @@ def ignore( for ignore in new_ignores: ignore.ttl = time.time() + self.ignore_timeout + self.expire_ignored_events() + def expire_ignored_events(self) -> None: """Removes all expired ignore entries.""" @@ -330,8 +332,6 @@ def _is_ignored(self, event: FileSystemEvent) -> bool: :returns: Whether the event should be ignored. """ - self.expire_ignored_events() - for ignore in self._ignored_events.copy(): ignore_event = ignore.event recursive = ignore.recursive From 4a3caeb06150d99913e437087a3616a0d9dacef8 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 15:10:53 +0000 Subject: [PATCH 343/374] added optional upload- or download-only sync --- src/maestral/config/main.py | 2 + src/maestral/sync.py | 175 +++++++++++++++++++----------------- 2 files changed, 95 insertions(+), 82 deletions(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index e8e0f7adf..a76607125 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -50,6 +50,8 @@ "reindex_interval": 60 * 60 * 24 * 7, # default to weekly "max_cpu_percent": 20.0, # max usage target per cpu core, default to 20% "keep_history": 60 * 60 * 24 * 7, # default one week + "upload": True, # if download sync is enabled + "download": True, # if upload sync is enabled }, ), ] diff --git a/src/maestral/sync.py b/src/maestral/sync.py index c456c82b0..fedf6b723 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3638,6 +3638,8 @@ def startup_worker( :param autostart: Set when syncing should automatically resume on connection. """ + conf = MaestralConfig(sync.config_name) + with handle_sync_thread_errors(running, autostart, sync.notifier): # Retry failed downloads. @@ -3667,7 +3669,8 @@ def startup_worker( startup_completed.set() return - sync.upload_local_changes_while_inactive() + if conf.get("sync", "upload"): + sync.upload_local_changes_while_inactive() logger.info(IDLE) @@ -3772,14 +3775,6 @@ def start(self) -> None: self.running = Event() self.startup_completed = Event() - self.local_observer_thread = Observer(timeout=40) - self.local_observer_thread.setName("maestral-fsobserver") - self._watch = self.local_observer_thread.schedule( - self.sync.fs_events, self.sync.dropbox_path, recursive=True - ) - for i, emitter in enumerate(self.local_observer_thread.emitters): - emitter.setName(f"maestral-fsemitter-{i}") - self.startup_thread = Thread( target=startup_worker, daemon=True, @@ -3792,94 +3787,110 @@ def start(self) -> None: name="maestral-sync-startup", ) - self.download_thread = Thread( - target=download_worker, - daemon=True, - args=( - self.sync, - self.running, - self.startup_completed, - self.autostart, - ), - name="maestral-download", - ) + if self._conf.get("sync", "download"): + + self.download_thread = Thread( + target=download_worker, + daemon=True, + args=( + self.sync, + self.running, + self.startup_completed, + self.autostart, + ), + name="maestral-download", + ) - self.download_thread_added_folder = Thread( - target=download_worker_added_item, - daemon=True, - args=( - self.sync, - self.running, - self.startup_completed, - self.autostart, - self.added_item_queue, - ), - name="maestral-folder-download", - ) + self.download_thread_added_folder = Thread( + target=download_worker_added_item, + daemon=True, + args=( + self.sync, + self.running, + self.startup_completed, + self.autostart, + self.added_item_queue, + ), + name="maestral-folder-download", + ) - self.upload_thread = Thread( - target=upload_worker, - daemon=True, - args=( - self.sync, - self.running, - self.startup_completed, - self.autostart, - ), - name="maestral-upload", - ) + if self._conf.get("sync", "upload"): + + self.upload_thread = Thread( + target=upload_worker, + daemon=True, + args=( + self.sync, + self.running, + self.startup_completed, + self.autostart, + ), + name="maestral-upload", + ) - try: - self.local_observer_thread.start() - except OSError as exc: + self.local_observer_thread = Observer(timeout=40) + self.local_observer_thread.setName("maestral-fsobserver") + self._watch = self.local_observer_thread.schedule( + self.sync.fs_events, self.sync.dropbox_path, recursive=True + ) + for i, emitter in enumerate(self.local_observer_thread.emitters): + emitter.setName(f"maestral-fsemitter-{i}") - err_cls: Type[MaestralApiError] + try: + self.local_observer_thread.start() + except OSError as exc: - if exc.errno in (errno.ENOSPC, errno.EMFILE): - title = "Inotify limit reached" + err_cls: Type[MaestralApiError] - try: - max_user_watches, max_user_instances, _ = get_inotify_limits() - except OSError: - max_user_watches, max_user_instances = 2 ** 18, 2 ** 9 + if exc.errno in (errno.ENOSPC, errno.EMFILE): + title = "Inotify limit reached" - if exc.errno == errno.ENOSPC: - n_new = max(2 ** 19, 2 * max_user_watches) - new_config = f"fs.inotify.max_user_watches={n_new}" - else: - n_new = max(2 ** 10, 2 * max_user_instances) - new_config = f"fs.inotify.max_user_instances={n_new}" - - msg = ( - "Changes to your Dropbox folder cannot be monitored because it " - "contains too many items. Please increase the inotify limit by " - "adding the following line to /etc/sysctl.conf, then apply the " - 'settings with "sysctl -p":\n\n' + new_config - ) - err_cls = InotifyError + try: + max_user_watches, max_user_instances, _ = get_inotify_limits() + except OSError: + max_user_watches, max_user_instances = 2 ** 18, 2 ** 9 - elif PermissionError: - title = "Insufficient permissions to monitor local changes" - msg = "Please check the permissions for your local Dropbox folder" - err_cls = InotifyError + if exc.errno == errno.ENOSPC: + n_new = max(2 ** 19, 2 * max_user_watches) + new_config = f"fs.inotify.max_user_watches={n_new}" + else: + n_new = max(2 ** 10, 2 * max_user_instances) + new_config = f"fs.inotify.max_user_instances={n_new}" + + msg = ( + "Changes to your Dropbox folder cannot be monitored because it " + "contains too many items. Please increase the inotify limit by " + "adding the following line to /etc/sysctl.conf, then apply the " + 'settings with "sysctl -p":\n\n' + new_config + ) + err_cls = InotifyError - else: - title = "Could not start watch of local directory" - msg = exc.strerror - err_cls = MaestralApiError + elif PermissionError: + title = "Insufficient permissions to monitor local changes" + msg = "Please check the permissions for your local Dropbox folder" + err_cls = InotifyError + + else: + title = "Could not start watch of local directory" + msg = exc.strerror + err_cls = MaestralApiError - new_error = err_cls(title, msg) - logger.error(title, exc_info=exc_info_tuple(new_error)) - self.sync.notifier.notify(title, msg, level=notify.ERROR) + new_error = err_cls(title, msg) + logger.error(title, exc_info=exc_info_tuple(new_error)) + self.sync.notifier.notify(title, msg, level=notify.ERROR) self.running.set() self.autostart.set() - self.sync.fs_events.enable() + if self._conf.get("sync", "upload"): + self.sync.fs_events.enable() + self.upload_thread.start() + + if self._conf.get("sync", "download"): + self.download_thread.start() + self.download_thread_added_folder.start() + self.startup_thread.start() - self.upload_thread.start() - self.download_thread.start() - self.download_thread_added_folder.start() self._startup_time = time.time() From 96e41c77fa4aa48498b88c2a27c23002e995ee08 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 15:11:20 +0000 Subject: [PATCH 344/374] increase default reindexing interval to 2 weeks --- src/maestral/config/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index a76607125..34581fba1 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -47,7 +47,7 @@ ( "sync", { - "reindex_interval": 60 * 60 * 24 * 7, # default to weekly + "reindex_interval": 60 * 60 * 24 * 14, # default to every fortnight "max_cpu_percent": 20.0, # max usage target per cpu core, default to 20% "keep_history": 60 * 60 * 24 * 7, # default one week "upload": True, # if download sync is enabled From 628e39058e4bc4f32f65d27c63e61bd87d45b273 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 15:11:32 +0000 Subject: [PATCH 345/374] removed analytics config value --- src/maestral/config/main.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index 34581fba1..04be53fba 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -40,7 +40,6 @@ "notification_level": 15, # desktop notification level, default to FILECHANGE "log_level": 20, # log level for journal and file, default to INFO "update_notification_interval": 60 * 60 * 24 * 7, # default to weekly - "analytics": False, # automatic errors reports with bugsnag, default to disabled "keyring": "automatic", # keychain backend to use for credential storage }, ), @@ -98,7 +97,7 @@ # or if you want to *rename* options, then you need to do a MAJOR update in # version, e.g. from 3.0.0 to 4.0.0 # 3. You don't need to touch this value if you're just adding a new option -CONF_VERSION = "14.0.0" +CONF_VERSION = "15.0.0" # ============================================================================= From 3c5a7572eadf8b34a230b60b0fcb10c094ba2133 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 15:20:27 +0000 Subject: [PATCH 346/374] [cli] renamed `configs` to `config-files` --- src/maestral/cli.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 915da8df5..93b880486 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1175,7 +1175,7 @@ def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) - @main.command(section="Information", help="List all configured Dropbox accounts.") -def configs() -> None: +def config_files() -> None: from .daemon import is_running from .config import ( @@ -1186,18 +1186,31 @@ def configs() -> None: ) # clean up stale configs - config_names = list_configs() - for name in config_names: + for name in list_configs(): dbid = MaestralConfig(name).get("account", "account_id") if dbid == "" and not is_running(name): remove_configuration(name) # display remaining configs names = list_configs() - emails = [MaestralState(c).get("account", "email") for c in names] + emails = [] + paths = [] - table = cli.Table([cli.Column("Config name", names), cli.Column("Account", emails)]) + for name in names: + config = MaestralConfig(name) + state = MaestralState(name) + + emails.append(state.get("account", "email")) + paths.append(config.get_config_fpath()) + + table = cli.Table( + [ + cli.Column("Config name", names), + cli.Column("Account", emails), + cli.Column("Path", paths, elide=cli.Elide.Leading), + ] + ) cli.echo("") table.echo() From 04ae6110dd30ab69b8da3c6269bd01f44cab7875 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 18:08:49 +0000 Subject: [PATCH 347/374] [config] be more restrictive in type conversion Accept only the same type as the default value. The only exception: int is accepted and converted to a float if the default value is a float. --- src/maestral/config/user.py | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/maestral/config/user.py b/src/maestral/config/user.py index 22f4f2c85..48280fc2d 100644 --- a/src/maestral/config/user.py +++ b/src/maestral/config/user.py @@ -493,15 +493,8 @@ def get(self, section, option, default: Any = NoDefault) -> Any: # type: ignore if isinstance(default_value, str): value = raw_value - elif isinstance(default_value, bool): - value = ast.literal_eval(raw_value) - elif isinstance(default_value, float): - value = float(raw_value) - elif isinstance(default_value, int): - value = int(raw_value) else: try: - # Lists, tuples, None, ... value = ast.literal_eval(raw_value) except (SyntaxError, ValueError): value = raw_value @@ -541,18 +534,15 @@ def set(self, section: str, option: str, value: Any, save: bool = True) -> None: default_value = value self.set_default(section, option, default_value) - if isinstance(default_value, bool): - value = bool(value) - elif isinstance(default_value, float): + if isinstance(default_value, float) and isinstance(value, int): value = float(value) - elif isinstance(default_value, int): - value = int(value) - # elif isinstance(default_value, list): - # value = list(value) - # elif isinstance(default_value, tuple): - # value = tuple(value) - elif not isinstance(default_value, str): - value = repr(value) + + if type(default_value) is not type(value): + raise ValueError( + f"Inconsistent config type for [{section}][{option}]. " + f"Expected {default_value.__class__.__name__} but " + f"got {value.__class__.__name__}." + ) self._set(section, option, value) if save: From 902933b57b47450a9fa697781d68a559da28145a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 18:12:07 +0000 Subject: [PATCH 348/374] [cli] added config command --- src/maestral/cli.py | 103 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 93b880486..2cf1e2da2 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1758,3 +1758,106 @@ def log_level(level_name: str, config_name: str) -> None: else: level_name = logging.getLevelName(m.log_level) cli.echo(f"Log level: {level_name}") + + +@main.group( + section="Maintenance", + help=""" +Direct access to config file. + +Warning: Changing some config values must be accompanied by maintenance tasks. For +example, changing the config value for the Dropbox location needs to be accompanied by +actually moving the folder. This command only changes the value in the config file. +Changes will also require a restart of the daemon to become effective. + +Use the commands from the Settings section instead wherever possible, they will take +effect immediately and never leave the daemon in an inconsistent state. + +Currently available config keys are: + +\b +- path: the location of the local Dropbox folder +- excluded_items: list of files or folders excluded by selective sync +- account_id: the ID of the linked Dropbox account +- notification_level: the level for desktop notifications +- log_level: the log level. +- update_notification_interval: interval in secs to check for updates +- keyring: the keyring backend to use (full path of the class) +- reindex_interval: the interval in seconds for full reindexing +- max_cpu_percent: maximum CPU usage target per core +- keep_history: the sync history to keep in seconds +- upload: if upload sync is enabled +- download: if download sync is enabled +""", +) +def config(): + pass + + +@config.command(name="get", help="Print the value of a given configuration key.") +@click.argument("key") +@config_option +def config_get(key: str, config_name: str) -> None: + + from .config import MaestralConfig + from .config.main import DEFAULTS_CONFIG + from .daemon import MaestralProxy, CommunicationError + + section = next( + iter(s for s, conf_dict in DEFAULTS_CONFIG if key in conf_dict), None + ) + + if not section: + raise cli.CliException(f"'{key}' is not a valid configuration key") + + try: + with MaestralProxy(config_name) as m: + value = m.get_conf(section, key) + except CommunicationError: + value = MaestralConfig(config_name).get(section, key) + + cli.echo(value) + + +@config.command( + name="set", + help=""" +Update configuration with a value for the given key. + +Values will be cast to the proper type, raising an error where this is not possibly. For +instance, setting a boolean config value to 1 will actually set it to True. +""", +) +@click.argument("key") +@click.argument("value") +@config_option +@catch_maestral_errors +def config_set(key: str, value: str, config_name: str) -> None: + + import ast + from .config import MaestralConfig + from .config.main import DEFAULTS_CONFIG + from .daemon import MaestralProxy, CommunicationError + + section, defaults = next( + iter((s, d) for s, d in DEFAULTS_CONFIG if key in d), (None, None) + ) + + if not section or not defaults: + raise cli.CliException(f"'{key}' is not a valid configuration key") + + default_value = defaults[key] + + if isinstance(default_value, str): + py_value = value + else: + try: + py_value = ast.literal_eval(value) + except (SyntaxError, ValueError): + py_value = value + + try: + with MaestralProxy(config_name) as m: + m.set_conf(section, key, py_value) + except CommunicationError: + MaestralConfig(config_name).set(section, key, py_value) From 7ddcad48b4471f13c13275e59f6ba54fe252646f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 18:28:21 +0000 Subject: [PATCH 349/374] [cli] pretty print all exceptions --- src/maestral/cli.py | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 2cf1e2da2..c51f54e49 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -212,7 +212,7 @@ def check_for_fatal_errors(m: Union["MaestralProxy", "Maestral"]) -> bool: return False -def catch_maestral_errors(func: Callable) -> Callable: +def convert_py_errors(func: Callable) -> Callable: """ Decorator that catches a MaestralApiError and prints it as a useful message to the command line instead of printing the full stacktrace. @@ -228,6 +228,8 @@ def wrapper(*args, **kwargs): raise cli.RemoteApiError(exc.title, exc.message) except ConnectionError: raise cli.CliException("Could not connect to Dropbox") + except Exception as exc: + raise cli.CliException(f"{exc.__class__.__name__}: {exc.args[0]}") return wrapper @@ -518,7 +520,7 @@ def main(): help="Print log messages to stdout when started with '-f, --foreground' flag.", ) @config_option -@catch_maestral_errors +@convert_py_errors def start(foreground: bool, verbose: bool, config_name: str) -> None: # ---- run setup if necessary ------------------------------------------------------ @@ -704,7 +706,7 @@ def auth(): help="Relink to the current account. Keeps the sync state.", ) @config_option -@catch_maestral_errors +@convert_py_errors def auth_link(relink: bool, config_name: str) -> None: from .daemon import MaestralProxy @@ -730,7 +732,7 @@ def auth_link(relink: bool, config_name: str) -> None: ) @click.option("--yes", "-Y", is_flag=True, default=False) @existing_config_option -@catch_maestral_errors +@convert_py_errors def auth_unlink(yes: bool, config_name: str) -> None: if not yes: @@ -786,7 +788,7 @@ def sharelink(): help="Expiry time for the link (e.g. '2025-07-24 20:50').", ) @existing_config_option -@catch_maestral_errors +@convert_py_errors def sharelink_create( dropbox_path: str, password: str, @@ -820,7 +822,7 @@ def sharelink_create( @sharelink.command(name="revoke", help="Revoke a shared link.") @click.argument("url") @existing_config_option -@catch_maestral_errors +@convert_py_errors def sharelink_revoke(url: str, config_name: str) -> None: from .daemon import MaestralProxy @@ -836,7 +838,7 @@ def sharelink_revoke(url: str, config_name: str) -> None: ) @click.argument("dropbox_path", required=False, type=DropboxPath()) @existing_config_option -@catch_maestral_errors +@convert_py_errors def sharelink_list(dropbox_path: Optional[str], config_name: str) -> None: from .daemon import MaestralProxy @@ -876,7 +878,7 @@ def sharelink_list(dropbox_path: Optional[str], config_name: str) -> None: @main.command(section="Information", help="Show the status of the daemon.") @existing_config_option -@catch_maestral_errors +@convert_py_errors def status(config_name: str) -> None: from .daemon import MaestralProxy, CommunicationError @@ -953,7 +955,7 @@ def filestatus(local_path: str, config_name: str) -> None: @main.command(section="Information", help="Live view of all items being synced.") @existing_config_option -@catch_maestral_errors +@convert_py_errors def activity(config_name: str) -> None: import curses @@ -1038,7 +1040,7 @@ def curses_loop(screen) -> None: # no type hints for screen provided yet @main.command(section="Information", help="Show recently changed or added files.") @existing_config_option -@catch_maestral_errors +@convert_py_errors def history(config_name: str) -> None: from datetime import datetime @@ -1086,7 +1088,7 @@ def history(config_name: str) -> None: help="Include deleted items in listing.", ) @existing_config_option -@catch_maestral_errors +@convert_py_errors def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) -> None: from .utils import natural_size @@ -1290,7 +1292,7 @@ def excluded_list(config_name: str) -> None: ) @click.argument("dropbox_path", type=DropboxPath()) @existing_config_option -@catch_maestral_errors +@convert_py_errors def excluded_add(dropbox_path: str, config_name: str) -> None: from .daemon import MaestralProxy @@ -1318,7 +1320,7 @@ def excluded_add(dropbox_path: str, config_name: str) -> None: ) @click.argument("dropbox_path", type=DropboxPath()) @existing_config_option -@catch_maestral_errors +@convert_py_errors def excluded_remove(dropbox_path: str, config_name: str) -> None: from .daemon import MaestralProxy, CommunicationError @@ -1420,7 +1422,7 @@ def move_dir(new_path: str, config_name: str) -> None: """, ) @existing_config_option -@catch_maestral_errors +@convert_py_errors def rebuild_index(config_name: str) -> None: import textwrap @@ -1462,7 +1464,7 @@ def rebuild_index(config_name: str) -> None: default=10, ) @existing_config_option -@catch_maestral_errors +@convert_py_errors def revs(dropbox_path: str, limit: int, config_name: str) -> None: from .daemon import MaestralProxy @@ -1516,7 +1518,7 @@ def revs(dropbox_path: str, limit: int, config_name: str) -> None: type=click.IntRange(min=1, max=100), default=10, ) -@catch_maestral_errors +@convert_py_errors @existing_config_option def diff( dropbox_path: str, @@ -1649,7 +1651,7 @@ def color(ind: int, line: str) -> str: default=10, ) @existing_config_option -@catch_maestral_errors +@convert_py_errors def restore(dropbox_path: str, rev: str, limit: int, config_name: str) -> None: from .daemon import MaestralProxy @@ -1831,7 +1833,7 @@ def config_get(key: str, config_name: str) -> None: @click.argument("key") @click.argument("value") @config_option -@catch_maestral_errors +@convert_py_errors def config_set(key: str, value: str, config_name: str) -> None: import ast From dcd53a853b5ae9d2dc7be5f75fc8b4874a98cfef Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 18:55:56 +0000 Subject: [PATCH 350/374] updated changelog --- CHANGELOG.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f26968602..ffc7699f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,12 +7,28 @@ * Resurrected the command `maestral revs` to list previous versions 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. + * `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. + + Use these commands with caution: setting some config values may leave the daemon in an + inconsistent state (e.g., changing the location of the Dropbox folder). Always prefer + the equivalent command from the Settings group (e.g., `maestral move-dir`). +* Added the ability to turn off one 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. Note that conflict resolution remain 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. + #### Changed: * Changes to indexing: @@ -33,6 +49,7 @@ `link`, `unlink` and `status`. * Renamed 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`. * Improved error message when the user is running out of inotify watches: Recommend default values of `max_user_watches = 524,288` and `max_user_instances = 1024` or double the current values, whichever is higher. Advise to apply the changes with From 9f83d68f152ea27f3060ce3d4318110f78c7d50b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 18:58:19 +0000 Subject: [PATCH 351/374] [docs] updated config docs --- docs/background/config_files.rst | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/docs/background/config_files.rst b/docs/background/config_files.rst index 5626b4c09..b1a4c5487 100644 --- a/docs/background/config_files.rst +++ b/docs/background/config_files.rst @@ -23,14 +23,11 @@ made to one of the options through the ``maestral.config`` module. # The current Dropbox directory path = /Users/samschott/Dropbox (Maestral) - # Default directory name for the config - default_dir_name = Dropbox (Maestral) - # List of excluded files and folders excluded_items = ['/test_folder', '/sub/folder'] # Config file version (not the Maestral version!) - version = 12.0.0 + version = 15.0.0 [account] @@ -57,12 +54,19 @@ made to one of the options through the ``maestral.config`` module. # Interval in sec to check for updates update_notification_interval = 604800 - # Enable or disable automatic error reports - analytics = False - [sync] # Interval in sec to perform a full reindexing reindex_interval = 604800 + # Maximum CPU usage per core max_cpu_percent = 20.0 + + # Sync history to keep in seconds + keep_history = 604800 + + # Enable upload syncing + upload = True + + # Enable download syncing + download = True From c7a56f6a589f280c9f5e25fb160c130524993ca3 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 20:32:53 +0000 Subject: [PATCH 352/374] [cli] refine config help messages --- src/maestral/cli.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/maestral/cli.py b/src/maestral/cli.py index c51f54e49..5a41fb380 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1765,15 +1765,16 @@ def log_level(level_name: str, config_name: str) -> None: @main.group( section="Maintenance", help=""" -Direct access to config file. +Direct access to config values. Warning: Changing some config values must be accompanied by maintenance tasks. For example, changing the config value for the Dropbox location needs to be accompanied by -actually moving the folder. This command only changes the value in the config file. -Changes will also require a restart of the daemon to become effective. +actually moving the folder. This command only gets / sets the value in the config file. +Most changes will also require a restart of the daemon to become effective. -Use the commands from the Settings section instead wherever possible, they will take -effect immediately and never leave the daemon in an inconsistent state. +Use the commands from the Settings section instead wherever possible. They will take +effect immediately, perform accompanying tasks for you, and never leave the daemon in an +inconsistent state. Currently available config keys are: @@ -1810,7 +1811,7 @@ def config_get(key: str, config_name: str) -> None: ) if not section: - raise cli.CliException(f"'{key}' is not a valid configuration key") + raise cli.CliException(f"'{key}' is not a valid configuration key.") try: with MaestralProxy(config_name) as m: @@ -1846,7 +1847,7 @@ def config_set(key: str, value: str, config_name: str) -> None: ) if not section or not defaults: - raise cli.CliException(f"'{key}' is not a valid configuration key") + raise cli.CliException(f"'{key}' is not a valid configuration key.") default_value = defaults[key] From 8085856a109564199265f7621b39ab4034b580e4 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 20:33:15 +0000 Subject: [PATCH 353/374] [config] update DEFAULTS_CONFIG inline commends --- src/maestral/config/main.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index 04be53fba..74ec61546 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -37,18 +37,18 @@ ( "app", { - "notification_level": 15, # desktop notification level, default to FILECHANGE - "log_level": 20, # log level for journal and file, default to INFO - "update_notification_interval": 60 * 60 * 24 * 7, # default to weekly + "notification_level": 15, # desktop notification level, default: FILECHANGE + "log_level": 20, # log level for journal and file, default: INFO + "update_notification_interval": 60 * 60 * 24 * 7, # default: weekly "keyring": "automatic", # keychain backend to use for credential storage }, ), ( "sync", { - "reindex_interval": 60 * 60 * 24 * 14, # default to every fortnight - "max_cpu_percent": 20.0, # max usage target per cpu core, default to 20% - "keep_history": 60 * 60 * 24 * 7, # default one week + "reindex_interval": 60 * 60 * 24 * 14, # default: every fortnight + "max_cpu_percent": 20.0, # max usage target per cpu core, default: 20% + "keep_history": 60 * 60 * 24 * 7, # default: one week "upload": True, # if download sync is enabled "download": True, # if upload sync is enabled }, From 70e2b3a00afb70ac30410814b6a1a9813c04fe1c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 23:37:22 +0000 Subject: [PATCH 354/374] [notify] use inequalities to compare levels --- src/maestral/notify.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/maestral/notify.py b/src/maestral/notify.py index 5ca27daf4..191320f08 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -120,11 +120,11 @@ def notify( notification. """ - ignore = self.snoozed and level == FILECHANGE + snoozed = self.snoozed and level <= FILECHANGE - if level >= self.notify_level and not ignore: + if level >= self.notify_level and not snoozed: - urgency = Urgency.Critical if level == ERROR else Urgency.Normal + urgency = Urgency.Critical if level >= ERROR else Urgency.Normal if actions: buttons = [Button(name, handler) for name, handler in actions.items()] From 0cdd7dc0f2711b0d86674a5cb25686edec5f149a Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 23:51:37 +0000 Subject: [PATCH 355/374] [notify] raise ValueError when converting level name to number fails --- src/maestral/notify.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify.py b/src/maestral/notify.py index 191320f08..1ea2bbb12 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -46,7 +46,7 @@ FILECHANGE: "FILECHANGE", } -_nameToLevel = { +_name_to_level = { "NONE": 100, "ERROR": 40, "SYNCISSUE": 30, @@ -61,7 +61,11 @@ def level_number_to_name(number: int) -> str: def level_name_to_number(name: str) -> int: """Converts a Maestral notification level name to number.""" - return _nameToLevel[name] + + try: + return _name_to_level[name] + except KeyError: + raise ValueError("Invalid level name") class MaestralDesktopNotifier: From 1b753e510ba983f24f39e964d307d63e56531a30 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 23:52:15 +0000 Subject: [PATCH 356/374] [notify] create ad-hoc level name if it doesn't exist --- src/maestral/notify.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/maestral/notify.py b/src/maestral/notify.py index 1ea2bbb12..b0892d638 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -39,7 +39,7 @@ FILECHANGE = 15 -_levelToName = { +_level_to_name = { NONE: "NONE", ERROR: "ERROR", SYNCISSUE: "SYNCISSUE", @@ -56,7 +56,11 @@ def level_number_to_name(number: int) -> str: """Converts a Maestral notification level number to name.""" - return _levelToName[number] + + try: + return _level_to_name[number] + except KeyError: + return f"Level {number}" def level_name_to_number(name: str) -> int: From 01f254b1ba65ba38dfcbb66343fe843c59f43c0e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Fri, 12 Feb 2021 23:56:16 +0000 Subject: [PATCH 357/374] [notify] update doc string --- src/maestral/notify.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/maestral/notify.py b/src/maestral/notify.py index b0892d638..63593d6a8 100644 --- a/src/maestral/notify.py +++ b/src/maestral/notify.py @@ -76,11 +76,6 @@ class MaestralDesktopNotifier: """Desktop notification emitter for Maestral Desktop notifier with snooze functionality and variable notification levels. - - :cvar int NONE: Notification level for no desktop notifications. - :cvar int ERROR: Notification level for errors. - :cvar int SYNCISSUE: Notification level for sync issues. - :cvar int FILECHANGE: Notification level for file changes. """ def __init__(self, config_name: str) -> None: From 0fc95273237ecda79dd3a608848be157d051b329 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 01:49:03 +0000 Subject: [PATCH 358/374] [docs] don't show module summary in api docs --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 2fa534a6c..62cafd37d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -55,7 +55,6 @@ autoapi_options = [ "members", "show-inheritance", - "show-module-summary", "undoc-members", ] autoapi_add_toctree_entry = False From f13ba54675b19b602abc7d5d241a692a6e2cca5f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 01:57:58 +0000 Subject: [PATCH 359/374] give up on snap support The development for the kde-frameworks-5 snap looks awfully slow, we might always be lagging behind one year or more. Consider moving to app-image or native package managers (apt, yum, dnf) --- snap/snapcraft.yaml | 67 --------------------------------------------- 1 file changed, 67 deletions(-) delete mode 100644 snap/snapcraft.yaml diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml deleted file mode 100644 index bd69d3e43..000000000 --- a/snap/snapcraft.yaml +++ /dev/null @@ -1,67 +0,0 @@ -name: maestral -base: core18 -license: MIT -adopt-info: maestral -icon: maestral/resources/maestral.png -summary: An open-source Dropbox client for macOS and Linux. -description: | - Maestral is light-weight and simple Dropbox client for Linux and macOS. - It allows two-way syncing with your Dropbox, setting up a 'mignore' file - similar to 'gitignore' and syncing multiple Dropbox accounts. - -grade: stable -confinement: strict - -apps: - maestral: - command: maestral - desktop: share/applications/maestral.desktop - autostart: maestral-maestral.desktop - extensions: - - kde-neon - plugs: - - home - - network - - unity7 - - opengl - -environment: - LC_ALL: C.UTF-8 - LANG: C.UTF-8 - QT_QPA_PLATFORMTHEME: gtk3 - XDG_CURRENT_DESKTOP: "Unity:$XDG_CURRENT_DESKTOP" - -parts: - maestral: - source: . - plugin: python - python-version: python3 - stage-packages: - # Use the version from the repo to avoid the xcb not found error - - python3-pyqt5 - override-pull: | - snapcraftctl pull - snapcraftctl set-version $(grep version maestral/__init__.py | cut -d'"' -f2) - sed -i "s|Exec = {start_cmd}|Exec = maestral gui -c 'maestral'|g" maestral/resources/maestral.desktop - - maestral-qt: - source: https://github.com/SamSchott/maestral-qt.git - plugin: python - python-version: python3 - override-build: | - sed -i 's|Exec = maestral_qt|Exec = maestral gui|g' maestral_qt/resources/maestral.desktop - sed -i "s|'PyQt5.*||g" setup.py - sed -i "s|'maestral==.*||g" setup.py - snapcraftctl build - override-prime: | - snapcraftctl prime - sed -i 's|Icon = maestral|Icon=${SNAP}/share/icons/hicolor/512x512/apps/maestral.png|g' share/applications/maestral.desktop - - cleanup: - after: [maestral, maestral-qt] - plugin: nil - build-snaps: [ kde-frameworks-5-core18 ] - override-prime: | - set -eux - cd /snap/kde-frameworks-5-core18/current - find . -type f,l -exec rm -f $SNAPCRAFT_PRIME/{} \; From 5e8642f61510abdfafd4d1c093a7ccb41db09ea3 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 02:04:17 +0000 Subject: [PATCH 360/374] [docs] intersphinx link to watchdog latest --- docs/conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 62cafd37d..328085689 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -71,5 +71,5 @@ "python": ("https://docs.python.org/3/", None), "requests": ("https://requests.readthedocs.io/en/master/", None), "sqlalchemy": ("https://docs.sqlalchemy.org/en/latest/", None), - "watchdog": ("https://python-watchdog.readthedocs.io/en/v0.10.3/", None), + "watchdog": ("https://python-watchdog.readthedocs.io/en/latest/", None), } From b7b379f1d3d931ee8a50e77c1e742dfd5e87a186 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 10:36:37 +0000 Subject: [PATCH 361/374] [cli] added config-file --clean option --- CHANGELOG.md | 9 ++++--- src/maestral/cli.py | 65 +++++++++++++++++++++++++++------------------ 2 files changed, 45 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffc7699f4..4ee4491c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,9 +25,10 @@ the equivalent command from the Settings group (e.g., `maestral move-dir`). * Added the ability to turn off one 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. Note that conflict resolution remain 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. + local changes. To use this, set the respective config values for `upload` or + `download` to False. Note that conflict resolution remain 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. #### Changed: @@ -50,6 +51,8 @@ * Renamed 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 without + a linked Dropbox account. * Improved error message when the user is running out of inotify watches: Recommend default values of `max_user_watches = 524,288` and `max_user_instances = 1024` or double the current values, whichever is higher. Advise to apply the changes with diff --git a/src/maestral/cli.py b/src/maestral/cli.py index 5a41fb380..98b7b0757 100755 --- a/src/maestral/cli.py +++ b/src/maestral/cli.py @@ -1177,7 +1177,13 @@ def ls(long: bool, dropbox_path: str, include_deleted: bool, config_name: str) - @main.command(section="Information", help="List all configured Dropbox accounts.") -def config_files() -> None: +@click.option( + "--clean", + is_flag=True, + default=False, + help="Remove config files without a linked account.", +) +def config_files(clean: bool) -> None: from .daemon import is_running from .config import ( @@ -1187,36 +1193,43 @@ def config_files() -> None: remove_configuration, ) - # clean up stale configs + if clean: - for name in list_configs(): - dbid = MaestralConfig(name).get("account", "account_id") - if dbid == "" and not is_running(name): - remove_configuration(name) + # Clean up stale config files. - # display remaining configs - names = list_configs() - emails = [] - paths = [] + for name in list_configs(): + conf = MaestralConfig(name) + path = conf.get_config_fpath() + dbid = conf.get("account", "account_id") - for name in names: - config = MaestralConfig(name) - state = MaestralState(name) + if dbid == "" and not is_running(name): + remove_configuration(name) + cli.echo(f"Removed: {path}") - emails.append(state.get("account", "email")) - paths.append(config.get_config_fpath()) - - table = cli.Table( - [ - cli.Column("Config name", names), - cli.Column("Account", emails), - cli.Column("Path", paths, elide=cli.Elide.Leading), - ] - ) + else: + # Display config files. + names = list_configs() + emails = [] + paths = [] + + for name in names: + config = MaestralConfig(name) + state = MaestralState(name) + + emails.append(state.get("account", "email")) + paths.append(config.get_config_fpath()) + + table = cli.Table( + [ + cli.Column("Config name", names), + cli.Column("Account", emails), + cli.Column("Path", paths, elide=cli.Elide.Leading), + ] + ) - cli.echo("") - table.echo() - cli.echo("") + cli.echo("") + table.echo() + cli.echo("") # ====================================================================================== From e86c07769a91f697fe9a31792e47255ed8bc9af6 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 15:04:01 +0000 Subject: [PATCH 362/374] [errors] added CancelledError --- src/maestral/errors.py | 69 ++++-------------------------------------- 1 file changed, 6 insertions(+), 63 deletions(-) diff --git a/src/maestral/errors.py b/src/maestral/errors.py index 69bc51d55..2e1bf84c5 100644 --- a/src/maestral/errors.py +++ b/src/maestral/errors.py @@ -35,7 +35,7 @@ class MaestralApiError(Exception): def __init__( self, title: str, - message: str, + message: str = "", dbx_path: Optional[str] = None, dbx_path_dst: Optional[str] = None, local_path: Optional[str] = None, @@ -58,167 +58,119 @@ def __str__(self) -> str: class SyncError(MaestralApiError): """Base class for recoverable sync issues.""" - pass - class InsufficientPermissionsError(SyncError): """Raised when accessing a file or folder fails due to insufficient permissions, both locally and on Dropbox servers.""" - pass - class InsufficientSpaceError(SyncError): """Raised when the Dropbox account or local drive has insufficient storage space.""" - pass - class PathError(SyncError): """Raised when there is an issue with the provided file or folder path such as invalid characters, a too long file name, etc.""" - pass - class NotFoundError(SyncError): """Raised when a file or folder is requested but does not exist.""" - pass - class ConflictError(SyncError): """Raised when trying to create a file or folder which already exists.""" - pass - class FileConflictError(ConflictError): """Raised when trying to create a file which already exists.""" - pass - class FolderConflictError(SyncError): """Raised when trying to create or folder which already exists.""" - pass - class IsAFolderError(SyncError): """Raised when a file is required but a folder is provided.""" - pass - class NotAFolderError(SyncError): """Raised when a folder is required but a file is provided.""" - pass - class DropboxServerError(SyncError): """Raised in case of internal Dropbox errors.""" - pass - class RestrictedContentError(SyncError): """Raised when trying to sync restricted content, for instance when adding a file with a DMCA takedown notice to a public folder.""" - pass - class UnsupportedFileError(SyncError): """Raised when this file type cannot be downloaded but only exported. This is the case for G-suite files.""" - pass - class FileSizeError(SyncError): """Raised when attempting to upload a file larger than 350 GB in an upload session or larger than 150 MB in a single upload. Also raised when attempting to download a file with a size that exceeds file system's limit.""" - pass - class FileReadError(SyncError): """Raised when reading a local file failed.""" - pass - # ==== errors which are not related to a specific sync event =========================== +class CancelledError(MaestralApiError): + """Raised when syncing is cancelled by the user.""" + + class NotLinkedError(MaestralApiError): """Raised when no Dropbox account is linked.""" - pass - class InvalidDbidError(MaestralApiError): """Raised when the given Dropbox ID does not correspond to an existing account.""" - pass - class KeyringAccessError(MaestralApiError): """Raised when retrieving a saved auth token from the user keyring fails.""" - pass - class NoDropboxDirError(MaestralApiError): """Raised when the local Dropbox folder cannot be found.""" - pass - class CacheDirError(MaestralApiError): """Raised when creating the cache directory fails.""" - pass - class InotifyError(MaestralApiError): """Raised when the local Dropbox folder is too large to monitor with inotify.""" - pass - class OutOfMemoryError(MaestralApiError): """Raised when there is insufficient memory to complete an operation.""" - pass - class DatabaseError(MaestralApiError): """Raised when reading or writing to the database fails.""" - pass - class DropboxAuthError(MaestralApiError): """Raised when authentication fails.""" - pass - class TokenExpiredError(DropboxAuthError): """Raised when authentication fails because the user's token has expired.""" - pass - class TokenRevokedError(DropboxAuthError): """Raised when authentication fails because the user's token has been revoked.""" - pass - class CursorResetError(MaestralApiError): """Raised when the cursor used for a longpoll or list-folder request has been @@ -226,34 +178,24 @@ class CursorResetError(MaestralApiError): cursor for the respective folder has to be obtained through files_list_folder. This may require re-syncing the entire Dropbox.""" - pass - class BadInputError(MaestralApiError): """Raised when an API request is made with bad input. This should not happen during syncing but only in case of manual API calls.""" - pass - class BusyError(MaestralApiError): """Raised when trying to perform an action which is only possible in the idle state and we cannot block or queue the job.""" - pass - class UnsupportedFileTypeForDiff(MaestralApiError): """Raised when a diff for an unsupported file type was issued.""" - pass - class SharedLinkError(MaestralApiError): """Raised when creating a shared link fails.""" - pass - # connection errors are handled as warnings # sync errors only appear in the sync errors list @@ -281,6 +223,7 @@ class SharedLinkError(MaestralApiError): SYNC_ERRORS = ( SyncError, + CancelledError, InsufficientPermissionsError, InsufficientSpaceError, PathError, From 8ee9b7223b1ce33755bd033f82bc3e1d7c52ce6f Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 15:34:23 +0000 Subject: [PATCH 363/374] [sync] cancel running syncs by raising an error in the sync threads This ensures that a) no cursors are saved after the cancellation and b) no items are cleared from the pending_downloads list. Cancellation may occur when the user pauses sync or when our low-latency check detects a connection issue. --- src/maestral/sync.py | 43 ++++++++++++++++++++----------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index fedf6b723..cd9c20f26 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -86,6 +86,7 @@ from .errors import ( MaestralApiError, SyncError, + CancelledError, NoDropboxDirError, CacheDirError, PathError, @@ -1399,7 +1400,7 @@ def _slow_down(self) -> None: def cancel_sync(self) -> None: """ - Cancels all pending sync jobs and blocks until the sync cycle is complete. + Raises a CancelledError in all sync threads and waits for them to shut down. """ self._cancel_requested.set() @@ -1563,8 +1564,7 @@ def upload_local_changes_while_inactive(self) -> None: else: logger.debug("No local changes while inactive") - if not self._cancel_requested.is_set(): - self.local_cursor = local_cursor + self.local_cursor = local_cursor def _get_local_changes_while_inactive(self) -> Tuple[List[FileSystemEvent], float]: """ @@ -1683,14 +1683,14 @@ def upload_sync_cycle(self): changes, cursor = self.list_local_changes() self.apply_local_changes(changes) - if not self._cancel_requested.is_set(): - # Save local cursor if not sync was not aborted by user. - # Failed uploads will be tracked and retried individually. - self.local_cursor = cursor + self.local_cursor = cursor del changes self._free_memory() + if self._cancel_requested.is_set(): + raise CancelledError("Sync cancelled") + def list_local_changes(self, delay: float = 1) -> Tuple[List[SyncEvent], float]: """ Waits for local file changes. Returns a list of local changes with at most one @@ -2120,9 +2120,7 @@ def _create_remote_entry(self, event: SyncEvent) -> SyncEvent: """ if self._cancel_requested.is_set(): - event.status = SyncStatus.Aborted - self.syncing.remove(event) - return event + raise CancelledError("Sync cancelled") self._slow_down() @@ -2605,6 +2603,9 @@ def _get_remote_folder(self, dbx_path: str) -> bool: for e in download_res ) + if self._cancel_requested.is_set(): + raise CancelledError("Sync cancelled") + except SyncError as e: self._handle_sync_error(e, direction=SyncDirection.Down) return False @@ -2655,11 +2656,11 @@ def download_sync_cycle(self) -> None: # Don't send desktop notifications during indexing. self.notify_user(downloaded) + # Save (incremental) remote cursor. + self.remote_cursor = cursor + if self._cancel_requested.is_set(): - break - else: - # Save (incremental) remote cursor. - self.remote_cursor = cursor + raise CancelledError("Sync cancelled") del changes del downloaded @@ -3133,9 +3134,7 @@ def _create_local_entry(self, event: SyncEvent) -> SyncEvent: """ if self._cancel_requested.is_set(): - event.status = SyncStatus.Aborted - self.syncing.remove(event) - return event + raise CancelledError("Sync cancelled") self._slow_down() @@ -3495,6 +3494,8 @@ def handle_sync_thread_errors( yield except DropboxServerError: logger.info("Dropbox server error", exc_info=True) + except CancelledError: + running.clear() except ConnectionError: logger.info(DISCONNECTED) logger.debug("Connection error", exc_info=True) @@ -3647,7 +3648,6 @@ def startup_worker( logger.info("Retrying failed syncs...") for dbx_path in list(sync.download_errors): - logger.info(f"Syncing ↓ {dbx_path}") sync.get_remote_item(dbx_path) # Resume interrupted downloads. @@ -3655,7 +3655,6 @@ def startup_worker( logger.info("Resuming interrupted syncs...") for dbx_path in list(sync.pending_downloads): - logger.info(f"Syncing ↓ {dbx_path}") sync.get_remote_item(dbx_path) sync.pending_downloads.discard(dbx_path) @@ -3898,10 +3897,8 @@ def start(self) -> None: def stop(self) -> None: """Stops syncing and destroys worker threads.""" - if not self.running.is_set(): - return - - logger.info("Shutting down threads...") + if self.running.is_set(): + logger.info("Shutting down threads...") self.sync.fs_events.disable() self.running.clear() From c9e509a12c4d2720fd2b984cc7bc2bdcb1443cee Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 15:34:40 +0000 Subject: [PATCH 364/374] [sync] tweak log messages --- src/maestral/sync.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index cd9c20f26..f77e34408 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -1411,6 +1411,8 @@ def cancel_sync(self) -> None: self._cancel_requested.clear() + logger.info("Sync aborted") + def busy(self) -> bool: """ Checks if we are currently syncing. @@ -2535,6 +2537,8 @@ def get_remote_item(self, dbx_path: str) -> bool: :returns: Whether download was successful. """ + logger.info(f"Syncing ↓ {dbx_path}") + with self.sync_lock: md = self.client.get_metadata(dbx_path, include_deleted=True) @@ -2574,8 +2578,6 @@ def _get_remote_folder(self, dbx_path: str) -> bool: with self.sync_lock: - logger.info(f"Syncing ↓ {dbx_path}") - try: idx = 0 From a7278866d76fee8a931c5c8d8bddc2d40584979c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 15:53:35 +0000 Subject: [PATCH 365/374] [sync] don't stop sync threads on low-latency connection error Instead, let them deal with connection issues themselves. They have a longer timeout and might be able to resume any upload or download sessions. --- src/maestral/sync.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index f77e34408..f77317c2b 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -3927,10 +3927,13 @@ def connection_monitor(self) -> None: if self.connected and not self.running.is_set() and self.autostart.is_set(): logger.info(CONNECTED) self.start() + elif not self.connected and self.running.is_set(): - logger.info(DISCONNECTED) - self.stop() - self.autostart.set() + + # Don't stop sync threads, let them deal with the connection issues with + # their own timeout. This prevents us from aborting any uploads or + # downloads which could still be saved on reconnection. + logger.info(CONNECTING) time.sleep(self.connection_check_interval) From 44944f87f9f0c11e5a9863ca1bc797225e5b8e4b Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 15:57:44 +0000 Subject: [PATCH 366/374] updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ee4491c3..9caeebf9c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -70,6 +70,10 @@ 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 sync 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: From 22581e74f8881790c3e94da0ba125392fd2180ae Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sat, 13 Feb 2021 17:16:22 +0000 Subject: [PATCH 367/374] updated change log --- CHANGELOG.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9caeebf9c..43a4db264 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ * 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. @@ -33,6 +33,7 @@ #### Changed: * Changes to indexing: + * Avoiding 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 @@ -45,7 +46,9 @@ change. * Defer periodic reindexing, typically carried out weekly, if we the device is not connected to an AC power supply. + * Changes to CLI: + * Moved linking and unlinking to a new command group `maestral auth` with subcommands `link`, `unlink` and `status`. * Renamed command `file-status` to `filestatus`. @@ -53,6 +56,7 @@ * Renamed the `configs` command to list config files to `config-files`. * Added an option `--clean` to `config-files` to remove all stale config files without a linked Dropbox account. + * Improved error message when the user is running out of inotify watches: Recommend default values of `max_user_watches = 524,288` and `max_user_instances = 1024` or double the current values, whichever is higher. Advise to apply the changes with From 75d4b5b072dc11d62ff82c40d8c1f23cd9bb6b07 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 10:40:51 +0000 Subject: [PATCH 368/374] [client] tweak error message for server errors --- src/maestral/client.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/maestral/client.py b/src/maestral/client.py index fad65fbb5..ec4aeaaf8 100644 --- a/src/maestral/client.py +++ b/src/maestral/client.py @@ -1518,11 +1518,10 @@ def dropbox_to_maestral_error( # ---- Internal Dropbox error ------------------------------------------------------ elif isinstance(exc, exceptions.InternalServerError): err_cls = DropboxServerError - title = "Could not sync file or folder" + title = "Dropbox server error" text = ( - "Something went wrong with the job on Dropbox’s end. Please " - "verify on the Dropbox website if the job succeeded and try " - "again if it failed." + "Something went wrong on Dropbox’s end. Please check on status.dropbox.com " + "if their services are up and running and try again later." ) maestral_exc = err_cls(title, text, dbx_path=dbx_path, local_path=local_path) From 1891429e659398211f2776236824e50941060996 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 10:41:58 +0000 Subject: [PATCH 369/374] [sync] handle non-sync related server errors like other fatal errors --- src/maestral/sync.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/maestral/sync.py b/src/maestral/sync.py index f77317c2b..0df9b7d43 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -91,7 +91,6 @@ CacheDirError, PathError, NotFoundError, - DropboxServerError, FileConflictError, FolderConflictError, InvalidDbidError, @@ -3494,8 +3493,6 @@ def handle_sync_thread_errors( try: yield - except DropboxServerError: - logger.info("Dropbox server error", exc_info=True) except CancelledError: running.clear() except ConnectionError: From e7dddec2b52624853aa564d2a1207a2730ca2847 Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 10:44:02 +0000 Subject: [PATCH 370/374] [main] catch errors in period update of account info --- src/maestral/main.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/maestral/main.py b/src/maestral/main.py index 8bde98e7d..b651b0b2a 100644 --- a/src/maestral/main.py +++ b/src/maestral/main.py @@ -1548,11 +1548,15 @@ async def _periodic_refresh_info(self) -> None: while True: # update account info if self.client.auth.loaded: - # only run if we have loaded the keyring, we don't - # want to trigger any keyring access from here - if self.client.linked: + + # Only run if we have loaded the keyring, we don't + # want to trigger any keyring access from here. + + try: await self._loop.run_in_executor(self._pool, self.get_account_info) await self._loop.run_in_executor(self._pool, self.get_profile_pic) + except (ConnectionError, MaestralApiError): + pass await sleep_rand(60 * 45) From 60f9490f9079149651018ec769158782d96fdc3c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 15:23:27 +0000 Subject: [PATCH 371/374] =?UTF-8?q?Bump=20version:=201.3.2.dev0=20?= =?UTF-8?q?=E2=86=92=201.4.0.dev0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/conf.py | 2 +- setup.cfg | 6 +----- setup.py | 2 +- src/maestral/__init__.py | 2 +- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 328085689..4ff2aefc4 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -11,7 +11,7 @@ # -- Project information --------------------------------------------------------------- author = "Sam Schott" -version = "1.3.2.dev0" +version = "1.4.0.dev0" release = version project = "Maestral" title = "Maestral API Documentation" diff --git a/setup.cfg b/setup.cfg index 616b071d7..f4014b992 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 1.3.2.dev0 +current_version = 1.4.0.dev0 commit = True tag = False parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\.(?P[a-z]+)(?P\d+))? @@ -25,10 +25,6 @@ replace = version="{new_version}" [bumpversion:file:docs/conf.py] [flake8] -# E203: whitespace before ':', conflicts with black -# E501: line width, is handled by black -# W503: line break before binary operator, conflict with black -# H306: imports in alphabetical order ignore = E203,E501,W503,H306 statistics = True diff --git a/setup.py b/setup.py index e6ff2bbdd..9be3e13b9 100644 --- a/setup.py +++ b/setup.py @@ -55,7 +55,7 @@ name="maestral", author="Sam Schott", author_email="ss2151@cam.ac.uk", - version="1.3.2.dev0", + version="1.4.0.dev0", url="https://github.com/SamSchott/maestral", description="Open-source Dropbox client for macOS and Linux.", license="MIT", diff --git a/src/maestral/__init__.py b/src/maestral/__init__.py index 11bf2dc8c..e895db638 100644 --- a/src/maestral/__init__.py +++ b/src/maestral/__init__.py @@ -2,7 +2,7 @@ import warnings -__version__ = "1.3.2.dev0" +__version__ = "1.4.0.dev0" __author__ = "Sam Schott" __url__ = "https://github.com/SamSchott/maestral" From 99a85fe2c5e6fd0b9526a8f151d894adef7508ff Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 15:35:35 +0000 Subject: [PATCH 372/374] update release notes to prepare for 1.4.0 --- CHANGELOG.md | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 43a4db264..11ee7d648 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,16 @@ -## v1.3.2.dev +## v1.4.0 + +This release brings significant improvements 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 +when keeping a mirror of a remote Dropbox folder while ignoring local changes. + +Bug fixes mostly concern resuming the sync activity when the connection has been lost +while indexing a remote folder. + +Finally, this release removes automatic error reporting via Bugsnag. Please file any +issues on GitHub where it is possible to follow up. #### Added: @@ -95,9 +107,9 @@ * 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 from Maestral, built on - the code from the `notify` module. -* Removed bugsnag dependency. +* 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 From 0eea8a7ae506fd011ea83a848d31080c5b87d13c Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 16:57:35 +0000 Subject: [PATCH 373/374] [sync] improve log messages when resuming indexing --- src/maestral/config/main.py | 2 ++ src/maestral/sync.py | 50 ++++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/maestral/config/main.py b/src/maestral/config/main.py index 74ec61546..03b9d7304 100644 --- a/src/maestral/config/main.py +++ b/src/maestral/config/main.py @@ -82,6 +82,8 @@ "cursor": "", # remote cursor: represents last state synced from dropbox "lastsync": 0.0, # local cursor: time-stamp of last upload "last_reindex": 0.0, # time-stamp of full last reindexing + "indexing_counter": 0, # counter for indexing progress between restarts + "did_finish_indexing": False, # indicates completed indexing "upload_errors": [], # failed uploads to retry on next sync "download_errors": [], # failed downloads to retry on next sync "pending_uploads": [], # incomplete uploads to retry on next sync diff --git a/src/maestral/sync.py b/src/maestral/sync.py index 0df9b7d43..3f9d54ddc 100644 --- a/src/maestral/sync.py +++ b/src/maestral/sync.py @@ -2645,20 +2645,41 @@ def download_sync_cycle(self) -> None: with self.sync_lock: - is_indexing = self.remote_cursor == "" + if self.remote_cursor == "": + + self._state.set("sync", "last_reindex", time.time()) + self._state.set("sync", "did_finish_indexing", False) + self._state.set("sync", "indexing_counter", 0) + + idx = self._state.get("sync", "indexing_counter") + is_indexing = not self._state.get("sync", "did_finish_indexing") + + if is_indexing and idx == 0: + logger.info("Indexing remote Dropbox") + elif is_indexing: + logger.info("Resuming indexing") + else: + logger.info("Fetching remote changes") changes_iter = self.list_remote_changes_iterator(self.remote_cursor) # Download changes in chunks to reduce memory usage. for changes, cursor in changes_iter: - downloaded = self.apply_remote_changes(changes) - if not is_indexing: - # Don't send desktop notifications during indexing. - self.notify_user(downloaded) + idx += len(changes) + + if idx > 0: + logger.info(f"Indexing {idx}...") + + downloaded = self.apply_remote_changes(changes) # Save (incremental) remote cursor. self.remote_cursor = cursor + self._state.set("sync", "indexing_counter", idx) + + # Send desktop notifications when not indexing. + if not is_indexing: + self.notify_user(downloaded) if self._cancel_requested.is_set(): raise CancelledError("Sync cancelled") @@ -2666,6 +2687,12 @@ def download_sync_cycle(self) -> None: del changes del downloaded + self._state.set("sync", "did_finish_indexing", True) + self._state.set("sync", "indexing_counter", 0) + + if idx > 0: + logger.info(IDLE) + self._free_memory() def list_remote_changes_iterator( @@ -2681,27 +2708,17 @@ def list_remote_changes_iterator( :returns: Iterator yielding tuples with remote changes and corresponding cursor. """ - idx = 0 - if last_cursor == "": # We are starting from the beginning, do a full indexing. - logger.info("Fetching remote Dropbox") - self._state.set("sync", "last_reindex", time.time()) changes_iter = self.client.list_folder_iterator("/", recursive=True) else: # Pick up where we left off. This may be an interrupted indexing / # pagination through changes or a completely new set of changes. - logger.info("Fetching remote changes...") logger.debug("Fetching remote changes since cursor: %s", last_cursor) changes_iter = self.client.list_remote_changes_iterator(last_cursor) for changes in changes_iter: - idx += len(changes.entries) - - if idx > 0: - logger.info(f"Indexing {idx}...") - logger.debug("Listed remote changes:\n%s", entries_repr(changes.entries)) clean_changes = self._clean_remote_changes(changes) @@ -2718,9 +2735,6 @@ def list_remote_changes_iterator( yield sync_events, changes.cursor - if idx > 0: - logger.info(IDLE) - def apply_remote_changes(self, sync_events: List[SyncEvent]) -> List[SyncEvent]: """ Applies remote changes to local folder. Call this on the result of From 0b25e7053c70615a7d7f3db62ecf97b9a40dbe8e Mon Sep 17 00:00:00 2001 From: Sam Schott Date: Sun, 14 Feb 2021 19:26:38 +0000 Subject: [PATCH 374/374] updated change log --- CHANGELOG.md | 83 ++++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 11ee7d648..aa9949fdf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,22 @@ ## v1.4.0 -This release brings significant improvements 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 -when keeping a mirror of a remote Dropbox folder while ignoring local changes. +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. -Bug fixes mostly concern resuming the sync activity when the connection has been lost -while indexing a remote folder. +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 -issues on GitHub where it is possible to follow up. +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 of a file. +* 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: @@ -32,60 +32,65 @@ issues on GitHub where it is possible to follow up. * `get`: Gets the config value for a key. * `set`: Sets the config value for a key. - Use these commands with caution: setting some config values may leave the daemon in an - inconsistent state (e.g., changing the location of the Dropbox folder). Always prefer - the equivalent command from the Settings group (e.g., `maestral move-dir`). -* Added the ability to turn off one sync direction, for instance to enable download + 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. To use this, set the respective config values for `upload` or - `download` to False. Note that conflict resolution remain 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. + 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: - * Avoiding 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. + * 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 we the device is not - connected to an AC power supply. - + * 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 command `file-status` to `filestatus`. + * 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 without - a linked Dropbox account. + * Added an option `--clean` to `config-files` to remove all stale config files (those + without a linked Dropbox account). -* Improved error message when the user is running out of inotify watches: Recommend - default values of `max_user_watches = 524,288` and `max_user_instances = 1024` or +* 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 CLI on Python 3.6 where commands that print datetimes to the - console would raise an exception. -* Properly handle a rare OSError ([Errno 41] Protocol wrong type for socket) on macOS, +* 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 sync cycle. + 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 @@ -93,13 +98,13 @@ issues on GitHub where it is possible to follow up. #### Removed: -* Removed automatic error reporting via bugsnag. Please file issues directly on GitHub - instead. This allows following up on errors and investigating their cause while - removing third party access to potentially private information. +* 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 main API `Maestral.resume_sync` and `Maestral.pause_sync`. Use +å +* Removed the public API methods `Maestral.resume_sync` and `Maestral.pause_sync`. Use `Maestral.start_sync` and `Maestral.stop_sync` instead. #### Dependencies: