liyujie
2025-08-28 b3810562527858a3b3d98ffa6e9c9c5b0f4a9a8e
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/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)