views:

67

answers:

1

Hi,

I'm currently working with a collection of projects which are all their own specific branches / extensions of a generic core project and I am looking for a way to manage the way the projects collaborate.

I understand the following is a little vague, I only have a little experience with version control beyond the basic needs of a single project. What I am looking for is if anyone has come across something like this before and if so, how did they solve it? (ie what technologies/features were utilized or was it simply a matter of creating good practices?)

I'm in the fortunate position of being allowed to completely do away with SVN and move to something else if it is more appropriate.

We have

  • A core subversion source tree (The generic tree) that receives updates.
  • A number of domain specific subversion source trees that will use files from, modify existing files and add new files to the core source tree to generate a final product.

Our Process

  • Changes in the core source tree are manually incorporated into the domain specific trees
  • Occasionally changes in the domain specific trees are deemed “generic”/good enough to be incorporated back into the core tree (and eventually all other domain specific trees)

What we would like is a technology (or technologies) that can

  • Allow each domain specific tree to build against a specific revision in the core tree (ie the build process would grab the specific core revision and then apply all the domain specific changes over the top of it to generate a final product)
  • Would allow each domain specific tree to change the specific revision of the core to build against (This may introduce build errors but as long as the process of changing is relatively straightforward and easy to use).
  • Provide a method for a domain specific tree to contribute changes back to the core repository.
  • As the generic core tree is open source but the domain specific trees are NOT, we will need to have some form of access control placed on some parts of the final solution.

Thanks in advance for any help.

+1  A: 

I would treat them as separate projects in your version control system.

Then use a build system like Ant to build the domain-specific projects. Have the build script export a particular revision or tag of the core project, and put it into a directory of your domain-specific project. (The directory should be excluded from version control.)

Or you can use svn:externals, so that SVN checks out o version of your core project automatically, whenever you check out a domain-specific project.

JW
I originally considered using svn:externals but I couldn't think of a nice way to deal with the domain specific projects modifying the files of the core project. Say for instance if the user modified a core project source file for their domain specific working copy (to add some erroneous feature), how can those changes stay local to that domain specific tree when the source file is from the external core project source file?
Josh LOL
I'm not exactly sure what you mean, about the domain-specific projects modifying the core project. If you need different versions of the core project, then you're going to have to deal with branching, and keeping the branches in sync, etc.. It will be easier if you can avoid that, maybe by having the DS projects extend classes from the core project instead of replacing them.
JW
Or if they're changes that are easily automated, you can use the Ant approach above. You'd have an exported copy of the core project, so the Ant script could change some of its files, and you just wouldn't commit those changes.
JW
Class extension could work for some aspects but it won't really help for things like html or other non "OOP" files. I'm not too familiar with Ant so it might be worthwhile having a look at that.
Josh LOL
I should probably mention that we are using maven 2 for building at the moment
Josh LOL