aboutsummaryrefslogtreecommitdiffstats
path: root/build/scripts/fs_tools.py
blob: f6d81ca48816891e4053b3188cdb9429c8c7d3f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
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)