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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
import argparse
import errno
import os
import process_command_files as pcf
import shutil
import sys
def parse_args():
parser = argparse.ArgumentParser()
parser.add_argument('--bin-dir', nargs='*')
parser.add_argument('--build-root', required=True)
parser.add_argument('--dest-dir', required=True)
parser.add_argument('--docs-dir', action='append', nargs=2, dest='docs_dirs', default=None)
parser.add_argument('--existing', choices=('skip', 'overwrite'), default='overwrite')
parser.add_argument('--source-root', required=True)
parser.add_argument('--src-dir', action='append', nargs='*', dest='src_dirs', default=None)
parser.add_argument('files', nargs='*')
return parser.parse_args(pcf.get_args(sys.argv[1:]))
def makedirs(dirname):
try:
os.makedirs(dirname)
except OSError as e:
if e.errno == errno.EEXIST and os.path.isdir(dirname):
pass
else:
raise
def copy_file(src, dst, overwrite=False, orig_path=None, generated=False):
if os.path.exists(dst) and not overwrite:
return
makedirs(os.path.dirname(dst))
with open(src, 'r') as fsrc, open(dst, 'w') as fdst:
# if (orig_path or generated) and src.endswith('.md'):
# fdst.write('---\n{}\n\n---\n'.format('generated: true' if generated else 'vcsPath: {}'.format(orig_path)))
shutil.copyfileobj(fsrc, fdst)
def main():
args = parse_args()
dest_dir = os.path.normpath(args.dest_dir)
makedirs(dest_dir)
source_root = os.path.normpath(args.source_root) + os.path.sep
build_root = os.path.normpath(args.build_root) + os.path.sep
is_overwrite_existing = args.existing == 'overwrite'
if args.docs_dirs:
for item in args.docs_dirs:
assert len(item) == 2
docs_dir, nm = item[0], item[1]
assert not os.path.isabs(docs_dir)
if nm and nm != '.':
assert not os.path.isabs(nm)
dst = os.path.join(dest_dir, nm)
else:
dst = dest_dir
abs_docs_dir = os.path.join(args.source_root, docs_dir)
for root, _, files in os.walk(abs_docs_dir):
for f in files:
if os.path.islink(os.path.join(root, f)):
continue
file_src = os.path.join(root, f)
assert file_src.startswith(source_root)
file_dst = os.path.join(dst, os.path.relpath(root, abs_docs_dir), f)
copy_file(file_src, file_dst, overwrite=is_overwrite_existing, orig_path=file_src[len(source_root):])
if args.src_dirs:
for item in args.src_dirs:
assert len(item) > 1
src_dir, nm = os.path.normpath(item[0]), item[1]
assert os.path.isabs(src_dir)
if nm and nm != '.':
assert not os.path.isabs(nm)
dst = os.path.join(dest_dir, nm)
else:
dst = dest_dir
if src_dir.startswith(source_root):
root = source_root
is_from_source_root = True
else:
assert src_dir.startswith(build_root)
root = build_root
is_from_source_root = False
for f in item[2:]:
file_src = os.path.normpath(f)
assert file_src.startswith(root)
rel_path = file_src[len(root):] if is_from_source_root else None
file_dst = os.path.join(dst, file_src[len(src_dir):])
copy_file(file_src, file_dst, overwrite=is_overwrite_existing, orig_path=rel_path)
if args.bin_dir:
assert len(args.bin_dir) > 1
bin_dir, bin_dir_namespace = os.path.normpath(args.bin_dir[0]) + os.path.sep, args.bin_dir[1]
assert bin_dir.startswith(build_root)
if bin_dir_namespace and bin_dir_namespace != '.':
assert not os.path.isabs(bin_dir_namespace)
dst = os.path.join(dest_dir, bin_dir_namespace)
else:
dst = dest_dir
for file_src in args.bin_dir[2:]:
assert os.path.isfile(file_src)
assert file_src.startswith(bin_dir)
file_dst = os.path.join(dst, file_src[len(bin_dir):])
copy_file(file_src, file_dst, overwrite=is_overwrite_existing, orig_path=None)
for src in args.files:
generated = False
file_src = os.path.normpath(src)
assert os.path.isfile(file_src), 'File [{}] does not exist...'.format(file_src)
rel_path = file_src
if file_src.startswith(source_root):
rel_path = file_src[len(source_root):]
elif file_src.startswith(build_root):
# generated = True
rel_path = file_src[len(build_root):]
else:
raise Exception('Unexpected file path [{}].'.format(file_src))
assert not os.path.isabs(rel_path)
file_dst = os.path.join(args.dest_dir, rel_path)
copy_file(file_src, file_dst, is_overwrite_existing, rel_path, generated)
if __name__ == '__main__':
main()
|