diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py
index b29fc64..96fb7fa 100644
--- a/Lib/distutils/command/sdist.py
+++ b/Lib/distutils/command/sdist.py
@@ -4,7 +4,10 @@
 
 __revision__ = "$Id$"
 
-import sys, os
+import os
+import string
+import sys
+from types import *
 from glob import glob
 from distutils.core import Command
 from distutils import dir_util, dep_util, file_util, archive_util
@@ -332,9 +335,18 @@
 
         self.filelist.exclude_pattern(None, prefix=build.build_base)
         self.filelist.exclude_pattern(None, prefix=base_dir)
-        self.filelist.exclude_pattern(r'(^|/)(RCS|CVS|\.svn|\.hg|\.git|\.bzr|_darcs)/.*', is_regex=1)
 
-    def write_manifest(self):
+        if sys.platform == 'win32':
+            seps = r'/|\\'
+        else:
+            seps = '/'
+
+        vcs_dirs = ['RCS', 'CVS', r'\.svn', r'\.hg', r'\.git', r'\.bzr',
+                    '_darcs']
+        vcs_ptrn = r'(^|%s)(%s)(%s).*' % (seps, '|'.join(vcs_dirs), seps)
+        self.filelist.exclude_pattern(vcs_ptrn, is_regex=1)
+
+    def write_manifest (self):
         """Write the file list in 'self.filelist' (presumably as filled in
         by 'add_defaults()' and 'read_template()') to the manifest file
         named by 'self.manifest'.
diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py
new file mode 100644
index 0000000..7cc04cf
--- /dev/null
+++ b/Lib/distutils/tests/test_sdist.py
@@ -0,0 +1,110 @@
+"""Tests for distutils.command.sdist."""
+import os
+import unittest
+import shutil
+import zipfile
+from os.path import join
+
+from distutils.command.sdist import sdist
+from distutils.core import Distribution
+from distutils.tests.test_config import PyPIRCCommandTestCase
+
+CURDIR = os.path.dirname(__file__)
+TEMP_PKG = join(CURDIR, 'temppkg')
+
+SETUP_PY = """
+from distutils.core import setup
+import somecode
+
+setup(name='fake')
+"""
+
+MANIFEST_IN = """
+recursive-include somecode *
+"""
+
+class sdistTestCase(PyPIRCCommandTestCase):
+
+    def setUp(self):
+        PyPIRCCommandTestCase.setUp(self)
+        self.old_path = os.getcwd()
+
+    def tearDown(self):
+        os.chdir(self.old_path)
+        if os.path.exists(TEMP_PKG):
+            shutil.rmtree(TEMP_PKG)
+        PyPIRCCommandTestCase.tearDown(self)
+
+    def _write(self, path, content):
+        f = open(path, 'w')
+        try:
+            f.write(content)
+        finally:
+            f.close()
+
+    def test_prune_file_list(self):
+        # this test creates a package with some vcs dirs in it
+        # and launch sdist to make sure they get pruned
+        # on all systems
+        if not os.path.exists(TEMP_PKG):
+            os.mkdir(TEMP_PKG)
+        os.mkdir(join(TEMP_PKG, 'somecode'))
+
+        # creating a MANIFEST, a package, and a README
+        self._write(join(TEMP_PKG, 'MANIFEST.in'), MANIFEST_IN)
+        self._write(join(TEMP_PKG, 'README'), 'xxx')
+        self._write(join(TEMP_PKG, 'somecode', '__init__.py'), '#')
+        self._write(join(TEMP_PKG, 'setup.py'), SETUP_PY)
+
+        # creating VCS directories with some files in them
+        os.mkdir(join(TEMP_PKG, 'somecode', '.svn'))
+        self._write(join(TEMP_PKG, 'somecode', '.svn', 'ok.py'), 'xxx')
+
+        os.mkdir(join(TEMP_PKG, 'somecode', '.hg'))
+        self._write(join(TEMP_PKG, 'somecode', '.hg',
+                         'ok'), 'xxx')
+
+        os.mkdir(join(TEMP_PKG, 'somecode', '.git'))
+        self._write(join(TEMP_PKG, 'somecode', '.git',
+                         'ok'), 'xxx')
+
+        os.chdir(TEMP_PKG)
+
+        # now building a sdist
+        dist = Distribution()
+        dist.script_name = 'setup.py'
+        dist.metadata.name = 'fake'
+        dist.metadata.version = '1.0'
+        dist.metadata.url = 'http://xxx'
+        dist.metadata.author = dist.metadata.author_email = 'xxx'
+        dist.packages = ['somecode']
+        dist.include_package_data = True
+        cmd = sdist(dist)
+        cmd.manifest = 'MANIFEST'
+        cmd.template = 'MANIFEST.in'
+        cmd.dist_dir = 'dist'
+
+        # zip is available universally
+        # (tar might not be installed under win32)
+        cmd.formats = ['zip']
+        cmd.run()
+
+        # now let's check what we have
+        dist_folder = join(TEMP_PKG, 'dist')
+        files = os.listdir(dist_folder)
+        self.assertEquals(files, ['fake-1.0.zip'])
+
+        zip_file = zipfile.ZipFile(join(dist_folder, 'fake-1.0.zip'))
+        try:
+            content = zip_file.namelist()
+        finally:
+            zip_file.close()
+
+        # making sure everything has been pruned correctly
+        self.assertEquals(len(content), 4)
+
+def test_suite():
+    return unittest.makeSuite(sdistTestCase)
+
+if __name__ == "__main__":
+    unittest.main(defaultTest="test_suite")
