Last active
December 11, 2025 17:30
-
-
Save bmr-cymru/ee8046006bc6339388cec3c7d4bfe291 to your computer and use it in GitHub Desktop.
`snapm` difference engine test driver
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/python3 | |
| from argparse import ArgumentParser | |
| import logging | |
| import sys | |
| import snapm | |
| import snapm.manager | |
| import snapm.manager.plugins | |
| from snapm._fsdiff import FsDiffer, DiffOptions | |
| LOG_LEVELS = { | |
| "debug": logging.DEBUG, | |
| "info": logging.INFO, | |
| "warn": logging.WARNING, | |
| "error": logging.ERROR, | |
| } | |
| def main(): | |
| parser = ArgumentParser("difftest.py") | |
| parser.add_argument( | |
| "-f", | |
| "--file-types", | |
| help="Generate file type information (slower)", | |
| action="store_true", | |
| ) | |
| parser.add_argument( | |
| "-l", | |
| "--log-level", | |
| default = "info", | |
| help = f"Set log level ({", ".join(LOG_LEVELS.keys())})", | |
| choices=LOG_LEVELS.keys(), | |
| ) | |
| parser.add_argument( | |
| "-n", | |
| "--no-diff", | |
| help="Do not generate content diffs", | |
| action="store_true", | |
| ) | |
| parser.add_argument( | |
| "-s", | |
| "--start-path", | |
| default="/", | |
| metavar="PATH", | |
| type=str, | |
| help="Start traversal from PATH", | |
| ) | |
| parser.add_argument( | |
| "name", | |
| type=str, | |
| help="Snapshot set name to compare to system", | |
| ) | |
| args = parser.parse_args() | |
| snapm_log = logging.getLogger("snapm") | |
| formatter = logging.Formatter('%(levelname)s - %(message)s') | |
| snapm_log.setLevel(LOG_LEVELS[args.log_level]) | |
| _console_handler = logging.StreamHandler() | |
| _console_handler.setFormatter(formatter) | |
| snapm_log.addHandler(_console_handler) | |
| m = snapm.manager.Manager() | |
| sys_root = m.mounts.get_sys_mount() | |
| did_mount = False | |
| mounts = m.mounts.find_mounts(snapm.Selection(name=args.name)) | |
| if not mounts: | |
| snapsets = m.find_snapshot_sets(snapm.Selection(name=args.name)) | |
| if not snapsets: | |
| print(f"Cannot find snapshot set named '{args.name}'", file=sys.stderr) | |
| sys.exit(1) | |
| snapset = snapsets[0] | |
| snap_root = m.mounts.mount(snapset) | |
| did_mount = True | |
| else: | |
| snap_root = mounts[0] | |
| options = DiffOptions( | |
| from_path = args.start_path, | |
| include_content_diffs = not args.no_diff, | |
| include_file_type = args.file_types, | |
| ) | |
| fsd = FsDiffer(m, options=options) | |
| try: | |
| diffs = fsd.compare_roots(snap_root, sys_root) | |
| except (KeyboardInterrupt, SystemExit, BrokenPipeError): | |
| return | |
| print(f"Found {len(diffs)} changes:") | |
| print("\n\n".join(str(diff) for diff in diffs)) | |
| if did_mount: | |
| m.mounts.umount(snapset) | |
| if __name__ == "__main__": | |
| main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment