summaryrefslogtreecommitdiff
path: root/dh_movefiles
blob: 9795b785a1a0f0f86f18ab609ebf7a629328e51a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/perl -w
#
# Move files out of debian/tmp, into subpackages.

use Debian::Debhelper::Dh_Lib;
init();

$ret=0;

foreach $PACKAGE (@{$dh{DOPACKAGES}}) {
	$TMP=tmpdir($PACKAGE);
	$files=pkgfile($PACKAGE,"files");

	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=();

        # debian/files has a different purpose, so ignore it.
	if ( $files && $files ne "debian/files" ) {
		@tomove=filearray($files);
	}
	
	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.");
	}

	if (@tomove) {
		if (! -d $TMP) {
			doit("install","-d",$TMP);
		}
		# Now we need to expand wildcards in @tomove.
		@filelist=();
		foreach (@tomove) {
			push @filelist, glob("$sourcedir/$_");
		}

		# If the globs expended to nothing, we are done.
		next unless @filelist;

		# 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","movelist");
		foreach (@filelist) {
			$file=$_;
			$ret=1 if (! -e $file && ! -l $file);
			$file=~s:^$sourcedir/+::;
			complex_doit("(cd $sourcedir >/dev/null ; find $file ! -type d -and ! -type l -print || true) >> movelist");
		}
		foreach (@filelist) {
			$file=$_;
			$ret=1 if (! -e $file && ! -l $file);
			$file=~s:^$sourcedir/+::;
			complex_doit("(cd $sourcedir >/dev/null ; find $file ! -type d -and -type l -print || true) >> movelist");
		}
		complex_doit("(cd $sourcedir >/dev/null ; tar --create --remove-files --files-from=../../movelist --file -) | (cd $TMP >/dev/null ;tar xpf -)");
		doit("rm","-f","movelist");
	}
}

# If $ret is set, we wern't actually able to find some 
# files that were specified to be moved, and we should
# exit with the code in $ret. This program puts off 
# exiting with an error until all files have been tried
# to be moved, because this makes it easier for some 
# packages that arn't always sure exactly which files need
# to be moved.
exit $ret;