From 87ac64d684a588fde3507bc18d40c07a8d77ca3f Mon Sep 17 00:00:00 2001 From: Rodja Trappe Date: Sun, 31 Dec 2023 10:43:49 +0100 Subject: [PATCH] Introduce --ignore-mutex option --- livesync/livesync.py | 3 ++- livesync/sync.py | 24 ++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/livesync/livesync.py b/livesync/livesync.py index 1c08adf..5734f22 100755 --- a/livesync/livesync.py +++ b/livesync/livesync.py @@ -13,12 +13,13 @@ def main(): parser.add_argument('--ssh-port', type=int, default=22, help='SSH port on target') parser.add_argument('--on-change', type=str, help='command to be executed on remote host after any file change') parser.add_argument('--mutex-interval', type=int, default=10, help='interval in which mutex is updated') + parser.add_argument('--ignore-mutex', action='store_true', help='ignore mutex (use with caution)') parser.add_argument('rsync_args', nargs=argparse.REMAINDER, help='arbitrary rsync parameters after "--"') args = parser.parse_args() folder = Folder(args.source, args.target, ssh_port=args.ssh_port, on_change=args.on_change) folder.rsync_args(' '.join(args.rsync_args)) - sync(folder, mutex_interval=args.mutex_interval) + sync(folder, mutex_interval=args.mutex_interval, ignore_mutex=args.ignore_mutex) if __name__ == '__main__': diff --git a/livesync/sync.py b/livesync/sync.py index 69a39bd..88b7058 100644 --- a/livesync/sync.py +++ b/livesync/sync.py @@ -10,15 +10,16 @@ def get_summary(folders: Iterable[Folder]) -> str: return '\n'.join(folder.get_summary() for folder in folders).replace('"', '\'') -async def run_folder_tasks(folders: Iterable[Folder], mutex_interval: float) -> None: +async def run_folder_tasks(folders: Iterable[Folder], mutex_interval: float, ignore_mutex: bool = False) -> None: try: - summary = get_summary(folders) - mutexes = {folder.host: Mutex(folder.host, folder.ssh_port) for folder in folders} - for mutex in mutexes.values(): - print(f'Checking mutex on {mutex.host}', flush=True) - if not mutex.set(summary): - print(f'Target is in use by {mutex.occupant}') - sys.exit(1) + if not ignore_mutex: + summary = get_summary(folders) + mutexes = {folder.host: Mutex(folder.host, folder.ssh_port) for folder in folders} + for mutex in mutexes.values(): + print(f'Checking mutex on {mutex.host}', flush=True) + if not mutex.set(summary): + print(f'Target is in use by {mutex.occupant}') + sys.exit(1) for folder in folders: print(f' {folder.source_path} --> {folder.target}', flush=True) @@ -29,6 +30,9 @@ async def run_folder_tasks(folders: Iterable[Folder], mutex_interval: float) -> asyncio.create_task(folder.watch()) while True: + if ignore_mutex: + await asyncio.sleep(0) + continue summary = get_summary(folders) for mutex in mutexes.values(): if not mutex.set(summary): @@ -38,8 +42,8 @@ async def run_folder_tasks(folders: Iterable[Folder], mutex_interval: float) -> print(e) -def sync(*folders: Folder, mutex_interval: float = 10) -> None: +def sync(*folders: Folder, mutex_interval: float = 10, ignore_mutex: bool = False) -> None: try: - asyncio.run(run_folder_tasks(folders, mutex_interval)) + asyncio.run(run_folder_tasks(folders, mutex_interval, ignore_mutex=ignore_mutex)) except KeyboardInterrupt: print('Bye!')