1eb8dc403SDave Cobbley#!/usr/bin/env python3 2eb8dc403SDave Cobbley# 3*92b42cb3SPatrick Williams# Copyright OpenEmbedded Contributors 4*92b42cb3SPatrick Williams# 5c342db35SBrad Bishop# SPDX-License-Identifier: GPL-2.0-only 6c342db35SBrad Bishop# 7eb8dc403SDave Cobbley# Allow copying of $1 to $2 but if files in $1 disappear during the copy operation, 8eb8dc403SDave Cobbley# don't error. 9eb8dc403SDave Cobbley# Also don't error if $1 disappears. 10eb8dc403SDave Cobbley# 11eb8dc403SDave Cobbley 12eb8dc403SDave Cobbleyimport sys 13eb8dc403SDave Cobbleyimport os 14eb8dc403SDave Cobbleyimport shutil 15eb8dc403SDave Cobbley 16eb8dc403SDave Cobbleydef copytree(src, dst, symlinks=False, ignore=None): 17eb8dc403SDave Cobbley """Based on shutil.copytree""" 18eb8dc403SDave Cobbley names = os.listdir(src) 19eb8dc403SDave Cobbley try: 20eb8dc403SDave Cobbley os.makedirs(dst) 21eb8dc403SDave Cobbley except OSError: 22eb8dc403SDave Cobbley # Already exists 23eb8dc403SDave Cobbley pass 24eb8dc403SDave Cobbley errors = [] 25eb8dc403SDave Cobbley for name in names: 26eb8dc403SDave Cobbley srcname = os.path.join(src, name) 27eb8dc403SDave Cobbley dstname = os.path.join(dst, name) 28eb8dc403SDave Cobbley try: 29eb8dc403SDave Cobbley d = dstname 30eb8dc403SDave Cobbley if os.path.isdir(dstname): 31eb8dc403SDave Cobbley d = os.path.join(dstname, os.path.basename(srcname)) 32eb8dc403SDave Cobbley if os.path.exists(d): 33eb8dc403SDave Cobbley continue 34eb8dc403SDave Cobbley try: 35eb8dc403SDave Cobbley os.link(srcname, dstname) 36eb8dc403SDave Cobbley except OSError: 37eb8dc403SDave Cobbley shutil.copy2(srcname, dstname) 38eb8dc403SDave Cobbley # catch the Error from the recursive copytree so that we can 39eb8dc403SDave Cobbley # continue with other files 40eb8dc403SDave Cobbley except shutil.Error as err: 41eb8dc403SDave Cobbley errors.extend(err.args[0]) 42eb8dc403SDave Cobbley except EnvironmentError as why: 43eb8dc403SDave Cobbley errors.append((srcname, dstname, str(why))) 44eb8dc403SDave Cobbley try: 45eb8dc403SDave Cobbley shutil.copystat(src, dst) 46eb8dc403SDave Cobbley except OSError as why: 47eb8dc403SDave Cobbley errors.extend((src, dst, str(why))) 48eb8dc403SDave Cobbley if errors: 49eb8dc403SDave Cobbley raise shutil.Error(errors) 50eb8dc403SDave Cobbley 51eb8dc403SDave Cobbleytry: 52eb8dc403SDave Cobbley copytree(sys.argv[1], sys.argv[2]) 53eb8dc403SDave Cobbleyexcept shutil.Error: 54eb8dc403SDave Cobbley pass 55eb8dc403SDave Cobbleyexcept OSError: 56eb8dc403SDave Cobbley pass 57