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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
from __future__ import print_function
import os
import platform
import sys
import shutil
import errno
# Explicitly enable local imports
# Don't forget to add imported scripts to inputs of the calling command!
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
import process_command_files as pcf
def link_or_copy(src, dst, trace={}):
if dst not in trace:
trace[dst] = src
try:
if platform.system().lower() == 'windows':
shutil.copy(src, dst)
else:
os.link(src, dst)
except OSError as e:
if e.errno == errno.EEXIST:
if dst in trace:
print(
'[[bad]]link_or_copy: copy collision found - tried to copy {} to {} which was copied earlier from {}[[rst]]'.format(
src, dst, trace[dst]
),
file=sys.stderr,
)
else:
print('[[bad]]link_or_copy: destination file already exists: {}[[rst]]'.format(dst), file=sys.stderr)
if e.errno == errno.ENOENT:
print('[[bad]]link_or_copy: source file doesn\'t exists: {}[[rst]]'.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)
|