-#!/usr/bin/perl
+#!/usr/bin/env perl
+
+#
+# InspIRCd -- Internet Relay Chat Daemon
+#
+# Copyright (C) 2008-2009 Robin Burchell <robin+git@viroteck.net>
+#
+# This file is part of InspIRCd. InspIRCd 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, version 2.
+#
+# 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 <http://www.gnu.org/licenses/>.
+#
+
+
use strict;
use warnings FATAL => qw(all);
use LWP::Simple;
# determine core version
`./src/version.sh` =~ /InspIRCd-([0-9.]+)/ or die "Cannot determine inspircd version";
$installed{core} = $1;
+for my $mod (keys %modules) {
+ MODVER: for my $mver (keys %{$modules{$mod}}) {
+ for my $dep (@{$modules{$mod}{$mver}{depends}}) {
+ next unless $dep =~ /^core (.*)/;
+ if (!ver_in_range($installed{core}, $1)) {
+ delete $modules{$mod}{$mver};
+ next MODVER;
+ }
+ }
+ }
+ delete $modules{$mod} unless %{$modules{$mod}};
+}
$modules{core}{$1} = {
url => 'NONE',
depends => [],
sub ver_cmp {
($a,$b) = @_ if @_;
- # string versions first, git IDs
- if ($a =~ /[a-z0-9]{40}/ or $b =~ /[a-z0-9]{40}/)
+ if ($a !~ /^[0-9.]+$/ or $b !~ /^[0-9.]+$/)
{
- # it's a string version. compare them as such.
+ # not a valid version number, don't try to sort
return $a ne $b;
}
my @a = split /\./, $a;
my @b = split /\./, $b;
push @a, 0 while $#a < $#b;
- push @b, 0 while $#b < $#a;
+ push @b, ($_[2] || 0) while $#b < $#a;
for my $i (0..$#a) {
my $d = $a[$i] <=> $b[$i];
return $d if $d;
sub ver_in_range {
my($ver, $range) = @_;
return 1 unless defined $range;
+ my($l,$h) = ($range, $range);
if ($range =~ /(.*)-(.*)/) {
- my($l,$h) = ($1,$2);
- return 0 if $l && ver_cmp($ver, $l) < 0;
- return 0 if $h && ver_cmp($ver, $h) > 0;
- return 1;
+ ($l,$h) = ($1,$2);
}
- return !ver_cmp($ver, $range);
+ return 0 if $l && ver_cmp($ver, $l) < 0;
+ return 0 if $h && ver_cmp($ver, $h, 9999) > 0;
+ return 1;
}
sub find_mod_in_range {
my $ver = $todo{$mod};
my $info = $modules{$mod}{$ver} or die "no dependency information on $mod $ver";
for my $dep (@{$info->{depends}}) {
- $dep =~ /^(\S+)(?: \S+))?/ or die "Bad dependency $dep from $info->{from}";
+ $dep =~ /^(\S+)(?: (\S+))?/ or die "Bad dependency $dep from $info->{from}";
my($depmod, $depvers) = ($1,$2);
next if $todo{$depmod} && ver_in_range($todo{$depmod}, $depvers);
# need to install a dependency
} else {
print " - HTTP $stat\n";
}
+}
- # write database of installed versions
- open SRC, '>.modulemanager' or die "can't write installed versions to .modulemanager, won't be able to track upgrades properly: $!";
- foreach my $key (keys %mod_versions)
- {
- print SRC "$key $mod_versions{$key}\n";
- }
- close SRC;
+# write database of installed versions
+open SRC, '>.modulemanager' or die "can't write installed versions to .modulemanager, won't be able to track upgrades properly: $!";
+foreach my $key (keys %mod_versions)
+{
+ print SRC "$key $mod_versions{$key}\n";
}
-print "Done!\n";
+close SRC;
+
+print "Finished!\n";