If you have a makefile M containing:
projects = p_a
projects = p_b
And project p_a has a makefile N containing:
projects = p_b
Then you get a spurious "Directory not empty" error for p_b. Worse, if p_b is in a git repository,
drush_make_download_git fails horribly the second time round: drush make stops in its tracks when it tries to unpack p_b a second time (I think - it basically quits with "error in drush_drush_make_make" immediately after the second "p_b cloned from..." message.)
When you don't have control over the makefiles - if they're in contrib on d.o, or in someone else's module - then there's nothing you can do to prevent this from happening. Two project makefiles could justifiably bring in a CCK dependency, and you'll then get an error message that, it turns out, you can ignore; but if two makefiles try to bring in the same git repository, then you will never be able to build the site using drush make as it stands. This is probably going to become more and more of a problem as Drupal moves to using git.
Please find attached a patch which solves this. The patch does two major things:
DrushMakeProject::findDownloadLocation keeps track of what it's been asked to download before. If it recognizes a package, it only reports a warning, not an error, on the directory not being empty.
drush_make_download_factory checks for repeat projects, and produces a verbose warning when the second or future calls is attempted.
By still reporting [warning]s, that means that any potential problems can be tracked by looking at the reported drush log, but 1. means that the directory-not-empty isn't reported as a (spurious) error, and 2. means that a lower-level PHP error doesn't kill