#!/usr/bin/perl

use strict;
use warnings;
use Cwd;

# Make symlinks from your git-project repo into the system. This is only
# designed to work with Media Temple's git-project workflow.
#
# Usage: sudo link-stuff.pl /path/to/git/project
#
# The git-project root should have top-level folders such as `perl-libs`, with
# a path convention like e.g. `perl-libs/$NAME/lib/**/*.pm` -- this script will
# attempt to find system-installed counterparts and symlink them to the file
# from your git repo.
#
# Currently supports the following types of things:
# * perl-libs

my $root = shift;
if (!$root) {
	die "Usage: $0 /path/to/git/project\n";
}
if (!-d $root) {
	die "Error: $root is not a directory\n";
}

chdir($root);
my $abspath = Cwd::abs_path(".");

if (-d "./perl-libs") {
	perl_libs();
}

sub perl_libs {
	# Root directories to check.
	my @lib = (
		"/usr/share/perl5",
		"/usr/share/perl5/vendor_perl",
	);

	# Find all the perl-libs projects.
	opendir(my $dh, "./perl-libs");
	foreach my $project (readdir($dh)) {
		next unless -d "./perl-libs/$project/lib";
		print "Project: perl-libs/$project\n";

		# Get its modules.
		foreach my $module (scan("./perl-libs/$project/lib")) {
			$module =~ s{^\./perl-libs/$project/lib/}{}g;
			foreach my $lib (@lib) {
				if (-f "$lib/$module") {
					print "  - Link: $lib/$module\n";
					unlink("$lib/$module");
					symlink("$abspath/perl-libs/$project/lib/$module", "$lib/$module");
				}
			}
		}
	}
}

# Recursively scan a directory.
sub scan {
	my $dir = shift;

	my @found;

	opendir (my $dh, $dir);
	foreach my $file (readdir($dh)) {
		next if ($file eq '.' || $file eq '..');
		if (-d "$dir/$file") {
			push @found, scan("$dir/$file");
		} else {
			push @found, "$dir/$file";
		}
	}
	closedir($dh);

	return @found;
}