- From: Greg Stein <gstein@lyra.org>
- Date: Sun, 31 Dec 2000 04:26:16 -0800
- To: ietf-dav-versioning@w3.org
I'm starting from scratch on this, but this message is tied to the thread
entitled "COPY and retain history". It just wouldn't be clean to respond to
those messages.
Basic issue: needing a way to add a member to a working collection that
refers to an existing version resource, then possibly allowing further
changes to that added member before [activity] checkin.
Background/details/etc:
*) current situation: collection versions contain version histories. Working
collections contain version histories or non-versioned resources.
*) VERSION-CONTROL creates a new VCR, which implies it cannot be used in a
collection version or a working collection
*) BASELINE-CONTROL was suggested by Geoff for some purpose (not entirely
clear), but it puts existing collections under baseline control. We have
only one "public" collection, which is the repository root's VCR.
*) (model-wise) Subversion's collection versions contain version resources.
New collection versions are created if the collection must refer to a
different version resource of a member ("bubble up" occurs).
[ I say "model-wise" because this is the SVN model, but the DeltaV terms
don't strictly apply because of the definition of a collection
version's member resources. ]
*) Commits can be made atomic via merging an activity. This is a rather
heavyweight operation in the SVN server:
- for all non-versioned resources in the activity, create new version
histories and initial versions
- check in all working resources
- update all VCRs to refer to the new version resources
- the VCRs are baseline-controlled, so the baseline selector is checked
out, a new baseline is created, and then the baseline is checked in.
(per S9.11, DAV:auto-baseline)
The resulting baseline would refer to the proper set of version
resources, so we're fine so far.
*) While SVN collections refer to specific versions, it could be possible to
leave that only to the baselines and to somehow construct a "standard"
collection version resource.
[ this might be difficult because in DeltaV, a new collection version is
created when the *set* of members is changed; in SVN, a new collection
version is created when the set changes *or* a member gets a new
version resource. The hard part is "creating" collection versions on
set-changes, but not member version changes. Now that I have thought
about it, it might not be possible to do this; if it *is* then it will
probably be quite expensive and it doesn't fit the model at all ]
[ hmm. an alternative would be to go ahead and create new collection
version resources even when "no change" has occurred in the set of
members. to a client, it simply sees spurious creation of collection
versions, but shouldn't have a real issue with it. ]
Given the second model in the "aside" above, it would seem that we could
model a DeltaV collection version. A true SVN collection version would
only be exposed via a baseline.
*) The problem: given a working collection, I need a way to specify that a
member is a specific version resource. The member may be furthered
modified before it is checked in. When the new (auto) baseline is
constructed, it will refer to the original version resource or to the
modified successor of that version resource.
Note that the member may be a collection or a non-collection resource.
(I state this because I think Geoff said to use a BASELINE-CONTROL for
this copy-by-ref thing, but that would only apply to a collection)
My ideal solution would be to allow collection versions, and thusly working
collections, to contain version resources *instead* of version histories.
This would solve the model disparity for collection versions. However,
putting a version resource into a working collection isn't quite right...
That would prevent a change of the copy-by-ref'd resource before it was
checked in. It almost seems that the needed model would be a working
resource where the DAV:checked-out property is the copied version resource.
But that might spawn a new version resource even when we don't make any
changes...
sigh. Here would be an ideal sequence of semantic operations:
1) CHECKOUT a collection version (within an activity)
2) "copy" a specific version resource into the working collection; the copy
should also be a version resource, tied to the same version history. In
fact, using the BIND method is pretty close: construct a new URL for a
given version resource.
3) somehow "checkout" the "new" version resource to create a working
resource
4) PUT/PROPPATCH changes to that working resource
5) MERGE the activity
Yes... steps (2) and (3) are the hard part.
I'm all for fitting into the existing DeltaV model(s), but I can't see how.
Hmm. What if I copy/bind/whatever a version resource ("VR") into the working
collection ("WC"). If changes are needed, then I do a CHECKOUT on VR and a
working resource ("WR") is returned. PUT/PROPPATCH request(s) are performed
on WR. At checkin/merge time, the server understands that WR corresponds to
VR. The new collection version (or baseline; the actual new "thing" seems to
be moot here) is created to refer to VR, or to VR' (resulting from the
checkin of WR).
It may also be that a version-controlled resource would go into WC which
initially points at the original version resource. However, this creates
problems when we go to check out that version resource to make further
changes. That would lose the association between WC and the "new" member.
But the nice part about the VCR is that it can point to VR'. Otherwise,
there is a need to "replace" VR (within WC) with VR'.
Obviously... I haven't figured out the best way to model this (within the
existing DeltaV or figuring out how it needs to change). Any thoughts?
Cheers,
-g
--
Greg Stein, http://www.lyra.org/
Received on Sunday, 31 December 2000 07:21:48 UTC