2012-04-03 03:34:16 +02:00
|
|
|
# Copyright (c) 2011 The Chromium Embedded Framework Authors. All rights
|
|
|
|
# reserved. Use of this source code is governed by a BSD-style license that
|
|
|
|
# can be found in the LICENSE file.
|
|
|
|
|
|
|
|
from glob import iglob
|
|
|
|
import os
|
|
|
|
import shutil
|
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
|
2017-05-28 15:04:18 +02:00
|
|
|
|
|
|
|
def read_file(name, normalize=True):
|
|
|
|
""" Read a file. """
|
|
|
|
try:
|
|
|
|
f = open(name, 'r')
|
|
|
|
# read the data
|
|
|
|
data = f.read()
|
|
|
|
if normalize:
|
|
|
|
# normalize line endings
|
|
|
|
data = data.replace("\r\n", "\n")
|
|
|
|
return data
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to read file ' + name + ': ' + strerror)
|
|
|
|
raise
|
|
|
|
else:
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
def write_file(name, data):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Write a file. """
|
|
|
|
try:
|
|
|
|
f = open(name, 'w')
|
|
|
|
# write the data
|
|
|
|
f.write(data)
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to write file ' + name + ': ' + strerror)
|
|
|
|
raise
|
|
|
|
else:
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
def path_exists(name):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Returns true if the path currently exists. """
|
|
|
|
return os.path.exists(name)
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
|
|
|
|
def backup_file(name):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Rename the file to a name that includes the current time stamp. """
|
|
|
|
move_file(name, name + '.' + time.strftime('%Y-%m-%d-%H-%M-%S'))
|
|
|
|
|
|
|
|
|
|
|
|
def copy_file(src, dst, quiet=True):
|
|
|
|
""" Copy a file. """
|
|
|
|
try:
|
|
|
|
shutil.copy(src, dst)
|
|
|
|
if not quiet:
|
|
|
|
sys.stdout.write('Transferring ' + src + ' file.\n')
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to copy file from ' + src + ' to ' + dst + ': ' +
|
|
|
|
strerror)
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
def move_file(src, dst, quiet=True):
|
|
|
|
""" Move a file. """
|
|
|
|
try:
|
|
|
|
shutil.move(src, dst)
|
|
|
|
if not quiet:
|
|
|
|
sys.stdout.write('Moving ' + src + ' file.\n')
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to move file from ' + src + ' to ' + dst + ': ' +
|
|
|
|
strerror)
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
def copy_files(src_glob, dst_folder, quiet=True):
|
|
|
|
""" Copy multiple files. """
|
|
|
|
for fname in iglob(src_glob):
|
|
|
|
dst = os.path.join(dst_folder, os.path.basename(fname))
|
|
|
|
if os.path.isdir(fname):
|
|
|
|
copy_dir(fname, dst, quiet)
|
|
|
|
else:
|
|
|
|
copy_file(fname, dst, quiet)
|
|
|
|
|
|
|
|
|
|
|
|
def remove_file(name, quiet=True):
|
|
|
|
""" Remove the specified file. """
|
|
|
|
try:
|
|
|
|
if path_exists(name):
|
|
|
|
os.remove(name)
|
|
|
|
if not quiet:
|
|
|
|
sys.stdout.write('Removing ' + name + ' file.\n')
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to remove file ' + name + ': ' + strerror)
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
def copy_dir(src, dst, quiet=True):
|
|
|
|
""" Copy a directory tree. """
|
|
|
|
try:
|
|
|
|
remove_dir(dst, quiet)
|
|
|
|
shutil.copytree(src, dst)
|
|
|
|
if not quiet:
|
|
|
|
sys.stdout.write('Transferring ' + src + ' directory.\n')
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to copy directory from ' + src + ' to ' + dst +
|
|
|
|
': ' + strerror)
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
def remove_dir(name, quiet=True):
|
|
|
|
""" Remove the specified directory. """
|
|
|
|
try:
|
|
|
|
if path_exists(name):
|
|
|
|
shutil.rmtree(name)
|
|
|
|
if not quiet:
|
|
|
|
sys.stdout.write('Removing ' + name + ' directory.\n')
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to remove directory ' + name + ': ' + strerror)
|
|
|
|
raise
|
|
|
|
|
|
|
|
|
|
|
|
def make_dir(name, quiet=True):
|
|
|
|
""" Create the specified directory. """
|
|
|
|
try:
|
|
|
|
if not path_exists(name):
|
|
|
|
if not quiet:
|
|
|
|
sys.stdout.write('Creating ' + name + ' directory.\n')
|
|
|
|
os.makedirs(name)
|
|
|
|
except IOError, (errno, strerror):
|
|
|
|
sys.stderr.write('Failed to create directory ' + name + ': ' + strerror)
|
|
|
|
raise
|
|
|
|
|
2012-04-03 03:34:16 +02:00
|
|
|
|
|
|
|
def get_files(search_glob):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Returns all files matching the search glob. """
|
|
|
|
# Sort the result for consistency across platforms.
|
|
|
|
return sorted(iglob(search_glob))
|
|
|
|
|
2012-10-08 19:47:37 +02:00
|
|
|
|
|
|
|
def read_version_file(file, args):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Read and parse a version file (key=value pairs, one per line). """
|
|
|
|
lines = read_file(file).split("\n")
|
|
|
|
for line in lines:
|
|
|
|
parts = line.split('=', 1)
|
|
|
|
if len(parts) == 2:
|
|
|
|
args[parts[0]] = parts[1]
|
|
|
|
|
2014-10-22 23:48:11 +02:00
|
|
|
|
|
|
|
def eval_file(src):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Loads and evaluates the contents of the specified file. """
|
|
|
|
return eval(read_file(src), {'__builtins__': None}, None)
|
|
|
|
|
2014-10-22 23:48:11 +02:00
|
|
|
|
|
|
|
def normalize_path(path):
|
2017-05-28 15:04:18 +02:00
|
|
|
""" Normalizes the path separator to match the Unix standard. """
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
return path.replace('\\', '/')
|
|
|
|
return path
|