You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(15) |
Oct
(31) |
Nov
(38) |
Dec
(21) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(46) |
Feb
(2) |
Mar
(10) |
Apr
(13) |
May
(2) |
Jun
(14) |
Jul
(28) |
Aug
(3) |
Sep
(7) |
Oct
(8) |
Nov
(8) |
Dec
(11) |
2005 |
Jan
|
Feb
|
Mar
|
Apr
(42) |
May
(1) |
Jun
(8) |
Jul
(4) |
Aug
(18) |
Sep
(38) |
Oct
(10) |
Nov
|
Dec
(7) |
2006 |
Jan
|
Feb
(8) |
Mar
(9) |
Apr
|
May
|
Jun
(6) |
Jul
(6) |
Aug
|
Sep
|
Oct
|
Nov
(12) |
Dec
(8) |
2007 |
Jan
(3) |
Feb
|
Mar
(9) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(5) |
Oct
|
Nov
|
Dec
|
2008 |
Jan
|
Feb
(4) |
Mar
(2) |
Apr
(17) |
May
(16) |
Jun
(2) |
Jul
|
Aug
(3) |
Sep
(1) |
Oct
|
Nov
(11) |
Dec
(1) |
2009 |
Jan
|
Feb
|
Mar
|
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2012 |
Jan
(1) |
Feb
(2) |
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(2) |
2013 |
Jan
(14) |
Feb
(14) |
Mar
|
Apr
|
May
(3) |
Jun
(10) |
Jul
(2) |
Aug
|
Sep
(1) |
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(10) |
Jun
|
Jul
|
Aug
|
Sep
(9) |
Oct
(8) |
Nov
|
Dec
|
2017 |
Jan
(3) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(4) |
Sep
|
Oct
|
Nov
|
Dec
|
From: <th...@us...> - 2008-09-06 18:05:44
|
Revision: 672 http://py2exe.svn.sourceforge.net/py2exe/?rev=672&view=rev Author: theller Date: 2008-09-06 18:05:55 +0000 (Sat, 06 Sep 2008) Log Message: ----------- Whitespace Modified Paths: -------------- trunk/py2exe/ChangeLog Modified: trunk/py2exe/ChangeLog =================================================================== --- trunk/py2exe/ChangeLog 2008-08-30 07:51:40 UTC (rev 671) +++ trunk/py2exe/ChangeLog 2008-09-06 18:05:55 UTC (rev 672) @@ -12,15 +12,15 @@ * Bump version number to 0.6.8. - * Updated test suite to be smarter about which interpreters - to use for testing and to output stats. + * Updated test suite to be smarter about which interpreters to use + for testing and to output stats. - * Merged modulefinder.py r59200 from the Python svn trunk into mf.py - in order to support relative imports. + * Merged modulefinder.py r59200 from the Python svn trunk into + mf.py in order to support relative imports. - * Use Python 2.5 to build the source distribution. + * Use Python 2.5 to build the source distribution. - * Include the entire test suite in the source distribution. + * Include the entire test suite in the source distribution. 2008-04-17 Thomas Heller <th...@py...> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mha...@us...> - 2008-08-30 07:51:30
|
Revision: 671 http://py2exe.svn.sourceforge.net/py2exe/?rev=671&view=rev Author: mhammond Date: 2008-08-30 07:51:40 +0000 (Sat, 30 Aug 2008) Log Message: ----------- Ensure we don't clobber the manifest or version resources in pythonxx.dll Modified Paths: -------------- trunk/py2exe/py2exe/build_exe.py Modified: trunk/py2exe/py2exe/build_exe.py =================================================================== --- trunk/py2exe/py2exe/build_exe.py 2008-08-28 03:56:11 UTC (rev 670) +++ trunk/py2exe/py2exe/build_exe.py 2008-08-30 07:51:40 UTC (rev 671) @@ -970,7 +970,8 @@ def patch_python_dll_winver(self, dll_name, new_winver = None): from py2exe.resources.StringTables import StringTable, RT_STRING - from py2exe_util import add_resource + from py2exe_util import add_resource, load_resource + from py2exe.resources.VersionInfo import RT_VERSION new_winver = new_winver or self.distribution.metadata.name or "py2exe" if self.verbose: @@ -988,14 +989,30 @@ f.close() except IOError, why: print "WARNING: File %s could not be opened - %s" % (dll_name, why) - # OK - do it. + # We aren't smart enough to update string resources in place, so we need + # to persist other resources we care about. + unicode_name = ensure_unicode(dll_name) + + # Preserve existing version info (all versions should have this) + ver_info = load_resource(unicode_name, RT_VERSION, 1) + # Preserve an existing manifest (only python26.dll+ will have this) + try: + # Manfiests have resource type of 24, and ID of either 1 or 2. + mfest = load_resource(unicode_name, RT_MANIFEST, 2) + except RuntimeError: + mfest = None + + # Start putting the resources back, passing 'delete=True' for the first. + add_resource(unicode_name, ver_info, RT_VERSION, 1, True) + if mfest is not None: + add_resource(unicode_name, mfest, RT_MANIFEST, 2, False) + + # OK - do the strings. s = StringTable() # 1000 is the resource ID Python loads for its winver. s.add_string(1000, new_winver) - delete = True for id, data in s.binary(): - add_resource(ensure_unicode(dll_name), data, RT_STRING, id, delete) - delete = False + add_resource(ensure_unicode(dll_name), data, RT_STRING, id, False) # restore the time. os.utime(dll_name, (st[stat.ST_ATIME], st[stat.ST_MTIME])) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mha...@us...> - 2008-08-28 03:56:02
|
Revision: 670 http://py2exe.svn.sourceforge.net/py2exe/?rev=670&view=rev Author: mhammond Date: 2008-08-28 03:56:11 +0000 (Thu, 28 Aug 2008) Log Message: ----------- [ 2038411 ] copy manifest to target executables and allow user-specified UAC settings for the target. Modified Paths: -------------- trunk/py2exe/ChangeLog trunk/py2exe/py2exe/build_exe.py trunk/py2exe/source/py2exe_util.c Added Paths: ----------- trunk/py2exe/py2exe/samples/user_access_control/ trunk/py2exe/py2exe/samples/user_access_control/README.txt trunk/py2exe/py2exe/samples/user_access_control/hello.py trunk/py2exe/py2exe/samples/user_access_control/setup.py Modified: trunk/py2exe/ChangeLog =================================================================== --- trunk/py2exe/ChangeLog 2008-08-05 05:15:40 UTC (rev 669) +++ trunk/py2exe/ChangeLog 2008-08-28 03:56:11 UTC (rev 670) @@ -1,3 +1,13 @@ +2008-08-28 Mark Hammond <mha...@sk...> + + * Copy the manifest, if any, from the 'template' into the targets + to ensure embedded assembly references, as required for python 2.6 based + apps, are copied. + + * Allow each target to specify Vista User Access Control flags. For + example, specifying 'uac_execution_info="requireAdministrator"' would + force elevation for the final executable. + 2008-05-19 Jimmy Retzlaff <ji...@re...> * Bump version number to 0.6.8. Modified: trunk/py2exe/py2exe/build_exe.py =================================================================== --- trunk/py2exe/py2exe/build_exe.py 2008-08-05 05:15:40 UTC (rev 669) +++ trunk/py2exe/py2exe/build_exe.py 2008-08-28 03:56:11 UTC (rev 670) @@ -16,6 +16,7 @@ import sets import tempfile import struct +import re is_win64 = struct.calcsize("P") == 8 @@ -34,7 +35,12 @@ # resource constants RT_BITMAP=2 +RT_MANIFEST=24 +# Pattern for modifying the 'requestedExecutionLevel' in the manifest. Groups +# are setup so all text *except* for the values is matched. +pat_manifest_uac = re.compile(r'(^.*<requestedExecutionLevel level=")([^"])*(" uiAccess=")([^"])*(".*$)') + # note: we cannot use the list from imp.get_suffixes() because we want # .pyc and .pyo, independent of the optimize flag. _py_suffixes = ['.py', '.pyo', '.pyc', '.pyw'] @@ -85,6 +91,15 @@ # A very loosely defined "target". We assume either a "script" or "modules" # attribute. Some attributes will be target specific. class Target: + # A custom requestedExecutionLevel for the User Access Control portion + # of the manifest for the target. May be a string, which will be used for + # the 'requestedExecutionLevel' portion and False for 'uiAccess', or a tuple + # of (string, bool) which specifies both values. If specified and the + # target's 'template' executable has no manifest (ie, python 2.5 and + # earlier), then a default manifest is created, otherwise the manifest from + # the template is copied then updated. + uac_info = None + def __init__(self, **kw): self.__dict__.update(kw) # If modules is a simple string, assume they meant list @@ -719,6 +734,58 @@ } return self.build_executable(target, template, arcname, None, vars) + def build_manifest(self, target, template): + # Optionally return a manifest to be included in the target executable. + # Note for Python 2.6 and later, its *necessary* to include a manifest + # which correctly references the CRT. For earlier versions, a manifest + # is optional, and only necessary to customize things like + # Vista's User Access Control 'requestedExecutionLevel' setting, etc. + default_manifest = """ + <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> + <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> + <security> + <requestedPrivileges> + <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> + </requestedPrivileges> + </security> + </trustInfo> + </assembly> + """ + from py2exe_util import load_resource + if os.path.splitext(template)[1]==".exe": + rid = 1 + else: + rid = 2 + try: + # Manfiests have resource type of 24, and ID of either 1 or 2. + mfest = load_resource(ensure_unicode(template), RT_MANIFEST, rid) + # we consider the manifest 'changed' as we know we clobber all + # resources including the existing manifest - so this manifest must + # get written even if we make no other changes. + changed = True + except RuntimeError: + mfest = default_manifest + # in this case the template had no existing manifest, so its + # not considered 'changed' unless we make further changes later. + changed = False + # update the manifest according to our options. + # for now a regex will do. + if target.uac_info: + changed = True + if isinstance(target.uac_info, tuple): + exec_level, ui = target.uac_info + else: + exec_level = target.uac_info + ui = False + new_lines = [] + for line in mfest.splitlines(): + repl = r'\1%s\3%s\5' % (exec_level, ui) + new_lines.append(re.sub(pat_manifest_uac, repl, line)) + mfest = "".join(new_lines) + if not changed: + return None, None + return mfest, rid + def build_executable(self, target, template, arcname, script, vars={}): # Build an executable for the target # template is the exe-stub to use, and arcname is the zipfile @@ -827,6 +894,13 @@ if not self.dry_run: add_icon(ensure_unicode(exe_path), ensure_unicode(ico_filename), ico_id) + # a manifest + mfest, mfest_id = self.build_manifest(target, src) + if mfest: + self.announce("add manifest, %d bytes" % len(mfest)) + if not self.dry_run: + add_resource(ensure_unicode(exe_path), mfest, RT_MANIFEST, mfest_id, False) + for res_type, res_id, data in getattr(target, "other_resources", []): if not self.dry_run: if isinstance(res_type, basestring): @@ -960,13 +1034,17 @@ images = dlls + templates self.announce("Resolving binary dependencies:") + excludes_use = dll_excludes[:] + # The MSVCRT modules are never found when using VS2008+ + if sys.version_info > (2,6): + excludes_use.append("msvcr90.dll") # we add python.exe (aka sys.executable) to the list of images # to scan for dependencies, but remove it later again from the # results list. In this way pythonXY.dll is collected, and # also the libraries it depends on. alldlls, warnings, other_depends = \ - bin_depends(loadpath, images + [sys.executable], dll_excludes) + bin_depends(loadpath, images + [sys.executable], excludes_use) alldlls.remove(sys.executable) for dll in alldlls: self.announce(" %s" % dll) Added: trunk/py2exe/py2exe/samples/user_access_control/README.txt =================================================================== --- trunk/py2exe/py2exe/samples/user_access_control/README.txt (rev 0) +++ trunk/py2exe/py2exe/samples/user_access_control/README.txt 2008-08-28 03:56:11 UTC (rev 670) @@ -0,0 +1,54 @@ +This is a sample for how to control Vista's user-access-control for your +py2exe created programs. + +Execute 'python setup.py py2exe' to create various executables, all with +different manifest values. Each of these may behave slightly differently +when executed under Vista. + +Important: +---------- + +There is an important difference between Python 2.6 versus +earlier versions. + +Python 2.5 and before created executables will not have a manifest +by default, meaning a backwards compatibility virtualization mode +may be used by default. However, if you specify any value for 'uac_info' +this virtualization will be disabled as it will cause a manifest to be +created for the executable. + +To demonstrate on Vista: + +* Using an elevated process, create a temp directory under "C:\Program Files" + and copy the generated 'dist' directory to that temp dir. + +* From a non-elevated command-prompt, execute: + c:\Program Files\temp\not_specified.exe -e foo + + You will see an error dialog due to 'foo' being written to stderr. The + error dialog will tell you the log file was written to the + "C:\Program Files\temp" directory, but that log file will not exist + in that directory - instead, it will be in the + "C:\Users\{username}\AppData\Local\VirtualStore\Program Files (x86)\temp" + directory - Windows has virtualized the file-system. Similar things will + be able to be demonstrated with the registry. + +* From a non-elevated command-prompt, execute: + c:\Program Files\temp\as_invoker.exe -e foo + + You will see an error dialog, but it will be slightly different - it + will relate to a failure to open the log file in the "c:\Program Files\temp" + directory. In this case, Windows has *not* virtualized the file-system but + your process does not have permission to write in that directory, so it + fails to write a log file at all. + +* From a non-elevated command-prompt, execute: + c:\Program Files\temp\admin_required.exe -e foo + + You will be prompted to elevate the process, then a log file will be + written to "C:\Program Files\temp" as the permissions exists in the + elevated process. + +NOTE: For Python 2.6 and later there is always a manifest, so virtualization +is always disabled. In other words, in Python 2.6, not_specified.exe will +work exactly like as_invoker.exe does for all versions. Added: trunk/py2exe/py2exe/samples/user_access_control/hello.py =================================================================== --- trunk/py2exe/py2exe/samples/user_access_control/hello.py (rev 0) +++ trunk/py2exe/py2exe/samples/user_access_control/hello.py 2008-08-28 03:56:11 UTC (rev 670) @@ -0,0 +1,28 @@ +import sys +import optparse + +def main(): + parser = optparse.OptionParser() + # Main point here is showing that writing to stderr + # currently forces py2exe to write a .log file next + # to the executable, but that might not always work. + # README.txt relies on that to demonstrate different + # behaviour for the different manifest values, so + # if this changes, be sure to also ensure README.txt + # stays accurate. + parser.add_option("-e", "--write-err", + action="store", + help="a message to write to stderr.") + + parser.add_option("-o", "--write-out", + action="store", + help="a message to write to stdout.") + + opts, args = parser.parse_args() + if opts.write_err: + sys.stderr.write(opts.write_err + "\n") + if opts.write_out: + sys.stderr.write(opts.write_out+ "\n") + +if __name__=='__main__': + main() Added: trunk/py2exe/py2exe/samples/user_access_control/setup.py =================================================================== --- trunk/py2exe/py2exe/samples/user_access_control/setup.py (rev 0) +++ trunk/py2exe/py2exe/samples/user_access_control/setup.py 2008-08-28 03:56:11 UTC (rev 670) @@ -0,0 +1,46 @@ +# A simple setup script to create various executables with +# different User Access Control flags in the manifest. + +# Run the build process by entering 'setup.py py2exe' or +# 'python setup.py py2exe' in a console prompt. +# +# If everything works well, you should find a subdirectory named 'dist' +# containing lots of executables + +from distutils.core import setup +import py2exe + +# The targets to build + +# create a target that says nothing about UAC - On Python 2.6+, this +# should be identical to "asInvoker" below. However, for 2.5 and +# earlier it will force the app into compatibility mode (as no +# manifest will exist at all in the target.) +t1 = dict(script="hello.py", + dest_base="not_specified") +# targets with different values for requestedExecutionLevel +t2 = dict(script="hello.py", + dest_base="as_invoker", + uac_info="asInvoker") +t3 = dict(script="hello.py", + dest_base="highest_available", + uac_info="highestAvailable") +t4 = dict(script="hello.py", + dest_base="require_admin", + uac_info="requireAdministrator") +console = [t1, t2, t3, t4] + +# hack to make windows copies of them all too, but +# with '_w' on the tail of the executable. +windows = [t1.copy(), t2.copy(), t3.copy(), t4.copy()] +for t in windows: + t['dest_base'] += "_w" + +setup( + version = "0.5.0", + description = "py2exe user-access-control sample script", + name = "py2exe samples", + # targets to build + windows = windows, + console = console, + ) Modified: trunk/py2exe/source/py2exe_util.c =================================================================== --- trunk/py2exe/source/py2exe_util.c 2008-08-05 05:15:40 UTC (rev 669) +++ trunk/py2exe/source/py2exe_util.c 2008-08-28 03:56:11 UTC (rev 670) @@ -357,6 +357,62 @@ return NULL; } +static PyObject *load_resource(PyObject *self, PyObject *args) +{ + PyObject *ret = NULL; + Py_UNICODE *exename; + HANDLE hMod = NULL; + HRSRC hrsrc = NULL; + HGLOBAL hglob = 0; + LPVOID res_ptr = NULL; + DWORD res_size = 0; + PyObject *py_res_type, *py_res_id; + Py_UNICODE *res_type; + Py_UNICODE *res_id; + WORD wLanguage = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); + + if (!PyArg_ParseTuple(args, "uOO|H", + &exename, &py_res_type, &py_res_id, &wLanguage)) + return NULL; + + res_type = PyObject_AsRESOURCEID(py_res_type); + if (res_type==NULL) + return NULL; + + res_id = PyObject_AsRESOURCEID(py_res_id); + if (res_id==NULL) + return NULL; + + // Note lack of function pointers - this was added after win9x support was + // dropped. + if (!(hMod = LoadLibraryExW(exename, NULL, LOAD_LIBRARY_AS_DATAFILE))) + return SystemError(GetLastError(), "LoadLibraryExW"); + + // from here. take care to exit via 'done' + if (!(hrsrc = FindResourceExW(hMod, res_type, res_id, wLanguage))) { + SystemError(GetLastError(), "FindResourceEx"); + goto done; + } + if (0 == (res_size = SizeofResource(hMod, hrsrc))) { + SystemError(GetLastError(), "SizeofResource"); + goto done; + } + if (0 == (hglob = LoadResource(hMod, hrsrc))) { + SystemError(GetLastError(), "LoadResource"); + goto done; + } + if (0 == (res_ptr = LockResource(hglob))) { + SystemError(GetLastError(), "LockResource"); + goto done; + } + ret = PyString_FromStringAndSize((char *)res_ptr, res_size); +done: + if (hMod) + FreeLibrary(hMod); + // nothing else to clean up (no Unlock/UnloadResource exist) + return ret; +} + /*********************************************************************************** * * Dependency tracker @@ -510,6 +566,9 @@ "Return a list containing the dlls needed to run 'executable'.\n" "The dlls are searched along 'loadpath'\n" "or windows default loadpath", }, + { "load_resource", load_resource, METH_VARARGS, + "load_resource(executable, res_type, res_id[, language]) -> string\n\n" + "Load the specified resource from 'executable'", }, { NULL, NULL }, /* Sentinel */ }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mha...@us...> - 2008-08-05 05:15:33
|
Revision: 669 http://py2exe.svn.sourceforge.net/py2exe/?rev=669&view=rev Author: mhammond Date: 2008-08-05 05:15:40 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Vista SDK headers don't include a value for IMAGE_SIZEOF_BASE_RELOCATION Modified Paths: -------------- trunk/py2exe/source/MemoryModule.c Modified: trunk/py2exe/source/MemoryModule.c =================================================================== --- trunk/py2exe/source/MemoryModule.c 2008-06-16 21:29:12 UTC (rev 668) +++ trunk/py2exe/source/MemoryModule.c 2008-08-05 05:15:40 UTC (rev 669) @@ -35,6 +35,10 @@ #include <stdio.h> #endif +#ifndef IMAGE_SIZEOF_BASE_RELOCATION +// Vista SDKs no longer define IMAGE_SIZEOF_BASE_RELOCATION!? +# define IMAGE_SIZEOF_BASE_RELOCATION (sizeof(IMAGE_BASE_RELOCATION)) +#endif #include "MemoryModule.h" /* This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Jimmy R. <jr...@us...> - 2008-06-15 16:55:43
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7659 Modified Files: ANNOUNCE Log Message: Updated announce file for 0.6.6 and 0.6.8 releases. Index: ANNOUNCE =================================================================== RCS file: /cvsroot/py2exe/py2exe/ANNOUNCE,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** ANNOUNCE 20 Mar 2006 11:49:30 -0000 1.15 --- ANNOUNCE 15 Jun 2008 16:55:50 -0000 1.16 *************** *** 1,3 **** ! py2exe 0.6.5 released ===================== --- 1,3 ---- ! py2exe 0.6.8 released ===================== *************** *** 7,10 **** --- 7,48 ---- NT services, exe and dll COM servers are supported. + Changes in 0.6.8: + + * Support for relative imports. + + * Fix MemoryLoadLibrary to handle loading function addresses by ordinal + numbers. Patch and test by Matthias Miller. + + * Using the options compressed=1, bundle_files=3, and zipfile=None at + the same time now works; patch from Alexey Borzenkov. + + * Allow renaming of single-executable files; patch from Alexey + Borzenkov. + + * Embedding icon resources into the image now works correctly even for + ico files containing multiple images. + + * pyd files from different packages with the same filename no longer + conflict. Patch from Grant Edwards. + + * There are new samples for the 'typelibs' support, including the new + option of pre-generating a typelib and specifying the file as an + input to py2exe. + + * The test suite is now included in the source distribution. + + + Changes in 0.6.6: + + * Better support for Python 2.5. + + * Experimental support for 64-bit builds of Python on win64. + + * Better ISAPI support. + + * New samples for ISAPI and COM servers. + + * Support for new "command-line styles" when building Windows services. + Changes in 0.6.5: |
From: Jimmy R. <jr...@us...> - 2008-06-15 16:17:03
|
Update of /cvsroot/py2exe/py2exe/docs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19469 Modified Files: py2exe.txt Log Message: Update news page for new release. Index: py2exe.txt =================================================================== RCS file: /cvsroot/py2exe/py2exe/docs/py2exe.txt,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** py2exe.txt 19 May 2008 07:22:47 -0000 1.20 --- py2exe.txt 15 Jun 2008 16:17:09 -0000 1.21 *************** *** 58,64 **** ---- ! **py2exe 0.6.7 released (2008/03/25)** ! What's new? **py2exe 0.6.6 released (2006/12/30)** --- 58,78 ---- ---- ! **py2exe 0.6.8 released (2008/06/15)** ! Support for relative imports. ! ! Fix MemoryLoadLibrary to handle loading function addresses by ordinal numbers. Patch and test by Matthias Miller. ! ! Using the options compressed=1, bundle_files=3, and zipfile=None at the same time now works; patch from Alexey Borzenkov. ! ! Allow renaming of single-executable files; patch from Alexey Borzenkov. ! ! Embedding icon resources into the image now works correctly even for ico files containing multiple images. ! ! pyd files from different packages with the same filename no longer conflict. Patch from Grant Edwards. ! ! There are new samples for the 'typelibs' support, including the new option of pre-generating a typelib and specifying the file as an input to py2exe. ! ! The test suite is now included in the source distribution. **py2exe 0.6.6 released (2006/12/30)** |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:56:57
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2580 Modified Files: ChangeLog MANIFEST.in Log Message: Include the entire test suite in the source distribution. Index: MANIFEST.in =================================================================== RCS file: /cvsroot/py2exe/py2exe/MANIFEST.in,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** MANIFEST.in 29 Dec 2006 11:55:50 -0000 1.18 --- MANIFEST.in 19 May 2008 08:57:02 -0000 1.19 *************** *** 2,4 **** --- 2,5 ---- recursive-include py2exe *.h *.c *.ico *.rc *.py *.txt *.vbs recursive-include source *.h *.c *.ico *.rc *.py *.txt + recursive-include test *.h *.c *.ico *.rc *.py *.txt recursive-include docs *.txt *.css *.html *.py Index: ChangeLog =================================================================== RCS file: /cvsroot/py2exe/py2exe/ChangeLog,v retrieving revision 1.52 retrieving revision 1.53 diff -C2 -d -r1.52 -r1.53 *** ChangeLog 19 May 2008 08:56:02 -0000 1.52 --- ChangeLog 19 May 2008 08:57:02 -0000 1.53 *************** *** 11,14 **** --- 11,16 ---- * Use Python 2.5 to build the source distribution. + * Include the entire test suite in the source distribution. + 2008-04-17 Thomas Heller <th...@py...> |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:55:58
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2165 Modified Files: ChangeLog build.cmd Log Message: Use Python 2.5 to build the source distribution. Index: ChangeLog =================================================================== RCS file: /cvsroot/py2exe/py2exe/ChangeLog,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** ChangeLog 19 May 2008 08:49:12 -0000 1.51 --- ChangeLog 19 May 2008 08:56:02 -0000 1.52 *************** *** 9,12 **** --- 9,14 ---- in order to support relative imports. + * Use Python 2.5 to build the source distribution. + 2008-04-17 Thomas Heller <th...@py...> Index: build.cmd =================================================================== RCS file: /cvsroot/py2exe/py2exe/build.cmd,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** build.cmd 24 Mar 2008 19:03:17 -0000 1.3 --- build.cmd 19 May 2008 08:56:02 -0000 1.4 *************** *** 18,22 **** rm MANIFEST ! C:\Python24\python.exe setup.py sdist -f rm -rf build --- 18,22 ---- rm MANIFEST ! C:\Python25\python.exe setup.py sdist -f rm -rf build |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:49:10
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32152 Modified Files: ChangeLog Log Message: Merged modulefinder.py r59200 from the Python svn trunk into mf.py in order to support relative imports. Index: ChangeLog =================================================================== RCS file: /cvsroot/py2exe/py2exe/ChangeLog,v retrieving revision 1.50 retrieving revision 1.51 diff -C2 -d -r1.50 -r1.51 *** ChangeLog 19 May 2008 07:24:50 -0000 1.50 --- ChangeLog 19 May 2008 08:49:12 -0000 1.51 *************** *** 3,9 **** * Bump version number to 0.6.8. ! * Updated test suite to be smarted about which interpreters to use for testing and to output stats. 2008-04-17 Thomas Heller <th...@py...> --- 3,12 ---- * Bump version number to 0.6.8. ! * Updated test suite to be smarter about which interpreters to use for testing and to output stats. + * Merged modulefinder.py r59200 from the Python svn trunk into mf.py + in order to support relative imports. + 2008-04-17 Thomas Heller <th...@py...> |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:49:09
|
Update of /cvsroot/py2exe/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32152/py2exe Modified Files: mf.py Log Message: Merged modulefinder.py r59200 from the Python svn trunk into mf.py in order to support relative imports. Index: mf.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/py2exe/mf.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** mf.py 20 Mar 2006 12:04:11 -0000 1.6 --- mf.py 19 May 2008 08:49:12 -0000 1.7 *************** *** 1,6 **** """Find modules used by a script, using introspection.""" - # This module should be kept compatible with Python 2.2, see PEP 291. import dis import imp --- 1,6 ---- """Find modules used by a script, using introspection.""" # This module should be kept compatible with Python 2.2, see PEP 291. + from __future__ import generators import dis import imp *************** *** 8,12 **** import os import sys ! import new import struct --- 8,12 ---- import os import sys ! import types import struct *************** *** 17,20 **** --- 17,26 ---- READ_MODE = "r" + LOAD_CONST = chr(dis.opname.index('LOAD_CONST')) + IMPORT_NAME = chr(dis.opname.index('IMPORT_NAME')) + STORE_NAME = chr(dis.opname.index('STORE_NAME')) + STORE_GLOBAL = chr(dis.opname.index('STORE_GLOBAL')) + STORE_OPS = [STORE_NAME, STORE_GLOBAL] + HAVE_ARGUMENT = chr(dis.HAVE_ARGUMENT) # !!! NOTE BEFORE INCLUDING IN PYTHON DISTRIBUTION !!! *************** *** 125,131 **** self.load_module(name, fp, pathname, stuff) ! def import_hook(self, name, caller=None, fromlist=None): ! self.msg(3, "import_hook", name, caller, fromlist) ! parent = self.determine_parent(caller) q, tail = self.find_head_package(parent, name) m = self.load_tail(q, tail) --- 131,137 ---- self.load_module(name, fp, pathname, stuff) ! def import_hook(self, name, caller=None, fromlist=None, level=-1): ! self.msg(3, "import_hook", name, caller, fromlist, level) ! parent = self.determine_parent(caller, level=level) q, tail = self.find_head_package(parent, name) m = self.load_tail(q, tail) *************** *** 136,145 **** return None ! def determine_parent(self, caller): ! self.msgin(4, "determine_parent", caller) ! if not caller: self.msgout(4, "determine_parent -> None") return None pname = caller.__name__ if caller.__path__: parent = self.modules[pname] --- 142,165 ---- return None ! def determine_parent(self, caller, level=-1): ! self.msgin(4, "determine_parent", caller, level) ! if not caller or level == 0: self.msgout(4, "determine_parent -> None") return None pname = caller.__name__ + if level >= 1: # relative import + if caller.__path__: + level -= 1 + if level == 0: + parent = self.modules[pname] + assert parent is caller + self.msgout(4, "determine_parent ->", parent) + return parent + if pname.count(".") < level: + raise ImportError, "relative importpath too deep" + pname = ".".join(pname.split(".")[:-level]) + parent = self.modules[pname] + self.msgout(4, "determine_parent ->", parent) + return parent if caller.__path__: parent = self.modules[pname] *************** *** 301,305 **** self.badmodules[name][caller.__name__] = 1 ! def _safe_import_hook(self, name, caller, fromlist): # wrapper for self.import_hook() that won't raise ImportError if name in self.badmodules: --- 321,325 ---- self.badmodules[name][caller.__name__] = 1 ! def _safe_import_hook(self, name, caller, fromlist, level=-1): # wrapper for self.import_hook() that won't raise ImportError if name in self.badmodules: *************** *** 307,311 **** return try: ! self.import_hook(name, caller) except ImportError, msg: self.msg(2, "ImportError:", str(msg)) --- 327,331 ---- return try: ! self.import_hook(name, caller, level=level) except ImportError, msg: self.msg(2, "ImportError:", str(msg)) *************** *** 318,322 **** continue try: ! self.import_hook(name, caller, [sub]) except ImportError, msg: self.msg(2, "ImportError:", str(msg)) --- 338,342 ---- continue try: ! self.import_hook(name, caller, [sub], level=level) except ImportError, msg: self.msg(2, "ImportError:", str(msg)) *************** *** 324,355 **** self._add_badmodule(fullname, caller) ! def scan_code(self, co, m, ! HAVE_ARGUMENT = chr(dis.HAVE_ARGUMENT), ! LOAD_CONST = chr(dis.opname.index('LOAD_CONST')), ! IMPORT_NAME = chr(dis.opname.index('IMPORT_NAME')), ! STORE_OPS = [chr(dis.opname.index('STORE_NAME')), ! chr(dis.opname.index('STORE_GLOBAL'))], ! unpack = struct.unpack ! ): code = co.co_code ! constants = co.co_consts ! n = len(code) ! i = 0 ! fromlist = None ! while i < n: ! c = code[i] ! i = i+1 if c >= HAVE_ARGUMENT: ! i = i+2 ! if c == LOAD_CONST: ! # An IMPORT_NAME is always preceded by a LOAD_CONST, it's ! # a tuple of "from" names, or None for a regular import. ! # The tuple may contain "*" for "from <mod> import *" ! oparg = unpack('<H', code[i-2:i])[0] ! fromlist = constants[oparg] ! elif c == IMPORT_NAME: ! assert fromlist is None or type(fromlist) is tuple ! oparg = unpack('<H', code[i-2:i])[0] ! name = co.co_names[oparg] have_star = 0 if fromlist is not None: --- 344,414 ---- self._add_badmodule(fullname, caller) ! def scan_opcodes(self, co, ! unpack = struct.unpack): ! # Scan the code, and yield 'interesting' opcode combinations ! # Version for Python 2.4 and older code = co.co_code ! names = co.co_names ! consts = co.co_consts ! while code: ! c = code[0] ! if c in STORE_OPS: ! oparg, = unpack('<H', code[1:3]) ! yield "store", (names[oparg],) ! code = code[3:] ! continue ! if c == LOAD_CONST and code[3] == IMPORT_NAME: ! oparg_1, oparg_2 = unpack('<xHxH', code[:6]) ! yield "import", (consts[oparg_1], names[oparg_2]) ! code = code[6:] ! continue if c >= HAVE_ARGUMENT: ! code = code[3:] ! else: ! code = code[1:] ! ! def scan_opcodes_25(self, co, ! unpack = struct.unpack): ! # Scan the code, and yield 'interesting' opcode combinations ! # Python 2.5 version (has absolute and relative imports) ! code = co.co_code ! names = co.co_names ! consts = co.co_consts ! LOAD_LOAD_AND_IMPORT = LOAD_CONST + LOAD_CONST + IMPORT_NAME ! while code: ! c = code[0] ! if c in STORE_OPS: ! oparg, = unpack('<H', code[1:3]) ! yield "store", (names[oparg],) ! code = code[3:] ! continue ! if code[:9:3] == LOAD_LOAD_AND_IMPORT: ! oparg_1, oparg_2, oparg_3 = unpack('<xHxHxH', code[:9]) ! level = consts[oparg_1] ! if level == -1: # normal import ! yield "import", (consts[oparg_2], names[oparg_3]) ! elif level == 0: # absolute import ! yield "absolute_import", (consts[oparg_2], names[oparg_3]) ! else: # relative import ! yield "relative_import", (level, consts[oparg_2], names[oparg_3]) ! code = code[9:] ! continue ! if c >= HAVE_ARGUMENT: ! code = code[3:] ! else: ! code = code[1:] ! ! def scan_code(self, co, m): ! code = co.co_code ! if sys.version_info >= (2, 5): ! scanner = self.scan_opcodes_25 ! else: ! scanner = self.scan_opcodes ! for what, args in scanner(co): ! if what == "store": ! name, = args ! m.globalnames[name] = 1 ! elif what in ("import", "absolute_import"): ! fromlist, name = args have_star = 0 if fromlist is not None: *************** *** 357,361 **** have_star = 1 fromlist = [f for f in fromlist if f != "*"] ! self._safe_import_hook(name, m, fromlist) if have_star: # We've encountered an "import *". If it is a Python module, --- 416,422 ---- have_star = 1 fromlist = [f for f in fromlist if f != "*"] ! if what == "absolute_import": level = 0 ! else: level = -1 ! self._safe_import_hook(name, m, fromlist, level=level) if have_star: # We've encountered an "import *". If it is a Python module, *************** *** 377,386 **** else: m.starimports[name] = 1 ! elif c in STORE_OPS: ! # keep track of all global names that are assigned to ! oparg = unpack('<H', code[i-2:i])[0] ! name = co.co_names[oparg] ! m.globalnames[name] = 1 ! for c in constants: if isinstance(c, type(co)): self.scan_code(c, m) --- 438,453 ---- else: m.starimports[name] = 1 ! elif what == "relative_import": ! level, fromlist, name = args ! if name: ! self._safe_import_hook(name, m, fromlist, level=level) ! else: ! parent = self.determine_parent(m, level=level) ! self._safe_import_hook(parent.__name__, None, fromlist, level=0) ! else: ! # We don't expect anything else from the generator. ! raise RuntimeError(what) ! ! for c in co.co_consts: if isinstance(c, type(co)): self.scan_code(c, m) *************** *** 538,542 **** consts[i] = self.replace_paths_in_code(consts[i]) ! return new.code(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, co.co_code, tuple(consts), co.co_names, co.co_varnames, new_filename, co.co_name, --- 605,609 ---- consts[i] = self.replace_paths_in_code(consts[i]) ! return types.CodeType(co.co_argcount, co.co_nlocals, co.co_stacksize, co.co_flags, co.co_code, tuple(consts), co.co_names, co.co_varnames, new_filename, co.co_name, *************** *** 643,651 **** Base.run_script(self, pathname) ! def import_hook(self, name, caller=None, fromlist=None): old_last_caller = self._last_caller try: self._last_caller = caller ! return Base.import_hook(self,name,caller,fromlist) finally: self._last_caller = old_last_caller --- 710,718 ---- Base.run_script(self, pathname) ! def import_hook(self, name, caller=None, fromlist=None, level=-1): old_last_caller = self._last_caller try: self._last_caller = caller ! return Base.import_hook(self,name,caller,fromlist,level) finally: self._last_caller = old_last_caller |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:49:09
|
Update of /cvsroot/py2exe/py2exe/test/relative_import/x In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32152/test/relative_import/x Added Files: __init__.py Log Message: Merged modulefinder.py r59200 from the Python svn trunk into mf.py in order to support relative imports. --- NEW FILE: __init__.py --- from __future__ import absolute_import import sys as a from .. import sys as b |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:49:07
|
Update of /cvsroot/py2exe/py2exe/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32152/test Added Files: test_relative_import.py Log Message: Merged modulefinder.py r59200 from the Python svn trunk into mf.py in order to support relative imports. --- NEW FILE: test_relative_import.py --- import relative_import.x if __name__ == "__main__": print relative_import.x.a.maxint print relative_import.x.b.maxint |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:49:07
|
Update of /cvsroot/py2exe/py2exe/test/relative_import In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32152/test/relative_import Added Files: __init__.py sys.py Log Message: Merged modulefinder.py r59200 from the Python svn trunk into mf.py in order to support relative imports. --- NEW FILE: sys.py --- maxint = 12 --- NEW FILE: __init__.py --- |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:32:09
|
Update of /cvsroot/py2exe/py2exe/test/relative_import/x In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25795/x Log Message: Directory /cvsroot/py2exe/py2exe/test/relative_import/x added to the repository |
From: Jimmy R. <jr...@us...> - 2008-05-19 08:31:18
|
Update of /cvsroot/py2exe/py2exe/test/relative_import In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25449/relative_import Log Message: Directory /cvsroot/py2exe/py2exe/test/relative_import added to the repository |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:24:46
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32556 Modified Files: ChangeLog Log Message: Fixed date in changelog. Index: ChangeLog =================================================================== RCS file: /cvsroot/py2exe/py2exe/ChangeLog,v retrieving revision 1.49 retrieving revision 1.50 diff -C2 -d -r1.49 -r1.50 *** ChangeLog 19 May 2008 07:22:47 -0000 1.49 --- ChangeLog 19 May 2008 07:24:50 -0000 1.50 *************** *** 1,3 **** ! 2008-02-29 Jimmy Retzlaff <ji...@re...> * Bump version number to 0.6.8. --- 1,3 ---- ! 2008-05-19 Jimmy Retzlaff <ji...@re...> * Bump version number to 0.6.8. |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:22:42
|
Update of /cvsroot/py2exe/py2exe/docs In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31787/docs Modified Files: py2exe.txt Log Message: Bumped version number to 0.6.8. Index: py2exe.txt =================================================================== RCS file: /cvsroot/py2exe/py2exe/docs/py2exe.txt,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** py2exe.txt 29 Dec 2006 09:40:25 -0000 1.19 --- py2exe.txt 19 May 2008 07:22:47 -0000 1.20 *************** *** 8,14 **** .. _setup-script: http://www.python.org/doc/current/dist/setup-script.html ! .. _py2exe-0.6.5.win32-py2.3.exe: http://prdownloads.sourceforge.net/py2exe/py2exe-0.6.5.win32-py2.3.exe?download ! .. _py2exe-0.6.5.win32-py2.4.exe: http://prdownloads.sourceforge.net/py2exe/py2exe-0.6.5.win32-py2.4.exe?download .. _WIKI: http://starship.python.net/crew/theller/moin.cgi/Py2Exe --- 8,16 ---- .. _setup-script: http://www.python.org/doc/current/dist/setup-script.html ! .. _py2exe-0.6.7.win32-py2.3.exe: http://prdownloads.sourceforge.net/py2exe/py2exe-0.6.7.win32-py2.3.exe?download ! .. _py2exe-0.6.7.win32-py2.4.exe: http://prdownloads.sourceforge.net/py2exe/py2exe-0.6.7.win32-py2.4.exe?download ! ! .. _py2exe-0.6.7.win32-py2.5.exe: http://prdownloads.sourceforge.net/py2exe/py2exe-0.6.7.win32-py2.5.exe?download .. _WIKI: http://starship.python.net/crew/theller/moin.cgi/Py2Exe *************** *** 36,40 **** ================================================================ ! Copyright (c) 2001-2006 Thomas Heller, Mark Hammond, Joachim Bauch, Jimmy Retzlaff, and contributors. --- 38,42 ---- ================================================================ ! Copyright (c) 2001-2008 Thomas Heller, Mark Hammond, Joachim Bauch, Jimmy Retzlaff, and contributors. *************** *** 56,59 **** --- 58,65 ---- ---- + **py2exe 0.6.7 released (2008/03/25)** + + What's new? + **py2exe 0.6.6 released (2006/12/30)** *************** *** 375,380 **** ----------------- ! Download and run the installer py2exe-0.6.5.win32-py2.3.exe_ (for ! Python 2.3), or py2exe-0.6.5.win32-py2.4.exe_ (for Python 2.4). This installs **py2exe** together with some samples, the samples are in --- 381,387 ---- ----------------- ! Download and run the installer py2exe-0.6.7.win32-py2.3.exe_ (for ! Python 2.3), py2exe-0.6.7.win32-py2.4.exe_ (for ! Python 2.4), or py2exe-0.6.7.win32-py2.5.exe_ (for Python 2.5). This installs **py2exe** together with some samples, the samples are in |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:22:41
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31787 Modified Files: ChangeLog Log Message: Bumped version number to 0.6.8. Index: ChangeLog =================================================================== RCS file: /cvsroot/py2exe/py2exe/ChangeLog,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -d -r1.48 -r1.49 *** ChangeLog 17 Apr 2008 18:19:58 -0000 1.48 --- ChangeLog 19 May 2008 07:22:47 -0000 1.49 *************** *** 1,2 **** --- 1,9 ---- + 2008-02-29 Jimmy Retzlaff <ji...@re...> + + * Bump version number to 0.6.8. + + * Updated test suite to be smarted about which interpreters + to use for testing and to output stats. + 2008-04-17 Thomas Heller <th...@py...> |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:22:41
|
Update of /cvsroot/py2exe/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31787/py2exe Modified Files: __init__.py Log Message: Bumped version number to 0.6.8. Index: __init__.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/py2exe/__init__.py,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** __init__.py 29 Feb 2008 08:54:45 -0000 1.37 --- __init__.py 19 May 2008 07:22:47 -0000 1.38 *************** *** 63,67 **** # ! __version__ = "0.6.7" import distutils.dist, distutils.core, distutils.command, build_exe, sys --- 63,67 ---- # ! __version__ = "0.6.8" import distutils.dist, distutils.core, distutils.command, build_exe, sys |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:20:38
|
Update of /cvsroot/py2exe/py2exe/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31050 Added Files: checkTestModule.py Log Message: Run the tests using test.py rather than test.cmd. This enables smarter logic to determine the interpreters present (e.g., if the interpreter can't be run because it is for CE, then don't use it to run tests). Also report statistics about the number of tests that succeeded/skipped/failed. --- NEW FILE: checkTestModule.py --- import sys try: __import__(sys.argv[1]) except Exception, details: print details sys.exit(1) sys.exit(0) |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:18:49
|
Update of /cvsroot/py2exe/py2exe/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30259 Modified Files: setup_noZipFile.py setup_win32com_shell.py test.py Added Files: reinstall.cmd Removed Files: test.cmd Log Message: Run the tests using test.py rather than test.cmd. This enables smarter logic to determine the interpreters present (e.g., if the interpreter can't be run because it is for CE, then don't use it to run tests). Also report statistics about the number of tests that succeeded/skipped/failed. --- test.cmd DELETED --- Index: setup_win32com_shell.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/setup_win32com_shell.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** setup_win32com_shell.py 17 Apr 2008 18:20:07 -0000 1.1 --- setup_win32com_shell.py 19 May 2008 07:18:55 -0000 1.2 *************** *** 21,25 **** setup( - script_args=['py2exe', '%s'], console=['%s'], ) --- 21,24 ---- Index: test.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** test.py 17 Apr 2008 18:20:07 -0000 1.8 --- test.py 19 May 2008 07:18:55 -0000 1.9 *************** *** 18,25 **** import subprocess import sys excludedTestFiles = dict( ! AMD64=['test_win32com.shell.py'], Intel=[], ) --- 18,26 ---- import subprocess import sys + import time excludedTestFiles = dict( ! AMD64=['test_pysvn', 'test_win32com_shell.py'], Intel=[], ) *************** *** 41,45 **** from distutils.core import setup import py2exe ! setup(script_args=['py2exe', '%s'], console = ['%s']) """ --- 42,46 ---- from distutils.core import setup import py2exe ! setup(console = ['%s']) """ *************** *** 47,55 **** ! def getPlatform(): for platform in 'AMD64', 'Intel': ! if '(' + platform + ')' in sys.version: return platform ! raise RuntimeError("Can't determine Intel vs. AMD64 from: " + sys.version) --- 48,77 ---- ! def getPlatform(version): for platform in 'AMD64', 'Intel': ! if '(' + platform + ')' in version: return platform ! raise RuntimeError("Can't determine Intel vs. AMD64 from: " + version) ! ! ! def PythonInterpreters(pattern): ! for folder in glob.glob(pattern): ! path = os.path.join(folder, 'python.exe') ! if os.path.exists(path): ! errorlevel, output = run(path, '-c', 'import sys; print sys.version') ! if errorlevel == 0: ! yield output.strip(), path ! ! ! def shortVersion(version): ! return '%s-%s' % (version.split()[0], getPlatform(version)) ! ! ! def reasonForSkipping(interpreter, basename): ! errorlevel, output = run(interpreter, 'checkTestModule.py', basename) ! if errorlevel: ! return output.strip() ! else: ! return None *************** *** 70,116 **** ) output = popen.communicate() ! return popen.returncode, output ! def main(pattern='test_*.py'): ! print 'Python', sys.version ! for test in glob.glob(pattern): ! if test not in excludedTestFiles[getPlatform()]: ! print ' ', test ! basename = os.path.splitext(test)[0] ! try: ! __import__(basename) ! except ImportError, details: ! print "(Skipping %s: %s)" % (basename, details) ! continue ! # Execute script to get baseline ! baseline = run(sys.executable, test) ! exe = os.path.join('dist', basename + '.exe') ! exe2 = os.path.join('dist', basename + '_2.exe') ! for option in options.get(test, ['--quiet', '--compressed', '--bundle=1', '--bundle=2', '--bundle=3', '--ascii', '--skip-archive']): ! if option not in excludedTestOptions[getPlatform()]: ! # Build exe ! clean() ! print ' ', option ! if os.path.exists(test.replace('test_', 'setup_')): ! open(generatedSetup, 'wt').write(open(test.replace('test_', 'setup_'), 'rt').read() % (option, test)) ! else: ! open(generatedSetup, 'wt').write(py2exeTemplate % (option, test)) ! run(sys.executable, generatedSetup) ! # Run exe and test against baseline ! os.rename(exe, exe2) # ensure that the exe works when renamed ! out2 = run(exe2) ! if out2 != baseline: ! print "FAILED." ! print "\tExpected:", baseline ! print "\tGot:", out2 ! clean() if __name__ == '__main__': ! main(*sys.argv[1:]) --- 92,166 ---- ) output = popen.communicate() ! return popen.returncode, output[0] ! def main(interpreter_pattern=r'C:\Python*', test_pattern='test_*.py'): ! start = time.time() ! succeeded = {} ! skipped = {} ! failed = {} ! versions = [] ! for version, interpreter in PythonInterpreters(interpreter_pattern): ! print 'Python', version ! versions.append(version) ! succeeded[version] = 0 ! skipped[version] = 0 ! failed[version] = 0 ! for test in glob.glob(test_pattern): ! if test not in excludedTestFiles[getPlatform(version)]: ! print ' ', test ! basename = os.path.splitext(test)[0] ! reason = reasonForSkipping(interpreter, basename) ! if reason: ! print ' SKIPPED: %s' % reason ! skipped[version] += 1 ! continue ! # Execute script to get baseline ! baseline = run(interpreter, test) ! exe = os.path.join('dist', basename + '.exe') ! exe2 = os.path.join('dist', basename + '_2.exe') ! for option in options.get(test, ['--quiet', '--compressed', '--bundle=1', '--bundle=2', '--bundle=3', '--ascii', '--skip-archive']): ! if option not in excludedTestOptions[getPlatform(version)]: ! # Build exe ! clean() ! print ' ', option ! if os.path.exists(test.replace('test_', 'setup_')): ! open(generatedSetup, 'wt').write(open(test.replace('test_', 'setup_'), 'rt').read() % test) ! else: ! open(generatedSetup, 'wt').write(py2exeTemplate % test) ! run(sys.executable, generatedSetup, 'py2exe', option) ! # Run exe and test against baseline ! os.rename(exe, exe2) # ensure that the exe works when renamed ! out2 = run(exe2) ! if out2 == baseline: ! succeeded[version] += 1 ! else: ! failed[version] += 1 ! print "FAILED." ! print "\tExpected:", baseline ! print "\t Got:", out2 ! print ! clean() ! print ! columnWidth = max(map(len, map(shortVersion, versions))) ! format = '%' + str(columnWidth) + 's' ! format = ' '.join(4*[format]) ! separator = ' '.join(4*[columnWidth*'-']) ! print round(time.time()-start, 1), 'seconds' ! print ! print format % ('', 'Succeeded', 'Skipped', 'Failed') ! print separator ! for version in versions: ! print format % (shortVersion(version), succeeded[version], skipped[version], failed[version]) ! print separator ! print format % ('TOTAL', sum(succeeded.values()), sum(skipped.values()), sum(failed.values())) ! return sum(failed.values()) if __name__ == '__main__': ! sys.exit(main(*sys.argv[1:])) Index: setup_noZipFile.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/setup_noZipFile.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** setup_noZipFile.py 5 Apr 2008 11:48:10 -0000 1.1 --- setup_noZipFile.py 19 May 2008 07:18:55 -0000 1.2 *************** *** 3,7 **** setup( - script_args=['py2exe', '%s'], console=['%s'], zipfile=None, --- 3,6 ---- --- NEW FILE: reinstall.cmd --- "C:\Python23\Removepy2exe.exe" -u "C:\Python23\py2exe-wininst.log" "C:\Python24\Removepy2exe.exe" -u "C:\Python24\py2exe-wininst.log" "C:\Python25\Removepy2exe.exe" -u "C:\Python25\py2exe-wininst.log" for %%f in (..\dist\py2exe*.exe) do ( "%%f" ) for %%f in (..\dist\py2exe*.msi) do ( "%%f" ) |
From: Jimmy R. <jr...@us...> - 2008-05-19 07:13:40
|
Update of /cvsroot/py2exe/py2exe/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28379 Modified Files: test_pysvn.py Log Message: Without supplying a setup_pysvn.py we can't be sure we get the same version number output when running this test under Python and under py2exe (because different svn dlls are found). So just print the major version number (which still tests that we can retrieve the version number). Index: test_pysvn.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test_pysvn.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_pysvn.py 17 Apr 2008 18:14:16 -0000 1.1 --- test_pysvn.py 19 May 2008 07:13:41 -0000 1.2 *************** *** 2,4 **** if __name__ == "__main__": ! print pysvn.version --- 2,8 ---- if __name__ == "__main__": ! # the py2exe wrapper for this test doesn't pick up the svn ! # lib installed with pysvn so it can report a different ! # version number, so just make sure we can get the version ! # number and that the major version is the same ! print pysvn.version[0] |
From: Thomas H. <th...@us...> - 2008-04-17 18:23:30
|
Update of /cvsroot/py2exe/py2exe In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15870 Modified Files: setup.py Log Message: Ignore possible 'build' and 'dist' directories when looking for samples. Index: setup.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/setup.py,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -d -r1.51 -r1.52 *** setup.py 29 Dec 2006 11:56:12 -0000 1.51 --- setup.py 17 Apr 2008 18:23:29 -0000 1.52 *************** *** 309,313 **** def iter_samples(): ! excludedDirs = ['CVS'] for dirpath, dirnames, filenames in os.walk(r'py2exe\samples'): for dir in dirnames: --- 309,313 ---- def iter_samples(): ! excludedDirs = ['CVS', 'build', 'dist'] for dirpath, dirnames, filenames in os.walk(r'py2exe\samples'): for dir in dirnames: |
From: Thomas H. <th...@us...> - 2008-04-17 18:22:17
|
Update of /cvsroot/py2exe/py2exe/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15143 Modified Files: test.cmd Log Message: Look for Python installations only in the directories C:\Python??, not C:\Python*. (I had a directory c:\Python-2.4.3-wince-dev) Index: test.cmd =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test.cmd,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** test.cmd 24 Mar 2008 19:03:17 -0000 1.2 --- test.cmd 17 Apr 2008 18:22:05 -0000 1.3 *************** *** 1,5 **** @echo off ! for /D %%f in (C:\Python*) do ( "%%f\python.exe" test.py if errorlevel 1 goto fail --- 1,5 ---- @echo off ! for /D %%f in (C:\Python??) do ( "%%f\python.exe" test.py if errorlevel 1 goto fail |
From: Thomas H. <th...@us...> - 2008-04-17 18:20:16
|
Update of /cvsroot/py2exe/py2exe/test In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv14650 Modified Files: test_noZipFile.py test_EasyDialogs.py test_2+2.py test.py Added Files: test_xml_xpath.py test_win32com_shell.py test_sys_path.py setup_win32com_shell.py Removed Files: test_xml.xpath.py test_win32com.shell.py test_sys.path.py setup_win32com.shell.py Log Message: Rename the tests so that they are valid Python modules - no dot in the filename except for the extension. Change the tests: Move the imports to the top, and move the actual test code inside a "if __name__ == '__main__':" block. Change the test runner in test/test.py so that it skips test scripts that cannot be imported as modules. Print out info about failed assertions. --- NEW FILE: test_win32com_shell.py --- from win32com.shell import shellcon, shell if __name__ == "__main__": print shell.SHGetFolderPath(0, shellcon.CSIDL_DESKTOP, 0, 0) Index: test.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** test.py 5 Apr 2008 11:26:42 -0000 1.7 --- test.py 17 Apr 2008 18:20:07 -0000 1.8 *************** *** 79,85 **** print ' ', test # Execute script to get baseline baseline = run(sys.executable, test) - basename = os.path.splitext(test)[0] exe = os.path.join('dist', basename + '.exe') exe2 = os.path.join('dist', basename + '_2.exe') --- 79,91 ---- print ' ', test + basename = os.path.splitext(test)[0] + try: + __import__(basename) + except ImportError, details: + print "(Skipping %s: %s)" % (basename, details) + continue + # Execute script to get baseline baseline = run(sys.executable, test) exe = os.path.join('dist', basename + '.exe') exe2 = os.path.join('dist', basename + '_2.exe') *************** *** 98,102 **** # Run exe and test against baseline os.rename(exe, exe2) # ensure that the exe works when renamed ! assert run(exe2) == baseline clean() --- 104,112 ---- # Run exe and test against baseline os.rename(exe, exe2) # ensure that the exe works when renamed ! out2 = run(exe2) ! if out2 != baseline: ! print "FAILED." ! print "\tExpected:", baseline ! print "\tGot:", out2 clean() --- test_xml.xpath.py DELETED --- --- NEW FILE: test_xml_xpath.py --- # This tests http://sourceforge.net/project/showfiles.php?group_id=6473 import xml.xpath if __name__ == "__main__": print xml.xpath.Init() Index: test_2+2.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test_2+2.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_2+2.py 13 Feb 2006 13:54:07 -0000 1.1 --- test_2+2.py 17 Apr 2008 18:20:07 -0000 1.2 *************** *** 1 **** ! print 2+2 --- 1,2 ---- ! if __name__ == "__main__": ! print 2+2 --- NEW FILE: setup_win32com_shell.py --- import sys # ModuleFinder can't handle runtime changes to __path__, but win32com uses them try: import modulefinder import win32com for p in win32com.__path__[1:]: modulefinder.AddPackagePath("win32com", p) for extra in ["win32com.shell"]: #,"win32com.mapi" __import__(extra) m = sys.modules[extra] for p in m.__path__[1:]: modulefinder.AddPackagePath(extra, p) except ImportError: # no build path setup, no worries. pass from distutils.core import setup import py2exe setup( script_args=['py2exe', '%s'], console=['%s'], ) --- test_sys.path.py DELETED --- --- setup_win32com.shell.py DELETED --- --- test_win32com.shell.py DELETED --- Index: test_EasyDialogs.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test_EasyDialogs.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_EasyDialogs.py 13 Feb 2006 13:54:07 -0000 1.1 --- test_EasyDialogs.py 17 Apr 2008 18:20:07 -0000 1.2 *************** *** 4,13 **** import EasyDialogs ! progressBar = EasyDialogs.ProgressBar('Testing py2exe', 100, 'Testing, testing, 1-2-3...') ! for i in range(100): ! time.sleep(0.001) ! progressBar.inc() ! ! print progressBar.curval ! sys.exit(progressBar.curval) --- 4,13 ---- import EasyDialogs + if __name__ == "__main__": + progressBar = EasyDialogs.ProgressBar('Testing py2exe', 100, 'Testing, testing, 1-2-3...') + for i in range(100): + time.sleep(0.001) + progressBar.inc() ! print progressBar.curval ! sys.exit(progressBar.curval) Index: test_noZipFile.py =================================================================== RCS file: /cvsroot/py2exe/py2exe/test/test_noZipFile.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** test_noZipFile.py 5 Apr 2008 11:48:10 -0000 1.1 --- test_noZipFile.py 17 Apr 2008 18:20:07 -0000 1.2 *************** *** 1 **** ! print 2+2 --- 1,2 ---- ! if __name__ == "__main__": ! print 2+2 --- NEW FILE: test_sys_path.py --- import sys if __name__ == "__main__": print 1 < len(sys.path) < 5 |