diff options
| author | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
|---|---|---|
| committer | Devtools Arcadia <[email protected]> | 2022-02-07 18:08:42 +0300 | 
| commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
| tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /build/scripts/fs_tools.py | |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'build/scripts/fs_tools.py')
| -rw-r--r-- | build/scripts/fs_tools.py | 104 | 
1 files changed, 104 insertions, 0 deletions
| diff --git a/build/scripts/fs_tools.py b/build/scripts/fs_tools.py new file mode 100644 index 00000000000..dec4c349c89 --- /dev/null +++ b/build/scripts/fs_tools.py @@ -0,0 +1,104 @@ +from __future__ import print_function + +import os +import platform +import sys +import shutil +import errno + +import process_command_files as pcf + + +def link_or_copy(src, dst): +    try: +        if platform.system().lower() == 'windows': +            shutil.copy(src, dst) +        else: +            os.link(src, dst) +    except OSError as e: +        if e.errno == errno.EEXIST: +            print('link_or_copy: destination file already exists: {}'.format(dst), file=sys.stderr) +        if e.errno == errno.ENOENT: +            print('link_or_copy: source file doesn\'t exists: {}'.format(src), file=sys.stderr) +        raise + + +if __name__ == '__main__': +    mode = sys.argv[1] +    args = pcf.get_args(sys.argv[2:]) + +    if mode == 'copy': +        shutil.copy(args[0], args[1]) +    elif mode == 'copy_tree_no_link': +        dst = args[1] +        shutil.copytree(args[0], dst, ignore=lambda dirname, names: [n for n in names if os.path.islink(os.path.join(dirname, n))]) +    elif mode == 'copy_files': +        src = args[0] +        dst = args[1] +        files = open(args[2]).read().strip().split() +        for f in files: +            s = os.path.join(src, f) +            d = os.path.join(dst, f) +            if os.path.exists(d): +                continue +            try: +                os.makedirs(os.path.dirname(d)) +            except OSError: +                pass +            shutil.copy(s, d) +    elif mode == 'copy_all_files': +        src = args[0] +        dst = args[1] +        for root, _, files in os.walk(src): +            for f in files: +                if os.path.islink(os.path.join(root, f)): +                    continue +                file_dst = os.path.join(dst, os.path.relpath(root, src), f) +                if os.path.exists(file_dst): +                    continue +                try: +                    os.makedirs(os.path.dirname(file_dst)) +                except OSError: +                    pass +                shutil.copy(os.path.join(root, f), file_dst) +    elif mode == 'rename_if_exists': +        if os.path.exists(args[0]): +            shutil.move(args[0], args[1]) +    elif mode == 'rename': +        targetdir = os.path.dirname(args[1]) +        if targetdir and not os.path.exists(targetdir): +            os.makedirs(os.path.dirname(args[1])) +        shutil.move(args[0], args[1]) +    elif mode == 'remove': +        for f in args: +            try: +                if os.path.isfile(f) or os.path.islink(f): +                    os.remove(f) +                else: +                    shutil.rmtree(f) +            except OSError: +                pass +    elif mode == 'link_or_copy': +        link_or_copy(args[0], args[1]) +    elif mode == 'link_or_copy_to_dir': +        assert len(args) > 1 +        start = 0 +        if args[0] == '--no-check': +            if args == 2: +                sys.exit() +            start = 1 +        dst = args[-1] +        for src in args[start:-1]: +            link_or_copy(src, os.path.join(dst, os.path.basename(src))) +    elif mode == 'cat': +        with open(args[0], 'w') as dst: +            for input_name in args[1:]: +                with open(input_name) as src: +                    dst.write(src.read()) +    elif mode == 'md': +        try: +            os.makedirs(args[0]) +        except OSError: +            pass +    else: +        raise Exception('unsupported tool %s' % mode) | 
