# 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 __future__ import absolute_import from glob import iglob from io import open import os import shutil import sys import time def read_file(name, normalize=True): """ Read a file. """ try: with open(name, 'r', encoding='utf-8') as f: # read the data data = f.read() if normalize: # normalize line endings data = data.replace("\r\n", "\n") return data except IOError as e: (errno, strerror) = e.args sys.stderr.write('Failed to read file ' + name + ': ' + strerror) raise def write_file(name, data): """ Write a file. """ try: with open(name, 'w', encoding='utf-8') as f: # write the data if sys.version_info.major == 2: f.write(data.decode('utf-8')) else: f.write(data) except IOError as e: (errno, strerror) = e.args sys.stderr.write('Failed to write file ' + name + ': ' + strerror) raise def path_exists(name): """ Returns true if the path currently exists. """ return os.path.exists(name) def backup_file(name): """ 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.copy2(src, dst) if not quiet: sys.stdout.write('Transferring ' + src + ' file.\n') except IOError as e: (errno, strerror) = e.args 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 as e: (errno, strerror) = e.args 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 as e: (errno, strerror) = e.args 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 as e: (errno, strerror) = e.args 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 as e: (errno, strerror) = e.args 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 as e: (errno, strerror) = e.args sys.stderr.write('Failed to create directory ' + name + ': ' + strerror) raise def get_files(search_glob): """ Returns all files matching the search glob. """ # Sort the result for consistency across platforms. return sorted(iglob(search_glob)) def read_version_file(file, args): """ 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] def eval_file(src): """ Loads and evaluates the contents of the specified file. """ return eval(read_file(src), {'__builtins__': None}, None) def normalize_path(path): """ Normalizes the path separator to match the Unix standard. """ if sys.platform == 'win32': return path.replace('\\', '/') return path