I have developed a script which does an svn copy and allows you to
update the svn:externals in one of two ways to address tagging (1258)
and branching (1829):

--pin-externals or --tag

Update any svn:externals to ensure they have a version number,
using the current destination version if none is already specified.
Useful for tagging operations.

This implements 1258 (albeit in a script rather than the svn
commandline).

--update-externals or --branch

Update any unversioned svn:externals which point to a location
within one of the sources so that they point to the corresponding
location within the destination.

This implements 1829.

I include the script, along with a test script I built up while
developing the script.

Note: this script is (almost) atomic - it does the work in a local
working copy and then commits (although it creates intermediate
directories directly in the repository, so there may be a couple of
preparatory checkins). However, it can result in a large working copy
and take a while...

Suggestion: allow a checkout without following externals. This would
save some time and space for this script (which is doing externals
meta-work and so doesn't need the contents of the externals; in fact it
explicitly ignores them).

The scripts are attached (because I don't trust my mailer to leave my
line-endings alone) - svncopy.pl.in is the script, testsvncopy.pl.in is
the test.