Return to Snippet

Revision: 47424
at June 8, 2011 01:35 by jigante


Updated Code
<?php

if (count($argv) !== 4)
{
  die("Usage: svnforeigncopy from-repo-url to-repo-url local-checkout-dir\n");
}

$from = $argv[1];
$to = $argv[2];
$local = $argv[3];

echo("Creating $to\n");
mysystem("svn mkdir --parents " . escapeshellarg($to));
echo("Checking out $to\n");
mysystem("svn co " . escapeshellarg($to) . " " . escapeshellarg($local));
echo("Exporting non-external content of $from to $local\n");
mysystem("svn export --force --ignore-externals " . escapeshellarg($from) . " " . escapeshellarg($local));
echo("Checking out $from to $local.tmp without externals so that we can do efficient recursive propgets\n");
mysystem("svn co --ignore-externals " . escapeshellarg($from) . " " . escapeshellarg("$local.tmp"));
echo("Querying svn:externals properties of $from\n");
$externals = simplexml_load_string(stream_get_contents(popen("svn propget --xml --recursive svn:externals " . escapeshellarg("$local.tmp"), "r")));
echo("Querying svn:ignore properties of $from\n");
$ignores = simplexml_load_string(stream_get_contents(popen("svn propget --xml --recursive svn:ignore " . escapeshellarg("$local.tmp"), "r")));
echo("Adding $local contents (necessary before externals can be set)\n");
mysystem("cd " . escapeshellarg($local) . "; svn add *; cd ..");
echo("Applying externals\n");
applyProperties($externals);
echo("Applying ignores\n");
applyProperties($ignores);
echo("Removing $local.tmp");
mysystem("rm -rf " . escapeshellarg("$local.tmp"));
echo("Committing $local\n");
mysystem("svn commit " . escapeshellarg($local));
echo("Updating $local\n");
mysystem("svn update " . escapeshellarg($local));
echo("Done!\n");

function applyProperties($properties)
{
  global $local;
  foreach ($properties->target as $target)
  {
    $path = $target['path'];
    $path = str_replace("$local.tmp/", "", $path);
    foreach ($target->property as $property)
    {
      $name = $property['name'];
      $value = (string) $property;
      mysystem("svn propset " . escapeshellarg($name) . " " . escapeshellarg($value) . " " . escapeshellarg("$local/$path"));
    }
  }
}
 
function mysystem($cmd)
{
  passthru($cmd, $val);
  if ($val != 0)
  {
    die("Command $cmd exited with nonzero exit status $val\n");
  }
}

Revision: 47423
at June 8, 2011 01:34 by jigante


Initial Code


Initial URL


Initial Description


Initial Title
Apostrophe SVN Foreign Copy

Initial Tags
svn, textmate

Initial Language
PHP