mumble/scripts/release.pl
2009-03-09 23:40:53 +01:00

157 lines
3.8 KiB
Perl

#! /usr/bin/perl -w
use strict;
use warnings;
use Carp;
use Switch;
use Archive::Tar;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use Compress::Zlib;
sub adddir($$) {
my ($dir, $ref) = @_;
$dir =~ s/^\.\///;
my $base = $dir;
$base =~ s/^.+\/([^\/]+)$/$1/;
if (-f "$dir/$base.pro") {
push @{$ref}, "$dir/$base.pro";
}
opendir(DIR, $dir);
foreach my $e (grep { ! /^\./ } readdir(DIR)) {
if (-d "$dir/$e") {
adddir("$dir/$e", $ref);
}
}
}
my %files;
my $ver;
my %filevars = ( 'sources' => 1, 'headers' => 1, 'rc_file' => 1, 'dist' => 1, 'forms' => 1, 'resources' => 1, 'precompiled_header' => 1, 'translations' => 1);
system("rm mumble-*");
chdir("scripts");
system("bash mkini.sh");
chdir("..");
my @pro = ("main.pro");
#, "src/mumble.pri");
#adddir(".", \@pro);
while (my $pro = shift @pro) {
open(F, $pro) or croak "Failed to open $pro";
print "Processing $pro\n";
$files{$pro}=1;
my $basedir=$pro;
$basedir =~ s/[^\/]+\Z//g;
my @vpath = ($basedir);
while(<F>) {
chomp();
if (/^include\((.+)\)/) {
my $f = $basedir . $1;
$f =~ s/(\/|\A)[^\/]+\/\.\.\//$1/g;
$f =~ s/(\/|\A)[^\/]+\/\.\.\//$1/g;
$f =~ s/(\/|\A)[^\/]+\/\.\.\//$1/g;
push @pro, $f;
} elsif (/^\s*(\w+)\s*?[\+\-\*]{0,1}=\s*(.+)$/) {
my ($var,$value)=(lc $1,$2);
switch ($var) {
case "version" {
croak "Versions don't match" if (defined($ver) && ($ver ne $value));
$ver=$value;
}
case "vpath" {
push @vpath,map { "$basedir$_/"} split(/\s/, $value);
}
case "subdirs" {
push @pro,map { my ($b,$p) = ($_,$_); $p =~ s/^.+\///g; "$basedir$b/$p.pro" } split(/\s/, $value);
}
case %filevars {
foreach my $f (split(/\s+/,$value)) {
my $ok = 0;
foreach my $d (@vpath) {
if (-f "$d$f") {
$f = $d.$f;
$ok = 1;
last;
}
}
if (! $ok) {
croak "Failed to find $f in ".join(" ",@vpath);
} else {
if ($f =~ /\.\./) {
$f =~ s/(\/|\A)[^\/]+\/\.\.\//$1/g;
$f =~ s/(\/|\A)[^\/]+\/\.\.\//$1/g;
$f =~ s/(\/|\A)[^\/]+\/\.\.\//$1/g;
}
$files{$f}=1;
}
}
}
}
}
}
close(F);
}
open(F, "src/mumble/mumble.qrc");
while(<F>) {
chomp();
if (/\<file\>(.+)<\/file\>/) {
$files{$1}=1;
} elsif (/\<file alias=\"(.+)\"\>/) {
if ( -f "icons/$1") {
$files{"icons/$1"}=1;
} else {
$files{"samples/$1"}=1;
}
}
}
close(F);
foreach my $dir ('speex','speex/include/speex','speex/libspeex','man') {
opendir(D, $dir) or croak "Could not open $dir";
foreach my $f (grep(! /^\./,readdir(D))) {
next if ($f =~ /\~$/);
my $ff=$dir . '/' . $f;
if (-f $ff) {
$files{$ff}=1;
}
}
closedir(D);
}
delete($files{'LICENSE'});
my $tar = new Archive::Tar();
my $zip = new Archive::Zip();
my $blob;
my $dir="mumble-$ver/";
my $zipdir = $zip->addDirectory($dir);
foreach my $file ('LICENSE', sort keys %files) {
if (($file =~ /\.qm$/) || ($file =~ /\/Murmur\.(h|cpp)/)) {
print "Skipping $file\n";
next;
}
print "Adding $file\n";
open(F, $file) or croak "Missing $file";
sysread(F, $blob, 1000000000);
if ($file eq "src/Version.h") {
$blob =~ s/\#ifndef MUMBLE_VERSION/\#define MUMBLE_VERSION $ver\n\#if 0/;
}
$tar->add_data($dir . $file, $blob);
my $zipmember=$zip->addString($blob, $dir . $file);
$zipmember->desiredCompressionMethod( COMPRESSION_DEFLATED );
$zipmember->desiredCompressionLevel( 9 );
close(F);
}
my $gz=gzopen("mumble-${ver}.tar.gz", "w");
$gz->gzwrite($tar->write());
$gz->gzclose();
$zip->writeToFileNamed("mumble-${ver}.zip");