X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=modulemanager;h=37aebac9bf4a1e65c262712093be93c582e43603;hb=e35dd5cbb8b7d0d39a83b35c5837c1f062977eea;hp=0d5d1fd163c32b573fd439d319ca15400f5e7880;hpb=76d8c58f091b5a2c2250e6b1e507f604632a2da6;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/modulemanager b/modulemanager index 0d5d1fd16..37aebac9b 100755 --- a/modulemanager +++ b/modulemanager @@ -24,6 +24,7 @@ my %url_seen; sub parse_url; +# retrieve and parse entries from sources.list sub parse_url { my $src = shift; return if $url_seen{$src}; @@ -36,7 +37,7 @@ sub parse_url { for (split /\n+/, $doc) { s/^\s+//; # ignore whitespace at start next if /^#/; - if (/^module (\S+) ([0-9.]+) (\S+)/) { + if (/^module (\S+) (\S+) (\S+)/) { my($name, $ver, $url) = ($1,$2,$3); if ($modules{$name}{$ver}) { my $origsrc = $modules{$name}{$ver}{from}; @@ -65,6 +66,29 @@ sub parse_url { } } +# hash of installed module versions from our mini-database, key (m_foobar) to version (00abacca..). +my %mod_versions; + +# useless helper stub +sub getmodversion { + my ($file) = @_; + return $mod_versions{$file}; +} + +# read in installed versions +if (-e '.modulemanager') +{ + open SRC, '.modulemanager' or die ".modulemanager exists but i can't read it: $!"; + while () + { + s/\n//; + (my $mod, my $ver) = split(/ /, $_); + $mod_versions{$mod} = $ver; + } + close SRC; +} + +# read in external URL sources open SRC, 'sources.list' or die "Could not open sources.list: $!"; while () { next if /^\s*#/; @@ -72,8 +96,9 @@ while () { } close SRC; -getmodules(); +getmodules(1); +# determine core version `./src/version.sh` =~ /InspIRCd-([0-9.]+)/ or die "Cannot determine inspircd version"; $installed{core} = $1; $modules{core}{$1} = { @@ -83,10 +108,11 @@ $modules{core}{$1} = { from => 'local file', }; +# set up core module list for my $modname (@modlist) { my $mod = "m_$modname"; my $modfile = "src/modules/$mod.cpp"; - my $ver = getmodversion($modfile) || '0.0'; + my $ver = getmodversion($mod) || '0.0'; $ver =~ s/\$Rev: (.*) \$/$1/; # for storing revision in SVN $installed{$mod} = $ver; next if $modules{$mod}{$ver}; @@ -102,6 +128,15 @@ my %todo = %installed; sub ver_cmp { ($a,$b) = @_ if @_; + + # string versions first, git IDs + if ($a =~ /[a-z0-9]{40}/ or $b =~ /[a-z0-9]{40}/) + { + # it's a string version. compare them as such. + return $a ne $b; + } + + # else it's probably a numerical type version.. i.e. 1.0 my @a = split /\./, $a; my @b = split /\./, $b; push @a, 0 while $#a < $#b; @@ -150,7 +185,7 @@ sub resolve_deps { my $ver = $todo{$mod}; my $info = $modules{$mod}{$ver} or die "no dependency information on $mod $ver"; for my $dep (@{$info->{depends}}) { - $dep =~ /^(\S+)(?: ([-0-9.]+))?/ 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 @@ -163,7 +198,7 @@ sub resolve_deps { } } for my $dep (@{$info->{conflicts}}) { - $dep =~ /^(\S+)(?: ([-0-9.]+))?/ 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 unless $todo{$depmod} && ver_in_range($todo{$depmod}, $depvers); # if there are changes this round, maybe the conflict won't come up after they are resolved. @@ -243,11 +278,19 @@ resolve_deps(0); $| = 1; # immediate print of lines without \n +# whether or not to invoke ./configure -modupdate after processing +my $regen_modules_list = 0; + +print "Processing changes for $action...\n"; for my $mod (keys %installed) { next if $todo{$mod}; print "Uninstalling $mod $installed{$mod}\n"; unlink "src/modules/$mod.cpp"; + $regen_modules_list = 1; } + +my $count = scalar keys %todo; +print "Checking $count items...\n"; for my $mod (sort keys %todo) { my $ver = $todo{$mod}; my $oldver = $installed{$mod}; @@ -261,10 +304,29 @@ for my $mod (sort keys %todo) { } else { print "Installing $mod $ver from $url"; } + $mod_versions{$mod} = $ver; + my $stat = getstore($url, "src/modules/$mod.cpp"); if ($stat == 200) { print " - done\n"; } else { print " - HTTP $stat\n"; } + $regen_modules_list = 1; +} + +# 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; + +# regenerate makefiles if necessary +if ($regen_modules_list) +{ + print "Done... Re-generating makefiles\n"; + system "./configure -modupdate"; } +print "Finished!\n";