[ANN] DeltaStreams release 0.1
Andreas Raab
andreas.raab at gmx.de
Fri Nov 9 04:00:54 UTC 2007
Göran Krampe wrote:
> Still, this is not what you may be asking about - I presume you see all
> the above - I presume you wonder about the "streams" part.
Well, no, not exactly. What I'm wondering about is how DS address the
issues that I'd like to see addressed when looking at both Monticello
and change sets. Because what I'm hoping DS will do is to integrate the
best of change sets (flexibility, size, speed, cross-package changes)
with the best of Monticello (versioning, compare, diff, merge). The
reason why I want these together is that although I loathe Monticello
for all its shortcomings I pick it in every new project over using
change sets. Because by the end of the day, being able to say what is
version X of package Y is more important than all the great properties
of change sets (at least that is true for my work).
So what I'm wondering is, how can DS be used such that they overcome the
problems with Monticello and how would one apply them to such uses. The
main area that I see relates to "versions of packages". By far the
biggest shortcoming of change sets is that they have no idea of versions
and packages and because of that the use of change sets is currently
mutually exclusive with the use of Monticello (don't get me started
about this Frankenstream that is currently used to deal with MCZs as
updates).
I think a version really is the entire set of transformations (Deltas)
applied to bring the package to a particular state. In other words, a
possible version of a package maintained with Deltas could just be a zip
file with all the deltas included. However, in order to to be able to
stream these changes we'd still need that information somehow inside the
delta.
The best way I can think of dealing with it is if a delta could include
information of the "from/to" versions of packages it applies to. In
other words, it would include enough information to say: This delta
started from package version Foo-bar.1, added method Foo>>bar and the
result was package version Foo-bar.2.
This information allows two very important things: First, subscribers to
the stream know which version their working version is based on (it
doesn't guarantee that it is the exact version but similar to Monticello
one could simply mark the package as dirty and require a full diff to
find out whether it has actually changed) which solves the update stream
problems we have today. With the "before state" that deltas have for
individual changes it seems like a perfect match as one could easily
reason about whether an incoming change conflicts with a local
modification etc.
But secondly it should be possible to have multiple versions described
that way for has cross-package changes. The reason why this is important
is that obviously, when you need an atomic update of package Foo and Bar
together they both need to be at the "right" version (e.g., the version
that was described in the delta) and having that information allows you
to update Foo, and when you hit the update in Foo that applies to both
Foo and Bar, you can update Bar up to the point required by the delta
and then apply it.
So it seems that having "some" version information in the deltas
themselves is pretty important. It allows a number of operations that
are otherwise hard or impossible to achieve and would integrate well
with a "Monticello point of view" of maintaining sets of packages while
at the same time having all the nice properties of change sets.
Thoughts?
Cheers,
- Andreas
More information about the Squeak-dev
mailing list
|