David Radcliffe wrote:
> Julian,
>
> Thanks for considering my suggestion, and your detailed reply.
>
> Yes, 'sparse branching' does nicely describe the effect I am trying to
> achieve. I do appreciate that any form of 'variants' is going to cause a
> management overhead.
A few more thoughts, on reflection.
1. I should have said, sparse branching is undoubtedly useful. Subversion
currently doesn't have a way to manage sparse branching, except that you can
branch a single sub-tree of your project. The back end allows branching each
file separately, but there is no support for managing that at a higher level.
Adding some sort of sparse branching support, at least per file, is certainly
an interesting direction to contemplate for Subversion in the longer term.
> The specific problems I'm trying to overcome are:
>
> 1. Parameter controlled functionality:
> Fairly easy to achieve,
> Requires only one build (of any 'tag'),
> BUT
> May result in unnecessarily large .EXE or DLL for every customer,
> Checking (at run-time) for a large number of parameters is messy and
> time-consuming, as is the admin of them,
> All code is present in every customer's copy, so un-licenced features
> could be enabled if parameter name is learned.
>
> 2. Conditional Compilation:
> Advantage of only one check-out (per 'tag'),
> Un-compiled code still visible, but greyed-out,
> BUT
> Suffers from developer resistance ('old school' way of doing things),
> Easy to make mistakes when setting values in MS Visual Studio (other
> IDEs
> may handle this better).
>
> It is these last two points which are the biggest barrier, and their effect
> should not be under-estimated.
> I have heard developers say that they would much rather suffer the overhead
> of
> updating several separate branches (with bug-fixes & enhancements), (along
> with all the risks that that approach exposes), rather than risk using
> Conditional Compilation.
2. I am going to hazard a guess that you're using the IDE's "project
configurations" system to select different configurations. (I don't know the
specific terminology MSVS uses, as it's years since I used it, but other IDEs
have the same idea.) This is the system that lets you customise everything
about how the project is built, from choosing the compiler through to choosing
in what colour the comments are displayed (OK maybe not going quite that far
:-).
The trouble with that system, at least on NetBeans IDE which I'm currently
using, is it doesn't have a way to say "the only thing I want to vary between
configurations is this single #define" and it doesn't have a way to easily
check whether everything else is the same or accidentally different between
configurations, or to help you manage that.
Or, if you're not doing that, then maybe you're going into the project settings
and editing one of the #defines, and have to be careful not to accidentally
touch anything else, and then when you check in the project you have to be
careful about whether you check in the change to the project configuration or
not, and if so whether there are any accidental other changes.
Either way, with interfaces like that, yes, it's horribly fragile.
(And I'm assuming you only need to change one #define to select your variant.
If you're having to change multiple definitions or settings, I'd suggest you
first look into reducing that.)
The reaction from devs that they'd rather use branches sounds very much like a
reaction *away* from something bad, rather than necessarily knowing that
branching would be better.
It sounds like what you need is a better interface, one that lets you select a
variant with "one click" without the risk of changing other settings. I'm going
out on a limb here, but would it be possible to script or write a plug-in to
MSVS to add a "variant chooser" control which either edits the single #define
or selects one of the multiple configurations but also checks that everything
is synchronized apart from the #define, or something? In other words, to work
around the issue that the UI is currently making this kind of work flow harder
than it should be?
> Certainly, the two existing methods of variant management lend themselves
> fairly
> well to the situation of fixes needing applying to common-code (thus all
> variants), which I accept that a 'sparse' branch' may impact.
>
> So, by moving the decision on which variant to compile back to the
> source-code
> check-out stage, most of the above failings could possibly be avoided.
> I do acknowledge that this still is not a 'silver bullet' to cure the
> problem of variants - I doubt that there is one - but it might help.
3. "Branching" as managed by a version control system implies the system can
show you the separate streams of development (so, "log" would be able to show
only the changes on one specified branch, for example) and the ability to
extract changes from one branch and merge them to another branch (imagine if
two of your variants are nearly identical and need the same bug fix). No matter
if you don't often want to do such merges, but the ability to have branches
without even a concept of being able to merge between them and track them
separately is not really a concept of branches at all.
If Subversion was to be able to support this kind of "branching" at the
granularity of text hunks, that has profound implications for the way in which
changes are recorded in the repository, especially in merge tracking and log
history tracking. That doesn't now seem at all feasible.
I think these are the kind of issues that define the essential differences
between conditional compilation and branching (whether sparse or not). Only by
considering your needs in relation to these kinds of issues can you really make
the right choice.
Now, if you say variants aren't like regular branching, and don't need separate
tracking, and don't need merging, then what do they have to do with version
control itself, really, fundamentally? If what you want is support for per-hunk
variants but *not* support for merging and separately seeing their histories
with "log", and so on, then I think it boils down to being just a kind of
conditional compilation add-on.
If it's a conditional compilation add-on that you're looking for, with a better
user interface than MSVS provides, then I have to ask, why a
Subversion-specific one? You already have a language-specific method (#define
in the C family of languages) and an IDE-specific one (MSVS project
configurations). Why a Subversion-specific one, if it doesn't interact with
version control features such as branching and merging and logs? Beyond
trivialities like that it's convenient to have it run automatically after
checkout and update, and knowing it'd automatically be available because you
installed Subversion, of course.
I'm not saying it's irrelevant to Subversion, but that it might be more
productive to think of it as a separate tool that would make a good plug-in to
any version control system as well as being useful on its own.
- Julian
> Maybe the question should be put to the SVN community, to see what other
> users
> feel about this?
>
> I haven't had a chance to try implementing anything. If I get time, I might
> try the post-check-out script idea...
>
> Thanks again, Dave Radcliffe