]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/commitdiff
pakfire: Add getmetadata function
authorRobin Roevens <robin.roevens@disroot.org>
Thu, 28 Jul 2022 11:21:35 +0000 (13:21 +0200)
committerPeter Müller <peter.mueller@ipfire.org>
Thu, 28 Jul 2022 13:44:29 +0000 (13:44 +0000)
- Added new getmetadata function for easy access to all available
  metadata of a pak without knowledge about or need to parse
  pakfire internal db files.
- Added new 'pakfire info' functionality for displaying all available
  metadata of (a) pak(s) to the user, using the new getmetadata.

Signed-off-by: Robin Roevens <robin.roevens@disroot.org>
src/pakfire/lib/functions.pl
src/pakfire/pakfire

index f87589bc447e14999670efd1a746b9e95adc253c..1ebf98775891e31365fcc720c7cf2cb0dee13af2 100644 (file)
@@ -115,6 +115,7 @@ sub usage {
   &Pakfire::message("               <update> - Contacts the servers for new lists of paks.");
   &Pakfire::message("               <upgrade> - Installs the latest version of all paks.");
   &Pakfire::message("               <list> [installed/notinstalled/upgrade] - Outputs a list with all, installed, available or upgradeable paks.");
+  &Pakfire::message("               <info> <pak> [<pak> ...] - Output pak metadata.");
   &Pakfire::message("               <status> - Outputs a summary about available core upgrades, updates and a required reboot");
   &Pakfire::message("");
   &Pakfire::message("       Global options:");
@@ -706,6 +707,60 @@ sub parsemetafile {
        return %metadata;
 }
 
+sub getmetadata {
+       ### This subroutine returns a hash of available info for a package
+       #   Pass package name and type of info as argument: Pakfire::getmetadata(package, type_of_info) 
+       #       Type_of_info can be "latest" or "installed"
+       #   Usage is always with two argument.
+       my ($pak, $type) = @_;
+
+       my %metadata = (
+               Name => $pak, 
+               Installed => "no",
+               Available => "no");
+       my %installed_metadata = ();
+
+       my @templine;
+       my @file;
+
+       ### Get available version information
+       if ("$type" eq "latest") {
+               ### Check if package is in packages_list and get latest available version
+               my %db = Pakfire::dblist("all");
+               
+               if (defined $db{$pak}) {
+                       ### Get and parse latest available metadata
+                       if (getmetafile("$pak")) {
+                               %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak");
+
+                               $metadata{'Available'} = "yes";
+                               ### Rename version info fields
+                               $metadata{'AvailableProgVersion'} = delete $metadata{'ProgVersion'};
+                               $metadata{'AvailableRelease'} = delete $metadata{'Release'};
+                       }
+               }
+       }
+       
+       ### Parse installed pak metadata
+       if (&isinstalled($pak) == 0) {
+           %installed_metadata = parsemetafile("$Conf::dbdir/installed/meta-$pak");
+
+               if ("$type" eq "latest" && exists($metadata{'AvailableProgVersion'})) {
+                       ### Add installed version info to latest metadata
+                       $metadata{'ProgVersion'} = $installed_metadata{'ProgVersion'};
+                       $metadata{'Release'} = $installed_metadata{'Release'};
+               } else {
+                       ### Use metadata of installed pak
+                       %metadata = %installed_metadata;
+               }
+               $metadata{'Installed'} = 'yes';
+       } else {
+               $metadata{'Installed'} = 'no';
+       }
+
+       return %metadata;
+}
+
 sub decryptpak {
        my $pak = shift;
 
index 331204a000cc664944571d1a785cdb29450022fa..389c1399daaba179ef5c1a16843a7a7ee9b99b27 100644 (file)
                                exit 1;
                        }
                }
+       } elsif ("$ARGV[0]" eq "info") {
+               shift;
+
+               my @paks;
+               my $pak;
+               foreach $pak (@ARGV) {
+                       unless ("$pak" =~ "^-") {
+                               push(@paks,$pak);
+                       }
+               }
+
+               unless ("@paks") {
+                       Pakfire::message("PAKFIRE ERROR: missing package name");
+                       Pakfire::usage;
+                       exit 1;
+               }
+
+               foreach $pak (@paks) {
+                       my %metadata = Pakfire::getmetadata($pak, "latest");
+
+                       ### Check if pakfile was actually found
+                       if ($metadata{'Installed'} eq "no" && $metadata{'Available'} eq "no") {
+                               Pakfire::message("PAKFIRE WARN: Pak '$pak' not found.");
+                               last;
+                       }
+
+                       unless (defined $metadata{'Available'}) {
+                               Pakfire::message("PAKFIRE WARN: Unable to retrieve latest metadata for $pak. Information may be outdated.")
+                       }
+
+                       ### Printout metadata in a user friendly format
+                       print "Name: $metadata{'Name'}\n";
+                       print "Summary: $metadata{'Summary'}\n";
+                       if ($metadata{'Available'} eq "yes") {
+                               print "Version: $metadata{'AvailableProgVersion'}-$metadata{'AvailableRelease'}\n";
+                       } else {
+                               print "Version: $metadata{'ProgVersion'}-$metadata{'Release'}\n";
+                       }
+                       print "Size: " . Pakfire::beautifysize("$metadata{'Size'}") . "\n";
+                       print "Dependencies: $metadata{'Dependencies'}\n";
+                       print "Pakfile: $metadata{'File'}\n";
+                       print "Service InitScripts: $metadata{'Services'}\n";
+                       print "Installed: $metadata{'Installed'}\n";
+                       ### Generate a pak status message
+                       if (! defined $metadata{'Available'}) {
+                               print "Status: unknown (an error occured retrieving latest pak metadata)";
+                       } elsif ($metadata{'Available'} eq "no") {
+                               print "Status: obsolete (version $metadata{'ProgVersion'}-$metadata{'Release'} is installed)\n";
+                       } elsif ($metadata{'Installed'} eq "yes" && "$metadata{'Release'}" < "$metadata{'AvailableRelease'}") {
+                               print "Status: outdated (version $metadata{'ProgVersion'}-$metadata{'Release'} is installed)\n";
+                       } elsif ($metadata{'Installed'} eq "yes") {
+                               print "Status: up-to-date\n";
+                       } else {
+                               print "Status: not installed\n";
+                       }
+                       print "\n";
+               }
+
        } elsif ("$ARGV[0]" eq "resolvedeps") {
                foreach (@ARGV) {
                        next if ("$_" eq "resolvedeps");