#!/usr/local/bin/ruby
puts(
( `svn pl -R`.scan(/\S.*'(.*)':\n((?: .*\n)+)/)\
.inject({}) { |h, (d, p)| h[d] = p.strip.split(/\s+/); h }\
.select { |d, ps| ps.include? 'svn:externals' }\
.map { |xd, ps| [xd, `svn pg svn:externals #{xd}`] }\
.map { |xd, exts| exts.strip.split
(/\s*\n/).map { |l| xd + '/' + l.split(/\s+/).first } }\
.inject { |a, b| a + b }\
.map { |d| "cd #{d} && svn up 2>&1" } \
<< 'svn up . --ignore-externals 2>&1'
)\
.map { |cmd| [cmd, Thread.new { `#{cmd}` }] }\
.map { |cmd, thread| "#{cmd}\n#{thread.value}" }.join("\n")
)
From
here