]> git.donarmstrong.com Git - debhelper.git/blobdiff - dh_installman
r519: * dh_installdebconf: allow parameters after -- to go to
[debhelper.git] / dh_installman
index 15c20e5e04154db08960c9ae854aceb576b60151..cc94843e886f100955308a8678f59156fe8757f4 100755 (executable)
@@ -12,15 +12,26 @@ use Debian::Debhelper::Dh_Lib;
 
 =head1 SYNOPSIS
 
-  dh_installman [debhelper options] [manpage ...]
+B<dh_installman> [S<I<debhelper options>>] [S<I<manpage ...>>]
 
 =head1 DESCRIPTION
 
-dh_installman is a debhelper program that is responsible for installing
+dh_installman is a debhelper program that handles installing
 man pages into the correct locations in package build directories. You tell
-it what man pages go in your package(s), and it figures out where to
+it what man pages go in your packages, and it figures out where to
 install them based on the section field in their .TH line and their filename
-extention.
+extension. It also supports translated man pages, by looking for extensions
+like .ll.8 and .ll_LL.8
+
+If dh_installman seems to install a man page into the wrong section or with
+the wrong extension, this is because the man page has the wrong section
+listed in its .TH line. Edit the man page and correct the section, and
+dh_installman will follow suit.  See to L<man(7)> for details about the .TH
+section.  If dh_installman seems to install a man page into a directory
+like /usr/share/man/pl/man1/, that is because your program has a
+name like "foo.pl", and dh_installman assumes that means it is translated
+into Polish. There is currently no support for resolving this ambiguity;
+programs in debian should proably not have extensions like that anyway.
 
 Any man page filenames specified as parameters will be installed into the
 first package dh_installman is told to act on. By default, this is the
@@ -54,13 +65,16 @@ packages if -A is specified).
 
 An older version of this program, L<dh_installmanpages(1)>, is still used
 by some packages, and so is still included in debhelper.
-It is, however, deprecated, due to its counterintuiitive and inconsistent
+It is, however, deprecated, due to its counterintuitive and inconsistent
 interface. Use this program instead.
 
 =cut
 
 init();
 
+my @sofiles;
+my @sodests;
+
 foreach my $package (@{$dh{DOPACKAGES}}) {
        my $tmp=tmpdir($package);
        my $file=pkgfile($package,"manpages");
@@ -75,7 +89,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
        }
 
        foreach my $page (@manpages) {
-               my $basename=Debian::Debhelper::Dh_Lib::basename($page);
+               my $basename=basename($page);
 
                # Support compressed pages.
                my $gz='';
@@ -94,14 +108,14 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
                        open (IN, $page) or die "$page: $!";
                }
                while (<IN>) {
-                       if (/^\.TH\s+[^         ]+\s+(\d+[^     ]*)\s/) {
+                       if (/^\.TH\s+\S+\s+(\d+\S*)\s/) {
                                $section=$1;
                                last;
                        }
                }
                # Failing that, we can try to get it from the filename.
                if (! $section) {
-                       ($section)=$basename=~m/.*\.([1-9][^ ]*)/;
+                       ($section)=$basename=~m/.*\.([1-9]\S*)/;
                }
 
                # Now get the numeric component of the section.
@@ -112,19 +126,21 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
                        error("Could not determine section for $page");
                }
                
+               # Get the man page's name -- everything up to the last dot.
+               my ($instname)=$basename=~m/^(.*)\./;
+       
                my $destdir="$tmp/usr/share/man/man$realsection/";
                # Translated man pages are typically specified by adding the
                # language code to the filename, so detect that and
-               # redirect to appropriate directory.
+               # redirect to appropriate directory, stripping the code.
                my ($langcode)=$basename=~m/.*\.([a-z][a-z](?:_[A-Z][A-Z])?)\.(?:[1-9]|man)/;
                if (defined $langcode && $langcode ne '') {
                        $destdir="$tmp/usr/share/man/$langcode/man$section/";
+                       # Strip the language code from the instname.
+                       $instname=~s/\.$langcode$//;
                }
                $destdir=~tr:/:/:s; # just for looks
 
-               # Get the man page's name -- everything up to the last dot.
-               my ($instname)=$basename=~m/^(.*)\./;
-       
                if (! -e "$destdir/$instname.$section" && 
                    ! -l "$destdir/$instname.$section") {
                        if (! -d $destdir) {
@@ -137,8 +153,7 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
        }
 
        # Now the .so conversion.
-       my @sofiles;
-       my @sodests;
+       @sofiles=@sodests=();
        foreach my $dir (qw{usr/share/man usr/X11R6/man}) {
                if (-e "$tmp/$dir") {
                        find(\&find_so_man, "$tmp/$dir");
@@ -152,25 +167,23 @@ foreach my $package (@{$dh{DOPACKAGES}}) {
 }
 
 # 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) {
+       if (! -f $_ || -s $_ > 1024 || -s == 0) {
                return;
        }
 
        # Test first line of file for the .so thing.
-       open (SOTEST,$_);
+       open (SOTEST,$_) || die "$_: $!";
        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 (Debian::Debhelper::Dh_Lib::basename($File::Find::dir) eq
-                   Debian::Debhelper::Dh_Lib::dirname($solink)) {
-                       $solink=Debian::Debhelper::Dh_Lib::basename($solink);
+               if (basename($File::Find::dir) eq
+                   dirname($solink)) {
+                       $solink=basename($solink);
                }
                else {
                        $solink="../$solink";