The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.


Gentoo::VDB - Simple API for querying Gentoo's installed-package database


  use Gentoo::VDB;
  my $vdb = Gentoo::VDB->new();

  my (@categories) = $vdb->categories;
  ## Note: next line is slow
  my (@packages)   = $vdb->packages;
  ## Much faster
  my (@packages)   = $vdb->packages({ in => 'dev-perl' });



  my $instance = Gentoo::VDB->new(\%ARGS);


Returns a list of single-token category names that are valid.

  my (@categories) = $vdb->categories;

Note: Categories that have no definite installed packages are omitted, even if their dirs are present.

This is mostly because this is the only way to disambiguate between a temporary directory and a category.

It is mostly equivalent to

  find /var/db/pkg \
    -maxdepth 1 \
    -mindepth 1 \
    -not -empty \
    -printf '%f\n'

And should be similarly performant.


Returns a list of valid packages in CAT/PN-VERSION form.

  my ( @packages ) = $vdb->packages();
  # Show only packages in dev-perl, much faster
  my ( @packages ) = $vdb->packages({ in => 'dev-perl' });

This is mostly equivalent to:

  find /var/db/pkg      \
      -maxdepth 2       \
      -mindepth 2       \
      -not -empty       \
      -printf '%p\n' |  \
    sed -r 's|^.*/([^/]+)/([^/]+)$|\1/\2|'

  find /var/db/pkg/dev-perl   \
      -maxdepth 1             \
      -mindepth 1             \
      -not -empty             \
      -printf '%p\n'        | \
    sed -r 's|^.*/([^/]+)/([^/]+)$|\1/\2|'

And should be similarly performant.


Returns a list of hash entries describing properties of the given CAT/PN-VERSION

  my ( @properties ) = $vdb->properties({ for => 'dev-lang/perl-5.22.1-r1' });

A property contains:

    property =>  .... # the name of the property ( backend specific )
    label    =>  .... # usually the same as 'property' but is defined by
                      # Gentoo::VDB, some special cases like
                      # 'special:source_ebuild' and 'unknown:' . $property
                      # exist.
    type     =>  .... # Gentoo::VDB specific hint for decoding the
                      # data.
    for      =>  .... # CAT/PN-V entry

    # Selectively ...
    content  =>       # For "generic" types like "file", this is generally
                      # a MIME type for the undelying decoded data.
                      # ie: No VDB Specific decoding hint, just amorphous
                      # blob of bytes that have to be handled thusly
                      # eg: text/plain, application/octet-stream

    encoding =>       # if the data has some sort of protocol encoding,
                      # for instance, a bzip encoded text source
                      # this will be populated respectively, eg:
                      # application/x-bzip2

A given record may overlap with another record in part, eg: One "property" may yield 2 different hashes with different labels and types.

But this is just an idea at this stage, and there's no implementation behind it.

Mostly pertinent for large objects like `environment.bz2` that can yield additional metadata.


Fetch a given property as a string blob

  my $prop = $vdb->get_property({ for => 'dev-lang/perl-5.22.1-r1', property => 'BackendName' });


Kent Fredric <>


This software is copyright (c) 2016 by Kent Fredric.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.