#!/usr/bin/perl

# ============================================
# mklinks
# --------------------------------------------
#
# usage: mklinks DOTROOT [PREFIX]
#
#
# This script will go through each file or
# sub-folder of DOTROOT and create symbolic
# link to it under your HOME named with "."
# prefix.
#
# This is useful for sharing your dotfiles
# (e.g. using service like Dropbox or keeping
# them in a shared VCS repository like git)
#
#    DOTROOT - path where your shared dot-files
#              are.
#    PREFIX  - where you want your links to
#              dot-files to be created ($HOME
#              by default)
#
# --------------------------------------------
# By Alois Mahdal; no warranty
# ============================================


use strict;
use warnings;
use Getopt::Long;
use File::Spec;

sub usage { print STDERR "usage: $0: DOTROOT [PREFIX]\n"; exit 1; }

my $dotroot;
my $prefix;
my @masks;

my $opts = GetOptions(
    'dotroot=s' => \$dotroot,
    'prefix=s'  => \$prefix,
    'masks=s'   => \@masks
) or usage;

@masks = @masks ? @masks : qw ( .config .local/share );

$dotroot = $dotroot // shift;
$prefix = $prefix // shift;
$prefix = $prefix // $ENV{HOME};
$dotroot or usage;

sub mklinks {
    my $dotroot = shift;
    my $mask = shift;
    $dotroot =~ s|/?$||;
    if ($mask) {
        $dotroot .= $mask;
    }
    if (not -d $dotroot) { warn "not a directory: $dotroot\n"; return }
    my @dirs = `ls $dotroot`;
    foreach my $dir (@dirs) {
        chomp $dir;
        my $source = File::Spec->rel2abs("$dotroot/$dir");
        my $target;
        if ($mask) {
            $target = "$prefix/$mask/$dir";
            `mkdir -p $prefix/$mask`;
        } else {
            $target = "$prefix/.$dir";
            `mkdir -p $prefix`;
        }
        if (-e $target) {
            warn "target exists: $target\n";
        } else {
#           $source = File::Spec->abs2rel($source, $target);
            `ln -sr $source $target`;
        }
    }
}

mklinks($dotroot);
mklinks($dotroot, $_) foreach (@masks);