]> granicus.if.org Git - python/commitdiff
Merged revisions 68167,68276,68292-68293,68344 via svnmerge from
authorBenjamin Peterson <benjamin@python.org>
Fri, 9 Jan 2009 04:11:44 +0000 (04:11 +0000)
committerBenjamin Peterson <benjamin@python.org>
Fri, 9 Jan 2009 04:11:44 +0000 (04:11 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r68167 | vinay.sajip | 2009-01-02 12:53:04 -0600 (Fri, 02 Jan 2009) | 1 line

  Minor documentation changes relating to NullHandler, the module used for handlers and references to ConfigParser.
........
  r68276 | tarek.ziade | 2009-01-03 18:04:49 -0600 (Sat, 03 Jan 2009) | 1 line

  fixed #1702551: distutils sdist was not pruning VCS directories under win32
........
  r68292 | skip.montanaro | 2009-01-04 04:36:58 -0600 (Sun, 04 Jan 2009) | 3 lines

  If user configures --without-gcc give preference to $CC instead of blindly
  assuming the compiler will be "cc".
........
  r68293 | tarek.ziade | 2009-01-04 04:37:52 -0600 (Sun, 04 Jan 2009) | 1 line

  using clearer syntax
........
  r68344 | marc-andre.lemburg | 2009-01-05 13:43:35 -0600 (Mon, 05 Jan 2009) | 7 lines

  Fix #4846 (Py_UNICODE_ISSPACE causes linker error) by moving the declaration
  into the extern "C" section.

  Add a few more comments and apply some minor edits to make the file contents
  fit the original structure again.
........

Doc/library/logging.rst
Include/unicodeobject.h
Lib/distutils/command/sdist.py
Lib/distutils/tests/test_sdist.py [new file with mode: 0644]
configure.in

index c0c13fadf2de39285b268c0454a843a9fcf626d7..232c5b5acfa0f9749579b9df3c49917e97f229c4 100644 (file)
@@ -1608,11 +1608,15 @@ for use by library developers.
 
       This method does nothing.
 
+
+
 WatchedFileHandler
 ^^^^^^^^^^^^^^^^^^
 
 .. module:: logging.handlers
 
+.. module:: logging.handlers
+
 The :class:`WatchedFileHandler` class, located in the :mod:`logging.handlers`
 module, is a :class:`FileHandler` which watches the file it is logging to. If
 the file changes, it is closed and reopened using the file name.
@@ -2286,7 +2290,7 @@ in :mod:`logging` itself) and defining handlers which are declared either in
 .. function:: fileConfig(fname[, defaults])
 
    Reads the logging configuration from a :mod:`configparser`\-format file named
-   *fname*.  This function can be called several times from an application,
+   *fname*. This function can be called several times from an application,
    allowing an end user the ability to select from various pre-canned
    configurations (if the developer provides a mechanism to present the choices
    and load the chosen configuration). Defaults to be passed to the ConfigParser
@@ -2320,20 +2324,18 @@ in :mod:`logging` itself) and defining handlers which are declared either in
 Configuration file format
 ^^^^^^^^^^^^^^^^^^^^^^^^^
 
-The configuration file format understood by :func:`fileConfig` is
-based on :mod:`configparser` functionality. The file must contain
-sections called ``[loggers]``, ``[handlers]`` and ``[formatters]``
-which identify by name the entities of each type which are defined in
-the file. For each such entity, there is a separate section which
-identifies how that entity is configured. Thus, for a logger named
-``log01`` in the ``[loggers]`` section, the relevant configuration
-details are held in a section ``[logger_log01]``. Similarly, a handler
-called ``hand01`` in the ``[handlers]`` section will have its
-configuration held in a section called ``[handler_hand01]``, while a
-formatter called ``form01`` in the ``[formatters]`` section will have
-its configuration specified in a section called
-``[formatter_form01]``. The root logger configuration must be
-specified in a section called ``[logger_root]``.
+The configuration file format understood by :func:`fileConfig` is based on
+:mod:`configparser` functionality. The file must contain sections called
+``[loggers]``, ``[handlers]`` and ``[formatters]`` which identify by name the
+entities of each type which are defined in the file. For each such entity, there
+is a separate section which identifies how that entity is configured.  Thus, for
+a logger named ``log01`` in the ``[loggers]`` section, the relevant
+configuration details are held in a section ``[logger_log01]``. Similarly, a
+handler called ``hand01`` in the ``[handlers]`` section will have its
+configuration held in a section called ``[handler_hand01]``, while a formatter
+called ``form01`` in the ``[formatters]`` section will have its configuration
+specified in a section called ``[formatter_form01]``. The root logger
+configuration must be specified in a section called ``[logger_root]``.
 
 Examples of these sections in the file are given below. ::
 
index e6df277df71a04d665348e9684f3c96ba7ac0d4d..8259743a5a0fd16dbdcad97ca929c6ecf0dd0479 100644 (file)
@@ -126,6 +126,10 @@ typedef unsigned int Py_UCS4;
 typedef unsigned long Py_UCS4; 
 #endif
 
+/* Py_UNICODE is the native Unicode storage format (code unit) used by
+   Python and represents a single Unicode element in the Unicode
+   type. */
+
 typedef PY_UNICODE_TYPE Py_UNICODE;
 
 /* --- UCS-2/UCS-4 Name Mangling ------------------------------------------ */
@@ -369,12 +373,12 @@ typedef PY_UNICODE_TYPE Py_UNICODE;
 
 #else
 
-/* Since splitting on whitespace is an important use case, and whitespace
-   in most situations is solely ASCII whitespace, we optimize for the common
-   case by using a quick look-up table with an inlined check.
- */
-PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[];
+/* Since splitting on whitespace is an important use case, and
+   whitespace in most situations is solely ASCII whitespace, we
+   optimize for the common case by using a quick look-up table
+   _Py_ascii_whitespace (see below) with an inlined check.
 
+ */
 #define Py_UNICODE_ISSPACE(ch) \
        ((ch) < 128U ? _Py_ascii_whitespace[(ch)] : _PyUnicode_IsWhitespace(ch))
 
@@ -409,13 +413,14 @@ PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[];
 #define Py_UNICODE_COPY(target, source, length)                                \
        Py_MEMCPY((target), (source), (length)*sizeof(Py_UNICODE))
 
-#define Py_UNICODE_FILL(target, value, length) do\
-    {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\
+#define Py_UNICODE_FILL(target, value, length) \
+    do {Py_ssize_t i_; Py_UNICODE *t_ = (target); Py_UNICODE v_ = (value);\
         for (i_ = 0; i_ < (length); i_++) t_[i_] = v_;\
     } while (0)
 
-/* check if substring matches at given offset.  the offset must be
+/* Check if substring matches at given offset.  the offset must be
    valid, and the substring must not be empty */
+
 #define Py_UNICODE_MATCH(string, offset, substring) \
     ((*((string)->str + (offset)) == *((substring)->str)) && \
     ((*((string)->str + (offset) + (substring)->length-1) == *((substring)->str + (substring)->length-1))) && \
@@ -425,8 +430,6 @@ PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[];
 extern "C" {
 #endif
 
-PyAPI_FUNC(int) PyUnicode_ClearFreeList(void);
-
 /* --- Unicode Type ------------------------------------------------------- */
 
 typedef struct {
@@ -641,6 +644,17 @@ PyAPI_FUNC(Py_ssize_t) PyUnicode_AsWideChar(
 
 PyAPI_FUNC(PyObject*) PyUnicode_FromOrdinal(int ordinal);
 
+/* --- Free-list management ----------------------------------------------- */
+
+/* Clear the free list used by the Unicode implementation.
+
+   This can be used to release memory used for objects on the free
+   list back to the Python memory allocator.
+
+*/
+
+PyAPI_FUNC(int) PyUnicode_ClearFreeList(void);
+
 /* === Builtin Codecs ===================================================== 
 
    Many of these APIs take two arguments encoding and errors. These
@@ -1477,6 +1491,10 @@ PyAPI_FUNC(int) _PyUnicode_InsertThousandsGrouping(Py_UNICODE *buffer,
 
 /* === Characters Type APIs =============================================== */
 
+/* Helper array used by Py_UNICODE_ISSPACE(). */
+
+PyAPI_DATA(const unsigned char) _Py_ascii_whitespace[];
+
 /* These should not be used directly. Use the Py_UNICODE_IS* and
    Py_UNICODE_TO* macros instead. 
 
index b29fc64eca0baab4cc19a4527a984dd3eafd5a43..96fb7fa1a7733d9aa56afd6e0b52866b5ed08728 100644 (file)
@@ -4,7 +4,10 @@ Implements the Distutils 'sdist' command (create a source distribution)."""
 
 __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 @@ class sdist (Command):
 
         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 (file)
index 0000000..7cc04cf
--- /dev/null
@@ -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")
index 17f7d11743bb3a624c46cf032f3eafdfee0ecc11..12e4c80aa35e6e37d29fecd046f440608d20d0a0 100644 (file)
@@ -387,7 +387,7 @@ AC_ARG_WITH(gcc,
             AC_HELP_STRING(--without-gcc,never use gcc),
 [
        case $withval in
-       no)     CC=cc
+       no)     CC=${CC:-cc}
                without_gcc=yes;;
        yes)    CC=gcc
                without_gcc=no;;