
rarfile history
===============

.. py:currentmodule:: rarfile

Version 2.6 (2013-04-10)
------------------------

* Add context manager support for :class:`RarFile` class.
  Both :class:`RarFile` and :class:`RarExtFile` support
  :keyword:`with` statement now.
  (Wentao Han)
* :meth:`RarFile.volumelist` method, returns filenames of archive volumes.
* Re-throw clearer error in case ``unrar`` is not found in ``PATH``.
* Sync new unrar4.x error code from ``rar.txt``.
* Use Sphinx for documentation, push docs to rtfd.org_

.. _rtfd.org: https://rarfile.readthedocs.org/

Version 2.5 (2012-01-19)
------------------------

Fixes:

* .read() and .readinto() now do looping read to work properly
  on short reads.  Important for Python 3.2+ where read from pipe
  can return short result even on blocking file descriptor.
* Proper error reporting in .extract(), .extractall(), .testrar()
* .read() from unrar pipe: prefer to return unrar error code,
  if thats not available, do own error checks.
* Avoid string addition in .read(), instead use always list+join to
  merge multi-part reads.
* dumprar: dont re-encode byte strings (python 2.x).  This avoids
  unneccessary failure when printing invalid unicode.

Version 2.4 (2011-11-05)
------------------------

Fixes:

* USE_DATETIME: survive bad values from RAR
* Fix bug in corrupt unicode filename handling
* dumprar: make unicode chars work with both pipe and console

Version 2.3 (2011-07-03)
------------------------

Features:

* Support .seek() method on file streams.  (Kristian Larsson)
* Support .readinto() method on file streams.  Optimized implementation
  is available on Python 2.6+ where ``memoryview`` is available.
* Support file comments - ``RarInfo.comment`` contains decompressed data if available.
* File objects returned by ``RarFile.open()`` are ``io.RawIOBase``-compatible.
  They can further wrapped with ``io.BufferedReader` and ``io.TextIOWrapper``.
* Now .getinfo() uses dict lookup instead of sequential scan when
  searching archive entry.  This speeds up prococessing for archives that
  have many entries.
* Option ``rarfile.UNICODE_COMMENTS`` to decode both archive and file comments to unicode.
  It uses ``TRY_ENCODINGS`` for list of encodings to try.  If off, comments are
  left as byte strings.  Default: 0
* Option ``rarfile.PATH_SEP`` to change path separator.  Default: ``r'\'``,
  set ``rarfile.PATH_SEP='/'`` to be compatibe with zipfile.
* Option ``rarfile.USE_DATETIME`` to convert timestamps to datetime objects.
  Default: 0, timestamps are tuples.
* Option ``rarfile.TRY_ENCODINGS`` to allow tuning attempted encoding list.
* Reorder RarInfo fiels to better show zipfile-compatible fields.
* Standard regtests to make sure various features work

Compatibility:

* Drop ``RarInfo.unicode_filename``, plain ``RarInfo.filename`` is already unicode since 2.0.
* .read(-1) reads now until EOF.  Previously it returned empty buffer.

Fixes:

* Make encrypted headers work with Python 3.x bytes() and with old 2.x 'sha' module.
* Simplify ``subprocess.Popen()`` usage when launching ``unrar``.  Previously
  it tried to optimize and work around OS/Python bugs, but this is not
  maintainable.
* Use temp rar file hack on multi-volume archives too.
* Always .wait() on unrar, to avoid zombies
* Convert struct.error to BadRarFile
* Plug some fd leaks.  Affected: Jython, PyPy.
* Broken archives are handled more robustly.

Version 2.2 (2010-08-19)
------------------------

Fixes:

* Relaxed volume naming.  Now it just calculates new volume name by finding number
  in old one and increasing it, without any expectations what that number should be.
* Files with 4G of compressed data in one colume were handled wrong.  Fix.
* DOS timestamp seconds need to be multiplied with 2.
* Correct EXTTIME parsing.

Cleanups:

* Compressed size is per-volume, sum them together, so that user sees complete
  compressed size for files split over several volumes.
* dumprar: Show unknown bits.
* Use ``struct.Struct()`` to cache unpack formats.
* Support missing ``os.devnull``. (Python 2.3)

Version 2.1 (2010-07-31)
------------------------

Features:

* Minimal implmentation for .extract(), .extractall(), .testrar().
  They are simple shortcuts to ``unrar`` invocation.
* Accept RarInfo object where filename is expected.
* Include dumprar.py in .tgz.  It can be used to visualize RAR structure
  and test module.
* Support for encrypted file headers.

Fixes:

* Don't read past ENDARC, there could be non-RAR data there.
* RAR 2.x: It does not write ENDARC, but our volume code expected it.  Fix that.
* RAR 2.x: Support more than 200 old-style volumes.

Cleanups:

* Load comment only when requested.
* Cleanup of internal config variables.  They should have now final names.
* .open(): Add mode=r argument to match zipfile.
* Doc and comments cleanup, minimize duplication.
* Common wrappers for both compressed and uncompressed files,
  now .open() also does CRC-checking.

Version 2.0 (2010-04-29)
------------------------

Features:

* Python 3 support.  Still works with 2.x.
* Parses extended time fields. (.mtime, .ctime, .atime)
* .open() method.  This makes possible to process large
  entries that do not fit into memory.
* Supports password-protected archives.
* Supports archive comments.

Cleanups:

* Uses subprocess module to launch unrar.
* .filename is always Unicode string, .unicode_filename is now deprecated.
* .CRC is unsigned again, as python3 crc32() is unsigned.

Version 1.1 (2008-08-31)
------------------------

Fixes:

* Replace os.tempnam() with tempfile.mkstemp().  (Jason Moiron)
* Fix infinite loop in _extract_hack on unexpected EOF
* RarInfo.CRC is now signed value to match crc32()
* RarFile.read() now checks file crc

Cleanups:

* more docstrings
* throw proper exceptions (subclasses of rarfile.Error)
* RarInfo has fields pre-initialized, so they appear in help()
* rename RarInfo.data to RarInfo.header_data
* dont use "print" when header parsing fails
* use try/finally to delete temp rar

Version 1.0 (2005-08-08)
------------------------

* First release.

