WeDAV Versioning Summary

jamsden@us.ibm.com
Tue, 13 Apr 1999 10:33:27 -0400


From: jamsden@us.ibm.com
To: ietf-dav-versioning@w3.org
Message-ID: <85256752.00505E3E.00@d54mta03.raleigh.ibm.com>
Date: Tue, 13 Apr 1999 10:33:27 -0400
Subject: WeDAV Versioning Summary



In the interest of maintaining the momentum we have establish towards
converging on the WebDAV versioning semantics, could the DELT-V design team
members, and anyone else interested provide feedback on this updated
versioning summary? I am looking to reach consensus, or discover issues so
we can have a better idea what's done and what we need to work on. Thanks
for your effort.

---------------------- Forwarded by Jim Amsden/Raleigh/IBM on 04/13/99
10:18 AM ---------------------------
|------------------>
|    Discussion    |
|    Main Topic    |
|                  |
|       Jim        |
|Amsden/Raleigh/IBM|
|  02/01 08:59 AM  |
|                  |
|                  |
|------------------>
  >------------------------------------------------------------------|
  | .                                                                |
  |                                                                  |
  | Subject:                                                         |
  | .                                                                |
  |            WeDAV Versioning Summary                              |
  |            .                                                     |
  | Category:                                                        |
  |                                                                  |
  |                                                                  |
  |                                                                  |
  |                                                                  |
  >------------------------------------------------------------------|



Introduction

This document summarizes the semantics and rules for WebDAV versioning that
have been discussed the last few weeks on xml-dav-versioning. This document
doesn't present a lot of alternatives, motivation for why we picked one
semantic over another, or raise any issues. These will come later. I will
however try to present versioning, parallel development, configuration
management, and Document Management Systems semantics as simply and
completely as possible so we can see the big picture. Assuming we can nail
down these semantics, the protocol should be pretty straight forward to
design.

WebDAV Versioning Summary

The following is a brief summary of the WebDAV semantics for supporting
versioning, parallel development, and configuration management. This
summary does not describe the details of the protocol, only the high level
semantics the protocol is intended to support.

Creating Versioned Resources

A resource or collection can be put under version control. Putting a
resource under version control creates a versioned resource and sets its
initial revision to the resource. A checked in revision cannot be modified
by anyone at any time.

When a resource is put under version control, the server generates a URI
for each revision that may be used to explicitly access that revision.
These URIs are globally unique and are never reused for any other revision.

Naming Revisions: revision ids and labels

A revision of a versioned resource is given a system assigned revision id
when it is checked in. This revision id acts as an immutable identifier
distinguishing this revision from all others of the same versioned
resource. A revision id can be assigned to only one revision of a versioned
resource, and can never be reused on that versioned resource.

A user may assign other revision names called revision labels to a revision
in order to distinguish it from other revisions using more meaningful
names. These revision labels must be unique for any given versioned
resource, but may be reassigned to any revision of the versioned resource
at any time. Revisions of different versioned resources may have the same
label. There is a distinguished, floating label called "latest" which
always refers to the latest revision in a given activity.

Modifying a Versioned Resource

A versioned resource may be modified by checking out a revision to create a
working resource. A working resource can be updated (PUT, PROPPATCH, etc.)
any number of times. When updates are complete, the working resource is
checked back in. Users can use checkout/checkin to register intent to
modify a versioned resource similar to the way lock and unlock are used in
DAV level 2. The sense is reversed though. A checked in revision cannot be
changed without checking it out first.

A revision may be checked in as mutable or immutable. If the revision is
mutable, a subsequent checkin of a working resource may be done in place
allowing the mutable revision to be updated in place without creating a new
revision. A working resource created by a checkout of a mutable revision
can also be checked back in creating a new revision if the user wants to
retain the previous revision. If the revision is immutable, any checkin of
a working resource derived from this revision must create a new revision.
The mutability of a revision cannot be changed once it has been established
on an initial checkin.

Servers may choose to not allow revisions to be checked in as mutable, or
they may not allow a revision to be checked in without creating a new
revision. These constraints are typical of current configuration management
systems. Document management systems typically allow revisions to be
mutable and don't have these restrictions.

A revision of a collection is modified by adding or removing member URLs.
Changing the contents of a member of a revision of a versioned collection
does not imply a change to that revision of the versioned collection.

Development with Activities

Resources are checked out in the context of an activity. An activity
abstracts a set of related changes a user is making to versioned resources.
Each activity represents a thread of development. Servers may support
multiple sequential activities that can be used to enable controlled
parallel development. These different activities can be merged together at
some later time in order to integrate the changes. Servers that don't
support parallel development effectively only support one, default
activity. A revision that is already checked out in an activity cannot be
checked out again in the same activity. If parallel development is desired,
a user can checkout the revision in another activity and merge them later.

Simple parallel development can be accomplished by using the null activity.
A server may allow many checkouts of the same revision using the null
activity. Merge is not supported for the null activity, client applications
are responsible for integrating the changes.

Selecting Revision through the Workspace

Resources, working resources, and revisions of versioned resources are all
accessed using a URL. Specific revisions of a versioned resource can be
accessed by specifying the server generated revision URI, or the resource
URL and a version label. However, versioned resources are usually accessed
using a simple, human meaningful URL. The revision selected when a specific
revision name is not specified is resolved through a workspace. A workspace
provides a mapping between URLs for versioned resources, and specific
revisions. This allows versioned resources and unversioned resources to be
accessed the same way. As a consequence, relative ULRs continue to work,
and DAV level-2 clients that are not versioning aware are able  to access
versioned resources.

A workspace contains a current activity and a revision selection rule.
Revisions are selected using the following rules in order: If the URL is to
a unversioned resource, then that resource is selected. If the URL is to a
checked out revision, then it is selected. Otherwise the workspace revision
selection rule is applied to select the revision. If there is no matching
revision, then a resource not found status is returned. This rule is
applied to collections to select the revision that determines their member
URLs, and to other resource to determine the revision containing their
contents.

A workspace revision selection rule can specify any number of revision
labels, activities, configurations, or the functor "latest" to specify what
revision to select. The rules are applied in order until the first match is
found. Any subsequent potential matches are ignored. A label matches a
revision with that label. An activity matches the latest revision in that
activity, and may result in merge conflicts. A configuration matches a
revision contained in that configuration. Latest matches the latest
revision.

If a request is made and no workspace is specified, a default workspace
containing the null activity and "latest" in the version selection rule is
used. Administrators can change the current activity and revision selection
rule of this default workspace to have such down-level client requests done
in some other activity, or to support access to more specific revisions of
versioned resources.

A resource revision is checked out in the context of a workspace which is
used, with the resource URL, to subsequently access the working resource.
If a workspace is not specified on checkout, a new workspace is created as
a "checkout token". This workspace has no current activity, and no revision
selection rule. It can only be used to access the checked out working
resource. Client applications that wish to do their own URL to revision
mappings and not rely on server workspaces may use these checkout tokens
and revision GUIDs to do so.

Configuration Management

A workspace represents a volatile set of revisions. Any new checkouts,
changes to the current activity, merging operations, or changes to the
revision selection rule may result in the selection of different revisions.
A configuration is a resource that represents an immutable set of
revisions. A configuration contains a specific revision of each member
versioned resource. A configuration cannot contain a mutable revision
because the semantics of configurations cannot be guaranteed. A workspace
whose version selection rule contains a configuration will always return
the same revisions as long as there are no revisions checked out.

Versioned Collections

A collection contains a set of member URLs. For versioned collections, the
members refer to versioned resources, not particular revisions. To add or
remove members from a revision of a versioned collection, it must be
checked out just like any other resource. Creating a new revision of a
member, or modifying a member has no effect on the collection. Deleting a
versioned resource that is an internal member from a collection does not
delete the versioned resource, it only deletes the member from that version
of the collection. The resource may still be a member of a previous or
subsequent revision of this or some other collection. The URL for a
collection without a particular revision name is resolved to a particular
revision using the workspace the same as any other resource. If the
collection is part of a URL for some other resource, then its members are
determined from the selected revision.

Revision History

Each revision has a predecessor relationship with the revision it was
checked out from, and a successor relationship with revisions that were
checked out from it. Revisions may also have merge predecessor/successor
relationships with other revisions. A merge predecessor is a merge source
while the merge successor is the merge target and contains changes from the
merge predecessor as well as the predecessor. The revision history of a
versioned resource is the directed acyclic graphic (DAG) made up of all its
revisions from the initial revision to all tip revisions in all activities
in which this versioned resource was modified. The revision history
contains sufficient information so that a client may display or sort the
history by last modified properties.

Merging

Each activity represents a separate parallel thread of development. Users
make their changes in the context of an activity. Changes to the same
revision must be done in separate activities or by using the null activity.
At some point, a user may want to merge changes made to the same revision
together to create a new revision containing the combined updates. This is
accomplished by merging an activity into a workspace. In order to do a
merge, it is first necessary to determine what must be merged. A merge
conflict report lists the resources that have been modified in parallel in
different activities. The merge conflict report is generated using the
following rules: 1) if the merge source specifies a predecessor of the
revision selected by the workspace, then the workspace revision is
selected, else 2) if the merge source specifies a successor of the revision
selected by the workspace, then the merge source revision is selected, else
3) the merge source and the current workspace specify revisions that are on
different lines-of-descent, and a potential merge conflict exists and is
included in the merge conflict report.

A user can request the differences between two revisions of a resource
(servers may provide a differences report, but they must at least indicate
if they are the same or not). A user can request conflicts between an
activity and the current workspace to generate a merge conflict report. A
user can also request the differences between a configuration and the
current workspace which lists at least the activities that are contained in
the configuration but not in the workspace and vice versa. So differences
are detected at different levels: content differences for resources,
revision differences for activities, and activity differences for
configurations.

Once the merge conflicts are known, a user resolves the conflicts by
merging the source activity with the workspace. This enters the merge
source into the workspace, and sets the current conflicts that must be
resolved. The conflicts are resolved by merging the revisions from the
merge source into the revision selected by the workspace to create a new
working resource. Servers may perform some default auto merging, but at a
minimum, the merge is done by checking out the revision in the current
activity and noting the merge from the merge source. This creates a  merge
successor/predecessor relationship between the merge source and workspace
revisions called merged-from. The conflict is now removed because the
working resource is now a successor of both the source and target
revisions. It is the user's responsibility to apply the differences in the
two revisions in an appropriate manner. The merge is complete when all the
conflicts are resolved, all differences have been merged, and the resources
are all checked back in. The merge source can now be removed from the
workspace as all of its changes are now included in the current activity.

When merging mutable revisions, the merge conflict report may be inaccurate
as the source revision may change without the system being aware. Users are
responsible for applying any changes to ancestor revisions to their
descendants as appropriate. The system cannot determine if there are any
changes that need to be applied other than by looking a the last-modified
dates of the revisions.

Locking Versioned Resources

Locking a versioned resource prevents any revision from being checked out
in any activity. Locking a revision of a versioned resource prevents just
that revision from being checked out in any activity. Locking an activity
prevents any revisions from being checked out in that activity. Locking a
workspace prevents any checkouts in the current activity of that workspace
(similar to locking the current activity), and prevents changes to the
workspace revision selection rule.