aboutsummaryrefslogtreecommitdiffstats
path: root/compress_files
diff options
context:
space:
mode:
authorChmouel Boudjnah <chmouel@mandriva.org>2000-02-18 20:00:57 +0000
committerChmouel Boudjnah <chmouel@mandriva.org>2000-02-18 20:00:57 +0000
commit48bff1047b38c3f134a179786438440cc691f227 (patch)
treec3379252ab0d021163a9ba39d3fd52705f62d7d0 /compress_files
parent00a20e122852338baa6d892413f212d30db1da5d (diff)
downloadspec-helper-topic/MandrakeSoft.tar
spec-helper-topic/MandrakeSoft.tar.gz
spec-helper-topic/MandrakeSoft.tar.bz2
spec-helper-topic/MandrakeSoft.tar.xz
spec-helper-topic/MandrakeSoft.zip
Initial revisionCookertopic/MandrakeSoft
Diffstat (limited to 'compress_files')
-rwxr-xr-xcompress_files167
1 files changed, 167 insertions, 0 deletions
diff --git a/compress_files b/compress_files
new file mode 100755
index 0000000..eaaec0d
--- /dev/null
+++ b/compress_files
@@ -0,0 +1,167 @@
+#!/usr/bin/perl -w
+#---------------------------------------------------------------
+# Project : Linux-Mandrake
+# Module : spec-helper
+# File : compress_files
+# Version : $Id$
+# Author : Frederic Lepied
+# Created On : Thu Feb 10 08:04:11 2000
+# Purpose : compress man and info pages.
+#---------------------------------------------------------------
+
+use Cwd;
+use File::Find;
+
+################################################################################
+# Returns the basename of the argument passed to it.
+sub basename {
+ my $fn=shift;
+ $fn=~s:^.*/(.*?)$:$1:;
+ return $fn;
+}
+
+################################################################################
+# Returns the directory name of the argument passed to it.
+sub dirname {
+ my $fn=shift;
+ $fn=~s:^(.*)/.*?$:$1:;
+ return $fn;
+}
+
+################################################################################
+# Run a command that may have a huge number of arguments, like xargs does.
+# Pass in a reference to an array containing the arguments, and then other
+# parameters that are the command and any parameters that should be passed to
+# it each time.
+sub xargs {
+ my $args=shift;
+
+ # The kernel can accept command lines up to 20k worth of characters.
+ my $command_max=20000;
+
+ # Figure out length of static portion of command.
+ my $static_length=0;
+ foreach (@_) {
+ $static_length+=length($_)+1;
+ }
+
+ my @collect=();
+ my $length=$static_length;
+ foreach (@$args) {
+ if (length($_) + 1 + $static_length > $command_max) {
+ error("This command is greater than the maximum command size allowed by the kernel, and cannot be split up further. What on earth are you doing? \"@_ $_\"");
+ }
+ $length+=length($_) + 1;
+ if ($length < $command_max) {
+ push @collect, $_;
+ }
+ else {
+ system(@_,@collect) if $#collect > -1;
+ @collect=($_);
+ $length=$static_length + length($_) + 1;
+ }
+ }
+ system(@_,@collect) if $#collect > -1;
+}
+
+################################################################################
+# Check if a file is a .so man page, for use by File::Find.
+my @sofiles;
+my @sodests;
+sub find_so_man {
+ # The -s test is becuase a .so file tends to be small. We don't want
+ # to open every man page. 1024 is arbitrary.
+ if (! -f $_ || -s $_ > 1024) {
+ return;
+ }
+
+ # Test first line of file for the .so thing.
+ open (SOTEST,$_);
+ my $l=<SOTEST>;
+ close SOTEST;
+ if ($l=~m/\.so\s+(.*)/) {
+ my $solink=$1;
+ # This test is here to prevent links like ... man8/../man8/foo.8
+ if (basename($File::Find::dir) eq dirname($solink)) {
+ $solink=basename($solink);
+ }
+ else {
+ $solink="../$solink";
+ }
+
+ push @sofiles,"$File::Find::dir/$_";
+ push @sodests,$solink;
+ }
+}
+
+################################################################################
+$RPM_BUILD_ROOT=$ENV{RPM_BUILD_ROOT};
+chdir($RPM_BUILD_ROOT) || die "Can't cd to $ENV{RPM_BUILD_ROOT}: $!";
+
+# Now the .so conversion.
+@sofiles=@sodests=();
+foreach $dir (qw{usr/man usr/X11R6/man usr/lib/perl5/man}) {
+ if (-e "$dir") {
+ find(\&find_so_man, "$dir");
+ }
+}
+foreach $sofile (@sofiles) {
+ my $sodest=shift(@sodests);
+ system "rm","-f",$sofile;
+ system "ln","-sf",$sodest,$sofile;
+}
+
+push @files, split(/\n/,`find usr/info usr/share/info usr/man usr/share/man usr/X11*/man usr/lib/perl5/man -type f ! -name "*.gz" -a ! -name "*.bz2" 2>/dev/null || true`);
+
+# Look for files with hard links. If we are going to compress both,
+# we can preserve the hard link across the compression and save
+# space in the end.
+my @f=();
+my %hardlinks;
+foreach (@files) {
+ ($dev, $inode, undef, $nlink)=stat($_);
+ if ($nlink > 1) {
+ if (! $seen{"$inode.$dev"}) {
+ $seen{"$inode.$dev"}=$_;
+ push @f, $_;
+ }
+ else {
+ # This is a hardlink.
+ $hardlinks{$_}=$seen{"$inode.$dev"};
+ }
+ }
+ else {
+ push @f, $_;
+ }
+}
+
+if (@f) {
+ # Make executables not be anymore.
+ xargs(\@f,"chmod","a-x");
+
+ xargs(\@f,"bzip2","-9f");
+}
+
+
+# Now change over any files we can that used to be hard links so
+# they are again.
+foreach (keys %hardlinks) {
+ # Remove old file.
+ system("rm","-f","$_");
+ # Make new hardlink.
+ system("ln","$hardlinks{$_}.bz2","$_.bz2");
+}
+
+# Fix up symlinks that were pointing to the uncompressed files.
+open (FIND,"find $RPM_BUILD_ROOT -type l |");
+while (<FIND>) {
+ chomp;
+ ($directory)=m:(.*)/:;
+ $linkval=readlink($_);
+ if (! -e "$directory/$linkval" && -e "$directory/$linkval.bz2") {
+ system("rm","-f",$_);
+ system("ln","-sf","$linkval.bz2","$_.bz2");
+ }
+}
+
+# compress_files ends here