#!/usr/bin/perl use strict; use warnings; use DB_File; use lib './lib'; use Packages::Config qw( $TOPDIR $DBDIR ); use Packages::Search qw( :all ); &Packages::Config::init( './' ); my $suite = $ARGV[0] or die "Fatal Error: No suite given"; my $start_time = time; my $debug = 1; tie my %packages, 'DB_File', "$DBDIR/packages_small.db", O_RDONLY, 0666, $DB_BTREE or die "Fatal Error: Couldn't tie DB $DBDIR/packages_small.db: $!\n"; sub get_iso_date { my ($age) = @_; my ($day, $month, $year) = (gmtime($start_time - ($age*86_400)))[3..5]; $month++; $year += 1900; return sprintf( "%04s-%02s-%02s", $year, $month, $day ); } my $packagesdir = "$TOPDIR/files/packages"; open CHANGES, '>', "$packagesdir/newpkg_info_$suite.new" or die "Fatal Error: Couldn't open CHANGES file: $!"; my (%add, %del); my $lastday; for (my $age = 7; $age >= 0; $age--) { my (%old); my $newday = get_iso_date( $age ); my $oldday = get_iso_date( $age+1 ); -d "$packagesdir/$oldday" or do { warn "Warning: No information available for $oldday\n"; next unless $lastday; $oldday = $lastday; }; -d "$packagesdir/$newday" or do { warn "Warning: No information available for $newday\n"; next; }; $lastday = $newday; warn "Process: age=$age oldday=$oldday newday=$newday\n" if $debug; open OLD, '<', "$packagesdir/$oldday/package_names_$suite" or die "Error: Couldn't open OLD file $packagesdir/$oldday/package_names_$suite: $!\n"; open NEW, '<', "$packagesdir/$newday/package_names_$suite" or die "Error: Couldn't open NEW file $packagesdir/$newday/package_names_$suite: $!\n"; while () { chomp; $old{$_} = 1; } close OLD; while () { chomp; if ($old{$_}) { # we assume here that the input contains no dupes! delete $old{$_}; } else { if (exists $del{$_}) { delete $del{$_}; warn "Re-Added: $_\n" if $debug; } else { $add{$_} = $age; warn "Added: $_ (age $age)\n" if $debug; } } } close NEW; foreach (keys %old) { if (exists $add{$_}) { delete $add{$_}; warn "Deleted again: $_\n" if $debug; } else { $del{$_} = $age; warn "Deleted: $_ (age $age)\n" if $debug; } } } my %archives = map { $_ => 1 } qw( us security ); foreach (sort (keys %add, keys %del)) { my $entry = []; my $age = 0; if (exists $add{$_}) { $entry = read_entry_simple( \%packages, $_, \%archives, $suite); die "Fatal Error: Can't find entry for package $_\n" unless @$entry; shift @$entry; # remove virtual pkg info $age = $add{$_}; } else { $age = $del{$_}; } print CHANGES join(" ", $_, $age, @$entry)."\n"; print "Wrote entry: ".join(" ", $_, $age, @$entry)."\n"; } close CHANGES; rename("$packagesdir/newpkg_info_$suite.new", "$packagesdir/newpkg_info_$suite");