#!/usr/bin/env python3

import os
import sys

def permit_osx_workaround(m1,  m2):
    import platform
    if platform.system().lower() != 'darwin':
        return False
    if m2 % 10000 != 0:
        return False
    if m1//10000 != m2//10000:
        return False
    return True

if len(sys.argv) == 2:
    assert(os.path.exists(sys.argv[1]))
elif len(sys.argv) == 3:
    f1 = sys.argv[1]
    f2 = sys.argv[2]
    m1 = os.stat(f1).st_mtime_ns
    m2 = os.stat(f2).st_mtime_ns
    # Compare only os.stat()
    if m1 != m2:
        # Under macOS the lower four digits sometimes get assigned
        # zero, even though shutil.copy2 should preserve metadata.
        # Just have to accept it, I guess.
        if not permit_osx_workaround(m1, m2):
            raise RuntimeError(f'mtime of {f1!r} ({m1!r}) != mtime of {f2!r} ({m2!r})')
    import filecmp
    if not filecmp.cmp(f1, f2):
        raise RuntimeError(f'{f1!r} != {f2!r}')
else:
    raise AssertionError
