mirror of
				https://github.com/python/cpython.git
				synced 2025-11-01 06:01:29 +00:00 
			
		
		
		
	Merged revisions 85728,85731,85735,85766-85771,85773,85777 via svnmerge from
svn+ssh://svn.python.org/python/branches/py3k ........ r85728 | georg.brandl | 2010-10-19 20:54:25 +0200 (Di, 19 Okt 2010) | 1 line #10092: Properly reset locale in Locale*Calendar classes. The context manager was buggy because setlocale() returns the *new* locale, not the old. Also add a test for this. ........ r85731 | georg.brandl | 2010-10-19 23:07:16 +0200 (Di, 19 Okt 2010) | 1 line Be consistent in the spelling of thread-safe(ty). ........ r85735 | georg.brandl | 2010-10-20 08:50:19 +0200 (Mi, 20 Okt 2010) | 1 line Fix r85728: use "" to mean the system default locale, which should work on more systems. ........ r85766 | georg.brandl | 2010-10-21 09:40:03 +0200 (Do, 21 Okt 2010) | 1 line #10159: sort completion matches before comparing to dir() result. ........ r85767 | georg.brandl | 2010-10-21 14:49:28 +0200 (Do, 21 Okt 2010) | 1 line #9095, #8912, #8999: add support in patchcheck for Mercurial checkouts, C file reindenting, and docs whitespace fixing. ........ r85768 | georg.brandl | 2010-10-21 14:59:14 +0200 (Do, 21 Okt 2010) | 1 line #9919: fix off-by-one error in lineno command in Misc/gdbinit; also add newline to its output. ........ r85769 | georg.brandl | 2010-10-21 15:01:23 +0200 (Do, 21 Okt 2010) | 1 line Fix missing import. ........ r85770 | georg.brandl | 2010-10-21 15:29:10 +0200 (Do, 21 Okt 2010) | 1 line #3077: fix h2py substitution of character literals. ........ r85771 | georg.brandl | 2010-10-21 15:34:51 +0200 (Do, 21 Okt 2010) | 1 line #1203650: allow larger list of files in windows makefile for freeze. ........ r85773 | georg.brandl | 2010-10-21 15:45:52 +0200 (Do, 21 Okt 2010) | 1 line #4829: better error message for invalid file mode ........ r85777 | georg.brandl | 2010-10-21 17:44:51 +0200 (Do, 21 Okt 2010) | 1 line Add .hgeol file for the Mercurial EOL extension. ........
This commit is contained in:
		
							parent
							
								
									ab32fec83c
								
							
						
					
					
						commit
						d62ecbf0ba
					
				
					 18 changed files with 196 additions and 81 deletions
				
			
		
							
								
								
									
										36
									
								
								.hgeol
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								.hgeol
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | |||
| [patterns] | ||||
| ** = native | ||||
| 
 | ||||
| **.bat  = CRLF | ||||
| **.def  = CRLF | ||||
| **.dsp  = CRLF | ||||
| **.dsw  = CRLF | ||||
| **.mak  = CRLF | ||||
| **.mk   = CRLF | ||||
| **.rc   = CRLF | ||||
| **.sln  = CRLF | ||||
| **.vcproj  = CRLF | ||||
| **.vsprops = CRLF | ||||
| 
 | ||||
| **.aif  = BIN | ||||
| **.au   = BIN | ||||
| **.bmp  = BIN | ||||
| **.db   = BIN | ||||
| **.exe  = BIN | ||||
| **.icns = BIN | ||||
| **.gif  = BIN | ||||
| **.ico  = BIN | ||||
| **.info = BIN | ||||
| **.jpg  = BIN | ||||
| **.pck  = BIN | ||||
| **.png  = BIN | ||||
| **.psd  = BIN | ||||
| **.tar  = BIN | ||||
| **.xar  = BIN | ||||
| **.zip  = BIN | ||||
| 
 | ||||
| Lib/email/test/data/msg_26.txt = BIN | ||||
| Lib/test/sndhdrdata/sndhdr.* = BIN | ||||
| 
 | ||||
| [repository] | ||||
| native = LF | ||||
|  | @ -416,7 +416,7 @@ Thread State and the Global Interpreter Lock | |||
|    single: interpreter lock | ||||
|    single: lock, interpreter | ||||
| 
 | ||||
| The Python interpreter is not fully thread safe.  In order to support | ||||
| The Python interpreter is not fully thread-safe.  In order to support | ||||
| multi-threaded Python programs, there's a global lock, called the :dfn:`global | ||||
| interpreter lock` or :dfn:`GIL`, that must be held by the current thread before | ||||
| it can safely access Python objects. Without the lock, even the simplest | ||||
|  |  | |||
|  | @ -170,9 +170,9 @@ it's the base calendar for all computations. | |||
| .. class:: LocaleTextCalendar(firstweekday=0, locale=None) | ||||
| 
 | ||||
|    This subclass of :class:`TextCalendar` can be passed a locale name in the | ||||
|    constructor and will return month and weekday names in the specified | ||||
|    locale. If this locale includes an encoding all strings containing month and | ||||
|    weekday names will be returned as unicode. | ||||
|    constructor and will return month and weekday names in the specified locale. | ||||
|    If this locale includes an encoding all strings containing month and weekday | ||||
|    names will be returned as unicode. | ||||
| 
 | ||||
| 
 | ||||
| .. class:: LocaleHTMLCalendar(firstweekday=0, locale=None) | ||||
|  | @ -182,6 +182,12 @@ it's the base calendar for all computations. | |||
|    locale. If this locale includes an encoding all strings containing month and | ||||
|    weekday names will be returned as unicode. | ||||
| 
 | ||||
| .. note:: | ||||
| 
 | ||||
|    The :meth:`formatweekday` and :meth:`formatmonthname` methods of these two | ||||
|    classes temporarily change the current locale to the given *locale*.  Because | ||||
|    the current locale is a process-wide setting, they are not thread-safe. | ||||
| 
 | ||||
| 
 | ||||
| For simple text calendars this module provides the following functions. | ||||
| 
 | ||||
|  |  | |||
|  | @ -39,7 +39,7 @@ The :mod:`locale` module defines the following exception and functions: | |||
|    If *locale* is omitted or ``None``, the current setting for *category* is | ||||
|    returned. | ||||
| 
 | ||||
|    :func:`setlocale` is not thread safe on most systems. Applications typically | ||||
|    :func:`setlocale` is not thread-safe on most systems. Applications typically | ||||
|    start with a call of :: | ||||
| 
 | ||||
|       import locale | ||||
|  |  | |||
|  | @ -214,7 +214,7 @@ However, if you really do need to use some shared data then | |||
|    The ``'d'`` and ``'i'`` arguments used when creating ``num`` and ``arr`` are | ||||
|    typecodes of the kind used by the :mod:`array` module: ``'d'`` indicates a | ||||
|    double precision float and ``'i'`` indicates a signed integer.  These shared | ||||
|    objects will be process and thread safe. | ||||
|    objects will be process and thread-safe. | ||||
| 
 | ||||
|    For more flexibility in using shared memory one can use the | ||||
|    :mod:`multiprocessing.sharedctypes` module which supports the creation of | ||||
|  |  | |||
|  | @ -753,9 +753,9 @@ Currently, :class:`Lock`, :class:`RLock`, :class:`Condition`, | |||
| Importing in threaded code | ||||
| -------------------------- | ||||
| 
 | ||||
| While the import machinery is thread safe, there are two key | ||||
| restrictions on threaded imports due to inherent limitations in the way | ||||
| that thread safety is provided: | ||||
| While the import machinery is thread-safe, there are two key restrictions on | ||||
| threaded imports due to inherent limitations in the way that thread-safety is | ||||
| provided: | ||||
| 
 | ||||
| * Firstly, other than in the main module, an import should not have the | ||||
|   side effect of spawning a new thread and then waiting for that thread in | ||||
|  |  | |||
|  | @ -486,8 +486,8 @@ def __init__(self, locale): | |||
|         self.locale = locale | ||||
| 
 | ||||
|     def __enter__(self): | ||||
|         self.oldlocale = _locale.setlocale(_locale.LC_TIME, self.locale) | ||||
|         #return _locale.getlocale(_locale.LC_TIME)[1] | ||||
|         self.oldlocale = _locale.getlocale(_locale.LC_TIME) | ||||
|         _locale.setlocale(_locale.LC_TIME, self.locale) | ||||
| 
 | ||||
|     def __exit__(self, *args): | ||||
|         _locale.setlocale(_locale.LC_TIME, self.oldlocale) | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
| import unittest | ||||
| 
 | ||||
| from test import support | ||||
| import locale | ||||
| 
 | ||||
| 
 | ||||
| result_2004_text = """ | ||||
|  | @ -250,6 +251,19 @@ def test_months(self): | |||
|             # verify it "acts like a sequence" in two forms of iteration | ||||
|             self.assertEqual(value[::-1], list(reversed(value))) | ||||
| 
 | ||||
|     def test_localecalendars(self): | ||||
|         # ensure that Locale{Text,HTML}Calendar resets the locale properly | ||||
|         # (it is still not thread-safe though) | ||||
|         old_october = calendar.TextCalendar().formatmonthname(2010, 10, 10) | ||||
|         try: | ||||
|             calendar.LocaleTextCalendar(locale='').formatmonthname(2010, 10, 10) | ||||
|         except locale.Error: | ||||
|             # cannot set the system default locale -- skip rest of test | ||||
|             return | ||||
|         calendar.LocaleHTMLCalendar(locale='').formatmonthname(2010, 10) | ||||
|         new_october = calendar.TextCalendar().formatmonthname(2010, 10, 10) | ||||
|         self.assertEquals(old_october, new_october) | ||||
| 
 | ||||
| 
 | ||||
| class MonthCalendarTestCase(unittest.TestCase): | ||||
|     def setUp(self): | ||||
|  |  | |||
|  | @ -31,9 +31,9 @@ class B(list): | |||
| 
 | ||||
|     def test_global_matches(self): | ||||
|         # test with builtins namespace | ||||
|         self.assertEqual(self.stdcompleter.global_matches('di'), | ||||
|         self.assertEqual(sorted(self.stdcompleter.global_matches('di')), | ||||
|                          [x+'(' for x in dir(builtins) if x.startswith('di')]) | ||||
|         self.assertEqual(self.stdcompleter.global_matches('st'), | ||||
|         self.assertEqual(sorted(self.stdcompleter.global_matches('st')), | ||||
|                          [x+'(' for x in dir(builtins) if x.startswith('st')]) | ||||
|         self.assertEqual(self.stdcompleter.global_matches('akaksajadhak'), []) | ||||
| 
 | ||||
|  |  | |||
|  | @ -18,6 +18,8 @@ Library | |||
| 
 | ||||
| - Issue #10459: Update CJK character names to Unicode 5.1. | ||||
| 
 | ||||
| - Issue #10092: Properly reset locale in calendar.Locale*Calendar classes. | ||||
| 
 | ||||
| - Issue #6098: Don't claim DOM level 3 conformance in minidom. | ||||
| 
 | ||||
| - Issue #5762: Fix AttributeError raised by ``xml.dom.minidom`` when an empty | ||||
|  |  | |||
|  | @ -62,11 +62,12 @@ define lineno | |||
|       set $__p = $__p + 1 | ||||
|       if ($__ad > $__lasti) | ||||
| 	set $__continue = 0 | ||||
|       end | ||||
|       else | ||||
|         set $__li = $__li + *$__p | ||||
|         set $__p = $__p + 1 | ||||
|       end | ||||
|     printf "%d", $__li | ||||
|     end | ||||
|     printf "%d\n", $__li | ||||
| end | ||||
| 
 | ||||
| # print the current frame - verbose | ||||
|  |  | |||
|  | @ -265,7 +265,8 @@ fileio_init(PyObject *oself, PyObject *args, PyObject *kwds) | |||
|             if (rwa) { | ||||
|             bad_mode: | ||||
|                 PyErr_SetString(PyExc_ValueError, | ||||
|                                 "Must have exactly one of read/write/append mode"); | ||||
|                                 "Must have exactly one of read/write/append " | ||||
|                                 "mode and at most one plus"); | ||||
|                 goto error; | ||||
|             } | ||||
|             rwa = 1; | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| import re | ||||
| 
 | ||||
| import sys | ||||
| 
 | ||||
| # Write the config.c file | ||||
| 
 | ||||
|  | @ -38,7 +38,6 @@ def makeconfig(infp, outfp, modules, with_ifdef=0): | |||
| # Test program. | ||||
| 
 | ||||
| def test(): | ||||
|     import sys | ||||
|     if not sys.argv[3:]: | ||||
|         print('usage: python makeconfig.py config.c.in outputfile', end=' ') | ||||
|         print('modulename ...') | ||||
|  |  | |||
|  | @ -134,12 +134,14 @@ def realwork(vars, moddefns, target): | |||
|     print() ; print() | ||||
| 
 | ||||
|     print("$(target)$(debug_suffix)%s: $(temp_dir) $(OBJS)" % (target_ext)) | ||||
|     print("\tlink -out:$(target)$(debug_suffix)%s %s" % (target_ext, target_link_flags), end=' ') | ||||
|     print("\t$(OBJS) \\") | ||||
|     print("\t$(LIBS) \\") | ||||
|     print("\t$(ADDN_LINK_FILES) \\") | ||||
|     print("\t$(pythonlib) $(lcustom) $(l_debug)\\") | ||||
|     print("\tlink -out:$(target)$(debug_suffix)%s %s" % | ||||
|           (target_ext, target_link_flags), "@<<") | ||||
|     print("\t$(OBJS)") | ||||
|     print("\t$(LIBS)") | ||||
|     print("\t$(ADDN_LINK_FILES)") | ||||
|     print("\t$(pythonlib) $(lcustom) $(l_debug)") | ||||
|     print("\t$(resources)") | ||||
|     print("<<") | ||||
|     print() | ||||
|     print("clean:") | ||||
|     print("\t-rm -f *.obj") | ||||
|  |  | |||
|  | @ -93,7 +93,7 @@ def pytify(body): | |||
|     for p in ignores: | ||||
|         body = p.sub(' ', body) | ||||
|     # replace char literals by ord(...) | ||||
|     body = p_char.sub('ord(\\0)', body) | ||||
|     body = p_char.sub("ord('\\1')", body) | ||||
|     # Compute negative hexadecimal constants | ||||
|     start = 0 | ||||
|     UMAX = 2*(sys.maxsize+1) | ||||
|  |  | |||
|  | @ -1,8 +1,16 @@ | |||
| import re | ||||
| import sys | ||||
| import shutil | ||||
| import os.path | ||||
| import subprocess | ||||
| import sys | ||||
| 
 | ||||
| import reindent | ||||
| import untabify | ||||
| 
 | ||||
| 
 | ||||
| def n_files_str(count): | ||||
|     """Return 'N file(s)' with the proper plurality on 'file'.""" | ||||
|     return "{} file{}".format(count, "s" if count != 1 else "") | ||||
| 
 | ||||
| 
 | ||||
| def status(message, modal=False, info=None): | ||||
|  | @ -17,53 +25,105 @@ def call_fxn(*args, **kwargs): | |||
|             elif info: | ||||
|                 print(info(result)) | ||||
|             else: | ||||
|                 if result: | ||||
|                     print("yes") | ||||
|                 else: | ||||
|                     print("NO") | ||||
|                 print("yes" if result else "NO") | ||||
|             return result | ||||
|         return call_fxn | ||||
|     return decorated_fxn | ||||
| 
 | ||||
| @status("Getting the list of files that have been added/changed", | ||||
|             info=lambda x: "%s files" % len(x)) | ||||
| def changed_files(): | ||||
|     """Run ``svn status`` and return a set of files that have been | ||||
|     changed/added.""" | ||||
|     cmd = 'svn status --quiet --non-interactive --ignore-externals' | ||||
|     svn_st = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) | ||||
|     svn_st.wait() | ||||
|     output = [x.decode().rstrip() for x in svn_st.stdout.readlines()] | ||||
|     files = set() | ||||
|     for line in output: | ||||
|         if not line[0] in ('A', 'M'): | ||||
|             continue | ||||
|         line_parts = line.split() | ||||
|         path = line_parts[-1] | ||||
|         if os.path.isfile(path): | ||||
|             files.add(path) | ||||
|     return files | ||||
| 
 | ||||
| @status("Fixing whitespace", info=lambda x: "%s files" % x) | ||||
| @status("Getting the list of files that have been added/changed", | ||||
|         info=lambda x: n_files_str(len(x))) | ||||
| def changed_files(): | ||||
|     """Get the list of changed or added files from the VCS.""" | ||||
|     if os.path.isdir('.hg'): | ||||
|         vcs = 'hg' | ||||
|         cmd = 'hg status --added --modified --no-status' | ||||
|     elif os.path.isdir('.svn'): | ||||
|         vcs = 'svn' | ||||
|         cmd = 'svn status --quiet --non-interactive --ignore-externals' | ||||
|     else: | ||||
|         sys.exit('need a checkout to get modified files') | ||||
| 
 | ||||
|     st = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE) | ||||
|     try: | ||||
|         st.wait() | ||||
|         if vcs == 'hg': | ||||
|             return [x.decode().rstrip() for x in st.stdout] | ||||
|         else: | ||||
|             output = (x.decode().rstrip().rsplit(None, 1)[-1] | ||||
|                       for x in st.stdout if x[0] in b'AM') | ||||
|         return set(path for path in output if os.path.isfile(path)) | ||||
|     finally: | ||||
|         st.stdout.close() | ||||
| 
 | ||||
| 
 | ||||
| def report_modified_files(file_paths): | ||||
|     count = len(file_paths) | ||||
|     if count == 0: | ||||
|         return n_files_str(count) | ||||
|     else: | ||||
|         lines = ["{}:".format(n_files_str(count))] | ||||
|         for path in file_paths: | ||||
|             lines.append("  {}".format(path)) | ||||
|         return "\n".join(lines) | ||||
| 
 | ||||
| 
 | ||||
| @status("Fixing whitespace", info=report_modified_files) | ||||
| def normalize_whitespace(file_paths): | ||||
|     """Make sure that the whitespace for .py files have been normalized.""" | ||||
|     reindent.makebackup = False  # No need to create backups. | ||||
|     result = list(map(reindent.check, (x for x in file_paths if x.endswith('.py')))) | ||||
|     return sum(result) | ||||
|     fixed = [] | ||||
|     for path in (x for x in file_paths if x.endswith('.py')): | ||||
|         if reindent.check(path): | ||||
|             fixed.append(path) | ||||
|     return fixed | ||||
| 
 | ||||
| 
 | ||||
| @status("Fixing C file whitespace", info=report_modified_files) | ||||
| def normalize_c_whitespace(file_paths): | ||||
|     """Report if any C files """ | ||||
|     fixed = [] | ||||
|     for path in file_paths: | ||||
|         with open(path, 'r') as f: | ||||
|             if '\t' not in f.read(): | ||||
|                 continue | ||||
|         untabify.process(path, 8, verbose=False) | ||||
|         fixed.append(path) | ||||
|     return fixed | ||||
| 
 | ||||
| 
 | ||||
| ws_re = re.compile(br'\s+(\r?\n)$') | ||||
| 
 | ||||
| @status("Fixing docs whitespace", info=report_modified_files) | ||||
| def normalize_docs_whitespace(file_paths): | ||||
|     fixed = [] | ||||
|     for path in file_paths: | ||||
|         try: | ||||
|             with open(path, 'rb') as f: | ||||
|                 lines = f.readlines() | ||||
|             new_lines = [ws_re.sub(br'\1', line) for line in lines] | ||||
|             if new_lines != lines: | ||||
|                 shutil.copyfile(path, path + '.bak') | ||||
|                 with open(path, 'wb') as f: | ||||
|                     f.writelines(new_lines) | ||||
|                 fixed.append(path) | ||||
|         except Exception as err: | ||||
|             print('Cannot fix %s: %s' % (path, err)) | ||||
|     return fixed | ||||
| 
 | ||||
| 
 | ||||
| @status("Docs modified", modal=True) | ||||
| def docs_modified(file_paths): | ||||
|     """Report if any files in the Docs directory.""" | ||||
|     for path in file_paths: | ||||
|         if path.startswith("Doc"): | ||||
|             return True | ||||
|     return False | ||||
|     """Report if any file in the Doc directory has been changed.""" | ||||
|     return bool(file_paths) | ||||
| 
 | ||||
| 
 | ||||
| @status("Misc/ACKS updated", modal=True) | ||||
| def credit_given(file_paths): | ||||
|     """Check if Misc/ACKS has been changed.""" | ||||
|     return 'Misc/ACKS' in file_paths | ||||
| 
 | ||||
| 
 | ||||
| @status("Misc/NEWS updated", modal=True) | ||||
| def reported_news(file_paths): | ||||
|     """Check if Misc/NEWS has been changed.""" | ||||
|  | @ -72,14 +132,22 @@ def reported_news(file_paths): | |||
| 
 | ||||
| def main(): | ||||
|     file_paths = changed_files() | ||||
|     # PEP 7/8 verification. | ||||
|     normalize_whitespace(file_paths) | ||||
|     python_files = [fn for fn in file_paths if fn.endswith('.py')] | ||||
|     c_files = [fn for fn in file_paths if fn.endswith(('.c', '.h'))] | ||||
|     doc_files = [fn for fn in file_paths if fn.startswith('Doc')] | ||||
|     special_files = {'Misc/ACKS', 'Misc/NEWS'} & set(file_paths) | ||||
|     # PEP 8 whitespace rules enforcement. | ||||
|     normalize_whitespace(python_files) | ||||
|     # C rules enforcement. | ||||
|     normalize_c_whitespace(c_files) | ||||
|     # Doc whitespace enforcement. | ||||
|     normalize_docs_whitespace(doc_files) | ||||
|     # Docs updated. | ||||
|     docs_modified(file_paths) | ||||
|     docs_modified(doc_files) | ||||
|     # Misc/ACKS changed. | ||||
|     credit_given(file_paths) | ||||
|     credit_given(special_files) | ||||
|     # Misc/NEWS changed. | ||||
|     reported_news(file_paths) | ||||
|     reported_news(special_files) | ||||
| 
 | ||||
|     # Test suite run and passed. | ||||
|     print() | ||||
|  |  | |||
|  | @ -3,27 +3,12 @@ | |||
| # Make a reST file compliant to our pre-commit hook. | ||||
| # Currently just remove trailing whitespace. | ||||
| 
 | ||||
| import sys | ||||
| 
 | ||||
| import sys, re, shutil | ||||
| 
 | ||||
| ws_re = re.compile(r'\s+(\r?\n)$') | ||||
| import patchcheck | ||||
| 
 | ||||
| def main(argv=sys.argv): | ||||
|     rv = 0 | ||||
|     for filename in argv[1:]: | ||||
|         try: | ||||
|             with open(filename, 'rb') as f: | ||||
|                 lines = f.readlines() | ||||
|             new_lines = [ws_re.sub(r'\1', line) for line in lines] | ||||
|             if new_lines != lines: | ||||
|                 print('Fixing %s...' % filename) | ||||
|             shutil.copyfile(filename, filename + '.bak') | ||||
|             with open(filename, 'wb') as f: | ||||
|                 f.writelines(new_lines) | ||||
|         except Exception as err: | ||||
|             print('Cannot fix %s: %s' % (filename, err)) | ||||
|             rv = 1 | ||||
|     return rv | ||||
|     patchcheck.normalize_docs_whitespace(argv[1:]) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|     sys.exit(main()) | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ def main(): | |||
|     for filename in args: | ||||
|         process(filename, tabsize) | ||||
| 
 | ||||
| def process(filename, tabsize): | ||||
| def process(filename, tabsize, verbose=True): | ||||
|     try: | ||||
|         f = open(filename) | ||||
|         text = f.read() | ||||
|  | @ -46,6 +46,7 @@ def process(filename, tabsize): | |||
|     f = open(filename, "w") | ||||
|     f.write(newtext) | ||||
|     f.close() | ||||
|     if verbose: | ||||
|         print(filename) | ||||
| 
 | ||||
| if __name__ == '__main__': | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl