From: Robin Roevens <robin.roevens@disroot.org>
To: development@lists.ipfire.org
Subject: Re: [PATCH 2/3] pakfire: add 'info <pak(s)>' option
Date: Fri, 14 May 2021 22:24:41 +0200 [thread overview]
Message-ID: <4db47b94d6099c34bee4239b5fad7d3b27af8b5a.camel@disroot.org> (raw)
In-Reply-To: <DD252A9B-2A7D-4B9B-8B74-BD946F8293A3@ipfire.org>
[-- Attachment #1: Type: text/plain, Size: 16742 bytes --]
Hi
Michael Tremer schreef op vr 14-05-2021 om 13:19 [+0100]:
> Hello,
>
> All the mess is probably my fault. I was young and had no clue what I
> was doing. Now I am older… still not having a clue what I am doing.
>
We all were young once.. and who really does have a clue of what he is
actually doing :-)..
> I would say your solution looks clean, but as Jonatan suggested, a
> unique function to read the package metadata and return it as a hash
> would help. If you want to add that, I am happy to merge the patch.
>
I will certainly look into that.
> Generally I am interested in seeing pakfire being tidied up a little
> bit, but that has to happen in small steps that are reviewable and
> testable. Anything that breaks might stop people from installing
> updates and us from shipping a fix.
>
Indeed pakfire is quite essential to be as bug-free as possible, so we
will have to be very carefully with it. I'll see what I can do over
time as I'm currently still a rookie in Perl; but I have plenty of
experience in different kinds of languages and scripts, that can come
in handy.
Robin
> -Michael
>
> > On 13 May 2021, at 20:11, Robin Roevens <robin.roevens(a)disroot.org>
> > wrote:
> >
> > Hi Jonatan
> >
> > I completely agree with your remarks about the code duplication and
> > the
> > separation of GUI vs logic.. Actually even a bit relieved..
> >
> > I only continued this way since I didn't want to 'break' with the
> > way
> > code was currently written and as I'm both very new here in this
> > group
> > and I never actually coded in Perl before.. I more or less assumed
> > this
> > is the way it is done here and it was not (yet) my 'right' to
> > question
> > it :-)..
> >
> > But I would be happy to introduce more reusable functions, less to
> > no
> > duplicate code and a more (m)vc-like approach to the code.
> >
> > In the meantime I have also been working on a .cgi page for the
> > zabbix
> > agent configuration.. completely in the style currently all cgi
> > pages
> > are where duplicate code is everywhere and logic and view are
> > mangled
> > together.. even with 'goto's all around the place (in most
> > languages
> > where 'goto' exists, it is some kind of taboo to actually use it..
> > except for plain old BASIC or so.. And it seems to be accepted in
> > the
> > Perl community too.. but still I frowned upon it :-)
> > Anyway, I was about to start thinking about giving up on it since I
> > would not want to maintain such code in the long run.
> >
> > But if it is ok for you guys to revamp the coding style to a more
> > "modern" style, I'm willing to give that a try..
> >
> > Regards
> > Robin
> >
> > Jonatan Schlag schreef op do 13-05-2021 om 10:02 [+0200]:
> > > Hi,
> > >
> > > had a look at your code and found some more generic possibilities
> > > to
> > > improve it :-)
> > >
> > > Am 2021-04-23 18:15, schrieb Robin Roevens:
> > > > Add an 'info <pak(s)>' option to pakfire to display pakfile
> > > > metadata
> > > > and current state of the pak on the system.
> > > >
> > > > Signed-off-by: Robin Roevens <robin.roevens(a)disroot.org>
> > > > ---
> > > > src/pakfire/lib/functions.pl | 124
> > > > ++++++++++++++++++++++++++++++++++-
> > > > src/pakfire/pakfire | 21 ++++++
> > > > 2 files changed, 144 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/src/pakfire/lib/functions.pl
> > > > b/src/pakfire/lib/functions.pl
> > > > index 4d5c6219a..46da06a88 100644
> > > > --- a/src/pakfire/lib/functions.pl
> > > > +++ b/src/pakfire/lib/functions.pl
> > > > @@ -110,7 +110,8 @@ sub usage {
> > > > &Pakfire::message("Usage: pakfire <install|remove> [options]
> > > > <pak(s)>");
> > > > &Pakfire::message(" <update> - Contacts the
> > > > servers
> > > > for new lists of paks.");
> > > > &Pakfire::message(" <upgrade> - Installs the
> > > > latest
> > > > version of all paks.");
> > > > - &Pakfire::message(" <list> - Outputs a short
> > > > list
> > > > with all available paks.");
> > > > + &Pakfire::message(" <list>
> > > > [installed/notinstalled] -
> > > > Outputs a list with all, installed or available paks.");
> > > > + &Pakfire::message(" <info> <pak(s)> - Output
> > > > pak
> > > > metadata.");
> > > > &Pakfire::message(" <status> - Outputs a
> > > > summary
> > > > about available core upgrades, updates and a required reboot");
> > > > &Pakfire::message("");
> > > > &Pakfire::message(" Global options:");
> > > > @@ -538,6 +539,127 @@ sub dblist {
> > > > }
> > > > }
> > > >
> > > > +sub pakinfo {
> > > > + ### This subroutine shows available info for a package
> > > > + # Pass package name and type of info as argument:
> > > > &Pakfire::pakinfo(package, "latest")
> > > > + # Type can be "latest" or "installed"
> > > > + # Usage is always with two argument.
> > > > + my $pak = shift;
> > > > + my $info_type = shift;
> > > > +
> > > > + my $found = 0;
> > > > + my @templine;
> > > > + my ($available_version, $available_release);
> > > > +
> > > > + if ("$info_type" eq "latest") {
> > > > + ### Make sure that the info is not outdated.
> > > > + &Pakfire::dbgetlist("noforce");
> > > > +
> > > > + ### Check if package is in packages_list and
> > > > get
> > > > latest available
> > > > version
> > > > + open(FILE,
> > > > "<$Conf::dbdir/lists/packages_list.db");
> > > > + my @db = <FILE>;
> > > > + close(FILE);
> > > > +
> > > > + foreach (@db) {
> > > > + @templine = split(/;/,$_);
> > > > + if ("$templine[0]" eq "$pak" ) {
> > > > + $found = 1;
> > > > + $available_version =
> > > > $templine[1];
> > > > + $available_release =
> > > > $templine[2];
> > > > + break;
> > > > + }
> > > > + }
> > > > + }
> > > > +
> > > We have somehow similar code in dblist(). A very good example of
> > > why
> > > UI
> > > code and logic should be split up.
> > > Just want to mention it. It is definitely not your fault, and I
> > > do
> > > not
> > > want to blame you for the errors others made. But maybe it would
> > > be worth it to think about a function which either returns
> > > something
> > > like that:
> > >
> > > { (package-name, status in {installed, needs-upgrade,
> > > notinstalled
> > > })}
> > >
> > > or that:
> > >
> > > [
> > > installed: {set of packages which are installed}
> > > needs upgrade: {self explanatory }
> > > not installed: {self explanatory }
> > > ]
> > >
> > > [] is a dictionary so in perl somehthing like %data = ();
> > > () is a tupel so in perl an array
> > > {} is a set so in perl an array
> > >
> > > and use this function here and in dblist.
> > >
> > > > + ### Parse latest package metadata
> > > > + my $installed = !&isinstalled("$pak");
> > > > + my @file;
> > > > +
> > > > + if ($found && "$info_type" eq "latest") {
> > > > + getmetafile("$pak");
> > > > +
> > > > + open(FILE, "<$Conf::dbdir/meta/meta-$pak");
> > > > + @file = <FILE>;
> > > > + close(FILE);
> > > > + } elsif ($installed) {
> > > > + open(FILE, "<$Conf::dbdir/installed/meta-
> > > > $pak");
> > > > + @file = <FILE>;
> > > > + close(FILE);
> > > You could open the file at 1
> > > > + } else {
> > > > + message("PAKFIRE WARN: Pak '$pak' not found.");
> > > > + return 1;
> > > > + }
> > >
> > > Here is 1 and deduplicate the code.
> > > > +
> > > > + my ($name, $summary, $size, $dependencies, $pakfile,
> > > > $initscripts);
> > > > + foreach $line (@file) {
> > > > + @templine = split(/\: /,$line);
> > > > + if ("$templine[0]" eq "Name") {
> > > > + $name = $templine[1];
> > > > + chomp($name);
> > > > + } elsif ("$templine[0]" eq "Summary") {
> > > > + $summary = $templine[1];
> > > > + chomp($summary);
> > > > + } elsif ("$templine[0]" eq "Size") {
> > > > + $size = &beautifysize("$templine[1]");
> > > > + chomp($size);
> > > > + } elsif ("$templine[0]" eq "Dependencies") {
> > > > + $dependencies = $templine[1];
> > > > + chomp($dependencies);
> > > > + } elsif ("$templine[0]" eq "File") {
> > > > + $pakfile = $templine[1];
> > > > + chomp($pakfile);
> > > > + } elsif ("$templine[0]" eq "InitScripts") {
> > > > + $initscripts = $templine[1];
> > > > + chomp($initscripts);
> > > > + }
> > > > + }
> > >
> > > And here I somehow do not know what to say :-). The problem is
> > > that
> > > both
> > > blocks are code duplication. But we already have this kind of
> > > code
> > > duplication at a lot of places (I counted 5).
> > > So it is ok to do it that way, but it would be better to have a
> > > function
> > > which just returns a hash, and you could do something like that:
> > >
> > > metadata = get_metadate("$pak")
> > >
> > > metdata["installed_version"]
> > >
> > > Both functions would be also highly testable as we could lay down
> > > an
> > > example file and test if this file is read correctly.
> > >
> > > If now someone wonders why I wrote this down, it may help to
> > > learn
> > > new
> > > things, as I do when I read the list. I am unsure what advice a
> > > should
> > > give you @Robin: it is not your fault that the code looks like it
> > > looks,
> > > but on the other hand, making things "wrong" only because others
> > > did
> > > it
> > > before is also a dead end. So I hope others have an idea, what to
> > > do.
> > >
> > > Greetings Jonatan
> > > > +
> > > > + ### Get installed version information
> > > > + my ($installed_version, $installed_release);
> > > > +
> > > > + if ($installed) {
> > > > + open(FILE, "<$Conf::dbdir/installed/meta-
> > > > $pak");
> > > > + @file = <FILE>;
> > > > + close(FILE);
> > > > +
> > > > + foreach $line (@file) {
> > > > + @templine = split(/\: /,$line);
> > > > + if ("$templine[0]" eq "ProgVersion") {
> > > > + $installed_version =
> > > > $templine[1];
> > > > + chomp($installed_version);
> > > > + } elsif ("$templine[0]" eq "Release") {
> > > > + $installed_release =
> > > > $templine[1];
> > > > + chomp($installed_release);
> > > > + }
> > > > + }
> > > > + }
> > > > +
> > > > + print "Name: $name\n";
> > > > + if ("$info_type" eq "latest") {
> > > > + print "Version: $available_version-
> > > > $available_release\n";
> > > > + } else {
> > > > + print "Version: $installed_version-
> > > > $installed_release\n";
> > > > + }
> > > > + print "Summary: $summary\nSize: $size\nDependencies:
> > > > $dependencies\nPakfile: $pakfile\nInitScripts: $initscripts\n";
> > > > + if ($installed) {
> > > > + print "Installed: Yes\n";
> > > > + } else {
> > > > + print "Installed: No\n";
> > > > + }
> > > > + if ("$info_type" eq "latest") {
> > > > + if (!$found) {
> > > > + print "Status: obsolete (version
> > > > $installed_version-$installed_release is installed)\n";
> > > > + } elsif ($installed && "$installed_release" <
> > > > "$available_release")
> > > > {
> > > > + print "Status: outdated (version
> > > > $installed_version-$installed_release is installed)\n";
> > > > + } elsif ($installed) {
> > > > + print "Status: up-to-date\n";
> > > > + } else {
> > > > + print "Status: not installed\n";
> > > > + }
> > > > + }
> > > > + print "\n";
> > > > +}
> > > > +
> > > > sub resolvedeps_one {
> > > > my $pak = shift;
> > > >
> > > > diff --git a/src/pakfire/pakfire b/src/pakfire/pakfire
> > > > index c69a8d3ad..5507c8e92 100644
> > > > --- a/src/pakfire/pakfire
> > > > +++ b/src/pakfire/pakfire
> > > > @@ -303,6 +303,27 @@
> > > > &Pakfire::message("PAKFIRE WARN: Not a
> > > > known option $ARGV[1]") if
> > > > ($ARGV[1]);
> > > > &Pakfire::dblist("all", "noweb");
> > > > }
> > > > +
> > > > + } 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) {
> > > > + &Pakfire::pakinfo("$pak", "latest");
> > > > + }
> > > >
> > > > } elsif ("$ARGV[0]" eq "resolvedeps") {
> > > > foreach (@ARGV) {
> > > > --
> > > > 2.31.1
> > >
> >
> >
> > --
> > Dit bericht is gescanned op virussen en andere gevaarlijke
> > inhoud door MailScanner en lijkt schoon te zijn.
> >
>
>
--
Dit bericht is gescanned op virussen en andere gevaarlijke
inhoud door MailScanner en lijkt schoon te zijn.
next prev parent reply other threads:[~2021-05-14 20:24 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-23 16:15 [PATCH 0/3] Pakfile metadata enhancements Robin Roevens
2021-04-23 16:15 ` [PATCH 1/3] buildprocess: Add extra metadata to meta-* files Robin Roevens
2021-05-12 18:49 ` Jonatan Schlag
2021-05-14 12:24 ` Michael Tremer
2021-05-14 20:07 ` Robin Roevens
2021-05-18 15:09 ` Michael Tremer
2021-05-24 20:23 ` Robin Roevens
2021-06-06 18:41 ` Robin Roevens
2021-06-10 11:27 ` Michael Tremer
2021-06-17 22:28 ` Robin Roevens
2021-06-18 8:32 ` Michael Tremer
2021-06-10 11:24 ` Michael Tremer
2021-05-14 12:23 ` Michael Tremer
2021-05-14 20:16 ` Robin Roevens
2021-05-18 11:12 ` Michael Tremer
2021-04-23 16:15 ` [PATCH 2/3] pakfire: add 'info <pak(s)>' option Robin Roevens
2021-05-13 8:02 ` Jonatan Schlag
2021-05-13 19:11 ` Robin Roevens
2021-05-14 12:19 ` Michael Tremer
2021-05-14 20:24 ` Robin Roevens [this message]
2021-05-25 11:22 ` Michael Tremer
2021-04-23 16:15 ` [PATCH 3/3] services.cgi: use new Pakfire::pakinfo function Robin Roevens
2021-05-11 19:30 ` group call for review/opinions/idea's (was: [PATCH 0/3] Pakfile metadata enhancements) Robin Roevens
2021-05-12 18:45 ` [PATCH 0/3] Pakfile metadata enhancements Jonatan Schlag
2021-05-12 22:31 ` Robin Roevens
2021-05-15 12:10 ` Adolf Belka
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4db47b94d6099c34bee4239b5fad7d3b27af8b5a.camel@disroot.org \
--to=robin.roevens@disroot.org \
--cc=development@lists.ipfire.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox