Provided by: lintian_2.5.81ubuntu1_all bug

NAME

       Lintian::Lab -- Interface to the Lintian Lab

SYNOPSIS

        use Lintian::Lab;

        # Static lab
        my $lab = Lintian::Lab->new ('/var/lib/lintian/static-lab');

        if (!$lab->exists) {
            $lab->create;
        }
        $lab->open;

        # Fetch a package from the lab
        my $lpkg = $lab->get_package ('lintian', 'binary', '2.5.4', 'all');

        my $visitor = sub {
            my ($lpkg, $pkg_name, $pkg_ver, $pkg_arch) = @_;
            # do stuff with that entry
        };
        $lab->visit_packages ($visitor, 'source');

        $lab->close;

DESCRIPTION

       This module provides an abstraction from "How and where" packages are placed.  It handles
       creation and deletion of the Lintian Lab itself as well as providing access to the
       entries.

CLASS METHODS

       new ([DIR])
           Creates a new Lab instance.  If DIR is defined it will be used as the path to the lab
           and the lab will be in static mode.  Otherwise the lab will be in temporary mode and
           will point to a temporary directory.

INSTANCE METHODS

       dir Returns the absolute path to the base of the lab.

           Note: This may return the empty string if either the lab has been deleted or this is a
           temporary lab that has not been created yet.  In the latter case, "create" or "open"
           should be run to get a non-empty value from this method.

       is_open
           Returns a truth value if this lab is open.

           Note: If the lab is open, it also exists.  However, if the lab is closed then the lab
           may or may not exist (see "exists").

       exists
           Returns a truth value if the instance points to an existing lab.

           Note: This never implies that the lab is open.  Though it may imply the lab is closed
           (see "is_open").

       get_package (NAME, TYPE[, EXTRA]), get_package (PROC)
           Fetches an existing package from the lab.

           The first argument can be a processable.  In that case all other arguments are
           ignored.

           If the first calling convention is used then this method will search for an existing
           package.  The EXTRA argument can be used to narrow the search or even to add a new
           entry.

           EXTRA consists of (in order):

           •   version

           •   arch (ignored if TYPE is "source")

           If version or arch is omitted (or if it is undef) then that search parameter is
           consider a wildcard for "any".  Example:

            # Returns all eclipse-platform packages with architecture i386 regardless
            # of their version (if any)
            @ps  = $lab->get_package ('eclipse-platform', 'binary', undef, 'i386');
            # Returns all eclipse-platform packages with version 3.5.2-11 regardless
            # of their architecture (if any)
            @ps  = $lab->get_package ('eclipse-platform', 'binary', '3.5.2-11');
            # Return the eclipse-platform package with version 3.5.2-11 and architecture
            # i386 (or undef)
            $pkg = $lab->get_package ('eclipse-platform', 'binary', '3.5.2-11', 'i386');

           In list context, this returns a list of matches.  In scalar context this returns the
           first match (if any).  Note there is no guaranteed order (e.g. the returned list is
           not ordered).

           If the second calling convention is used, then this method will search for an entry
           matching the processable passed.  If such an entry does not exists, a new "non-
           existing" entry will be returned.  This entry can be created by using the create
           method on the entry.

       lab_query (QUERY)
           Process a given QUERY and return the results from it.  A QUERY is a string of the
           format:

             [TYPE:]NAME[/VERSION[/ARCH]]

           TYPE can be one of the regular package type (e.g. "binary") or one of the two special
           values "ALL" (default if omitted) or "GROUP".  If TYPE is ALL, then the query is one
           once for each of package type.

           NAME is the name of the package to request.  For GROUP queries, this is the name of
           the source package.  It is not possible to do any kind of wildcards in NAME:

           VERSION is the version of the package.  For GROUP queries, this is the version of the
           source package.  If omitted or the string '_', then any version will match.

           ARCH is the architecture of the package.  For GROUP and "source" queries, ARCH is
           ignored (if given).  If ARCH is omitted or the string '_', then any package
           architecture will match.  NB: The ARCH field should match the architecture field of
           the entry (which for .changes files usually contains spaces).

           lab_query will return a list of entries matching the query.  If no entries match, an
           empty list will be returned.

       visit_packages (VISITOR[, TYPE])
           Passes each lab entry to VISITOR.  If TYPE is passed, then only entries of that type
           are passed.

           VISITOR is given a reference to the entry, the package name, the package version and
           the package architecture (may be undef for source packages).

       generate_diffs (LIST)
           Each member of LIST must be a Lintian::Lab::Manifest.

           The lab will generate a diff between the given member and its state for the given
           package type.

           The diffs are accurate until the original manifest is modified or a package is added
           or removed to the lab.

       repair
           Checks the lab contents against the current meta-data and syncs them.  The lab must be
           open and should not be access while this method is running.

           This returns the number of corrections done by this process.  If there were any
           corrections, the state files are written before returning.

           The method may croak if it is unable to do a full check of the lab or if it is unable
           to write the corrected metadata.

           Note: This may (and generally will) correct "broken" entries by removing them.

       create ([OPTS])
           Creates a new lab.  It will create "dir" if it does not exist.  It will also create a
           basic empty lab.  If this is a temporary lab, this method will also setup the
           temporary dir for the lab.

           The lab will not be opened by this method.  This should be done afterwards by invoking
           the "open" method.

           OPTS (if present) is a hashref containing options.  The following options are
           accepted:

           keep-lab
               If "keep-lab" points to a truth value the temporary directory will not be removed
               by closing the lab (nor exiting the application).  However, explicitly calling
               "remove" will remove the lab.

           mode
               If present, this will be used as mode for creating directories.  Will default to
               0777 if not specified.  It is passed to mkdir and is thus subject to umask
               settings.

           Note: This will not create parent directories of "dir" and will croak if these does
           not exist.

           Note: This may update the value of "dir" as resolving the path requires it to exist.

           Note: This does nothing if the lab appears to already exists.

       open
           Opens the lab and reads the contents into caches.  If the lab is temporary and does
           not exists, this method will call create to initialize the temporary lab.

           This will croak if the lab is already open.  It may also croak for the same reasons as
           "create" if the lab is temporary.

           Note: for static labs, "dir" must point to an existing consistent lab or this will
           croak.  To open a new lab, please use "create".

           Note: It is not possible to pass options to the creation of the temporary lab.  If
           special options are required, please use "create" directly.

       close
           Close the lab - all state caches will be flushed to the disk and the lab can no longer
           be used.  All references to entries in the lab should be considered invalid.

           Note: if the lab is a temporary one, this will be deleted unless it was created with
           "keep-lab" (see "create").

       remove
           Removes the lab and everything in it.  Any reference to an entry returned from this
           lab will immediately become invalid.

           If this is a temporary lab, the lab root dir (as returned "dir") will be removed as
           well on success.  Otherwise the lab root dir will not be removed by this call.

           On success, this will return a truth value.  If the lab is a temporary lab, the
           directory path will be set to the empty string (that is, "dir" will return '').

           On error, this method will croak.

           If the lab has already been removed (or does not exist), this will return a truth
           value.

       is_temp
           Returns a truth value if lab is a temporary lab.

           Note: This returns a truth value, even if the lab was created with the "keep-lab"
           property.

Changes to the lab format.

       Lab formats up to (and including) "10" used to store the lab format with each entry.  The
       files in $LAB/info/ were used to list packages from a mirror (dist).

       In lab format 11 the lab format is stored in $LAB/info/lab-info.  The rest of the files in
       $LAB/info/* have been re-purposed to be a list of packages in the lab.

       The $LAB/info/lab-info is parsed as a debian control file (See Debian Policy Manual X5.1
       for syntax).  The consists of a single paragraph and only the following fields are
       allowed:

       Lab-Format (simple, mandatory)
           This field contains the lab format of this lab.  Generally this is simply an integer
           (though during development non-integers have been used).

       Layout (simple, optional)
           The layout parameter describes how packages are stored in the lab.  Currently the only
           accepted value is "pool" and the value is not case-sensitive.

           The pool format dictates that packages are stored in:

            pool/$l/${name}/${name}_${version}[_${arch}]_${type}/

           Note that $arch is left out for source packages, $l is the first letter of the package
           name (except if the name starts with "lib", then it is the first 4 letters of the
           package name).  Whitespace (e.g. " ") are replaced with dashes ("-") and colons (":")
           with underscores ("_").

           If the field is missing, it defaults to "pool".

       It is allowed to use comments in $LAB/info/lab-info as described in the Debian Policy
       Manual X5.1.

AUTHOR

       Niels Thykier <niels@thykier.net>

       Based on the work of various others.