#!/usr/bin/perl

use strict;

my $copy = 0;

sub renameWrap($$) {
  my $src = shift;
  my $dest = shift;
  if ($copy) {
      return system("cp -R '$src' '$dest'") == 0;
  }
  rename($src, $dest) && return 1;
  return system("mv '$src' '$dest'") == 0;
}

sub mergedir($$) {
  my $src = shift;
  my $dest = shift;

  if(! -e "$dest") {
    renameWrap("$src", "$dest") || die("Rename: $!\n");
    return 1;
  }

  opendir(IN, $src) || die("$src: $!\n");
  my @dir = readdir IN;
  closedir IN;

  foreach my $i (@dir) {
    next if($i eq ".");
    next if($i eq "..");
    if(-d "$src/$i") {
      if(-e "$dest/$i") {
        mergedir("$src/$i", "$dest/$i");
      } else {
        renameWrap("$src/$i", "$dest/$i") || die("Rename: $!\n");
      }
    } else {
      renameWrap("$src/$i", "$dest/$i") || die("Rename: $!\n");
    }
  }
  rmdir($src);
  return 1;
}

my @paths;
foreach my $arg (@ARGV) {
	if ($arg eq "-copy") {
		$copy = 1;
	} else {
		push @paths, $arg;
	}
}
die("Usage: mergedir [-copy] source target\n") if(@paths != 2);
mergedir($paths[0], $paths[1]);
