2011-01-18 Dirk Pranke <dpranke@chromium.org>
[WebKit.git] / Tools / Scripts / webkitpy / common / system / filesystem.py
index 527b6bdea5ad68da2530f3069fe7f87bf2eb6eb2..53e9796f15e357fff21925298444077ffdb2579a 100644 (file)
@@ -44,10 +44,27 @@ class FileSystem(object):
     Unless otherwise noted, all paths are allowed to be either absolute
     or relative."""
 
+    def basename(self, path):
+        return os.path.basename(path)
+
+    def copyfile(self, source, destination):
+        """Copies the contents of the file at the given path to the destination
+        path."""
+        shutil.copyfile(source, destination)
+
+    def dirname(self, path):
+        return os.path.dirname(path)
+
     def exists(self, path):
         """Return whether the path exists in the filesystem."""
         return os.path.exists(path)
 
+    def files_under(self, path):
+        """Return the list of all files under the given path."""
+        return [self.join(path_to_file, filename)
+            for (path_to_file, _, filenames) in os.walk(path)
+            for filename in filenames]
+
     def isfile(self, path):
         """Return whether the path refers to a file."""
         return os.path.isfile(path)
@@ -71,14 +88,20 @@ class FileSystem(object):
         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."""
+        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 = None
+                self._directory_path = tempfile.mkdtemp(**self._kwargs)
+
+            def __str__(self):
+                return self._directory_path
 
             def __enter__(self):
-                self._directory_path = tempfile.mkdtemp(**self._kwargs)
                 return self._directory_path
 
             def __exit__(self, type, value, traceback):
@@ -98,6 +121,30 @@ class FileSystem(object):
             if e.errno != errno.EEXIST:
                 raise
 
+    def move(self, src, dest):
+        shutil.move(src, dest)
+
+    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 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 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()
+
     class _WindowsError(exceptions.OSError):
         """Fake exception for Linux and Mac."""
         pass
@@ -124,8 +171,9 @@ class FileSystem(object):
                 if retry_timeout_sec < 0:
                     raise e
 
-    def remove_tree(self, path, ignore_errors=False):
-        shutil.rmtree(path, ignore_errors)
+    def rmtree(self, path):
+        """Delete the directory rooted at path, empty or no."""
+        shutil.rmtree(path, ignore_errors=True)
 
     def read_binary_file(self, path):
         """Return the contents of the file at the given path as a byte string."""
@@ -139,6 +187,10 @@ class FileSystem(object):
         with codecs.open(path, 'r', 'utf8') as f:
             return f.read()
 
+    def splitext(self, path):
+        """Return (dirname, basename + ext)."""
+        return os.path.splitext(path)
+
     def write_binary_file(self, path, contents):
         """Write the contents to the file at the given location."""
         with file(path, 'wb') as f:
@@ -150,14 +202,3 @@ class FileSystem(object):
         The file is written encoded as UTF-8 with no BOM."""
         with codecs.open(path, 'w', 'utf8') as f:
             f.write(contents)
-
-    def copyfile(self, source, destination):
-        """Copies the contents of the file at the given path to the destination
-        path."""
-        shutil.copyfile(source, destination)
-
-    def files_under(self, path):
-        """Return the list of all files under the given path."""
-        return [self.join(path_to_file, filename)
-            for (path_to_file, _, filenames) in os.walk(path)
-            for filename in filenames]