#!/usr/bin/perl =head1 NAME dh_md5sums - generate DEBIAN/md5sums file =cut use strict; use warnings; use Cwd; use Debian::Debhelper::Dh_Lib; our $VERSION = DH_BUILTIN_VERSION; =head1 SYNOPSIS B [S>] [B<-x>] [B<-X>I] [B<--include-conffiles>] =head1 DESCRIPTION B is a debhelper program that is responsible for generating a F file, which lists the md5sums of each file in the package. These files are used by B or the L program. All files in F are omitted from the F file, as are all conffiles (unless you use the B<--include-conffiles> switch). The md5sums file is installed with proper permissions and ownerships. =head1 OPTIONS =over 4 =item B<-x>, B<--include-conffiles> Include conffiles in the md5sums list. Note that this information is redundant since it is included in F in Debian packages. =item B<-X>I, B<--exclude=>I Exclude files that contain I anywhere in their filename from being listed in the md5sums file. =back =cut init(options => { "x" => \$dh{INCLUDE_CONFFILES}, # is -x for some unknown historical reason.. "include-conffiles" => \$dh{INCLUDE_CONFFILES}, }); on_pkgs_in_parallel { foreach my $package (@_) { next if is_udeb($package); my $dbgsym_tmp = dbgsym_tmpdir($package); my $tmp=tmpdir($package); install_dir("$tmp/DEBIAN"); # Check if we should exclude conffiles. my %conffiles; if (! $dh{INCLUDE_CONFFILES} && -r "$tmp/DEBIAN/conffiles") { # Generate exclude regexp. open(my $fd, '<', "$tmp/DEBIAN/conffiles") or error("open $tmp/DEBIAN/conffiles failed: $!"); while (my $line = <$fd>) { chomp($line); next if $line !~ s{^/+}{}; next if $line eq ''; $conffiles{$line} = 1; } close($fd); } generate_md5sums_file($tmp, \%conffiles); if ( -d $dbgsym_tmp) { install_dir("${dbgsym_tmp}/DEBIAN"); generate_md5sums_file($dbgsym_tmp); } } }; sub generate_md5sums_file { my ($tmpdir, $conffiles) = @_; my $find_pid = open(my $find_fd, '-|') // error("fork failed: $!"); my (@files, $pipeline_pid); if (not $find_pid) { # Child chdir($tmpdir) or error("chdir($tmpdir) failed: $!"); exec { 'find' } 'find', '-type', 'f', '!', '-regex', './DEBIAN/.*', '-printf', "%P\\0"; } local $/ = "\0"; # NUL-terminated input/"lines" while (my $line = <$find_fd>) { chomp($line); next if excludefile($line); next if $conffiles and %{$conffiles} and exists($conffiles->{$line}); push(@files, $line); } close($find_fd) or error_exitcode("find -type f ! -regex './DEBIAN/.*' -printf '%P\\0'"); @files = sort(@files); verbose_print("cd $tmpdir >/dev/null && " . q{xargs -r0 md5sum | perl -pe 'if (s@^\\\\@@) { s/\\\\\\\\/\\\\/g; }' > DEBIAN/md5sums}); $pipeline_pid = open(my $pipeline_fd, '|-') // error("fork failed: $!"); if (not $pipeline_pid) { # Child chdir($tmpdir) or error("chdir($tmpdir) failed: $!"); exec { 'sh' } '/bin/sh', '-c', q{xargs -r0 md5sum | perl -pe 'if (s@^\\\\@@) { s/\\\\\\\\/\\\\/g; }' > DEBIAN/md5sums}; } printf {$pipeline_fd} "%s\0", $_ for @files; # @files include NUL-terminator close($pipeline_fd) or error_exitcode("cd $tmpdir >/dev/null && xargs -r0 md5sum | perl -pe 'if (s@^\\\\@@) { s/\\\\\\\\/\\\\/g; }' > DEBIAN/md5sums"); reset_perm_and_owner(0644, "${tmpdir}/DEBIAN/md5sums"); return; } =head1 SEE ALSO L This program is a part of debhelper. =head1 AUTHOR Joey Hess =cut