The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

## allow user to specify a p4 version bin directory
## either via commmand line or menu, then return.


use Cwd;
use File::Basename;
use File::Spec;
use Getopt::Std;


# set the directory where the p4 versions are
my $dir = File::Spec->rel2abs( dirname( $0 ) );
$dir = File::Spec->catfile( $dir, "p4versions" );

sub dumb_menu {
   use Term::ReadLine;

   $term = new Term::ReadLine "menu_result";

   my $num_items = @_;
   return unless $num_items;

   print "p4 and p4d versions found:\n";
   print "  $_\n" for @_;

   my $ver;
   do {
      my $prompt = "Enter version number to use: ";
      $prompt .= " [$_[0]] " if $num_items == 1;
      $ver = $term->readline( $prompt );
      $ver = $_[0] if $num_items == 1 && (! defined $ver || ! length $ver);
   } until grep { $ver eq $_ } @_ ;

   return $ver;
}


sub find_versions {
   my $save_dir = cwd;
   chdir $dir;
   my @versions = sort glob "*";
   chdir $save_dir;

   return @versions;
}


sub usage {
   die "usage: p4version
       p4version [version-number]
         select a p4 version, and print full path for that version to standard out.
         options: -h   this help
                  -l   list all available versions
";
}


my $version;

getopts('hl', \%opts) or usage;

usage if $opts{h};
if( $opts{l} ) {
   my @versions = find_versions;
   print join " ", map( "$dir/$_", @versions ), "\n";
   exit 0;
}
elsif( @ARGV == 1 ) {
   $version = shift;

   die "p4 version directory $dir/$version not found\n"
      unless -d "$dir/$version"
}
else {
   # determine what versions are available to select
   # (both p4 and p4d must be present)
   my $ver_hash;
   
   my @versions = find_versions;
   die "no p4 versions found\n" unless @versions;

   #select version, or exit
   $version = dumb_menu @versions;
   
}


print "$dir/$version\n";