Release Notes for P4Python, Helix Core API for Python Version 2023.2 Introduction This document lists all user-visible changes to P4Python starting from release 2007.3, the first supported P4Python release. Perforce numbers releases YYYY.R/CCCCC, for example, 2007.3/30547. YYYY is the year; R is the release of that year; CCCCC is the bug fix change level. Each bug fix in these release notes is marked by its change number. Any build includes all bug fixes of all previous releases and all bug fixes of the current release up to the bug fix change level. To display the version of P4Python you have installed, start Python and issue the following commands: >>> import P4 >>> print(P4.P4.identify()) -------------------------------------------------------------------------- Important End-of-Life Notice This major release of P4Python would be the last to provide wheels for and test against MacOS 10.15. This is part of our commitment to focus on supported technology platforms. -------------------------------------------------------------------------- Installation Installation via pip P4Python can be installed via pip from 2015.1 onwards. Simply run the command python3 -m pip install p4python Note that previous versions of P4Python should be uninstalled first, since they were built using distutils and not setuptools (the installer will warn about this). Once installed via pip, future releases of P4Python can be installed by adding the upgrade option to pip python3 -m pip install --upgrade p4python P4Python is distributed as a binary wheels for Python 3.8, 3.9, 3.10, 3.11 and 3.12. In order for the binary wheel to be used, the ABI tag needs to match.This often requires updated pip, to do so issue: python3 -m pip install --upgrade pip Installation using Linux binary packages P4Python can be installed via Linux packages available from: https://www.perforce.com/perforce-packages Following packages are available: RHEL/Rocky Linux 8 perforce-p4python3-python3.8 perforce-p4python3-python3.9 RHEL/Rocky Linux 9 perforce-p4python3-python3.9 Ubuntu 20.04 perforce-p4python3-python3.8 perforce-p4python3-python3.9 Ubuntu 22.04 perforce-p4python3-python3.10 Installing P4Python for Maya. Maya has a private python executable called "mayapy". The instructions for installation are same as in "Building P4Python from Source" section, except use "mayapy" instead of "python". -------------------------------------------------------------------------- Upgrading P4Python When manually upgrading (not using pip or package managers), uninstall any older versions of P4Python. Some earlier versions of P4Python consisted of the following files, which must be deleted before installing a later version: p4.py p4.pyc p4.pyo P4Client.pyd -------------------------------------------------------------------------- Building P4Python from Source The official version of P4Python exists as source on: https://github.com/perforce/p4python Instructions for building are in the BUILD.md file which can be found here - https://github.com/perforce/p4python/blob/master/build.md -------------------------------------------------------------------------- Compatibility Statements Server Compatibility You can use any release of P4Python with any release of the Perforce server later than 2001.1 API Compatibility This release of P4Python requires at least 2023.2 Perforce API (2023.2/2519561). Older releases will not compile and are not supported. Python Compatibility This release of P4Python is supported building from source with Python 3.8, 3.9, 3.10, 3.11 and 3.12. For detailed compatibility, please check the following table: Python Release | P4Python Release ====================================== 3.8 | 2020.1 or later 3.9 | 2021.1 or later 3.10 | 2022.1 or later 3.11 | 2022.2 or later 3.12 | 2023.1 or later OpenSSL Compatibility To build P4Python with encrypted communication support, you must use the version of OpenSSL that Perforce C/C++ API has been built against. Beginning with the 2017.1 release of the Helix C/C++ API, the dependency on OpenSSL is now enforced and the SSL stub library has been removed. Executables linked against the P4API libraries must also be linked against real OpenSSL libraries: The latest 3.0.x or 1.1.1 patch is recommended Platform Compatibility This release is certified on the following platforms: Windows (x86, x86_64) Server 2016 Mac OS X 10.15, 11, 12 (x86_64) 12, 13 (ARM64) Linux (x86, x86_64) Ubuntu 20.04, 22.04 CentOS 8 Rocky Linux 9.1 The above platforms are tested and subject to regression testing on a frequent basis. Errors or bugs discovered in these platforms are prioritized for correction. Any platform not listed above is not actively tested by Perforce. P4Python may run on platforms that are not actively tested. Compiler Compatibility To build P4Python from source, you must use a version of P4Python that has been compiled with the same compiler used to build the Perforce C++ API. For most platforms, use gcc/g++. On Linux since the 2019.1 P4API release, due to a change in library dependencies, the source code requires gcc 6 or above to be used. Attempting to use a different compiler or a different version of the compiler will cause link errors due to differences in name handling. For more information about P4API compiler requirements, please see this link: https://www.perforce.com/manuals/p4api/Content/P4API/client.programming.compiling.html On Windows platforms, the P4Python installer is build with Python from python.org. The installer for Python 3.x was built with Visual Studio 2017 and Visual Studio 2008 for Python 2. To run Python 3.x on Windows, it might be necessary to install the redistributable version of the 2017 libraries, vc_redist.x64.exe or vc_redist.x86.exe, respectively for 64 bit and 32 bit. Without these libraries the DLL for P4API will not load into Python and the command 'import P4' will fail. Known Limitations The Perforce client-server protocol is not designed to support multiple concurrent queries over the same connection. For this reason, multi-threaded applications using the C++ API or the script APIs (P4Perl, P4Ruby, etc.) should ensure that a separate connection is used for each thread or that only one thread may use a shared connection at a time. Source Availability The official version of P4Python exists as source on: https://github.com/perforce/p4python. -------------------------------------------------------------------------- Attributes Perforce P4Python provides the attributes listed below. Attributes can be set in the P4() constructor or by using their setters and getters. For example: >>> import P4 >>> p4 = P4.P4(client="myclient", port="1666") >>> p4.user = 'me' Most attributes can be set and read. Attributes are strings unless noted otherwise. api_level API compatibility level, INTEGER charset The character set to use. String, not a constant as in previous versions client Client to use (P4CLIENT) cwd Current Working Directory debug Debug level (for debugging P4Python), INTEGER errors Array of errors returned by the server (Read-Only), LIST exception_level Determines whether exceptions are thrown, INTEGER host Client Host input Input for next command, can be STRING, LIST or DICTIONARY maxlocktime MaxLockTime for commands, INTEGER maxresults MaxResults for commands, INTEGER maxscanrows MaxScanRows for commands, INTEGER p4config_file Returns the config file path (Read-Only) ignore_file Ignore file used password Value of P4PASSWD port Value of P4PORT prog Name of the script, shown in the server log server_level Returns the server level (Read-Only) tagged Boolean value, determines whether to use tagged mode, INTEGER ticket_file Returns the name of the ticket file user Value of P4USER warnings Array of warnings returned by the server (Read-Only), LIST -------------------------------------------------------------------------- Tagged mode and form parsing In Perforce P4Python 2007.3 and later, form parsing and tagged output are enabled by default. (In Public Depot P4Python, tagged output and form parsing mode were disabled by default, but most scripts enabled them immediately.) Form parsing cannot be disabled explicitly, but tagged output can be enabled or disabled by setting p4.tagged as follows: p4.tagged = False # Disabled p4.tagged = True # Enabled This method can be used to disable form parsing, because form parsing does not work when tagged output is disabled. -------------------------------------------------------------------------- Key to symbols used in change notes below. * -- requires new P4Python ** -- requires new p4d server program *** -- requires new P4API -------------------------------------------------------------------------- Bugs fixed in 2023.2 Patch 2 (2023.2/2581979) (2024/04/05) #2558218 (Job #094891) Manylinux wheels now supports parallel threaded sync without requiring the execution of a copy of "p4". -------------------------------------------------------------------------- New functionality in 2023.2 Patch 1 (2023.2/2543803) (2024/01/22) (Job #118907) This release is built against P4API (2023.2/2519561), to address possible vulnerability: CVE-2023-5759. #2542109 (Job #117135) Made P4Exception object pickleable. -------------------------------------------------------------------------- New functionality in 2023.2 (2023.2/2527637) (2023/12/04) #2522046 (Job #117813) Built P4Python with P4API 2023.2 (2023.2/2519561) -------------------------------------------------------------------------- New functionality in 2023.1 Patch 2 (2023.1/2509188) (2023/10/25) #2503929 (Job #117105) Added wheels & build support for Python 3.12 -------------------------------------------------------------------------- New functionality in 2023.1 Patch 1 (2023.1/2477632) (2023/08/21) #2475832, #2471641, #2468946 (Job #114714) We now publish P4Python package for Rocky Linux 9 -------------------------------------------------------------------------- Bugs fixed in 2023.1 Patch 1 (2023.1/2477632) (2023/08/21) #2475148 (Job #116894) Fixed an erroneous conditional statement in setup.py which resulted in incorrect OpenSSL version definition in certain scenarios #2471616 (Job #116753) Fixed an issue where P4.identify() was returning quoted strings in the revision identifier on Windows platform. It is now consistent with Linux based platforms -------------------------------------------------------------------------- New functionality in 2023.1 (2023.1/2454917) (2023/06/15) #2449421, #2449107 (Job #115666) Built P4Python with P4API 2023.1 (2023.1/2442900) -------------------------------------------------------------------------- New functionality in 2022.2 Patch 2 (2022.2/2543766) (2024/01/18) (Job #118907) This release is built against P4API (2022.2/2531894), to address possible vulnerability: CVE-2023-5759. -------------------------------------------------------------------------- New functionality in 2022.2 Patch 1 (2022.2/2428370) (2023/04/13) #2427292 (Job #113073) Added wheels & build support for Python 3.11 -------------------------------------------------------------------------- New functionality in 2022.2 (2022.2/2425690) (2023/04/04) #2421979 (Job #114236) Built P4Python with P4API 2022.2 (2022.2/2407422) #2422290 #2422824 (Job #108702, #110277) Added wheel & build support for Apple M1 (ARM64) architecture -------------------------------------------------------------------------- New functionality in 2022.1 Patch 2 (2023/02/09) Important security note This version addresses vulnerabilities in OpenSSL (CVE-2023-0286, CVE-2023-0215, CVE-2022-4450, CVE-2022-4304) by linking in version 1.1.1t of the library. -------------------------------------------------------------------------- New functionality in 2022.1 Patch 1 (2022/11/11) #2353468 (Job #112534) * Changed download of C++ P4API to HTTPS instead of FTP. -------------------------------------------------------------------------- Bug fixes in 2022.1 Patch 1 (2022/11/11) (Job #112736) * *** Correct the handling of untranslated text left in the compression buffer on Close(). Build only change. -------------------------------------------------------------------------- New functionality in 2022.1 #2281584 (Job #109173) * *** Added support for Python 3.10. #2269851 (Job #111022) * ** *** Updated the spec templates to match the 2022.1 Helix Server specs. -------------------------------------------------------------------------- New functionality in 2021.1 Patch 1 (Job #109912 ) * *** Windows and Mac builds have updated version of OpenSSL(1.1.1n), to address possible vulnerability: CVE-2022-0778. Linux builds are not affected. -------------------------------------------------------------------------- New functionality in 2021.1 #2118072 (Job #105058) * *** Added support for Python 3.9. #2118073 (Job #106304) * ** *** Updated the spec templates to match the 2020.1 Helix Server specs. Bug fixes in 2021.1 #2124007 (Job #105472) * *** Fixed clean-up of locked temp workspaces. -------------------------------------------------------------------------- New functionality in 2020.1 Patch 1 (Job #104856) * *** Windows and Mac builds have updated version of OpenSSL(1.1.1i), to address possible vulnerability: CVE-2015-0288. Linux builds are not affected. -------------------------------------------------------------------------- New functionality in 2020.1 #1979782 (Job #100909) * *** Added support for Python 3.8. #1971901 (Job #102669) * ** *** Updated the spec templates to match the 2020.1 Helix Server specs. -------------------------------------------------------------------------- New functionality in 2019.1 #1804040 (Job #98777) * *** P4Python now requires p4api 2019.1 Added OSX support for 10.14, removed support for 10.8 and earlier Added additional libraries from p4api 19.1 to the link lines on all platforms. Fixed name conflicts between p4python modules and p4api extensions.On Linux, detect glib version so the correct p4api libraries are downloaded and linked. #1804040 (Job #97426) * *** Will now link with either openssl 1.0.2 or 1.1.1 #1804040 (Job #98778) * On Linux, if -ssl is not specified, will look for compatible ssl libraries, and if not found, will download the openssl source, and build and install it. #1894940 * (Job #98779) * Fixed Windows issue where OpenSSL library names changed with Openssl 1.1.0+ Bug fixes in 2019.1 #1804040 (Job #98261) * Changed setup.py to use subclasses, and process arguments the way setuputils wants. #1894940 (Job #98423) * Regex change to allow for space/extra characters in OpenSSL version #1841909 (Job #99571) * Memory leak in P4Result::Reset #1841909 (Job #99549) * Memory leak in Exception Handler #184040 (Job #98782) * P4Python does not install correctly with Maya 2019 "mayapy" interpreter #1812102 (Job #98261) * P4Python attempts to download P4API every time, ignoring --apidir -------------------------------------------------------------------------- New functionality in 2018.2 #1725050 (Job #95692) * Added support for Python 3.7. -------------------------------------------------------------------------- New functionality in 2017.2 Bug fixes in 2017.2 #1612945 (Job #85554, #94070) * Removed memory leak (and potential crashes) caused by P4.P4Message, P4.P4MergeData, P4.P4ActionMergeData and P4.P4Map not being correctly initialised. #1614534 (Job #93512) * Protect p4.run_resolve(resolver=Resolver()). If the resolver object returns anything but a string, check and throw a warning instead of crashing Python. #1613710 (Job #90903) * Extend the prog string with the Python, P4Python and P4API version to enhance debugging and logging. The appended string looks like this [PY3.6.3/P4PY2017.2/API2018.1/1592142] and will be appended even if P4.prog is set by the user. #1613337 (Job #93280) * Clean up temporary P4API files if downloaded from the ftp site. This is particular useful if P4Python is installed via pip by multiple users on a shared server. #1562323 (Job #92590) * Permit assignment of single string values to spec fields that require a list, for example the 'View' or 'AltRoots' field in the client spec. The string is treated like an array of 1 element. When reloading the spec, the field will be converted to an array. #1602183 (Job #86321) * Ensure context handlers correctly reset values if an exception is thrown inside the body of the context handler. This also applies if the context is set inside the run method as a karg, for example: p4.run_info(tagged=False) -------------------------------------------------------------------------- New functionality in 2017.1 #1525945 * Protect automatic P4Python installs from P4API changes. This makes sure that 'pip install p4python' on Linux uses the tested version of P4API. #1523857 * Added support for graph depots (Helix4Git). P4.graph is set to 1 by default to enable graph commands. Support can be disabled by setting P4.graph to 0. #1500363 (Job #90902) * Added support for P4.p4config_files, which returns a list of p4config files in case of nested usage. P4.p4config_file (note the missing s) only returns the outermost config file. #1501292 * Added support for setting (client-side) tunables: P4.set_tunable(key, value) P4.get_tunable(key) -------------------------------------------------------------------------- New functionality in 2016.2 #1446623 * ** *** Added support for P4Map.translate_array. This method is useful when translating ditto (&) mapping, which can result in more than one answer. Bug fixes in 2016.2: #1477171 (Job #89757) * Fixed parsing expression for the output of 'openssl version' for 1.0.2. This fix allows P4Python to be build with SSL support on Ubuntu Xenial (16.04) when installing via pip. #1436215 * P4.clone() without a directory parameter would segfault if the target directory is already in use. Now the exception will print out directory '.' instead. Bug fixes in 2016.2 Patch 1 #1497579 (Job #90749) * Removed spurious output of "*** It is not a list, I am confused" when parsing hand-crafted spec strings with added comments. #1493809 * Protect encoding test case from crashing macOS Sierra (10.12) -------------------------------------------------------------------------- New functionality in 2016.1 #1399690 * ** *** Comments in the protection table are now supported by P4.Spec. The comment is preserved as part of each protection table entry, so a script parsing the protection table needs to be able to expect an entry to be followed by a hash (#) and a comment. #1369476 (Job #83827) * Installing P4Python via pip under Linux will now attempt to link against the OpenSSL libraries if installed. If no suitable OpenSSL library can be found, P4Python will be installed without SSL support. #1349961 * ** Added P4.define_spec, which makes it possible to preload the spec cache with a spec definition. This is particularly useful when used with form-triggers that use the new 2016.1 variable %specdef%. #1349960 * ** *** Support for ditto (&) mapping in P4.Map. Bugs fixed in 2016.1 Patch 1: #1445730 (Job #88664) * P4.Map() correctly handles overlay mappings again. #1442582 (Job #88605) P4.run_login now takes an optional "password" keyword. This simplifies the login process from this: p4.password = "secret" p4.run_login() to this: p4.run_login(password="secret") #1443446 (Job #88606) Logging interface now logs warnings and errors as well. -------------------------------------------------------------------------- New functionality in 2015.2 Bugs fixed in 2015.2 #1315696 Added arguments and keyword arguments (args and kargs) to P4.run_login and P4.run_password for completeness. #1319215 (Job #81071) Use C++ P4API for 'p4 init' and 'p4 clone'. The 2015.1 implementation required a P4 executable in the path of the script. #1316068 (Job #84024) Updated the spec map in line with the 2015.2 server changes. Bugs fixed in 2015.2 Patch 1 #1338889 (Job #84749) Improve encoding for Python3 to allow sending Unicode strings to a non-Unicode server without converting the strings to UTF8. Also adds the ability to encode strings yourself and send bytes- encoded strings instead. #1340547 Fixed spec string for "typemap", "protect" and "triggers" commands. #1341514 Added test cases for spec parsing and formatting. -------------------------------------------------------------------------- New functionality in 2015.1 #1039185 (Job #78154) * ** Support for new DVCS commands 'p4 init' and 'p4 clone'. The commands are implemented as factory methods P4.init and P4.clone respectively and create a new P4 instance pointing to the DVCSworkspace. #1005721 (Job #062356) * Support for PyPi. P4Python can now be installed with a simple: pip install p4python on many supported platforms as a binary install, and as source on Linux, where it will attempt to automatically build. #1042731 * Support for automatically downloading P4API on appropriate platforms. If P4Python is built without the --apidir switch, setup will now attempt to connect to ftp.perforce.com to download the correct P4API binary for this platform and unpack it in a temporary directory. #1042578 * Support for automatic SSL-enabled builds. If the switch --ssl is provided without a path, setup will attempt to determine the correct path of the SSL libraries by running 'openssl version'. -------------------------------------------------------------------------- New functionality in 2014.2 #945604 * *** P4ENVIRO file can now be enquired and set within P4Python through the string variable P4.p4enviro_file. #948607 * Support Python logging interface. When a Python logger is assigned to P4.logger, P4Python will log all commands executed through the P4.run interface as INFO. Additionally, any warning or error from Perforce is reported as INFO, WARNING or ERROR in the log. By setting a logger, P4.debug is automatically set to 1 to facilitate command logging. Setting a higher value of P4.debug will also log additional information as DEBUG. The logging reporting level in the assigned logger and handlers must be set to the correct level to see any log output. -------------------------------------------------------------------------- New functionality in 2014.1 #779528 (Job #64555) * *** Added P4.is_ignored(), which allows a user to determine whether a particular file is ignored via the P4IGNORE feature. needs to be a local relative or absolute path. Call P4.ignore_file to see which P4IGNORE file is used. Setting P4.ignore_file has to happen before the first time P4.is_ignored() is used and has no influence on the environment. #706047 (Job #64849) * Added context manager for temporary workspaces in P4Python. P4.temp_client(prefix, template) will create a temporary workspace based on the template. The client workspace name starts with the prefix to make it easy to exclude the workspace from the spec depot. Use this feature with the Python "with" keyword. Bugs fixed in 2014.1 #895310 (Job #74027) * If a form-out trigger prints out a message before sending the spec, P4#fetch_spec would swallow the spec file (such as change or client) and only print the message. This is now fixed. #736768 * P4Python now builds on Mac OSX Maverick (i.e. Darwin 13) P4.identify() will report P4PYTHON/DARWIN100X86_64 #706046 (Job #68737)* Fixed P4.iterate to reject illegal commands. #693300 (Big #69143) * Added P4.disable_tmp_cleanup to prevent cleanup if temporary objects. Invoke this before connecting if you are using multiple P4 connections in parallel in a multi-threaded Python application. -------------------------------------------------------------------------- Bugs fixed in 2013.1 #628525 * When using Python 3.X P4Python created a memory leak for every call. This has now been fixed. Note that the fix requires upgrading to Python 3.3. All previous version of Python 3.X are not supported and P4Python 2013.1 will not compile with these releases. #634817 * Reformatted P4.py to use spaces instead of tabs, following the Python coding standard. -------------------------------------------------------------------------- New functionality in 2012.3 #533539 * P4Python is now compatible with Python 3.3 and will complete all test cases. #564572 (Job #59272) * Comments in forms are now preserved in the spec object when using P4.parse_spec. The comment can be accessed and changed through the P4.Spec.comment attribute. Comments are used by the P4.format_spec methods such as P4.format_client(). This is useful for form-out triggers. #568867 * When decoding strings in Python 3 from a non-Unicode Perforce server, P4Python normally assumes that all strings are encoded in UTF8. P4.encoding can be set to a legal Python encoding to change the decoding of any content from the Perforce Server. If P4.encoding is set, any decoding error will cause an exception to be thrown. The special encoding 'raw' can be used to receive Python bytes instead of Unicode strings. P4.encoding is only available when compiled with Python 3. Bugs fixed in 2012.3 #564572 (Job #32834) * In Python 3 it was impossible to reset the charset to None or ''. This is now fixed. -------------------------------------------------------------------------- New functionality in 2012.2 #524819 (Job #59800) * P4Python now supports Apple Mountain Lion (10.8). #503392 (Job #56081) * P4.run_print() would return None for a non-existing file. Now it returns [] for consistency. #503375 (Job #56479) * Added P4.run_tickets() method to list local tickets. Note that P4.run('tickets') still gives the old error message "Must upgrade to 2004.2 p4 to access tickets." #498110 (Job #56512) * ** *** Support for the new progress indicator API. P4Python supplies a new progress attribute, which can take an instance of P4.Progress class or subclass. Progress information is currently only supported for submits and sync -q. Details can be found in the documentation. #491236 (Job #57828) * New convenience method P4.iterate_() that allows easy iteration through some or all spec objects such as clients or changes. Details can be found in the documentation. Bugs fixed in 2012.2 #513715 (Job #59191) * Fixed a bug where P4Python would leak memory when calling an OutputHandler, and would leak more memory if the OutputHandler returned HANDLED. #512425 (Job #58722) * P4#parse_client could raise the exception "Unknown field name 'StreamAtChange'." when parsing a stream client workspace. Internal spec definition has been updated to resolve this. -------------------------------------------------------------------------- New functionality in 2012.1 #403096 (Job #51898) * ** *** Enable "action resolve" to support resolves of branches, deletes and file types. The existing P4.Resolver class has been extended with a new method actionResolve() that will be invoked if an "action resolve" is required. Details can be found in the documentation. #411866 (Job #51896) * ** *** P4Python supports SSL connections if compiled with SSL support. Instructions on how to compile with SSL support can be found at the top of this document under "Building P4Python from Source" and in the documentation. P4.identify() will then report the version of the OpenSSL library used for building the Perforce C++ API (not the version P4Python is linked against). Bugs fixed in 2012.1: #510916 (Job #59060) * Fixed a bug where P4Python would increment the reference count of an OutputHandler each time run was called. #446148 (Job #55062) * Fixed a test hardness due an incompatibility with Python 2.6 #397007 (Job #49820) * A fatal server error would leave P4Python in an undefined state which would result in incorrect output for successive commands. P4Python will now disconnect and clean up when encountering a fatal error. #420204 (Job #52909) * Python would crash with a segmentation fault if a custom Resolver object was used to resolve binary files. Fixed. -------------------------------------------------------------------------- New functionality in 2011.1 #328169 (Job #45862) * ** Enable streams in P4Python by default. With this change, streams specific specs such as streams depots are listed. Disable the listing of streams specific specs by either setting the api_level to a value below 70 or by disabling stream handling explicitly through the P4.streams attribute: p4.streams = False #318056 * All run methods now support keyword arguments in order to disable 'tagged' mode or to provide an OutputHandler for a single command only without having to wrap the command in a 'with' block: p4.run_counter('mycounter', tagged = False) p4.run_files('//...', handler = MyOutputHandler() ) More than one keyword argument can be provided if required. All attributes that can be changed for an active connection can be provided as keyword arguments. #317619 (Job #42251) * P4Python supports a callback interface by providing a P4.handler attribute. Set P4.handler to an instance of a subclass of P4.OutputHandler to enable callbacks. When a handler is defined, P4Python will invoke the handler for every response it receives from the Perforce Server immediately instead of collecting all results together in an array first. This can be used to make applications more scalable and more responsive if large results are expected. See the documentation for details on the OutputHandler class. #331330 (Job #43211) * P4Python now allows setting P4 registry values on Windows and Mac OS. P4.set_env(name, value) sets an entry and P4.set_env(name) deletes the entry. This is equivalent to running 'p4 set name=value' from the command line. Bugs fixed in 2011.1 #385159 (Job #49324) *** On Windows Vista, Windows 7, or Windows 2008, a client running as Administrator would fail to properly process file names in non-ASCII character sets (such as Shift-JIS). #328989 (Job #44038) * Prevent users from assigning non-string values to spec objects such as labels or client workspaces. Assigning values other than strings could crash P4Python. #328975 (Job #45395) * Updated the stored spec templates for user, client and change and added streams. These are required, for example, for form-triggers that do not connect to the server first. #328952 (Job #45956) * Under some circumstances P4Python would try to raise a P4Error, which has been renamed to P4Exception. This is now fixed. #328223 (Job #44820) * P4.identify() reports the platform on Mac OS as DARWIN in line with all other Perforce products. #328187 (Job #44819) * P4.identify() now reports P4Python as P4PYTHON in line with all other Perforce products. #326428 (Job #46255) * P4.Map.reverse would return a P4API.P4Map object. It now returns an instance of P4.Map instead. #323887 (Job #46151) * P4.run_filelog() would throw an exception for rare circumstances where no digest is defined for for a deleted revision that was later readed. This is now fixed. #312206 (Job #44742) * Info messages were not shown when an exception was thrown. This is because all messages of type info get silently swallowed. They will still not show in the output with this change, but they will be logged in the P4.message list. Info messages like this will be forwarded to the OutputHandler if present. -------------------------------------------------------------------------- New functionality in 2010.2 #257896 (Job #38952) * P4Python now comes in a Perforce standardized directory structure: p4python-..[-BETA]. Source and binary distributions created via 'python setup.py' will follow this naming scheme. #257263 (Job #37856) * Python 3.1 is now fully supported. It also has full support for Unicode-enabled Perforce Servers. This also means that P4.charset can be set to multibyte charsets such as UTF16. #257099 (Job #38766) * *** Errors and warnings are now instances of P4Message. This object has the additional methods generic(), severity() and (unique) msgid(), which makes parsing of error messages easier. P4.warnings and P4.errors still return the errors and warnings as strings for backwards compatibility. #239278 (Job #38210) * Added new SetTrack() and GetTrack() methods. For more details about server performance tracking see: http://kb.perforce.com/article/883 Bugs fixed in 2010.2 #285704 (Job #43213) * The connect() context would silently swallow exceptions thrown within the block. This means problems within the following code would get missed unless explicitly caught within the block: with p4.connect(): # do something with p4 # automatically disconnected This is now fixed. #287034 (Job #43415) * Running 'print' on a file that started with '---' would crash Python. This is now fixed. There is still an oddity when p4.track = 1 and a user runs p4.run_print() on a file that only has lines starting with '--- '. In that case, the output of the print is lost. Disable tracking by setting p4.track = 0 (the default) will solve this problem. -------------------------------------------------------------------------- New functionality in 2010.1 #235589 (Job #35946) * Compatibility with Python 3. This change makes P4Python incompatible with Python 2.5 and prior, but retains compatibility with Python 2.6 (Python 2.7 also works but is unsupported). Python 3.1 is currently only experimental because of Unicode and 8-bit ASCII support. P4Python 2010.1 with Python 3.1 at the moment only supports 7-bit ASCII on non-Unicode servers and UTF8 on Unicode servers. #231765 * Added new P4.server_unicode attribute that allows script writers to test whether or not a Perforce Server is in internationalized (unicode) mode. P4.server_case_insensitive() has been changed from a method to an attribute (that is, no brackets) P4.server_level, P4.server_unicode and P4.server_case_insensitive all will send a "info" command to the server upon invocation if no previous command was sent before. Previously, these commands would throw an exception instead. #230480 * New read-only string attributes PATCHLEVEL and OS so that script writers can test the installation of P4Python without having to parse the output of P4.identify() Bugs fixed in 2010.1 #242158 (Job #38677) * P4.identify() now correctly report 'NTX64' for 64-bit builds on Windows. #230649 (Job #37434) * All keyword arguments passed in the constructor are now evaluated correctly. #235706 * Support for P4.run_print() for more than one file. Previously, P4.run_print() would throw an exception when trying to print more than one file. #235718 (Job #37841) * P4.RAISE_ERROR has been renamed to P4.RAISE_ERRORS for consistency with P4Ruby. P4.RAISE_ERROR is still available for backwards compatibility. #235730 (Job #37186) * Under rare circumstances P4.run_filelog() would throw an "Index out of range" error for "fileSize" fields. This is now prevented. -------------------------------------------------------------------------- New functionality in 2009.2 #214490 (Job #35417 ) * New P4.server_case_sensitive() method enables scripts to detect whether the server is case-sensitive. Can be called only after a command has been issued to the server. #214611 (Job #032917) * Throw a P4Exception if user attempts to change the port after a connection is established. #215413 (Job #31789) * Throw an exception if a user tries to set a charset wider than one byte. Previously, all commands subsequent to setting a multi-byte charset returned empty strings. Bugs fixed in 2009.2 #227423 (Job #37143) * The build script removed the release notes when invoked. Fixed. #214614 (Job #34866) * The P4.connected() method now correctly resets the flag when detecting a dropped connection. #215406 * P4.__enter__() now correctly returns self, which permits the following idiom to work correctly: with p4.connect() as p: # use p here as an alias #209643 (Job #36223) * P4Python now builds with the latest API on Windows using Visual Studio 2008. Previously, the build failed because of a link error. #222723 (Job #36558) * The Map class removed '-' and '+' from the path if the form Map.insert(lhs, rhs) was used, even if these characters did not appear at the beginning of the path. Now dashes and pluses are preserved within the path. -------------------------------------------------------------------------- New functionality in 2009.1 #191476 (Job #26731) * Support for the Python "with" statement. P4.connect() now returns a Contect Management object that can be used in a "with" statement with a block. When the block is finished, the connection is automatically disconnected: import P4 p4 = P4.P4() with p4.connect(): # execute statements here # p4 is now disconnected Also, there are two new methods, P4.while_tagged() and P4.at_exception_level() that, when used in a "with" statement, set the tagged mode and exception_level for the block and then reset it back to the original state. For example: with p4.at_exception_level(P4.RAISE_ERROR): # no exceptions # for warnings p4.run_sync("//depot/main/...") Bugs fixed in 2009.1 #192108 (Job #32920) * P4Python now correctly parsse jobs when the jobspec contains fields with names ending in numbers. #191458 (Job #32834) * Charset can now be reset to the empty string ''. -------------------------------------------------------------------------- New functionality in 2008.2 #164805 (Job #30704) * P4Python now builds under CYGWIN. #163103 (Job #30363) * #166832 * A new class P4.Map has been defined in P4Python that allows users to create, and work with, Perforce mappings without requiring a connection to a server. Methods in the P4.Map class are: P4.Map() Constructor. P4.Map.join() Class method. Joins two maps to create a third. P4.Map.clear() Empties the map P4.Map.count() Returns the number of entries in the map P4.Map.is_empty() Returns True if the map is empty P4.Map.insert() Adds new entries to the map P4.Map.translate() Translates a string through the map P4.Map.includes() Returns True if the supplied string is visible through the map P4.Map.reverse() Swap left and right sides of the mapping P4.Map.lhs() Returns the left-hand-side of the map P4.Map.rhs() Returns the right-hand-side of the map P4.Map.as_array() Returns the map as an array Bugs fixed in 2008.2 #176515 (Job #31367) * Using P4.run_print() in untagged mode throws an exception: IndexError: list index out of range This is now fixed. P4.run_print() can be used both in tagged and untagged mode. #157855 (Job #29933) * P4Python now correctly loads the value of P4CHARSET from the environment. -------------------------------------------------------------------------- New functionality in 2008.1 #157600 * Added support for P4.run_resolve(). The default for run_resolve() is now to accept the merge hint provided by the server unless the hint is "e", indicating a conflict. In this case, run_resolve() will skip the resolve. P4.run_resolve() can also accept a "resolver" keyword argument, which should point to an instance of a subclass of P4.Resolver. The subclass should overwrite the method P4.Resolver.resolve(self, mergeData) and return a string indicating how the resolve should proceed. To get the old behaviour of "resolve", run the command P4.run("resolve"). You will need to set P4.input to the correct response in this case. #152008 (Job #28761) * Added support for Python 2.4. #152362 (Job #29024) * The 'P4.env( var )' method has been added to the P4 class. This instance method enables the caller to interrogate the Perforce environment, including reading Perforce variables from P4CONFIG files and, on Windows, the registry. P4.cwd now loads any P4CONFIG file settings that are appropriate to the new working directory. #153547 (Job #29310) * P4Python now supports Mac OSX 10.5. Bugs fixed in 2008.1 #175062 (Job #31637) * P4Python sometimes incorrectly decrements the reference count of None when calling p4.run_filelog(). In certain circumstances, this could cause Python to deallocate None, causing a fatal error. This problem has been fixed. #168966 (Job #31180) * P4Python did not release its output variable correctly. This caused a crash on 64 bit versions of Python when the P4 object went out of scope. This is now fixed. #166644 (Job #30723) * P4Python connections were not being correctly cleaned up when they were discarded due to a reference counting problem. This problem has been corrected. #161025 (Job #30076) * Fixed a serious memory leak problem in P4Python. Basically, all results returned from P4.run() had too many reference counts, which prevented the Python garbage collector from being able to clean up these objects. Now P4Python is memory neutral, as can be checked with the debug version of Python, which shows the total number of reference counts. #157844 (Job #28653) * Fixed an error with p4.run_filelog() when tagged output is off. The "df" variable is now correctly initialized on line 333 of P4.py. #156847 (Job #28770) * Calling print to retrieve the contents of a file no longer truncates content. #155969 (Job #29703) * When trying to create an illegal field in a Spec, P4Python would try to raise a P4Error, only to fail because the wrong number of arguments was provided to the Exception. This has been fixed. -------------------------------------------------------------------------- Bugs fixed in 2007.3 #149927 (Job #28703) * The presence of deleted revisions in a file's history could lead to P4Python throwing an error message. This occurred because deleted revisions do not have 'digest' or 'fileSize' fields. This problem has been corrected. #146116 (Job #28260) * The P4Python test harness, p4test.py, was omitted from the source distribution in error. This problem has been corrected. #146024 (Job #28077) * P4.Revision doesn't have a depot_file, or depotFile attribute as its counterparts in P4Perl and P4Ruby do. This is now fixed.