summaryrefslogtreecommitdiff
path: root/Tools/Scripts/webkitpy/common/system/filesystem.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Scripts/webkitpy/common/system/filesystem.py')
-rw-r--r--Tools/Scripts/webkitpy/common/system/filesystem.py269
1 files changed, 0 insertions, 269 deletions
diff --git a/Tools/Scripts/webkitpy/common/system/filesystem.py b/Tools/Scripts/webkitpy/common/system/filesystem.py
deleted file mode 100644
index 3786c6fed..000000000
--- a/Tools/Scripts/webkitpy/common/system/filesystem.py
+++ /dev/null
@@ -1,269 +0,0 @@
-# Copyright (C) 2010 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Wrapper object for the file system / source tree."""
-
-import codecs
-import errno
-import exceptions
-import glob
-import hashlib
-import os
-import shutil
-import sys
-import tempfile
-import time
-
-class FileSystem(object):
- """FileSystem interface for webkitpy.
-
- Unless otherwise noted, all paths are allowed to be either absolute
- or relative."""
- sep = os.sep
- pardir = os.pardir
-
- def abspath(self, path):
- return os.path.abspath(path)
-
- def realpath(self, path):
- return os.path.realpath(path)
-
- def path_to_module(self, module_name):
- """A wrapper for all calls to __file__ to allow easy unit testing."""
- # FIXME: This is the only use of sys in this file. It's possible this function should move elsewhere.
- return sys.modules[module_name].__file__ # __file__ is always an absolute path.
-
- def expanduser(self, path):
- return os.path.expanduser(path)
-
- def basename(self, path):
- return os.path.basename(path)
-
- def chdir(self, path):
- return os.chdir(path)
-
- def copyfile(self, source, destination):
- shutil.copyfile(source, destination)
-
- def dirname(self, path):
- return os.path.dirname(path)
-
- def exists(self, path):
- return os.path.exists(path)
-
- def files_under(self, path, dirs_to_skip=[], file_filter=None):
- """Return the list of all files under the given path in topdown order.
-
- Args:
- dirs_to_skip: a list of directories to skip over during the
- traversal (e.g., .svn, resources, etc.)
- file_filter: if not None, the filter will be invoked
- with the filesystem object and the dirname and basename of
- each file found. The file is included in the result if the
- callback returns True.
- """
- def filter_all(fs, dirpath, basename):
- return True
-
- file_filter = file_filter or filter_all
- files = []
- if self.isfile(path):
- if file_filter(self, self.dirname(path), self.basename(path)):
- files.append(path)
- return files
-
- if self.basename(path) in dirs_to_skip:
- return []
-
- for (dirpath, dirnames, filenames) in os.walk(path):
- for d in dirs_to_skip:
- if d in dirnames:
- dirnames.remove(d)
-
- for filename in filenames:
- if file_filter(self, dirpath, filename):
- files.append(self.join(dirpath, filename))
- return files
-
- def getcwd(self):
- return os.getcwd()
-
- def glob(self, path):
- return glob.glob(path)
-
- def isabs(self, path):
- return os.path.isabs(path)
-
- def isfile(self, path):
- return os.path.isfile(path)
-
- def isdir(self, path):
- return os.path.isdir(path)
-
- def join(self, *comps):
- return os.path.join(*comps)
-
- def listdir(self, path):
- return os.listdir(path)
-
- def mkdtemp(self, **kwargs):
- """Create and return a uniquely named directory.
-
- This is like tempfile.mkdtemp, but if used in a with statement
- the directory will self-delete at the end of the block (if the
- directory is empty; non-empty directories raise errors). The
- directory can be safely deleted inside the block as well, if so
- desired.
-
- Note that the object returned is not a string and does not support all of the string
- methods. If you need a string, coerce the object to a string and go from there.
- """
- class TemporaryDirectory(object):
- def __init__(self, **kwargs):
- self._kwargs = kwargs
- self._directory_path = tempfile.mkdtemp(**self._kwargs)
-
- def __str__(self):
- return self._directory_path
-
- def __enter__(self):
- return self._directory_path
-
- def __exit__(self, type, value, traceback):
- # Only self-delete if necessary.
-
- # FIXME: Should we delete non-empty directories?
- if os.path.exists(self._directory_path):
- os.rmdir(self._directory_path)
-
- return TemporaryDirectory(**kwargs)
-
- def maybe_make_directory(self, *path):
- """Create the specified directory if it doesn't already exist."""
- try:
- os.makedirs(self.join(*path))
- except OSError, e:
- if e.errno != errno.EEXIST:
- raise
-
- def move(self, source, destination):
- shutil.move(source, destination)
-
- def mtime(self, path):
- return os.stat(path).st_mtime
-
- def normpath(self, path):
- return os.path.normpath(path)
-
- def open_binary_tempfile(self, suffix):
- """Create, open, and return a binary temp file. Returns a tuple of the file and the name."""
- temp_fd, temp_name = tempfile.mkstemp(suffix)
- f = os.fdopen(temp_fd, 'wb')
- return f, temp_name
-
- def open_binary_file_for_reading(self, path):
- return codecs.open(path, 'rb')
-
- def read_binary_file(self, path):
- """Return the contents of the file at the given path as a byte string."""
- with file(path, 'rb') as f:
- return f.read()
-
- def write_binary_file(self, path, contents):
- with file(path, 'wb') as f:
- f.write(contents)
-
- def open_text_file_for_reading(self, path):
- # Note: There appears to be an issue with the returned file objects
- # not being seekable. See http://stackoverflow.com/questions/1510188/can-seek-and-tell-work-with-utf-8-encoded-documents-in-python .
- return codecs.open(path, 'r', 'utf8')
-
- def open_text_file_for_writing(self, path):
- return codecs.open(path, 'w', 'utf8')
-
- def read_text_file(self, path):
- """Return the contents of the file at the given path as a Unicode string.
-
- The file is read assuming it is a UTF-8 encoded file with no BOM."""
- with codecs.open(path, 'r', 'utf8') as f:
- return f.read()
-
- def write_text_file(self, path, contents):
- """Write the contents to the file at the given location.
-
- The file is written encoded as UTF-8 with no BOM."""
- with codecs.open(path, 'w', 'utf8') as f:
- f.write(contents)
-
- def sha1(self, path):
- contents = self.read_binary_file(path)
- return hashlib.sha1(contents).hexdigest()
-
- def relpath(self, path, start='.'):
- return os.path.relpath(path, start)
-
- class _WindowsError(exceptions.OSError):
- """Fake exception for Linux and Mac."""
- pass
-
- def remove(self, path, osremove=os.remove):
- """On Windows, if a process was recently killed and it held on to a
- file, the OS will hold on to the file for a short while. This makes
- attempts to delete the file fail. To work around that, this method
- will retry for a few seconds until Windows is done with the file."""
- try:
- exceptions.WindowsError
- except AttributeError:
- exceptions.WindowsError = FileSystem._WindowsError
-
- retry_timeout_sec = 3.0
- sleep_interval = 0.1
- while True:
- try:
- osremove(path)
- return True
- except exceptions.WindowsError, e:
- time.sleep(sleep_interval)
- retry_timeout_sec -= sleep_interval
- if retry_timeout_sec < 0:
- raise e
-
- def rmtree(self, path):
- """Delete the directory rooted at path, whether empty or not."""
- shutil.rmtree(path, ignore_errors=True)
-
- def copytree(self, source, destination):
- shutil.copytree(source, destination)
-
- def split(self, path):
- """Return (dirname, basename + '.' + ext)"""
- return os.path.split(path)
-
- def splitext(self, path):
- """Return (dirname + os.sep + basename, '.' + ext)"""
- return os.path.splitext(path)