# pkgtreediff
[](https://hackage.haskell.org/package/pkgtreediff)
[](LICENSE)
[](http://stackage.org/lts/package/pkgtreediff)
[](http://stackage.org/nightly/package/pkgtreediff)
`pkgtreediff` compares the NVRs (name-version-release) of RPM packages in OS package trees and/or installations:
- An OS tree can be referenced by an url or directory containing a tree of rpm files.
- A file containing a list(s) of rpm NVRs can also be compared.
- Commands can also be used to get installed RPMs, eg:
- `"rpm -qa"`
- `"ssh myhost rpm -qa"`
- `"podman run --rm myimage rpm -qa"`
- A koji tag: koji://tag@KojiHubUrl (or koji://tag@fedora)
## Usage examples
### Containers
Compare the content of two rpm based containers (new added packages in fedora:34)
```bash session
$ pkgtreediff --new "podman run --rm fedora:33 rpm -qa" "podman run --rm fedora:34 rpm -qa"
dejavu-sans-fonts.noarch 2.37-16.fc34
fonts-filesystem.noarch 2.0.5-5.fc34
langpacks-core-en_GB.noarch 3.0-12.fc34
langpacks-core-font-en.noarch 3.0-12.fc34
langpacks-en_GB.noarch 3.0-12.fc34
```
### Package trees
Package source changes between Fedora 30 and 31 Server at GA (ignoring release bumps):
```bash session
$ pkgtreediff --ignore-release https://dl.fedoraproject.org/pub/fedora/linux/releases/{32,33}/Server/source/tree/Packages/
ModemManager.src: 1.12.8-1.fc32 -> 1.14.2-1.fc33
NetworkManager.src: 1.22.10-1.fc32 -> 1.26.2-2.fc33
PackageKit.src: 1.1.13-2.fc32 -> 1.2.1-1.fc33
abrt.src: 2.14.0-2.fc32 -> 2.14.4-6.fc33
adwaita-icon-theme.src: 3.36.0-1.fc32 -> 3.38.0-1.fc33
alsa-lib.src: 1.2.2-2.fc32 -> 1.2.3.2-5.fc33
alsa-sof-firmware.src: 1.4.2-4.fc32 -> 1.5-2.fc33
anaconda.src: 32.24.7-1.fc32 -> 33.25.4-1.fc33
:
gobject-introspection.src: 1.64.1-1.fc32 -> 1.66.1-1.fc33
+ google-carlito-fonts.src 1.103-0.15.20130920.fc33
- google-crosextra-caladea-fonts.src 1.002-0.14.20130214.fc32
- google-crosextra-carlito-fonts.src 1.103-0.12.20130920.fc32
gpgme.src: 1.13.1-6.fc32 -> 1.14.0-2.fc33
:
:
xkeyboard-config.src: 2.29-1.fc32 -> 2.30-3.fc33
xxhash.src: 0.7.3-1.fc32 -> 0.8.0-1.fc33
yelp.src: 3.36.0-1.fc32 -> 3.38.1-1.fc33
yelp-xsl.src: 3.36.0-1.fc32 -> 3.38.1-1.fc33
- zram.src 0.4-1.fc32
zstd.src: 1.4.4-2.fc32 -> 1.4.5-5.fc33
Summary
Updated: 340
Added: 27
Deleted: 32
Arch changed: 0
Total packages: 937 -> 932
```
### Hosts
Compare the packages on local and another host:
```
pkgtreediff "rpm -qa" "ssh otherhost rpm -qa"
```
Any types of sources can be compared, together with the use of flags.
### Koji
Compare koji tags using the `koji://tag@kojihub` syntax:
```
pkgtreediff koji://dist-c8-updates-build@centos koji://dist-c8_1-updates-build@centos
```
Please avoid using koji tag to compare full releases as it is more efficient to
query URL or CMD trees.
## Builds
pkgtreediff is packaged in Fedora.
Older builds are also available in
[copr](https://copr.fedorainfracloud.org/coprs/petersen/pkgtreediff/)
for Fedora, EPEL, and OpenSuSE
([more details](https://copr.fedorainfracloud.org/coprs/petersen/pkgtreediff/monitor/detailed)).
## RPM version ordering
RPM version ordering is somewhat involved
<https://blog.jasonantman.com/2014/07/how-yum-and-rpm-compare-versions/>.
For example "1.2.1^rc1" < "1.2.1" (similarly for tilde).
pkgtreediff tries to implement the rpmvercmp() algorithm,
but it has not been verified to behave identically.