X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=dh_movefiles;h=3f59d9e5dfddbc5929e2dfc8dea80fca22867186;hb=e2a6d4cec4a7ee952cf6a7f250d80f1d75a38f95;hp=f2ea12315dac24ed702b406a2cb2f45ac43322b1;hpb=1d9a72073d0f54f96be2404929a452cdf90c2f6b;p=debhelper.git diff --git a/dh_movefiles b/dh_movefiles index f2ea123..3f59d9e 100755 --- a/dh_movefiles +++ b/dh_movefiles @@ -1,69 +1,159 @@ #!/usr/bin/perl -w -# -# Move files out of debian/tmp, into subpackages. +=head1 NAME + +dh_movefiles - move files out of debian/tmp into subpackages + +=cut + +use strict; use Debian::Debhelper::Dh_Lib; -init(); -$ret=0; +=head1 SYNOPSIS + +B [S>] [B<--sourcedir=>I] [B<-X>I] S ...>] + +=head1 DESCRIPTION + +B is a debhelper program that is responsible for moving files +out of F or some other directory and into other package build +directories. This may be useful if your package has a F that installs +everything into F, and you need to break that up into subpackages. + +Note: B is a much better program, and you are recommended to use +it instead of B. + +=head1 FILES + +=over 4 + +=item debian/I.files + +Lists the files to be moved into a package, separated by whitespace. The +filenames listed should be relative to F. You can also list +directory names, and the whole directory will be moved. + +=back + +=head1 OPTIONS + +=over 4 + +=item B<--sourcedir=>I + +Instead of moving files out of F (the default), this option makes +it move files out of some other directory. Since the entire contents of +the sourcedir is moved, specifying something like B<--sourcedir=/> is very +unsafe, so to prevent mistakes, the sourcedir must be a relative filename; +it cannot begin with a `B'. + +=item B<-Xitem>, B<--exclude=item> + +Exclude files that contain B anywhere in their filename from +being installed. + +=item I ... + +Lists files to move. The filenames listed should be relative to +F. You can also list directory names, and the whole directory will +be moved. It is an error to list files here unless you use B<-p>, B<-i>, or B<-a> to +tell B which subpackage to put them in. + +=back -foreach $PACKAGE (@{$dh{DOPACKAGES}}) { - $TMP=tmpdir($PACKAGE); - $files=pkgfile($PACKAGE,"files"); +=head1 NOTES +Note that files are always moved out of F by default (even if you +have instructed debhelper to use a compatibility level higher than one, +which does not otherwise use debian/tmp for anything at all). The idea +behind this is that the package that is being built can be told to install +into F, and then files can be moved by B from that +directory. Any files or directories that remain are ignored, and get +deleted by B later. + +=cut + +init(options => { + "sourcedir=s" => \$dh{SOURCEDIR}, +}); + +my $ret=0; + +foreach my $package (@{$dh{DOPACKAGES}}) { + my $tmp=tmpdir($package); + my $files=pkgfile($package,"files"); + + my $sourcedir="debian/tmp"; if ($dh{SOURCEDIR}) { if ($dh{SOURCEDIR}=~m:^/:) { error("The sourcedir must be a relative filename, not starting with `/'."); } $sourcedir=$dh{SOURCEDIR}; } - else { - $sourcedir="debian/tmp"; - } if (! -d $sourcedir) { error("$sourcedir does not exist."); } - @tomove=(); + my @tomove; # debian/files has a different purpose, so ignore it. - if ( $files && $files ne "debian/files" ) { - @tomove=filearray($files); + if ($files && $files ne "debian/files" ) { + @tomove=filearray($files, $sourcedir); } - if (($PACKAGE eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { + if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) { push @tomove, @ARGV; } - if (@tomove && $TMP eq $sourcedir) { - error("I was asked to move files from $sourcedir to $sourcedir. Perhaps you should set DH_COMAPT=2?"); + if (@tomove && $tmp eq $sourcedir) { + error("I was asked to move files from $sourcedir to $sourcedir. Perhaps you should set DH_COMPAT=2?"); } - if (@tomove) { - if (! -d $TMP) { - doit("install","-d",$TMP); - } - # Now we need to expand wildcards in @tomove. - @filelist=(); + # Now we need to expand wildcards in @tomove. + # This is only necessary in pre-v3 land -- as of v3, the + # expension is automatically done by filearray(). + if (@tomove && compat(2)) { + my @filelist=(); foreach (@tomove) { push @filelist, glob("$sourcedir/$_"); } + @tomove=@filelist; + } + else { + # However, filearray() does not add the sourcedir, + # which we need. + @tomove = map { "$sourcedir/$_" } @tomove; + } - # If the globs expended to nothing, we are done. - next unless @filelist; + if (@tomove) { + if (! -d $tmp) { + doit("install","-d",$tmp); + } - # Order the files. First all real files, then symlinks. - # Putting symlinks last is a nice thing to do for library - # packages and doesn't affect much of anything else. doit("rm","-f","debian/movelist"); - foreach (@filelist) { - $file=$_; - $ret=1 if (! -e $file && ! -l $file); - $file=~s:^\Q$sourcedir\E/+::; - complex_doit("(cd $sourcedir >/dev/null ; find $file ! -type d -print || true) >> debian/movelist"); + foreach (@tomove) { + my $file=$_; + if (! -e $file && ! -l $file && ! $dh{NO_ACT}) { + $ret=1; + warning("$file not found (supposed to put it in $package)"); + } + else { + $file=~s:^\Q$sourcedir\E/+::; + my $cmd="(cd $sourcedir >/dev/null ; find $file ! -type d "; + if ($dh{EXCLUDE_FIND}) { + $cmd.="-a ! \\( $dh{EXCLUDE_FIND} \\) "; + } + $cmd.="-print || true) >> debian/movelist"; + complex_doit($cmd); + } } - complex_doit("(cd $sourcedir >/dev/null ; tar --create --remove-files --files-from=../movelist --file -) | (cd $TMP >/dev/null ;tar xpf -)"); + my $pwd=`pwd`; + chomp $pwd; + complex_doit("(cd $sourcedir >/dev/null ; tar --create --files-from=$pwd/debian/movelist --file -) | (cd $tmp >/dev/null ;tar xpf -)"); + # --remove-files is not used above because tar then doesn't + # preserve hard links + complex_doit("(cd $sourcedir >/dev/null ; tr '\\n' '\\0' < $pwd/debian/movelist | xargs -0 rm -f)"); doit("rm","-f","debian/movelist"); } } @@ -76,3 +166,15 @@ foreach $PACKAGE (@{$dh{DOPACKAGES}}) { # packages that arn't always sure exactly which files need # to be moved. exit $ret; + +=head1 SEE ALSO + +L + +This program is a part of debhelper. + +=head1 AUTHOR + +Joey Hess + +=cut