#! /usr/bin/perl # $OpenBSD: list_update_info,v 1.8 2022/05/29 12:12:42 espie Exp $ # # Copyright (c) 2022 Marc Espie # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above # copyright notice and this permission notice appear in all copies. # # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. use strict; use warnings; use OpenBSD::AddCreateDelete; package OpenBSD::PackingElement; sub write_for_locate { } package OpenBSD::PackingElement::Meta; sub write_for_locate { my ($self, $plist, $o) = @_; print {$o->{output}} $plist->pkgname, ":"; $self->write($o->{output}); } package OpenBSD::PackingElement::Comment; sub write_for_locate { } package OpenBSD::PackingElement::SpecialFile; sub write_for_locate { } package OpenBSD::PackingElement::ExtraInfo; sub write_for_locate { &OpenBSD::PackingElement::Meta::write_for_locate; } package OpenBSD::PackingElement::AlwaysUpdate; sub write_for_locate { my ($self, $plist, $o) = @_; if (!defined $self->{hash}) { $o->{ui}->fatal("Update pkg tools and regen package #1\n" ."\t(outdated \@option always-update annotation)", $o->{pkgname}); } &OpenBSD::PackingElement::Meta::write_for_locate; } package Scanner; use OpenBSD::PackageInfo; use OpenBSD::AddCreateDelete; use OpenBSD::PackingList; use OpenBSD::PackageRepository; use File::Path; use Digest::SHA; sub handle_file { my ($self, $f) = @_; my $plist = OpenBSD::PackingList->fromfile($f, \&OpenBSD::PackingList::UpdateInfoOnly); return if $plist->pkgname =~ m/^quirks\-/; # TODO think about generating a "total size" annotation ? $self->{pkgname} = $plist->pkgname; $plist->write_for_locate($plist, $self); } sub handle_options { my $self = shift; $self->ui->handle_options('o:', "[-o outputfile] pkgdir"); my $filename = $self->ui->opt('o'); if (defined $filename) { open($self->{output}, '>', $self->ui->opt('o')) or die; } else { $self->{output} = \*STDOUT; } } sub new { my ($class, $cmd) = @_; my $ui = OpenBSD::AddCreateDelete::State->new($cmd); $ui->{signature_style} = 'unsigned'; my $o = bless { ui => $ui }, $class; $o->handle_options; return $o; } sub progress { return shift->ui->progress; } sub ui { return shift->{ui}; } sub scan { my ($self, $d) = @_; $self->progress->set_header("Scanning"); opendir(my $dir, $d); my @l = readdir $dir; closedir($dir); my $repo = OpenBSD::PackageRepository->new($d, $self->ui); $self->progress->for_list("Scanning", \@l, sub { my $pkgname = shift; return if $pkgname eq '.' or $pkgname eq '..'; my $true_package = $repo->find($pkgname); return unless $true_package; my $dir = $true_package->info; $true_package->close; #print $pkgname, "\n"; $self->handle_file($dir.CONTENTS); rmtree($dir); }); } package main; my $o = Scanner->new('list-update-info'); $o->scan($ARGV[0]);