#!/usr/bin/perl # # Copyright © 2017-2018 Guillem Jover # # 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 # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use warnings; use File::Basename; use File::Path qw(make_path); use File::Spec; use Getopt::Long qw(:config posix_default no_ignorecase); use HTTP::Tiny; use Dpkg::Index; my $VERSION = '0.0'; my ($PROGNAME) = $0 =~ m{(?:.*/)?([^/]*)}; my %url_map = ( 'debian' => 'https://ftp-master.debian.org/removals-full.822', ); my $default_url = 'debian'; sub version { print "$PROGNAME $VERSION (devscripts ###VERSION###)\n"; } sub usage { print <...] ... Options: -u, --url URL URL to the removals deb822 file list (defaults to <$url_map{$default_url}>). --no-refresh Do not refresh the cached removals file even if old. -?, --help Print this help text. --version Print the version. HELP } sub error { my @msg = @_; print { *STDERR } "E: @msg\n"; exit 1; } # XXX: DAK produces broken output, fix it up here before we process it. # # The two current bogus instances are, at least two fused paragraphs, and # bogus "sh: 0: getcwd() failed: No such file or directory" command output # interpersed within the file. sub fixup_broken_metadata { my $cachefile = shift; my $para_sep = 1; open my $fh_old, '<', $cachefile or error("cannot open cache file $cachefile for fixup"); open my $fh_new, '>', "$cachefile.new" or error("cannot open cache file $cachefile.new for fixup"); while (my $line = <$fh_old>) { if ($line =~ m/^\s*$/) { $para_sep = 1; } elsif (not $para_sep and $line =~ m/^Date:/) { # XXX: We assume each paragraph starts with a Date: field, and # inject the missing newline. print { $fh_new } "\n"; } else { $para_sep = 0; } # XXX: Fixup shell output detritus. if ($line =~ s/sh: 0: getcwd\(\) failed: No such file or directory//) { # Remove the trailing line so that the next line gets folded back # into this one. chomp $line; } print { $fh_new } $line; } close $fh_new or error("cannot write cache file $cachefile.new"); close $fh_old; # Preserve the original mtime so that mirroring works. my ($atime, $mtime) = (stat $cachefile)[8, 9]; utime $atime, $mtime, "$cachefile.new"; rename "$cachefile.new", $cachefile or error("cannot replace cache file with fixup version"); } my $opts; GetOptions( 'url|u=s' => \$opts->{'url'}, 'no-refresh' => \$opts->{'no-refresh'}, 'help|?' => sub { usage(); exit 0 }, 'version' => sub { version(); exit 0 }, ) or die "\nUsage: $PROGNAME [