Skip to content

Instantly share code, notes, and snippets.

@bmr-cymru
Last active December 11, 2025 17:30
Show Gist options
  • Select an option

  • Save bmr-cymru/ee8046006bc6339388cec3c7d4bfe291 to your computer and use it in GitHub Desktop.

Select an option

Save bmr-cymru/ee8046006bc6339388cec3c7d4bfe291 to your computer and use it in GitHub Desktop.
`snapm` difference engine test driver
#!/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