if using Python>=2.5, distribute uses disutils's upload command, which isn't properly factored, and the only option to make it raise an exception if the upload failed to copy the upload_file method from disutils.
But the upload_file method is different between Python 2.6 and 2.7 (and probably differs from other versions too), so copying just this method is a bitch.
I don't see an easy fix for this. I will leave this as an open issue.
Hopefully, there will resolve this (return proper exit codes) with disutils2, or at least throw exceptions on upload failures.