#!/usr/bin/perl

=head1 NAME

dh_installexamples - install example files into package build directories

=cut

use strict;
use warnings;
use Debian::Debhelper::Dh_Lib;

our $VERSION = DH_BUILTIN_VERSION;

=head1 SYNOPSIS

B<dh_installexamples> [S<I<debhelper options>>] [B<-A>] [B<-X>I<item>] [S<I<file> ...>]

=head1 DESCRIPTION

B<dh_installexamples> is a debhelper program that is responsible for
installing examples into F<usr/share/doc/package/examples> in package
build directories.

=head1 FILES

=over 4

=item debian/I<package>.examples

Lists example files or directories to be installed.

=back

=head1 OPTIONS

=over 4

=item B<-A>, B<--all>

Install any files specified by command line parameters in ALL packages
acted on.

=item B<--sourcedir=>I<dir>

Look in the specified directory for files to be installed.  This option
requires compat 11 or later (it is silently ignored in compat 10 or earlier).

Note that this is not the same as the B<--sourcedirectory> option used
by the B<dh_auto_>I<*> commands. You rarely need to use this option, since
B<dh_installexamples> automatically looks for files in F<debian/tmp> in debhelper
compatibility level 11 and above.

=item B<-X>I<item>, B<--exclude=>I<item>

Exclude files that contain I<item> anywhere in their filename from
being installed.

=item I<file> ...

Install these files (or directories) as examples into the first package
acted on. (Or into all packages if B<-A> is specified.)

=back

=head1 NOTES

Note that B<dh_installexamples> will happily copy entire directory hierarchies
if you ask it to (similar to B<cp -a>). If it is asked to install a
directory, it will install the complete contents of the directory.

=cut

init(options => {
	"sourcedir=s" => \$dh{SOURCEDIR},
});

# PROMISE: DH NOOP WITHOUT pkgfile-logged(examples)

my $pwd;
my $error_handler = compat(10) ? \&glob_expand_error_handler_warn_and_discard : \&glob_expand_error_handler_reject;
my $nodocs = is_build_profile_active('nodoc') ? 1 : 0;
# We cannot assume documentation is built under nodoc, but if it is we must flag it as handled
# or dh_missing might make noise.
$error_handler = \&glob_expand_error_handler_silently_ignore if $nodocs;

foreach my $package (getpackages()) {
	next if is_udeb($package);

	my $tmp=tmpdir($package);
	my $file=pkgfile($package,"examples");
	my @search_dirs = ('.');
	@search_dirs = ($dh{SOURCEDIR} // '.', default_sourcedir($package)) if not compat(10);
	
	my @examples;
	
	if ($file) {
		@examples = filearray($file, \@search_dirs, $error_handler) if $file;
	}	

	if (($package eq $dh{FIRSTPACKAGE} || $dh{PARAMS_ALL}) && @ARGV) {
		push @examples, @ARGV;
	}

	log_installed_files($package, @examples);

	next if not process_pkg($package) or $nodocs;

	if (@examples) {
		install_dir("$tmp/usr/share/doc/$package/examples");

		my $exclude = '';
		if ($dh{EXCLUDE_FIND}) {
			$exclude .= ' -and ! \( '.$dh{EXCLUDE_FIND}.' \)';
		}
		
		foreach my $example (@examples) {
			next if excludefile($example);
			if (-d $example && $exclude) {
				my $basename = basename($example);
				my $dir = ($basename eq '.') ? $example : "$example/..";
				chomp($pwd=`pwd`) if not defined($pwd);
				complex_doit("cd '$dir' && " .
							 "find '$basename' -type f$exclude -print0 | LC_ALL=C sort -z | " .
							 "xargs -0 -I {} cp --reflink=auto --parents -dp {} $pwd/$tmp/usr/share/doc/$package/examples");
			}
			else {
				doit("cp", '--reflink=auto', "-a", $example,
					 "$tmp/usr/share/doc/$package/examples");
			}
		}
	}
}

=head1 SEE ALSO

L<debhelper(7)>

This program is a part of debhelper.

=head1 AUTHOR

Joey Hess <joeyh@debian.org>

=cut
