pkgsrc/pkgtools/pkgsrc-todo/files/add_todo.pl
wiz 644fc25586 Initial import of pkgsrc-todo-1.0:
This package contains two tools for maintaining pkgsrc/doc/TODO.

add_todo adds lines for newly available updates for packages to
the TODO file.

obsolete_todo checks the contents of pkgsrc/doc/TODO against updates
noted in the CHANGES-* files and removes entries for packages which
were already updated to newer files.
2009-08-30 10:40:34 +00:00

153 lines
3.3 KiB
Perl
Executable file

#!@PERL@
# $NetBSD: add_todo.pl,v 1.1.1.1 2009/08/30 10:40:34 wiz Exp $
# TODO:
# fix adding entry after last one (currently broken)
# check if package was removed
# check if package was downgraded (e.g. oto)
# allow multiple command line arguments
use strict;
use Getopt::Std;
use pkgsrc::Dewey;
use constant regex_pkgname => qr"^(.*)-(\d[^-]*)$";
my ($comment, $entry, $grep_result, $newname, $newpkg, $newprinted,
$newversion, %opt, $verbose);
my $PKGSRCDIR = "@PKGSRCDIR@";
my $input = "$PKGSRCDIR/doc/TODO";
my $wipinput = "$PKGSRCDIR/wip/TODO";
my $output = "$input.new";
my $changes = "$PKGSRCDIR/doc/CHANGES*";
getopts('fp:', \%opt);
#usage() if $opt{h};
if ($opt{p}) {
$PKGSRCDIR = $opt{p};
}
$newpkg = shift(@ARGV);
$newpkg =~ regex_pkgname;
$newname = $1;
$newversion = $2;
# same code in obsolete_todo, keep in sync
sub update_done($$) {
my ($file, $found_at_all, @files);
my ($pkg, $ver) = @_;
$found_at_all = 0;
@files = glob($changes);
# XXX: better way of handling +?
$pkg =~ s/\+//g;
# look in newest files first
foreach $file (reverse(@files)) {
open IN, $file;
while (<IN>) {
if (m/[ \/]$pkg version ([^ ]*) / or
(m/[ \/]$pkg to ([^ ]*) / and not m/Moved/) or
m/[ \/]$pkg-([0-9][^ -]*) /) {
$found_at_all = 1;
if (dewey_cmp($ver, "<=", $1)) {
print STDERR "$pkg already at $1:\n";
print STDERR "$file: $_";
close(IN);
return 1;
}
}
}
close(IN);
# if found in latest CHANGES file, but no newer version,
# assume the version to add is newer and don't check
# older files
if ($found_at_all) {
last;
}
}
return 0;
}
$newprinted = 0;
$verbose = 1;
$grep_result = qx/grep -e "[ \/]"$newname"[ -]" $changes/;
if (not $grep_result) {
if (-d "$PKGSRCDIR/wip/$newname") {
$input = $wipinput;
}
else {
die "$newname not found in CHANGES* or wip\n";
}
}
if (update_done($newname, $newversion)) {
exit if not $opt{f};
print STDERR "Ignored old entry (forced)\n";
}
open IN, $input or die "can't open input file ``$input''";
open OUT, ">$output" or die "can't open output file ``$output''";
while (<IN>) {
if ($newprinted or not m/^ o /) {
print OUT $_;
next;
}
chomp();
s/^\to //;
if (m/([^ ]*)( .*)/) {
$entry = $1;
$comment = $2;
} else {
$entry = $_;
$comment = "";
}
$entry =~ regex_pkgname;
my ($entryname, $entryversion) = ($1, $2);
# different package, alphabetically before new entry
if ($newname gt $entryname) {
print OUT " o $entry$comment\n";
next;
}
# different package, alphabetically after new entry -> add entry
if ($newname lt $entryname) {
print OUT " o $newpkg\n";
print OUT " o $entry$comment\n";
$newprinted = 1;
next;
}
# $newname eq $entryname
if (dewey_cmp($newversion, "<=", $entryversion)) {
if ($opt{f}) {
print STDERR "Replaced $entry (forced)\n" if $verbose;
print OUT " o $newpkg\n";
} else {
print STDERR "Newer or same version $entry already in TODO\n" if $verbose;
print OUT " o $entry$comment\n";
}
}
else {
if ($comment) {
print STDERR "Keeping $entry because it has a comment:$comment\n";
print OUT " o $entry$comment\n";
next;
}
print STDERR "Replaced $entry\n" if $verbose;
print OUT " o $newpkg\n";
}
$newprinted = 1;
}
close IN;
close OUT;
rename($output, $input) or die "can't rename $output to $input";