From 97a1e459e522852b4c26ca8317b3794f53c2717b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:53:46 +0000 Subject: [PATCH 1/4] refactor: Use device path for sdm.unmount_device in close command Agent-Logs-Url: https://github.com/MaxG87/ButterBackup/sessions/ad709da7-175c-40a9-9c3d-24ea27cb80c0 Co-authored-by: MaxG87 <5477952+MaxG87@users.noreply.github.com> --- src/butter_backup/cli.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/butter_backup/cli.py b/src/butter_backup/cli.py index 81feb24..5177e14 100644 --- a/src/butter_backup/cli.py +++ b/src/butter_backup/cli.py @@ -169,17 +169,16 @@ def close(config: Path = CONFIG_OPTION, verbose: int = VERBOSITY_OPTION) -> None configurations = cp.parse_configuration(config.read_text()) mounted_devices = sdm.get_mounted_devices() for cfg in configurations: - mapped_device = str(cfg.map_name()) - if cfg.device().exists() and mapped_device in mounted_devices: - mount_dirs = mounted_devices[mapped_device] + map_name = cfg.map_name() + if cfg.device().exists() and str(map_name) in mounted_devices: + mount_dirs = mounted_devices[str(map_name)] if len(mount_dirs) != 1: # TODO introduce custom exception raise ValueError( "Got several possible mount points. Expected exactly 1!" ) - mount_dir = next(iter(mount_dirs)) - sdm.unmount_device(mount_dir) - sdm.close_decrypted_device(Path(mapped_device)) + sdm.unmount_device(map_name) + sdm.close_decrypted_device(map_name) @app.command() From beec5321cb0aac6aebc07133d003e8c03beec66c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:54:19 +0000 Subject: [PATCH 2/4] refactor: Remove BtrFSRsyncBackend.sync_filesystem_changes Agent-Logs-Url: https://github.com/MaxG87/ButterBackup/sessions/ad709da7-175c-40a9-9c3d-24ea27cb80c0 Co-authored-by: MaxG87 <5477952+MaxG87@users.noreply.github.com> --- src/butter_backup/backup_backends.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/butter_backup/backup_backends.py b/src/butter_backup/backup_backends.py index 3018dea..98d357f 100644 --- a/src/butter_backup/backup_backends.py +++ b/src/butter_backup/backup_backends.py @@ -57,7 +57,6 @@ def do_backup(self, mount_dir: Path) -> None: files_dest.mkdir(parents=True, exist_ok=True) for src in self.config.Files: self.rsync_file(src, files_dest) - self.sync_filesystem_changes(mount_dir) @staticmethod def get_source_snapshot(root: Path) -> Path: @@ -108,10 +107,6 @@ def rsync_file(src: Path, dest: Path) -> None: cmd: sh.StrPathList = ["sudo", "rsync", "-ax", "--inplace", src, dest] sh.run_cmd(cmd=cmd) - @staticmethod - def sync_filesystem_changes(mount_dir: Path) -> None: - sync_cmd: sh.StrPathList = ["sudo", "btrfs", "filesystem", "sync", mount_dir] - sh.run_cmd(cmd=sync_cmd) @staticmethod def rsync_folder( From 22018e80e08e1ff0515e8ab59289fc8be9de34de Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:54:43 +0000 Subject: [PATCH 3/4] refactor: Remove ResticBackend.sync_filesystem_changes Agent-Logs-Url: https://github.com/MaxG87/ButterBackup/sessions/ad709da7-175c-40a9-9c3d-24ea27cb80c0 Co-authored-by: MaxG87 <5477952+MaxG87@users.noreply.github.com> --- src/butter_backup/backup_backends.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/butter_backup/backup_backends.py b/src/butter_backup/backup_backends.py index 98d357f..14a64e9 100644 --- a/src/butter_backup/backup_backends.py +++ b/src/butter_backup/backup_backends.py @@ -107,7 +107,6 @@ def rsync_file(src: Path, dest: Path) -> None: cmd: sh.StrPathList = ["sudo", "rsync", "-ax", "--inplace", src, dest] sh.run_cmd(cmd=cmd) - @staticmethod def rsync_folder( src: Path, dest: Path, maybe_exclude_patterns: Path | None @@ -148,11 +147,6 @@ def adapt_ownership(backup_repository: Path) -> None: ) sdm.chown(backup_repository, user, group, recursive=True) - @staticmethod - def sync_filesystem_changes(mount_dir: Path) -> None: - sync_cmd: sh.StrPathList = ["sudo", "sync", "-f", mount_dir] - sh.run_cmd(cmd=sync_cmd) - def copy_files(self, backup_repository: Path) -> None: restic_cmd: sh.StrPathList = [ "sudo", @@ -166,4 +160,3 @@ def copy_files(self, backup_repository: Path) -> None: restic_cmd.extend(["--exclude-file", self.config.ExcludePatternsFile]) restic_cmd.extend(list(self.config.FilesAndFolders)) sh.pipe_pass_cmd_to_real_cmd(self.config.RepositoryPassCmd, restic_cmd) - self.sync_filesystem_changes(backup_repository) From 483de4aea709027b76aee1672b1ad6e50dbac6ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20G=C3=B6rner?= <5477952+MaxG87@users.noreply.github.com> Date: Mon, 27 Apr 2026 21:37:55 +0200 Subject: [PATCH 4/4] feat: Continue with othen devices on close unmount confusion --- src/butter_backup/cli.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/butter_backup/cli.py b/src/butter_backup/cli.py index 5177e14..71dd2a4 100644 --- a/src/butter_backup/cli.py +++ b/src/butter_backup/cli.py @@ -170,13 +170,18 @@ def close(config: Path = CONFIG_OPTION, verbose: int = VERBOSITY_OPTION) -> None mounted_devices = sdm.get_mounted_devices() for cfg in configurations: map_name = cfg.map_name() - if cfg.device().exists() and str(map_name) in mounted_devices: - mount_dirs = mounted_devices[str(map_name)] - if len(mount_dirs) != 1: - # TODO introduce custom exception - raise ValueError( - "Got several possible mount points. Expected exactly 1!" + map_name_as_str = str(map_name) + if cfg.device().exists() and map_name_as_str in mounted_devices: + mount_dirs = mounted_devices[map_name_as_str] + num_mount_dirs = len(mount_dirs) + if num_mount_dirs != 1: + logger.error( + "Got {num_mount_dirs} mount points for device {device}. Expected" + " exactly 1! Skipping device.", + num_mount_dirs=num_mount_dirs, + device=cfg.Name, ) + continue sdm.unmount_device(map_name) sdm.close_decrypted_device(map_name)