X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_compress;h=cbdf627c55e72205efd1d75f328e5ccc7bb3b3f6;hb=c85747dc1875ed610886bf891b0bebd5579d81de;hp=847bcb6d73f49d31089b2e49a221114c758d5e5a;hpb=da7d6c32c080678dc672f7c6e680c11569f46eda;p=debhelper.git diff --git a/dh_compress b/dh_compress index 847bcb6..cbdf627 100755 --- a/dh_compress +++ b/dh_compress @@ -1,28 +1,86 @@ #!/usr/bin/perl -w -# -# Compresses files and makes sure that symlinks pointing to the -# compressed files get fixed. +=head1 NAME + +dh_compress - compress files and fix symlinks in package build directories + +=cut + +use strict; use Cwd; -BEGIN { push @INC, "debian", "/usr/share/debhelper" } -use Dh_Lib; +use Debian::Debhelper::Dh_Lib; + +=head1 SYNOPSIS + +B [S>] [B<-X>I] [B<-A>] [S>] + +=head1 DESCRIPTION + +dh_compress is a debhelper program that is responsible for compressing +the files in package build directories, and makes sure that any symlinks +that pointed to the files before they were compressed are updated to point +to the new files. + +By default, dh_compress compresses files that debian policy mandates should +be compressed, namely all files in usr/share/info, usr/share/man, +usr/X11R6/man, files in usr/share/doc that are larger than 4k in size, +(except the copyright file, .html and .css files, and files that appear to be +already compressed based on their extensions), and all changelog files. Plus +PCF fonts underneath usr/X11R6/lib/X11/fonts/ + +If a debian/package.compress file exists, however, it will be ran as a shell +script, and all filenames that the shell script outputs will be compressed +instead of the default files. The shell script will be run from +inside the package build directory. Note though that using -X is a much +better idea in general; you should only use a debian/package.compress file +if you really have to. + +=head1 OPTIONS + +=over 4 + +=item B<-X>I, B<--exclude=>I + +Exclude files that contain "item" anywhere in their filename from being +compressed. For example, -X.jpeg will exclude jpeg's from compression. +You may use this option multiple times to build up a list of things to +exclude. You can accomplish the same thing by using a debian/compress file, +but this is easier. + +=item B<-A>, B<--all> + +Compress all files specified by command line parameters in ALL packages +acted on. + +=item I + +Add these files to the list of files to compress. + +=back + +=head1 CONFORMS TO + +Debian policy, version 3.0 + +=cut + init(); -foreach $PACKAGE (@{$dh{DOPACKAGES}}) { - $TMP=tmpdir($PACKAGE); - $compress=pkgfile($PACKAGE,"compress"); +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); + my $compress=pkgfile($package,"compress"); # Run the file name gathering commands from within the directory # structure that will be effected. - $olddir=getcwd(); - verbose_print("cd $TMP"); - chdir($TMP) || error("Can't cd to $TMP: $!"); + my $olddir=getcwd(); + verbose_print("cd $tmp"); + chdir($tmp) || error("Can't cd to $tmp: $!"); # Figure out what files to compress. - @files=(); + my @files; # First of all, deal with any files specified right on the command line. - if (($PACKAGE eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { - push @files,#ARGV; + if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { + push @files, @ARGV; } if ($compress) { # The config file is a sh script that outputs the files to be compressed @@ -30,29 +88,31 @@ foreach $PACKAGE (@{$dh{DOPACKAGES}}) { push @files, split(/\n/,`sh $olddir/$compress 2>/dev/null`); } else { - # By default, fall back to what the policy manual says to compress. - # Note that all the excludes of odd things like _z are because - # gzip refuses to compress such files, assumming they are zip files. - # I looked at the gzip source to get the complete list of such - # extentions: ".gz", ".z", ".taz", ".tgz", "-gz", "-z", "_z" - + # Note that all the excludes of odd things like _z + # are because gzip refuses to compress such files, assumming + # they are zip files. I looked at the gzip source to get the + # complete list of such extensions: ".gz", ".z", ".taz", + # ".tgz", "-gz", "-z", "_z" push @files, split(/\n/,` find usr/info usr/share/info usr/man usr/share/man usr/X11*/man -type f ! -name "*.gz" 2>/dev/null || true; - find usr/doc usr/share/doc -type f \\( -size +4k -or -name "changelog*" \\) \\ - \\( -name changelog.html -or ! -name "*.htm*" \\) \\ - ! -name "*.gif" ! -iname "*.gz" \\ - ! -iname "*.taz" ! -iname "*.tgz" ! -iname "*.z" \\ - ! -iname "*-gz" ! -iname "*-z" ! -iname "*_z" \\ - ! -name "copyright" 2>/dev/null || true + find usr/share/doc -type f \\( -size +4k -or -name "changelog*" -or -name "NEWS*" \\) \\ + \\( -name changelog.html -or ! -iname "*.htm*" \\) \\ + ! -iname "*.gif" ! -iname "*.png" ! -iname "*.jpg" \\ + ! -iname "*.jpeg" ! -iname "*.gz" ! -iname "*.taz" \\ + ! -iname "*.tgz" ! -iname "*.z" ! -iname "*.bz2" \\ + ! -iname "*-gz" ! -iname "*-z" ! -iname "*_z" \\ + ! -iname "*.jar" ! -iname "*.zip" ! -iname "*.css" \\ + ! -name "copyright" 2>/dev/null || true; + find usr/X11R6/lib/X11/fonts -type f -name "*.pcf" 2>/dev/null || true; `); } # Exclude files from compression. if (@files && defined($dh{EXCLUDE}) && $dh{EXCLUDE}) { - @new=(); + my @new=(); foreach (@files) { - $ok=1; - foreach $x (@{$dh{EXCLUDE}}) { + my $ok=1; + foreach my $x (@{$dh{EXCLUDE}}) { if (/\Q$x\E/) { $ok=''; last; @@ -68,8 +128,9 @@ foreach $PACKAGE (@{$dh{DOPACKAGES}}) { # space in the end. my @f=(); my %hardlinks; + my %seen; foreach (@files) { - ($dev, $inode, undef, $nlink)=stat($_); + my ($dev, $inode, undef, $nlink)=stat($_); if ($nlink > 1) { if (! $seen{"$inode.$dev"}) { $seen{"$inode.$dev"}=$_; @@ -86,6 +147,9 @@ foreach $PACKAGE (@{$dh{DOPACKAGES}}) { } if (@f) { + # Make executables not be anymore. + xargs(\@f,"chmod","a-x"); + xargs(\@f,"gzip","-9f"); } @@ -98,18 +162,38 @@ foreach $PACKAGE (@{$dh{DOPACKAGES}}) { doit("ln","$hardlinks{$_}.gz","$_.gz"); } - verbose_print("cd $olddir"); + verbose_print("cd '$olddir'"); chdir($olddir); # Fix up symlinks that were pointing to the uncompressed files. - open (FIND,"find $TMP -type l |"); - while () { - chomp; - ($directory)=m:(.*)/:; - $linkval=readlink($_); - if (! -e "$directory/$linkval" && -e "$directory/$linkval.gz") { - doit("rm","-f",$_); - doit("ln","-sf","$linkval.gz","$_.gz"); + my %links = map { chomp; $_ => 1 } `find $tmp -type l`; + my $changed; + # Keep looping through looking for broken links until no more + # changes are made. This is done in case there are links pointing + # to links, pointing to compressed files. + do { + $changed = 0; + foreach my $link (keys %links) { + my ($directory) = $link =~ m:(.*)/:; + my $linkval = readlink($link); + if (! -e "$directory/$linkval" && -e "$directory/$linkval.gz") { + doit("rm","-f",$link); + doit("ln","-sf","$linkval.gz","$link.gz"); + delete $links{$link}; + $changed++; + } } - } + } while $changed; } + +=head1 SEE ALSO + +L + +This program is a part of debhelper. + +=head1 AUTHOR + +Joey Hess + +=cut