I think Martin and John's work on #192859 and maybe #128562 have improved the situation. Using the lp:bzr/2.0 branch (where those fixes have landed, they aren't yet on trunk or the other stable branches) the 'bzr add' now gives:
$ bzr add testdir/one
bzr: ERROR: bzrlib.errors.PathNotChild: Path "/tmp/testdir/one" is not a child of path "/tmp/test"
Traceback (most recent call last):
...
That's still a traceback, which isn't a great result, but seems like a step in the right direction: failing with a sensible (although internal) error at the point the user requested something invalid.
I think Martin and John's work on #192859 and maybe #128562 have improved the situation. Using the lp:bzr/2.0 branch (where those fixes have landed, they aren't yet on trunk or the other stable branches) the 'bzr add' now gives:
$ bzr add testdir/one errors. PathNotChild: Path "/tmp/testdir/one" is not a child of path "/tmp/test"
bzr: ERROR: bzrlib.
Traceback (most recent call last):
...
That's still a traceback, which isn't a great result, but seems like a step in the right direction: failing with a sensible (although internal) error at the point the user requested something invalid.