[Svnmerge] [PATCH] Eliminate spurious svnmerge-integrated property conflicts

Jack Repenning jrepenning at collab.net
Mon Dec 11 11:19:35 PST 2006


On Tue Dec 5 07:48:26 PST 2006, Raman Gupta wrote:

> If keeping transitive merge data is important to people, perhaps what
> is needed is a discussion of the transitive use cases people wish to
> support, and then a specific implementation to achieve the
> requirements, perhaps enabled by use of a "--transitive" flag.

This whole "transitive merge info" business is kind of a pet project  
of mine, that I've been thinking about and working on for well over  
ten years, so if I get too wordy, feel free to slap me down ;-)  Let  
me start (and maybe even stop, at least as far as this message is  
concerned) with some concrete examples, real-world situations I've  
actually been in.

Limited-distribution product: In this situation, we had an internal  
product with a small number of customers--half a dozen.  The product  
was of substantial size: 100k lines of C, a client/server  
configuration with two or three distinct clients (I will use "client"  
to mean "process that depends on the server," while I will use  
"customer" to mean "team within the company that uses the product.")   
Each customer had their own server, and the customers were not  
software people.  The product was successful (i.e., people used it  
every day), and it evolved quite rapidly (new releases to some  
customer or other every week or so), and each customer had unique  
requirements.  We ended up boxed into maintaining parallel versions  
of what was only roughly the same product, sharing as much code as we  
could, generalizing the idiosyncratic requirements whenever possible,  
parameterizing and modularizing and configuring and otherwise  
limiting the variations as much as we could, but still we ended up  
with half a dozen parallel versions of something that was maybe 80%  
common and 20% custom.  The need for transitive merge tracking arises  
like this: when a problem is discovered in the common code, the  
particular customer who first encounters it is pretty much random.   
At any moment in time, it may or may not be convenient for other  
customers to receive the fix.  Worse than that: some customers would  
actually reject some fixes, because they violate one of their  
idiosyncratic requirements, or at any rate need to be moderated to  
fit their idiosyncrasies.  One concrete example of how messy that  
could get: we had a "fairness doctrine" in the server, that ensured  
that multiple concurrent clients didn't interfere in ways that  
starved one or another unfairly.  But one customer felt "fair" meant  
"equal time for all," while another wanted "in case of a tie, one  
designated client always wins."  A bug fix that improved the "one  
always wins" behavior might make the latter happy, while explicitly  
violating the former.  Key properties of this situation that forced  
us into wanting "transitive merge info":
  - several branches of development
  - proceeding in parallel without any expectation of eventual  
convergence
  - changes might originate in any of the versions
  - changes might propagate to the other versions in any arbitrary order
  - sometimes changes propagate identically, sometimes with tweaks,  
and sometimes we needed to record that a change was positively  
rejected and should never be applied

Database system: I once worked for a major relational database system  
vendor.  A peculiarity of the database business is that customers  
become extraordinarily wedded to the version of the DB they're  
using.  Major releases are allowed/expected to be incompatible, which  
means both that a dump/load of the data is/may be needed, and also  
that your APIs may change incompatibly.  A corollary to this is that  
some customers don't want to upgrade to a new version ... often  
customers with a lot of money to spend.  But the still want change in  
their product, not only bug fixes but even major enhancements of  
various sorts.  At the time I was there, we had four major versions  
in circulation.  The "center of gravity" (number of customers using  
it, or put another way number of dollars coming in for support  
contracts) tended to lag about 1.5 major versions behind the main  
release stream, so we had two or three versions under active, major  
enhancement and support, as well as one or two on "life support."   
Each version had some unique property to distinguish it: physical  
storage format, or highly parallel code, or object-relational  
support, or data replication, and the unique features involved a lot  
of unique code, of course, but there was also a huge majority of the  
code that was shared (and some of the support work on older versions  
consisted of back-porting stuff originally created for newer  
version).  So, once again, we had essentially eternal parallel  
development, with a rich mixture of unique stuff, shared stuff,  
weirdly semi-shared/semi-tweaked stuff, and some notable mixture of  
categorically-not-to-be-shared stuff.

Linux: Things in the Linux world are, perhaps, a bit more  
"cathedralesque" these days than they once were, but if you think  
back, say, to the days "pre-Red Hat," the model went something like  
this: while there was certainly always a very clear definition to  
"the most official Linux in the world" (answer: whatever Linux has),  
the community dynamics included a rich exchange of work at somewhat- 
less-than-Linus levels of officialdom.  There was ample room for  
hobbyists with no more interest than to build their own single site,  
and willing to take a useful feature from some other hobbyist,  
acknowledging that it might have some flaws or limitations that were  
actually keeping it from the One True Linux, "but what the heck, it  
works for me."  Maybe that's still true, maybe the commercially- 
viable, "I don't WANT to understand it, I just want someone to yell  
at if it fails" style is a pure addition.  Anyway, particularly in  
the hobbyist arena, we once again see those now-familiar indicia:  
multiple branches, no real expectation that they'll converge to one,  
on-going change freely interchanged among them, and a distinct  
requirement to accept some changes, modify others, and explicitly  
reject yet others.

So those are my cases.  As you can see, they really reduce down to  
one abstract case, which is handy because it means we only need one  
implementation to address them all!



-==-
Jack Repenning
Director, Software Product Architecture
CollabNet, Inc.
8000 Marina Boulevard, Suite 600
Brisbane, California 94005
office: +1 650.228.2562
mobile: +1 408.835.8090
raindance: 844.7461
aim: jackrepenning
skype: jrepenning







More information about the Svnmerge mailing list