Revision history for Perl extension RPM.

1.51	Tue Apr 24 18:45:49 PDT 2007

	Changes made by Alexey to setting of $VERSION in RPM::* classes
	didn't play well with CPAN. Since I'm moving the repo to subversion
	soon anyway, changed these to ordinary strings.

1.50	Tue Apr 24 17:42:49 PDT 2007

	This is an official release to make the work done by Alexey Tourbin
	(<>) available in the main branch. All of his changes
	are merged into the main repository. Without his work, the project
	would still be languishing. Beside fixing countless bugs, he got me
	back to actively looking at the code.

	Added LICENSE paramter in Makefile.PL to re-license the package under
	the same terms as Perl itself (dual Artistic/GPL). version bumped up to 1.50 for release tracking.

	Test suites added to t/ for POD correctness and POD coverage.

	Several new additions to POD as deficiencies found by the POD
	coverage testing.

1.49_01	Sun Apr 22 2007

	This release has been tested on ALT Linux Sisyphus (rpm-4.0.4) and
	Fedora Core 6 (rpm-4.4.2).

	The version has been bumped up to 1.49_01 to match $VERSION.

	This release includes about 100 changes from the previous version
	0.40, which was released almost 5 years ago.  All known bugs and
	memory leaks has been fixed; the code has been updated for recent
	rpm-4.4 versions [ #3930, #8710], as well as cleaned up
	and simplified.

	Detailed list of changes since version 0.40 is available at;a=summary

	The most important changes are as follows.

	Many memory leaks have been fixed, including lack of headerFree()
	in rpmdb_FETCH().  New file t/09_leaks.t implements tests for memory
	leaks (requires Devel::Leak module).  [ #12120]

	RPM::Database caching layer was dropped, because of unacceptable
	memory usage for database traversal.  However, due to Berkeley DB
	caching facilities, which is used by RPM, the overall performance
	seems much smoother.

	RPM::Header caching layer was also dropped, due to many
	inconsistencies which arise from the "cache by tag name" approach.
	(For example, it was possible to assign different values for EPOCH
	and SERIAL rpm header tags, which actually alias each other.)
	However, ad-hoc cache for NAME, VERSION, and RELEASE tags has been
	kept, along with SEGV bugfix.  [ #14489]

	XS code has been simplified by implementing RPM::Header and
	RPM::Database object boxing (and unboxing) completely with typemap.

	Conversion between RPM tag names to their numeric values is now
	also handled with typemap.

	Fixed wrong rpmError() usage, which expects printf-like format
	string and arguments, not just plain string.

	Implemented RPM::evrcmp(a,b) to compare [Epoch:]Version[-Release]
	specification strings, possibly against RPM::Header objects.

	Fixed wrong RPM_INT*_TYPE conversion in rpmhdr_STORE(), which
	made RPM::evrcmp() implementation possible.

	Update RPM::Constants for new rpm, based on perl-RPM-43.patch
	from PLD Linux Distribution.

0.40	Fri May 10 01:09:13 PDT 2002
	-alpha thirteen

	RPM 3.0 line is no longer going to be supported. It's been long
	enough since the 4.0 line came out, I feel. All #ifdef'd code relating
	to 3.0 (and 4.0 line before about 4.0.2) has been removed. The code
	once again will compile standing on its own within the rpm CVS

	Applied a patch to RPM/Database.xs from Gerald Teschl <>
	so that when a header for a package that exists multiple times in
	the db (such as kernel) is requested, the newest of the lot is

	In a related area, the list of potential control-case packages in
	t/02_headers.t started with kernel, but if there were two such
	packages installed when the tests ran, several of them would fail.
	Now, rpm is the first choice.

	Applied a modified version of a patch from Anton Berezin
	<> to RPM/Header.xs that catches cases where at
	the start of key-iteration, the first run of headerNextIterator()
	might yield a null (unknown) header key (in rpmhdr_FIRSTKEY).

	Applied a patch to RPM/ to allow options to be passed to
	the new() method. Also added documentation for the new() method (!).
	Patch was from

	Applied a patch from Radu Greab <> that eliminated
	a couple of compiler warnings and freed a pointer at destructor-time
	that was previously overlooked (RPM/Header.xs and RPM/Error.xs).

	Removed all the calls to safemalloc and safefree, replaced them with
	the API-correct New (or Newz) and Safefree.

0.32	Tue May 15 00:54:20 PDT 2001
	- alpha twelve

	Found and fixed a bug in RPM/Database.xs that was causing more of
	the "Attempt to free unreferenced scalar" messages. In the process,
	noticed that caching of values during iteration wasn't actually
	working as designed. The resulting fix should improve database look-ups
	fairly noticably.

	Two more places found (one in RPM/Header.xs, one in RPM/Database.xs)
	that were contributing to memory leakage.

	A lot of changes to RPM/Constants.xs in terms of reducing the number
	and length of string-compares made in constant look-ups. This is most
	noticable in the RPM* set of constants, where the breakdown is the
	most granular. On the main dev box (a P-1/233MHz) this sped up the
	full test suite by over 25%.

0.31	Fri Apr 27 01:45:37 PDT 2001
	- alpha eleven

	Re-worked most of RPM/Constants.xs to accomodate the change from
	#define to enum values in 4.0.2. This will be released as an
	interim version, since Red Hat is shipping 7.1 with this version of

0.30	Wed Mar  7 22:13:40 PST 2001
	- tenth alpha

	Much of the leakage of RPM::Header objects is now gone, due mostly to
	changing the prototype of rpmdb_FETCH to returning a SV* instead of
	a RPM::Header reference. The various class DESTROY methods seem to be
	getting called in the correct order, now.

	Caught a case in the RPM::Header class where attempting to reference
	an element of a non-existent tag would trigger auto-vivification on
	that key, which in turn was leading to some bad calls being made to
	the rpmlib routines.

	Re-did the av-assignment in rpmhdr_create. This should save on SV*
	creation, though it might not have been a leak. Still, this method
	is more efficient overall.

	Newer versions of rpm 4.0 tickled a bug in which a database offset
	value might get sent in without being initialized first. This was
	caught and fixed. Also related to the 3.0/4.0 rift, some variables
	only used for 3.0.X are now declared within #ifdef's to defeat 'unused'

	The current state of the module will be released to allow for use by
	other parties, without the wait for any ongoing development milestones
	on my part.

0.292	Mon Nov 13 22:40:15 PST 2000
	- ninth alpha

	Some unused variables were found in several places.

	Moved away from the self-tie mechanism and instead handle the data
	opacity in a completely different fashion. This simplified some code,
	muddled some, but ultimately led to the removal of several #define
	macros, more unused variable removal, and (hopefully) more stable

	Addressed a problem in both RPM::Database and RPM::Header XS code
	wherein destructors were not getting called when objects were
	implicitly or explicitly freed.

	Added more tests to the test suite.

	Changed the names of some of the find_* routines in RPM::Database.
	See the manual page. The old names were confusing me, despite my
	direct familiarity with the code!

	The find_* functions in RPM::Database may now take a RPM::Header
	object as their argument, and will use the package's name for the

	It's still leaking RPM::Header objects in the RPM::Database routines.
	The alternative is a nasty mix of "attempt to free unreferenced
	scalar" errors and core dumps.

0.291	Fri Oct 13 01:45:18 PDT 2000
	- eighth alpha

	The flags that are created from the rpm version are now passed for
	3.0.X, as well.

	A thread-safing bug was found and fixed in Header.xs. An unused
	variable was removed.

	Makefile.PL has some large-scale work, including the addition of a
	template spec file following the __DATA__ token, code to expand this
	file using the values that MakeMaker has derived for the package,
	generation of make rules to construct *.rpm and *.srpm files, and
	generation of "rpmrc" and "rpmmacro" files to use in invoking rpm
	(to force all operation into the local dir area).

0.29	Wed Oct  4 22:29:56 PDT 2000
	- seventh alpha

	The only change of note in this release is compatibility with version
	4.0 of RPM. Additionally, some flags to the C compiler to work with
	the gcc that is distributed with Red Hat Linux 7. This version has
	been tested on both 6.2 and 7 systems.

0.28	Fri Aug 18 01:29:35 PDT 2000
	- sixth alpha

	Considerable additions made to the documentation in RPM::Constants, as
	well as a few corrections. The prototype of the constant() function
	was changed, as well.

	Several bugs were addressed in RPM::Header, most notably: Error returns
	now correctly return a value of "undef"; A blocking issue surrounding
	multiple RPM::Header objects from ftp:// sources is fixed; the mode
	with which files are opened was also changed to allow for reading off
	of STDIN. The error-return issue was also applied to RPM::Database.

	RPM::Header now has a source_name() accessor method that returns the
	file name (or URI) that the header was read from. This is null if the
	header came from the database.

0.27	Tue Aug  8 00:02:22 PDT 2000
	- fifth alpha

	Added filenames() method to RPM::Header. This re-assembles the list of
	filenames from the components in the tags, BASENAMES, DIRNAMES and

	Added scalar_tag() method to RPM::Header. This returns a 0/1 value
	based on whether the return value for a given flag is an array ref or
	scalar (respectively). Can be called with either a string or a number
	argument. Can be called as a static (class) method.

	Added RPM/Error.xs and integrated into the build. All the XS code for
	RPM::Error that was previously in RPM.xs has been moved here.

	Added export of %RPM to RPM::Database. If requested, this is a hash
	pre-tied to the RPM::Database package (and thus the rpm database). One
	may also request $RPM and get an object referencing a tied hash.

	The return values from fetches on header objects has been completely
	revised. Tags are now explicitly defined as scalar or list in nature.
	The scalar_tag() method above is a part of this. The return value from
	a scalar tag is now a plain scalar. There is no more need for $_->[0]
	on scalar returns. Lists are still returned as list references, and
	undef is still used to signify problems. Tests have been added to
	t/02_headers.t for this, and tests in t/01_database.t were updated to
	use the new syntax. This does not obsolete the RPM::Header::NVR method,
	as that is a much faster means of fetching those three items than a
	stock fetch of the three individual tags would be.

	More tags/values documented in RPM::Constants.

0.26	Fri Jul 14 01:03:02 PDT 2000
	- fourth alpha

	Added NVR() method to RPM::Header for obvious reasons of convenience.
	Also added cmpver method, which calls into the rpmCompareVersion() API
	hook to compare two headers' version/release data with an internal
	algorithm that handles numerical and alpha content in the tags.

	Took out all remaining warn()'s and croak()'s, replacing them with
	rpm_error() calls. Most notable in the error-return cases of
	RPM::Database::init and ::rebuild.

	More thread-safing, in particular the heretofore-ignored RPM::Constants
	XS module.

	Added a sample script in utils, called rpmprune. It has a --help
	summary and a man page, see those for details.

0.25	Mon Jun  5 00:54:59 PDT 2000
	- third alpha

	Fixes to the thread-safing code. When built against a 5.6.0 configured
	for threading, several problems were found. All (current) tests now
	pass on that configuration.

	Added a file, IMPORTANT.perl, to the distribution that explains the
	nature of a condition that can prevent the extension from working on
	any version of Perl not installed from an rpm.

	Still more trimming of tokens out of that are not of use
	by the interface being provided. Filled in a few more in terms of

	Found a case in RPM::Header that would cause core-dumps: Any tags found
	by the iterator that were not exported for the API by the rpm lib
	could cause a null pointer to be passed through to an entry point that
	was several lines past where I had normally checked for the null. This
	meant that source RPMs would almost certainly break, since the
	offending tags only showed up when I started testing against SRPMS.
	Now, the iterators skip over these internal tags. The normal FETCH
	method already tested for this, but the interators were sneaking past
	those tests.

	Added a method to the RPM::Header class, is_source(), that returns a
	true value (1) if the header is associated with a source RPM.

0.2   Mon May 29 17:59:20 PDT 2000
	- second alpha

	Class for RPM::Error added. The code is in the RPM.xs file, but
	the docs and accessors are done in RPM/

	All sub-classes moved to RPM/.

	More documentation added, especially to RPM::Constants.

	RPM::Constants had about a dozen or so trimmed out.

	Found error in Database.xs where the FIRSTKEY/NEXTKEY pair would
	have returned string-ified references instead of package names,
	because of not taking the first array element. I really plan to
	change the RPM::Header::FETCH interface.

	Added two utility functions under the RPM::* space for getting O/S
	and architecture names.

	Put in the start of thread-safing the module. But this part of the
	API is still pretty black in the Lockheed Skunkworks sense of the
	word, so it isn't at all complete.

0.1   Mon May 22 00:59:54 PDT 2000
	- first alpha release

	Classes for RPM::Header and RPM::Database are (more or less) done.
	RPM::Constants appears to have everything that is expected to be
	needed (i.e., any changes should result in shortening the list of
	exported symbols, rather than lengthening it). A basic top-level
	RPM namespace is present, but doesn't yet do anything useful. Some
	basic test scripts are in place, but more are (always) needed.

0.01  Thu May  4 12:04:34 2000
	- original version; created by h2xs 1.19