Hi
As Jonatan pointed out some time ago, there is a lot of code duplication in the current pakfire code. This patch introduces a function to parse meta files which is now called instead of the repetative blocks parsing the files throughout the pakfire code.
This also in preparation of upcomming changes to use extra meta-data introduced in my earlier patch (and preventing once more a bunch of code duplication there).
Regards Robin
Removing a lot of duplicate code parsing meta files, now replaced by simple function calls, resulting in all metadata in one hash.
Signed-off-by: Robin Roevens robin.roevens@disroot.org --- src/pakfire/lib/functions.pl | 129 +++++++++++++---------------------- 1 file changed, 49 insertions(+), 80 deletions(-)
diff --git a/src/pakfire/lib/functions.pl b/src/pakfire/lib/functions.pl index f9a19b60d..79ef7a12d 100644 --- a/src/pakfire/lib/functions.pl +++ b/src/pakfire/lib/functions.pl @@ -2,7 +2,7 @@ ############################################################################### # # # IPFire.org - A linux based firewall # -# Copyright (C) 2007-2015 IPFire Team info@ipfire.org # +# Copyright (C) 2007-2021 IPFire Team info@ipfire.org # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # @@ -376,11 +376,10 @@ sub dbgetlist { }
# Update the meta database if new packages was in the package list - my @meta; my $file; my $line; my $prog; - my ($name, $version, $release); + my %metadata; my @templine;
open(FILE, "<$Conf::dbdir/lists/packages_list.db"); @@ -395,28 +394,14 @@ sub dbgetlist { next if ( $file eq ".." ); next if ( $file eq "meta-" ); next if ( $file =~ /^old/ ); - open(FILE, "<$Conf::dbdir/meta/$file"); - @meta = <FILE>; - close(FILE); - foreach $line (@meta) { - @templine = split(/: /,$line); - if ("$templine[0]" eq "Name") { - $name = $templine[1]; - chomp($name); - } elsif ("$templine[0]" eq "ProgVersion") { - $version = $templine[1]; - chomp($version); - } elsif ("$templine[0]" eq "Release") { - $release = $templine[1]; - chomp($release); - } - } + %metadata = parsemetafile("$Conf::dbdir/meta/$file"); + foreach $prog (@db) { @templine = split(/;/,$prog); - if (("$name" eq "$templine[0]") && ("$release" ne "$templine[2]")) { - move("$Conf::dbdir/meta/meta-$name","$Conf::dbdir/meta/old_meta-$name"); - fetchfile("meta/meta-$name", ""); - move("$Conf::cachedir/meta-$name", "$Conf::dbdir/meta/meta-$name"); + if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" ne "$templine[2]")) { + move("$Conf::dbdir/meta/meta-$metadata{'Name'}","$Conf::dbdir/meta/old_meta-$metadata{'Name'}"); + fetchfile("meta/meta-$metadata{'Name'}", ""); + move("$Conf::cachedir/meta-$metadata{'Name'}", "$Conf::dbdir/meta/meta-$metadata{'Name'}"); } } } @@ -429,12 +414,11 @@ sub dblist { # filter may be: all, notinstalled, installed my $filter = shift; my $forweb = shift; - my @meta; my @updatepaks; my $file; my $line; my $prog; - my ($name, $version, $release); + my %metadata; my @templine; ### Make sure that the list is not outdated. @@ -470,30 +454,16 @@ sub dblist { next if ( $file eq "." ); next if ( $file eq ".." ); next if ( $file =~ /^old/ ); - open(FILE, "<$Conf::dbdir/installed/$file"); - @meta = <FILE>; - close(FILE); - foreach $line (@meta) { - @templine = split(/: /,$line); - if ("$templine[0]" eq "Name") { - $name = $templine[1]; - chomp($name); - } elsif ("$templine[0]" eq "ProgVersion") { - $version = $templine[1]; - chomp($version); - } elsif ("$templine[0]" eq "Release") { - $release = $templine[1]; - chomp($release); - } - } + %metadata = parsemetafile("$Conf::dbdir/installed/$file"); + foreach $prog (@db) { @templine = split(/;/,$prog); - if (("$name" eq "$templine[0]") && ("$release" < "$templine[2]" && "$forweb" ne "notice")) { - push(@updatepaks,$name); + if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" < "$templine[2]" && "$forweb" ne "notice")) { + push(@updatepaks,$metadata{'Name'}); if ("$forweb" eq "forweb") { - print "<option value="$name">Update: $name -- Version: $version -> $templine[1] -- Release: $release -> $templine[2]</option>\n"; + print "<option value="$metadata{'Name'}">Update: $metadata{'Name'} -- Version: $metadata{'ProgVersion'} -> $templine[1] -- Release: $metadata{'Release'} -> $templine[2]</option>\n"; } else { - my $command = "Update: $name\nVersion: $version -> $templine[1]\nRelease: $release -> $templine[2]\n"; + my $command = "Update: $metadata{'Name'}\nVersion: $metadata{'ProgVersion'} -> $templine[1]\nRelease: $metadata{'Release'} -> $templine[2]\n"; if ("$Pakfire::enable_colors" eq "1") { print "$color{'lila'}$command$color{'normal'}\n"; } else { @@ -548,18 +518,9 @@ sub resolvedeps_one { message("PAKFIRE RESV: $pak: Resolving dependencies..."); - open(FILE, "<$Conf::dbdir/meta/meta-$pak"); - my @file = <FILE>; - close(FILE); - - my $line; - my (@templine, @deps, @all); - foreach $line (@file) { - @templine = split(/: /,$line); - if ("$templine[0]" eq "Dependencies") { - @deps = split(/ /, $templine[1]); - } - } + my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak"); + my @all; + my @deps = split(/ /, $metadata{'Dependencies'}); chomp (@deps); foreach (@deps) { if ($_) { @@ -679,20 +640,40 @@ sub getsize { getmetafile("$pak"); - open(FILE, "<$Conf::dbdir/meta/meta-$pak"); - my @file = <FILE>; + if (my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak")) { + return $metadata{'Size'}; + } + return 0; +} + +sub parsemetafile { + ### This subroutine returns a hash with the contents of a meta- file + # Pass path to metafile as argument: Pakfire::parsemetafile("$Conf::dbdir/meta/meta-$pak") + # Usage is always with an argument. + my $metafile = shift; + + my %metadata = (); + + my @templine; + my @file; + + if (! -e $metafile ) { + return 0; + } + + open(FILE, "<$metafile"); + @file = <FILE>; close(FILE); - my $line; - my @templine; - foreach $line (@file) { - @templine = split(/: /,$line); - if ("$templine[0]" eq "Size") { + foreach (@file) { + @templine = split(/: /,$_); + if ($templine[1]) { chomp($templine[1]); - return $templine[1]; + $metadata{"$templine[0]"} = $templine[1]; } } - return 0; + + return %metadata; }
sub decryptpak { @@ -715,20 +696,8 @@ sub getpak {
getmetafile("$pak"); - open(FILE, "<$Conf::dbdir/meta/meta-$pak"); - my @file = <FILE>; - close(FILE); - - my $line; - my $file; - my @templine; - foreach $line (@file) { - @templine = split(/: /,$line); - if ("$templine[0]" eq "File") { - chomp($templine[1]); - $file = $templine[1]; - } - } + my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak"); + my $file = $metadata{'File'}; unless ($file) { message("No filename given in meta-file.");
Hello Robin,
again, sorry for the late reply. This patch looks good to me.
Reviewed-by: Peter Müller peter.mueller@ipfire.org
Thanks, and best regards, Peter Müller
Removing a lot of duplicate code parsing meta files, now replaced by simple function calls, resulting in all metadata in one hash.
Signed-off-by: Robin Roevens robin.roevens@disroot.org
src/pakfire/lib/functions.pl | 129 +++++++++++++---------------------- 1 file changed, 49 insertions(+), 80 deletions(-)
diff --git a/src/pakfire/lib/functions.pl b/src/pakfire/lib/functions.pl index f9a19b60d..79ef7a12d 100644 --- a/src/pakfire/lib/functions.pl +++ b/src/pakfire/lib/functions.pl @@ -2,7 +2,7 @@ ############################################################################### # # # IPFire.org - A linux based firewall # -# Copyright (C) 2007-2015 IPFire Team info@ipfire.org # +# Copyright (C) 2007-2021 IPFire Team info@ipfire.org # # # # This program is free software: you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # @@ -376,11 +376,10 @@ sub dbgetlist { }
# Update the meta database if new packages was in the package list
- my @meta; my $file; my $line; my $prog;
- my ($name, $version, $release);
my %metadata; my @templine;
open(FILE, "<$Conf::dbdir/lists/packages_list.db");
@@ -395,28 +394,14 @@ sub dbgetlist { next if ( $file eq ".." ); next if ( $file eq "meta-" ); next if ( $file =~ /^old/ );
open(FILE, "<$Conf::dbdir/meta/$file");
@meta = <FILE>;
close(FILE);
foreach $line (@meta) {
@templine = split(/\: /,$line);
if ("$templine[0]" eq "Name") {
$name = $templine[1];
chomp($name);
} elsif ("$templine[0]" eq "ProgVersion") {
$version = $templine[1];
chomp($version);
} elsif ("$templine[0]" eq "Release") {
$release = $templine[1];
chomp($release);
}
}
%metadata = parsemetafile("$Conf::dbdir/meta/$file");
- foreach $prog (@db) { @templine = split(/;/,$prog);
if (("$name" eq "$templine[0]") && ("$release" ne "$templine[2]")) {
move("$Conf::dbdir/meta/meta-$name","$Conf::dbdir/meta/old_meta-$name");
fetchfile("meta/meta-$name", "");
move("$Conf::cachedir/meta-$name", "$Conf::dbdir/meta/meta-$name");
if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" ne "$templine[2]")) {
move("$Conf::dbdir/meta/meta-$metadata{'Name'}","$Conf::dbdir/meta/old_meta-$metadata{'Name'}");
fetchfile("meta/meta-$metadata{'Name'}", "");
} }move("$Conf::cachedir/meta-$metadata{'Name'}", "$Conf::dbdir/meta/meta-$metadata{'Name'}"); }
@@ -429,12 +414,11 @@ sub dblist { # filter may be: all, notinstalled, installed my $filter = shift; my $forweb = shift;
- my @meta; my @updatepaks; my $file; my $line; my $prog;
- my ($name, $version, $release);
my %metadata; my @templine;
### Make sure that the list is not outdated.
@@ -470,30 +454,16 @@ sub dblist { next if ( $file eq "." ); next if ( $file eq ".." ); next if ( $file =~ /^old/ );
open(FILE, "<$Conf::dbdir/installed/$file");
@meta = <FILE>;
close(FILE);
foreach $line (@meta) {
@templine = split(/\: /,$line);
if ("$templine[0]" eq "Name") {
$name = $templine[1];
chomp($name);
} elsif ("$templine[0]" eq "ProgVersion") {
$version = $templine[1];
chomp($version);
} elsif ("$templine[0]" eq "Release") {
$release = $templine[1];
chomp($release);
}
}
%metadata = parsemetafile("$Conf::dbdir/installed/$file");
foreach $prog (@db) { @templine = split(/\;/,$prog);
if (("$name" eq "$templine[0]") && ("$release" < "$templine[2]" && "$forweb" ne "notice")) {
push(@updatepaks,$name);
if (("$metadata{'Name'}" eq "$templine[0]") && ("$metadata{'Release'}" < "$templine[2]" && "$forweb" ne "notice")) {
push(@updatepaks,$metadata{'Name'}); if ("$forweb" eq "forweb") {
print "<option value=\"$name\">Update: $name -- Version: $version -> $templine[1] -- Release: $release -> $templine[2]</option>\n";
print "<option value=\"$metadata{'Name'}\">Update: $metadata{'Name'} -- Version: $metadata{'ProgVersion'} -> $templine[1] -- Release: $metadata{'Release'} -> $templine[2]</option>\n"; } else {
my $command = "Update: $name\nVersion: $version -> $templine[1]\nRelease: $release -> $templine[2]\n";
my $command = "Update: $metadata{'Name'}\nVersion: $metadata{'ProgVersion'} -> $templine[1]\nRelease: $metadata{'Release'} -> $templine[2]\n"; if ("$Pakfire::enable_colors" eq "1") { print "$color{'lila'}$command$color{'normal'}\n"; } else {
@@ -548,18 +518,9 @@ sub resolvedeps_one {
message("PAKFIRE RESV: $pak: Resolving dependencies...");
- open(FILE, "<$Conf::dbdir/meta/meta-$pak");
- my @file = <FILE>;
- close(FILE);
- my $line;
- my (@templine, @deps, @all);
- foreach $line (@file) {
@templine = split(/\: /,$line);
if ("$templine[0]" eq "Dependencies") {
@deps = split(/ /, $templine[1]);
}
- }
- my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak");
- my @all;
- my @deps = split(/ /, $metadata{'Dependencies'}); chomp (@deps); foreach (@deps) { if ($_) {
@@ -679,20 +640,40 @@ sub getsize {
getmetafile("$pak");
- open(FILE, "<$Conf::dbdir/meta/meta-$pak");
- my @file = <FILE>;
- if (my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak")) {
return $metadata{'Size'};
- }
- return 0;
+}
+sub parsemetafile {
- ### This subroutine returns a hash with the contents of a meta- file
- # Pass path to metafile as argument: Pakfire::parsemetafile("$Conf::dbdir/meta/meta-$pak")
- # Usage is always with an argument.
- my $metafile = shift;
- my %metadata = ();
- my @templine;
- my @file;
- if (! -e $metafile ) {
return 0;
- }
- open(FILE, "<$metafile");
- @file = <FILE>; close(FILE);
- my $line;
- my @templine;
- foreach $line (@file) {
@templine = split(/\: /,$line);
if ("$templine[0]" eq "Size") {
- foreach (@file) {
@templine = split(/\: /,$_);
if ($templine[1]) { chomp($templine[1]);
return $templine[1];
} }$metadata{"$templine[0]"} = $templine[1];
- return 0;
- return %metadata;
}
sub decryptpak { @@ -715,20 +696,8 @@ sub getpak {
getmetafile("$pak");
- open(FILE, "<$Conf::dbdir/meta/meta-$pak");
- my @file = <FILE>;
- close(FILE);
- my $line;
- my $file;
- my @templine;
- foreach $line (@file) {
@templine = split(/\: /,$line);
if ("$templine[0]" eq "File") {
chomp($templine[1]);
$file = $templine[1];
}
- }
my %metadata = parsemetafile("$Conf::dbdir/meta/meta-$pak");
my $file = $metadata{'File'};
unless ($file) { message("No filename given in meta-file.");