mirror of https://github.com/axmolengine/axmol.git
101 lines
3.2 KiB
Python
101 lines
3.2 KiB
Python
|
#!/usr/bin/python
|
||
|
# ----------------------------------------------------------------------------
|
||
|
# extend methods for copy files/dirs
|
||
|
#
|
||
|
# Copyright 2014 (C) zhangbin
|
||
|
#
|
||
|
# License: MIT
|
||
|
# ----------------------------------------------------------------------------
|
||
|
|
||
|
import os
|
||
|
import shutil
|
||
|
|
||
|
def copy_files_in_dir(src, dst):
|
||
|
|
||
|
for item in os.listdir(src):
|
||
|
path = os.path.join(src, item)
|
||
|
if os.path.isfile(path):
|
||
|
shutil.copy(path, dst)
|
||
|
if os.path.isdir(path):
|
||
|
new_dst = os.path.join(dst, item)
|
||
|
if not os.path.isdir(new_dst):
|
||
|
os.makedirs(new_dst)
|
||
|
copy_files_in_dir(path, new_dst)
|
||
|
|
||
|
def copy_files_with_config(config, src_root, dst_root):
|
||
|
src_dir = config["from"]
|
||
|
dst_dir = config["to"]
|
||
|
|
||
|
src_dir = os.path.join(src_root, src_dir)
|
||
|
dst_dir = os.path.join(dst_root, dst_dir)
|
||
|
|
||
|
include_rules = None
|
||
|
if config.has_key("include"):
|
||
|
include_rules = config["include"]
|
||
|
include_rules = convert_rules(include_rules)
|
||
|
|
||
|
exclude_rules = None
|
||
|
if config.has_key("exclude"):
|
||
|
exclude_rules = config["exclude"]
|
||
|
exclude_rules = convert_rules(exclude_rules)
|
||
|
|
||
|
copy_files_with_rules(src_dir, src_dir, dst_dir, include_rules, exclude_rules)
|
||
|
|
||
|
def copy_files_with_rules(src_rootDir, src, dst, include = None, exclude = None):
|
||
|
if os.path.isfile(src):
|
||
|
if not os.path.exists(dst):
|
||
|
os.makedirs(dst)
|
||
|
shutil.copy(src, dst)
|
||
|
return
|
||
|
|
||
|
if (include is None) and (exclude is None):
|
||
|
if not os.path.exists(dst):
|
||
|
os.makedirs(dst)
|
||
|
copy_files_in_dir(src, dst)
|
||
|
elif (include is not None):
|
||
|
# have include
|
||
|
for name in os.listdir(src):
|
||
|
abs_path = os.path.join(src, name)
|
||
|
rel_path = os.path.relpath(abs_path, src_rootDir)
|
||
|
if os.path.isdir(abs_path):
|
||
|
sub_dst = os.path.join(dst, name)
|
||
|
copy_files_with_rules(src_rootDir, abs_path, sub_dst, include = include)
|
||
|
elif os.path.isfile(abs_path):
|
||
|
if _in_rules(rel_path, include):
|
||
|
if not os.path.exists(dst):
|
||
|
os.makedirs(dst)
|
||
|
shutil.copy(abs_path, dst)
|
||
|
elif (exclude is not None):
|
||
|
# have exclude
|
||
|
for name in os.listdir(src):
|
||
|
abs_path = os.path.join(src, name)
|
||
|
rel_path = os.path.relpath(abs_path, src_rootDir)
|
||
|
if os.path.isdir(abs_path):
|
||
|
sub_dst = os.path.join(dst, name)
|
||
|
copy_files_with_rules(src_rootDir, abs_path, sub_dst, exclude = exclude)
|
||
|
elif os.path.isfile(abs_path):
|
||
|
if not _in_rules(rel_path, exclude):
|
||
|
if not os.path.exists(dst):
|
||
|
os.makedirs(dst)
|
||
|
shutil.copy(abs_path, dst)
|
||
|
|
||
|
def _in_rules(rel_path, rules):
|
||
|
import re
|
||
|
ret = False
|
||
|
path_str = rel_path.replace("\\", "/")
|
||
|
for rule in rules:
|
||
|
if re.match(rule, path_str):
|
||
|
ret = True
|
||
|
|
||
|
return ret
|
||
|
|
||
|
def convert_rules(rules):
|
||
|
ret_rules = []
|
||
|
for rule in rules:
|
||
|
ret = rule.replace('.', '\\.')
|
||
|
ret = ret.replace('*', '.*')
|
||
|
ret = "%s" % ret
|
||
|
ret_rules.append(ret)
|
||
|
|
||
|
return ret_rules
|