#!/usr/bin/env python3 # Copyright 2013 The Flutter Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Emulation of `rm -f out && cp -af` in out. This is necessary on Mac in order to preserve nanoseconds of mtime. See https://fxbug.dev/56376#c5.""" import os import shutil import sys def main(): if len(sys.argv) != 3: print('usage: copy.py source dest', file=sys.stderr) return 1 source = sys.argv[1] dest = sys.argv[2] if os.path.isdir(source): print(f'{source} is a directory, tool "copy" does not support directory copies') return 1 if os.path.exists(dest): if os.path.isdir(dest): def _on_error(fn, path, dummy_excinfo): # The operation failed, possibly because the file is set to # read-only. If that's why, make it writable and try the op # again. if not os.access(path, os.W_OK): os.chmod(path, stat.S_IWRITE) fn(path) shutil.rmtree(dest, onerror=_on_error) else: if not os.access(dest, os.W_OK): # Attempt to make the file writable before deleting it. os.chmod(dest, stat.S_IWRITE) os.unlink(dest) shutil.copy2(source, dest) if __name__ == '__main__': main()