| #!/usr/bin/env python |
| # |
| # Copyright (C) 2012 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the 'License'); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an 'AS IS' BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| # copy related utils for all PDK scripts |
| |
| import os, string, sys, shutil, zipfile |
| |
| def copy_dir(src_top, dest_top, dir_name, cp_option = ""): |
| """copy all the files under src_top/dir_name to dest_top/dir_name.""" |
| src_full_path = src_top + "/" + dir_name |
| # do not create the leaf dir as cp will create it |
| [mid_path, leaf_path] = dir_name.rsplit("/", 1) |
| dest_full_path = dest_top + "/" + mid_path |
| if not os.path.isdir(dest_full_path): |
| os.makedirs(dest_full_path) |
| print "copy dir ", src_full_path, " to ", dest_full_path |
| os.system("cp -a " + " " + cp_option + " " + src_full_path + " " + dest_full_path) |
| |
| |
| def copy_dir_only_file(src_top, dest_top, dir_name): |
| """copy only files directly under the given dir_name""" |
| src_full_path = src_top + "/" + dir_name |
| dest_full_path = dest_top + "/" + dir_name |
| if not os.path.isdir(dest_full_path): |
| os.makedirs(dest_full_path) |
| children = os.listdir(src_full_path) |
| for child in children: |
| child_full_name = src_full_path + "/" + child |
| if os.path.isfile(child_full_name): |
| print "copy file ", child_full_name, " to ", dest_full_path |
| os.system("cp -a " + child_full_name + " " + dest_full_path) |
| |
| |
| def copy_files(src_top, dest_top, files_name): |
| """copy files from src_top to dest_top. |
| Note that files_name can include directories which will be created |
| under dest_top""" |
| src_full_path = src_top + "/" + files_name |
| # do not create the leaf dir as cp will create it |
| [mid_path, leaf_path] = files_name.rsplit("/", 1) |
| dest_full_path = dest_top + "/" + mid_path |
| if not os.path.isdir(dest_full_path): |
| os.makedirs(dest_full_path) |
| print "copy files ", src_full_path, " to ", dest_full_path |
| os.system("cp -a " + src_full_path + " " + dest_full_path) |
| |
| |
| def copy_file_if_exists(src_top, dest_top, file_name): |
| """copy file src_top/file_name to dest_top/file_name |
| returns false if such file does not exist in source.""" |
| src_full_name = src_top + "/" + file_name |
| if not os.path.isfile(src_full_name): |
| print "file " + src_full_name + " not found" |
| return False |
| dest_file = dest_top + "/" + file_name |
| dest_dir = os.path.dirname(dest_file) |
| if not os.path.isdir(dest_dir): |
| os.makedirs(dest_dir) |
| print "copy file ", src_full_name, " to ", dest_file |
| os.system("cp -a " + src_full_name + " " + dest_file) |
| return True |
| |
| |
| def copy_file_new_name_if_exists(src_full_name, dest_dir, dest_file): |
| """copy src_full_name (including dir + file name) to dest_dir/dest_file |
| will be used when renaming is necessary""" |
| if not os.path.isfile(src_full_name): |
| print "file " + src_full_name + " not found" |
| return False |
| dest_full_name = dest_dir + "/" + dest_file |
| if not os.path.isdir(dest_dir): |
| os.makedirs(dest_dir) |
| print "copy file ", src_full_name, " to ", dest_full_name |
| os.system("cp -a " + src_full_name + " " + dest_full_name) |
| return True |
| |
| def list_files(dir_name, dir_exclusion_filter = ""): |
| """recursively list all files under given dir_name directory. |
| exluding subdirs ending with dir_exlusion_filter in name |
| returns list of files which can be [] if there is no file""" |
| file_list = [] |
| if dir_exclusion_filter != "" and dir_name.endswith(dir_exclusion_filter): |
| return file_list |
| for item in os.listdir(dir_name): |
| item_full_path = dir_name + "/" + item |
| # do not include symbolic link to recursion |
| if os.path.islink(item_full_path) or os.path.isfile(item_full_path): |
| file_list.append(item_full_path) |
| elif os.path.isdir(item_full_path): |
| result_list = list_files(item_full_path, dir_exclusion_filter) |
| for file_name in result_list: |
| file_list.append(file_name) |
| return file_list |
| |
| def src_newer_than_dest(src, dest): |
| """return True if src file/dir is newer than dest file/dir""" |
| result = True |
| src_mod_time = os.path.getmtime(src) |
| if os.path.isfile(dest) or os.path.isdir(dest): |
| dest_mod_time = os.path.getmtime(dest) |
| if dest_mod_time > src_mod_time: |
| result = False |
| return result |
| |
| def remove_if_exists(entry): |
| if os.path.exists(entry): |
| os.system("rm -rf " + entry) |
| |
| |
| def list_files_in_zip(zip_file_path, no_directory = True): |
| """ list all files/directories inside the given zip_file_path. |
| Directories are not included if no_directory is True""" |
| entry_list = [] |
| if not zipfile.is_zipfile(zip_file_path): |
| return entry_list |
| zip_file = zipfile.ZipFile(zip_file_path, 'r') |
| entries = zip_file.namelist() |
| for entry in entries: |
| if not no_directory or not entry.endswith("/"): |
| entry_list.append(entry) |
| |
| #print entry_list |
| return entry_list |
| |
| def save_list(list_to_save, file_name): |
| f = open(file_name, "w") |
| for entry in list_to_save: |
| f.write("%s\n" % entry) |
| f.close() |
| |
| def load_list(file_name): |
| result = [] |
| if not os.path.isfile(file_name): |
| return result |
| |
| for line in open(file_name, "r"): |
| result.append(line.strip()) |
| |
| #print result |
| return result |
| |
| def remove_files_listed(top_dir, files_list): |
| top_dir_ = top_dir + "/" |
| for entry in files_list: |
| path = top_dir_ + entry |
| print "remove " + path |
| os.system("rm -f " + path) |
| |
| def execute_command(command, error_msg): |
| if os.system(command) != 0: |
| raise RuntimeError(error_msg) |