From fc49ba8081c9a1b72615dbb4dd860e6fcd5b3b2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B8=D0=BB=D1=8F=D0=BD=20=D0=9F=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=D1=83=D0=B7=D0=BE=D0=B2?= Date: Sat, 27 Jun 2020 19:42:13 +0000 Subject: [PATCH] cli/discover: remove local collections if the remote collection is deleted This works when the destination backend is 'filesystem' and the source is CalDAV-calendar-home-set. --- vdirsyncer/cli/__init__.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/vdirsyncer/cli/__init__.py b/vdirsyncer/cli/__init__.py index ff8650205..1d46216f5 100644 --- a/vdirsyncer/cli/__init__.py +++ b/vdirsyncer/cli/__init__.py @@ -1,10 +1,13 @@ import functools import logging +import os +import shutil import sys import click import click_log +from ..utils import expand_path from .. import __version__ from .. import BUGTRACKER_HOME @@ -198,6 +201,9 @@ def discover(ctx, pairs, max_workers, list): config = ctx.config wq = WorkerQueue(max_workers) + pairs_a = set() + pairs_b = set() + pairs_b_path = {} with wq.join(): for pair_name in (pairs or config.pairs): pair = config.get_pair(pair_name) @@ -210,6 +216,22 @@ def discover(ctx, pairs, max_workers, list): list_collections=list, )) wq.spawn_worker() + if pair.config_b['type'] == 'filesystem': + for key in _DiscoverResult(pair.config_b)._discovered.keys(): + pairs_b.add(key) + pairs_b_path[key] = (pair.config_b["path"], pair.name) + pairs_a = pairs_a.union(set(_DiscoverResult(pair.config_a)._discovered.keys())) + + for dele in pairs_b - pairs_a: + path = pairs_b_path[dele][0] + '/' + dele + if not os.path.islink(path): + shutil.rmtree(path, ignore_errors=True) + path = expand_path(os.path.join(config.general['status_path'], pairs_b_path[dele][1] + '/' + dele)) + for m in ('items', 'metadata'): + try: + os.remove(path + '.' + m) + except: + pass @app.command() @@ -243,3 +265,5 @@ def repair(ctx, collection, repair_unsafe_uid): click.confirm('Do you want to continue?', abort=True) repair_collection(ctx.config, collection, repair_unsafe_uid=repair_unsafe_uid) + +from .discover import _DiscoverResult