I have a cvs repository, with mostly java code. Each package sits in it\'s own top level dir, like so, with the sourced laid out in typical java fashion.
$CVSR
It sounds like you have a great setup for using ivy. It lets your build system handle the pulldown and compile-against parts of your dependencies, and the source control just tracks point-in-time for modules.
Then in your ivy dependency files you have a clear record of what version of each component the others depended on and can revert/advance easily.
You could also use mercurial sub-repos, but I prefer using a good dependency manager like ivy.