#!/usr/bin/env python3 import os import sys import tempfile from posix_parity import cleanup_dir from posix_parity import cleanup_paths from posix_parity import compare_calls from posix_parity import fail from posix_parity import join from posix_parity import mergerfs_mount from posix_parity import temp_dir from posix_parity import touch def main(): try: with mergerfs_mount() as (mount, _): with tempfile.TemporaryDirectory() as native: merge_base = temp_dir(mount) try: native_base = join(native, os.path.basename(merge_base)) os.makedirs(native_base, exist_ok=True) merge_src = join(merge_base, "src") native_src = join(native_base, "src") merge_dst = join(merge_base, "dst") native_dst = join(native_base, "dst") merge_slnk = join(merge_base, "symlink") native_slnk = join(native_base, "symlink") merge_missing = join(merge_base, "missing") native_missing = join(native_base, "missing") cleanup_paths([merge_src, merge_dst, merge_slnk]) touch(merge_src, b"src", 0o644) touch(native_src, b"src", 0o644) err = compare_calls("link success", lambda: os.link(merge_src, merge_dst), lambda: os.link(native_src, native_dst)) if err: return fail(err) err = compare_calls( "link ENOENT source", lambda: os.link(merge_missing, join(merge_base, "dst2")), lambda: os.link(native_missing, join(native_base, "dst2")), ) if err: return fail(err) err = compare_calls( "symlink success", lambda: os.symlink("src", merge_slnk), lambda: os.symlink("src", native_slnk), ) if err: return fail(err) err = compare_calls( "symlink EEXIST", lambda: os.symlink("src", merge_slnk), lambda: os.symlink("src", native_slnk), ) if err: return fail(err) return 0 finally: cleanup_dir(merge_base) except RuntimeError as exc: print(str(exc), end="") return 77 if __name__ == "__main__": raise SystemExit(main())