From aaedcef5786f10593b51d389423b5d7ce97727c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tarek=20Ziad=C3=A9?= <ziade.tarek@gmail.com>
Date: Sun, 25 Jan 2009 23:34:00 +0000
Subject: Fixed #1885: --formats=tar,gztar was not working properly in the
 sdist command

---
 Lib/distutils/command/sdist.py    |  4 ++
 Lib/distutils/tests/test_sdist.py | 77 +++++++++++++++++++++++++++++++++------
 Misc/NEWS                         |  3 ++
 3 files changed, 73 insertions(+), 11 deletions(-)

diff --git a/Lib/distutils/command/sdist.py b/Lib/distutils/command/sdist.py
index 6ce8c43..e8b6bce 100644
--- a/Lib/distutils/command/sdist.py
+++ b/Lib/distutils/command/sdist.py
@@ -456,6 +456,10 @@ class sdist (Command):
 
         self.make_release_tree(base_dir, self.filelist.files)
         archive_files = []              # remember names of files we create
+        # tar archive must be created last to avoid overwrite and remove
+        if 'tar' in self.formats:
+            self.formats.append(self.formats.pop(self.formats.index('tar')))
+
         for fmt in self.formats:
             file = self.make_archive(base_name, fmt, base_dir=base_dir)
             archive_files.append(file)
diff --git a/Lib/distutils/tests/test_sdist.py b/Lib/distutils/tests/test_sdist.py
index 7cc04cf..96ec381 100644
--- a/Lib/distutils/tests/test_sdist.py
+++ b/Lib/distutils/tests/test_sdist.py
@@ -4,10 +4,13 @@ import unittest
 import shutil
 import zipfile
 from os.path import join
+import sys
 
 from distutils.command.sdist import sdist
 from distutils.core import Distribution
 from distutils.tests.test_config import PyPIRCCommandTestCase
+from distutils.errors import DistutilsExecError
+from distutils.spawn import spawn
 
 CURDIR = os.path.dirname(__file__)
 TEMP_PKG = join(CURDIR, 'temppkg')
@@ -35,6 +38,19 @@ class sdistTestCase(PyPIRCCommandTestCase):
             shutil.rmtree(TEMP_PKG)
         PyPIRCCommandTestCase.tearDown(self)
 
+    def _init_tmp_pkg(self):
+        if os.path.exists(TEMP_PKG):
+            shutil.rmtree(TEMP_PKG)
+        os.mkdir(TEMP_PKG)
+        os.mkdir(join(TEMP_PKG, 'somecode'))
+        os.mkdir(join(TEMP_PKG, 'dist'))
+        # 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)
+        os.chdir(TEMP_PKG)
+
     def _write(self, path, content):
         f = open(path, 'w')
         try:
@@ -46,15 +62,7 @@ class sdistTestCase(PyPIRCCommandTestCase):
         # 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)
+        self._init_tmp_pkg()
 
         # creating VCS directories with some files in them
         os.mkdir(join(TEMP_PKG, 'somecode', '.svn'))
@@ -68,8 +76,6 @@ class sdistTestCase(PyPIRCCommandTestCase):
         self._write(join(TEMP_PKG, 'somecode', '.git',
                          'ok'), 'xxx')
 
-        os.chdir(TEMP_PKG)
-
         # now building a sdist
         dist = Distribution()
         dist.script_name = 'setup.py'
@@ -103,6 +109,55 @@ class sdistTestCase(PyPIRCCommandTestCase):
         # making sure everything has been pruned correctly
         self.assertEquals(len(content), 4)
 
+    def test_make_distribution(self):
+
+        self._init_tmp_pkg()
+
+        # check if tar is installed under win32
+        if sys.platform == 'win32':
+            try:
+                spawn('tar --help')
+            except DistutilsExecError:
+                # let's return, no need to go further
+                return
+
+        # 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'
+
+        # creating a gztar then a tar
+        cmd.formats = ['gztar', 'tar']
+        cmd.run()
+
+        # making sure we have two files
+        dist_folder = join(TEMP_PKG, 'dist')
+        result = os.listdir(dist_folder)
+        result.sort()
+        self.assertEquals(result,
+                          ['fake-1.0.tar', 'fake-1.0.tar.gz'] )
+
+        os.remove(join(dist_folder, 'fake-1.0.tar'))
+        os.remove(join(dist_folder, 'fake-1.0.tar.gz'))
+
+        # now trying a tar then a gztar
+        cmd.formats = ['tar', 'gztar']
+        cmd.run()
+
+        result = os.listdir(dist_folder)
+        result.sort()
+        self.assertEquals(result,
+                ['fake-1.0.tar', 'fake-1.0.tar.gz'])
+
 def test_suite():
     return unittest.makeSuite(sdistTestCase)
 
diff --git a/Misc/NEWS b/Misc/NEWS
index ac54ab8..9878199 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -145,6 +145,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #1885: distutils. When running sdist with --formats=tar,gztar
+  the tar file was overriden by the gztar one.
+
 - Issue #4863: distutils.mwerkscompiler has been removed.
 
 - Added a new function:  itertools.compress().
-- 
cgit v0.12

