Issue #12442: add shutil.disk_usage()
diff --git a/Lib/shutil.py b/Lib/shutil.py
index d2e2dc5..0af9fa5 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -12,6 +12,7 @@
 import collections
 import errno
 import tarfile
+from collections import namedtuple
 
 try:
     import bz2
@@ -754,3 +755,21 @@
         func = _UNPACK_FORMATS[format][1]
         kwargs = dict(_UNPACK_FORMATS[format][2])
         func(filename, extract_dir, **kwargs)
+
+if hasattr(os, "statvfs") or os.name == 'nt':
+    _ntuple_diskusage = namedtuple('usage', 'total used free')
+
+    def disk_usage(path):
+        """Return disk usage statistics about the given path as a namedtuple
+        including total, used and free space expressed in bytes.
+        """
+        if hasattr(os, "statvfs"):
+            st = os.statvfs(path)
+            free = (st.f_bavail * st.f_frsize)
+            total = (st.f_blocks * st.f_frsize)
+            used = (st.f_blocks - st.f_bfree) * st.f_frsize
+        else:
+            import nt
+            total, free = nt._getdiskusage(path)
+            used = total - free
+        return _ntuple_diskusage(total, used, free)
diff --git a/Lib/test/test_shutil.py b/Lib/test/test_shutil.py
index ad31f47..20e9412 100644
--- a/Lib/test/test_shutil.py
+++ b/Lib/test/test_shutil.py
@@ -728,6 +728,16 @@
         unregister_unpack_format('Boo2')
         self.assertEqual(get_unpack_formats(), formats)
 
+    @unittest.skipUnless(hasattr(shutil, 'disk_usage'),
+                         "disk_usage not available on this platform")
+    def test_disk_usage(self):
+        usage = shutil.disk_usage(os.getcwd())
+        self.assertTrue(usage.total > 0)
+        self.assertTrue(usage.used > 0)
+        self.assertTrue(usage.free >= 0)
+        self.assertTrue(usage.total >= usage.used)
+        self.assertTrue(usage.total > usage.free)
+
 
 class TestMove(unittest.TestCase):