#!/usr/bin/env perl
# rel - display the relative path to a file from a given base
use warnings;
use strict;
use Cwd;
use File::Spec;
use Getopt::Long qw(:config bundling no_ignore_case);
use Data::Dumper;

BEGIN {
	if (eval {require Nullroute::Lib}) {
		Nullroute::Lib->import(qw(_debug _warn _err _die));
	} else {
		$::arg0 = (split m!/!, $0)[-1];
		$::debug = !!$ENV{DEBUG};
		$::warnings = 0;
		$::errors = 0;
		sub _debug { warn "debug: @_\n" if $::debug; }
		sub _warn  { warn "warning: @_\n"; ++$::warnings; }
		sub _err   { warn "error: @_\n"; ! ++$::errors; }
		sub _die   { _err(@_); exit 1; }
	}
}

my $base = $ENV{HOME};

sub do_rel {
	my ($base, $path) = @_;
	my $abs = Cwd::abs_path($path);
	if (!defined $abs) {
		return _err("'$path' does not exist");
	}
	my $rel = File::Spec->abs2rel($abs, $base);
	if ($::debug) {
		_debug("* given path: \"$path\"");
		_debug("    absolute: \"$abs\"");
		_debug("  given base: \"$base\"");
		_debug("     rebased: \"$rel\"");
	}
	print "$rel\n";
}

sub usage {
	print "$_\n" for
	"Usage: $::arg0 [-b base] <path>...",
	"",                       #
	"  -b, --base=PATH        Base for making relative paths",
}

# Option parsing

GetOptions(
	"help"		=> sub { usage(); exit; },
	"b|base=s"	=> \$base,
) or exit 2;

# Main code

$base = Cwd::abs_path($base);

if (@ARGV) {
	do_rel($base, $_) for @ARGV;
} else {
	do_rel($base, getcwd());
}
