Testsuite: Try harder to locate the tools
[exim.git] / test / src / locate.pl
diff --git a/test/src/locate.pl b/test/src/locate.pl
new file mode 100644 (file)
index 0000000..6f752c1
--- /dev/null
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use File::Find;
+use Cwd;
+
+my @dirs = grep { /^\// && -d } split(/:/, $ENV{PATH}), qw(
+  /bin
+  /usr/bin
+  /usr/sbin
+  /usr/libexec
+  /usr/local/bin
+  /usr/local/sbin
+  /usr/local
+  /opt
+);
+
+my %path = map { $_ => locate($_, @dirs) } @ARGV;
+
+mkdir 'bin.sys'
+  or die "bin.sys: $!"
+  if not -d 'bin.sys';
+
+foreach my $tool (keys %path) {
+    next if not defined $path{$tool};
+    print "$tool $path{$tool}\n";
+
+    unlink "bin.sys/$tool";
+    symlink $path{$tool}, "bin.sys/$tool"
+      or warn "bin.sys/$tool -> $path{$tool}: $!\n";
+}
+
+sub locate {
+    my ($tool, @dirs) = @_;
+
+    # use die to break out of the find as soon
+    # as we found it
+    my $cwd = cwd;
+    eval {
+        find(
+            sub {
+                return unless $tool eq $_ and -x $_ and -f _;
+                die { found => $File::Find::name };
+            },
+            @dirs
+        );
+    };
+    chdir $cwd;
+
+    return (ref $@ eq ref {} and $@->{found}) ? $@->{found} : undef;
+}