#!/usr/bin/env python3
#
# SPDX-License-Identifier: GPL-2.0-only
#
# Allow copying of $1 to $2 but if files in $1 disappear during the copy operation,
# don't error.
# Also don't error if $1 disappears.
#

import sys
import os
import shutil

def copytree(src, dst, symlinks=False, ignore=None):
    """Based on shutil.copytree"""
    names = os.listdir(src)
    try:
        os.makedirs(dst)
    except OSError: 
        # Already exists
        pass
    errors = []
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            d = dstname
            if os.path.isdir(dstname):
                d = os.path.join(dstname, os.path.basename(srcname))
            if os.path.exists(d):
                continue
            try:
                os.link(srcname, dstname)
            except OSError:
                shutil.copy2(srcname, dstname)
        # catch the Error from the recursive copytree so that we can
        # continue with other files
        except shutil.Error as err:
            errors.extend(err.args[0])
        except EnvironmentError as why:
            errors.append((srcname, dstname, str(why)))
    try:
        shutil.copystat(src, dst)
    except OSError as why:
        errors.extend((src, dst, str(why)))
    if errors:
        raise shutil.Error(errors)

try:
    copytree(sys.argv[1], sys.argv[2])
except shutil.Error:
   pass
except OSError:
   pass
