libreccm-legacy/tools/scripts/bin/make-source

234 lines
6.7 KiB
Perl
Executable File

#!/usr/bin/perl -w
#
# Copyright (C) 2004 Red Hat Inc. All Rights Reserved.
#
# The contents of this file are subject to the CCM Public
# License (the "License"); you may not use this file except in
# compliance with the License. You may obtain a copy of
# the License at http://www.redhat.com/licenses/ccmpl.html
#
# Software distributed under the License is distributed on an "AS
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
# implied. See the License for the specific language governing
# rights and limitations under the License.
#
# Daniel Berrange <berrange@redhat.com>
# Dennis Gregorovic <dgregor@redhat.com>
BEGIN {
if ( exists $ENV{'CCM_TOOLS_HOME'} && defined $ENV{'CCM_TOOLS_HOME'} ) {
if ( -d "$ENV{'CCM_TOOLS_HOME'}/lib" ) {
push @INC, "$ENV{'CCM_TOOLS_HOME'}/lib";
} else {
print "$ENV{'CCM_TOOLS_HOME'}/lib was not found\n";
exit 1;
}
} else {
print "The CCM_TOOLS_HOME environment variable must be set first.\n";
exit 1;
}
}
use strict;
use Cwd;
use CCM::CommandsUtil;
use CCM::Util;
use File::Find;
use File::Path;
use File::Spec;
use Getopt::Long;
my $OS = $^O;
my $ccm_apps = CCM::Util::getRequiredEnvVariable("CCM_APPS");
my $ccm_app_name = CCM::Util::getRequiredEnvVariable("CCM_APP_NAME");
my $ccm_dist_tar_dir = CCM::Util::getRequiredEnvVariable("CCM_DIST_TAR_DIR");
my $ccm_dist_zip_dir = CCM::Util::getRequiredEnvVariable("CCM_DIST_ZIP_DIR");
my $ccm_package = CCM::Util::getRequiredEnvVariable("CCM_PACKAGE");
my $ccm_package_name = CCM::Util::getRequiredEnvVariable("CCM_PACKAGE_NAME");
my $ccm_prettyname = CCM::Util::getRequiredEnvVariable("CCM_PRETTYNAME");
my $ccm_release = CCM::Util::getRequiredEnvVariable("CCM_RELEASE");
my $ccm_root_dir = CCM::Util::getRequiredEnvVariable("CCM_ROOT_DIR");
my $ccm_scripts_home = CCM::Util::getRequiredEnvVariable("CCM_SCRIPTS_HOME");
my $ccm_version = CCM::Util::getRequiredEnvVariable("CCM_VERSION");
my $command = undef;
my $verbose = defined $ENV{'CCM_SCRIPTS_VERBOSE'} && $ENV{'CCM_SCRIPTS_VERBOSE'} eq '1';
my $just_tar = 0;
my $just_zip = 0;
my $no_tar = defined $ENV{'CCM_SOURCE_NOTARS'} && $ENV{'CCM_SOURCE_NOTARS'} eq "1";
my $no_zip = defined $ENV{'CCM_SOURCE_NOZIPS'} && $ENV{'CCM_SOURCE_NOZIPS'} eq "1";
my $zip_file = undef;
GetOptions(
'verbose+' => \$verbose,
'just-tar' => \$just_tar,
'just-zip' => \$just_zip,
'no-tar' => \$no_tar,
'no-zip' => \$no_zip,
'zip-file=s' => \$zip_file
);
if (($just_tar && $no_tar) ||
($just_zip && $no_zip) ||
($just_tar && $just_zip)) {
die "conficting options.\n" . &display_options();
}
sub display_options {
return "
verbose => $verbose
just-tar => $just_tar
just-zip => $just_zip
no-tar => $no_tar
no-zip => $no_zip";
}
chdir $ccm_root_dir;
print "Creating source distribution\n";
print " generating manifest list\n";
# generate the manifest file
unlink (glob "MANIFEST*");
my $manifest_skip_in = File::Spec->catfile($ccm_scripts_home,"pkg","dist","MANIFEST.SKIP.in");
open (IN, $manifest_skip_in)
or &CCM::Util::error("can't open $manifest_skip_in: $!");
my $manifest_skip;
{
local $/ = undef;
$manifest_skip = <IN>;
}
&interpolate(\$manifest_skip);
close IN;
my $manifest = "";
my @files;
foreach my $dir (split ' +', $ccm_apps) {
my %options;
$options{'wanted'} = sub { -f $_ && push @files, $File::Find::name };
if ($^O ne 'MSWin32') {
$options{'follow_fast'} = 1;
}
find( \%options, $dir);
}
opendir(DIR, cwd) or &CCM::Util::error("can't opendir " . cwd . ": $!");
push @files, grep { -f $_ } readdir(DIR);
closedir DIR;
&filter($ccm_app_name, $manifest_skip, \@files);
rmtree($ccm_app_name);
if ($OS eq 'MSWin32') {
foreach my $dir (split ' +', $ccm_apps) {
CCM::CommandsUtil::runAndExitOnError("xcopy /e /i /o /y $dir ..\\$ccm_app_name\\$dir");
}
CCM::CommandsUtil::runAndExitOnError("xcopy /q /i /o /y * ..\\$ccm_app_name");
CCM::CommandsUtil::runAndExitOnError("move ..\\$ccm_app_name .");
} else {
symlink(".", $ccm_app_name);
}
&make_zip() if ( !$just_tar && !$no_zip );
&make_tar() if ( !$just_zip && !$no_tar );
sub make_zip {
mkpath($ccm_dist_zip_dir);
# make the source distribution (zip and maybe tar.gz)
print " creating zip file distribution\n";
my $filename;
if ( defined $zip_file ) {
$filename = $zip_file;
} else {
$filename = File::Spec->catfile($ccm_dist_zip_dir,"$ccm_package_name.zip");
}
unlink $filename;
print "creating $filename\n" if $verbose;
open (ZIP, "| zip -q $filename -@");
print ZIP (join "\n", @files) or die "$!";
close ZIP;
}
sub make_tar {
mkpath($ccm_dist_tar_dir);
print " creating tar.gz file distribution\n";
my $filename = File::Spec->catfile($ccm_dist_tar_dir,"$ccm_package_name.tar");
unlink $filename;
unlink "$filename.gz";
print "creating $filename.gz\n" if $verbose;
open (MANIFEST, "> MANIFEST");
print MANIFEST join "\n", @files;
close MANIFEST;
if ($^O eq 'MSWin32') {
# cygwin tar does not work well with Windows-style paths. So, let's convert it.
$filename =~ s,\\,/,g;
$filename =~ s,^([a-zA-Z]):,/cygdrive/$1,;
}
if ($^O eq 'solaris') {
CCM::CommandsUtil::runAndExitOnError("tar -cf $filename -I MANIFEST");
} else {
CCM::CommandsUtil::runAndExitOnError("tar -cf $filename -T MANIFEST");
}
CCM::CommandsUtil::runAndExitOnError("gzip -f $filename");
}
rmtree($ccm_app_name);
sub interpolate {
my $text = shift;
my %keys = ( 'PACKAGE' => $ccm_package,
'PRETTYNAME' => $ccm_prettyname,
'VERSION' => $ccm_version,
'RELEASE' => $ccm_release );
foreach (@_) {
if (/^(\w+)=(.*)$/) {
$keys{$1} = eval "qq{$2}";
} else {
&CCM::Util::error("cannot parse key=val pair $_", -1);
}
}
$$text =~ s/::(\w+)::/exists $keys{$1} ? $keys{$1} : die "no value supplied for variable $1"/gex;
return $text;
}
sub filter {
my $prefix = shift;
my $manifest = shift;
my $files = shift;
my @skip;
if ($OS eq 'MSWin32') {
$prefix =~ s/\\/\\\\/g;
}
foreach (split "\n", $manifest) {
chomp;
s/\./\\\./g;
s/\*/\.\*/g;
s/\?/\.\?/g;
push @skip, $_;
}
@{$files} = map {
chomp;
s/^\.\///;
my $skipped = 0;
foreach my $skip (@skip) {
if (/^$skip$/) {
$skipped = 1;
last;
}
}
if (!$skipped) {
if ($OS eq 'MSWin32') {
s/\\/\//g;
}
"$prefix/$_";
} else {
}
} @{$files};
}