xref: /openbmc/openbmc/poky/scripts/cp-noerror (revision 92b42cb3)
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