This is all Pav’s fault. The conversation went something like this (other conversations trimmed):
[15:32] <Pav> dvl: around?
[15:39] <dvl> Pav: here!
[15:41] <dvl> .ping Pav
[15:41] <dvl> ping Pav
[15:41] *** ¢ PING sent to Pav
[15:41] *** ¢ PING reply of 3.25 s from Pav
[15:41] <dvl> third time works
[15:42] <laemodost> Ping timeout.
[15:43] <dvl> yueah
[15:49] <Pav> dvl: hey hey.. been afk
[15:49] <dvl> me too
[15:49] <Pav> dvl: I noticed freshports don’t have descriptions for virtual categories.
[15:49] <Pav> dvl: you can parse them easily from www/en/ports/categories, if you want
[15:49] <dvl> Pav: Yes, I recall writing about it, but never working on it.
[15:49] <Pav> take it as a little improvement idea from me :)
[15:49] <dvl> let’s check the phorum
[15:49] <Pav> oh! okay then
[15:51] <dvl> Pav: http://news.freshports.org/2006/07/19/virtual-categories-have-no-descriptions/
[15:54] <Pav> dvl: great… so, when is it arriving to production?
[15:54] <dvl> NFI
[15:56] <dvl> well, that script works!
Nearly two hours later, I figured out how to use what Anton Berezin sent me many months ago;. The resulting script appears below, along with the output.
This leaves just five categories without descriptions:
freshports.org=# select name, description from categories where description like 'This%' order by name; name | description ----------+---------------------------------------------------------- offix | This is a virtual category. No description is available. paralell | This is a virtual category. No description is available. perl | This is a virtual category. No description is available. php | This is a virtual category. No description is available. tk42 | This is a virtual category. No description is available. (5 rows) freshports.org=#
The code appears below, along with the output. Hopefully I’ll be able to run this on production soon, and automate it.
#! /usr/bin/perl #use 5.006; use warnings; use strict; use category; use DBI; use database; use utilities; use constants; my $dbh; my $sql; my $sth; my @row; use Text::CSV_XS; # textproc/p5-Text-CSV_XS # = for testing use Data::Dumper; FreshPorts::Utilities::InitSyslog(); $dbh = FreshPorts::Database::GetDBHandle(); my @Categories = parse_categories(shift); #print Dumper [@Categories]; # = end of test update_each_category($dbh, @Categories); $dbh->commit(); $dbh->disconnect(); sub update_each_category { my $dbh = shift; my @Categories = @_; my $category = FreshPorts::Category->new($dbh); foreach my $value (@Categories) { # print $value->{category} . "\n"; $category->{name} = $value->{category}; $category->{id} = 0; if ($category->FetchByName()) { # print $category->{name} . ": old: " . $category->{description} . " new: ". # $value->{description}. "\n"; $category->{description} = $value->{description}; $category->save(); } else { FreshPorts::Utilities::ReportError('err', "Could not find category " . $value->{category}, 1); } } } # Input: filename # Output: an array of hashes representing categories, # each hash having fields named "category", # "description", and "class" sub parse_categories { my ($fn) = @_; open my $fh, "<", $fn or die "cannot open $fn: $!n"; my $csv = Text::CSV_XS->new(); my @r; while (<$fh>) { chomp; next if /^s*#/; next if /^s*$/; if ($csv->parse($_)) { my @c = $csv->fields; if (@c != 3) { warn "oops, got " . scalar(@c) . " fields at line $. while expecting 3n"; next; } push @r, { category => $c[0], description => $c[1], class => $c[2], }; } else { warn "oops, cannot parse line $.n"; } } close $fh; return @r; }