From: jamsden@us.ibm.com To: ietf-dav-versioning@w3.org Message-ID: <85256804.0064355F.00@d54mta03.raleigh.ibm.com> Date: Fri, 8 Oct 1999 14:14:27 -0400 Subject: Versioning Protocol 2.2 Review Here's my comments on version 2.2 of the versioning specification. Section 1.2 : The last sentence of the definition of a baselined collection contains a circular definition. It should read "A baseline is a configuration that contains a revision of the associated versioned collection and a revision of each and every member of that versioned collection with depth infinity." For the definition of history resource, my notes from concord say: Decide on a name for the versioned resource as a whole, currently called a history resource. Use the new name in the *-id property names. Resolution: use resource, revision, and versioned resource instead of versioned resource, revision, history resource. In cases where it the resource must be a revision, note it. 2.4, last sentence: merge operation is not defined. 2.7 needs an example. 3.1.3 Property Resources: WebDAV already has properties that are references to resources. For example DAV:link and DAV:href. It seems confusing to have PROPFIND follow these links for some references and not others, and to require a special header DAV:property-resource-URL to get the actual value of the property. I have no problem representing properties as references to resources, just this optimization seems a little contrived. Section 2 needs examples of methods that perform the functions described in each section. This ties the methods, headers, entity bodies, properties, and new resource types back to the semantics. 3.2.1 implies that the DAV:rev element is a list of revision identifiers when what is meant is that the rev element is used as an entry in such a list. 3.2.2 revision labels also appear in headers which cannot use XML encodings. 3.2.3 WebDAV uses "T" and "F" fro boolean values. See DAV:overwrite. 3.3.2 ELEMENT comment not author 3.4.6 says the DAV:auto-version value can take the same values as the DAV:checkin-policy, but the value is described and given as boolean. 3.4.6 revision-labels could be just labels 3.4.9 is DAV:history-uuid the same as requesting the DAV:history property with DAV:property-resource-URL? 3.4.12 DAV:merge-successors is defined to contain bindings to each revision. All the other predecessor/successor properties use less specific language. The XML document contains revision-ids, not bindings. Perhaps the use of bindings in this context is incorrect or misleading. 3.4 Missing DAV:activity for Revision resources. 3.5.3 DAV:baseline doesn't make sense. The checkin must be done and followed by a make baseline. This seems like an excess of control coupling. Why is this policy needed? Isn't it the same as checkin followed by make baseline? DAV:checkin-policy is not extensible as written. Need to add ANY? Should checkin-policy be a client responsibility? DAV:baseline cannot be part of [Core]. 3.6.1 Need a definition of the XML document for DAV:working-resources property. 3.6.2 ..., thus target... .... The target... I thought RSRs were part of "extended" workspace semantics and weren't part of [Core] (although I don't necessarily agree with this). Where is the RSR defined? 3.7.2 DAV:needed-activities should be required-activities. 3.7.3 Why is it necessary to restrict activities to one editor at a time? An activity is like a branch label. It is not uncommon for many developers to be working on different resources in the same activity. 3.8.1 I don't understand this definition. I though the roots were the collections that WERE added to the configuration. What's not included is their members (recursively) although those members are included in the configuration. 3.9.1 Why is baselines plural? A revision of a versioned collection can only have one baseline. A collection versioned resource can have many baselines, at most one for each revision. 3.10.2 DAV:revisions is not consistent. The first sentence says it s a collection of revision ids. The last sentence says it contains URLs of the revisions. Should be revision ids like all other references to revisions in properties (e.g., DAV:successors). How are the reserved characters escaped? 3.10.3 DAV:revision-labels is also inconsistent. It perhaps incorrectly uses the term binding, implies labels are resources. Why is this included? It sounds like an implementation detail. With the History Resource DAV:revisions property, and the Revision DAV:revision-labels property, this can be calculated. In any case, the binding name can't be that label as it must be scopped by the History Resource since the same label can be applied to a revision of other History Resources. Section 3: we need to define DAV:resourcetype for all these new resources. 4.1.1 Perhaps we should define GET on the versioning resource to return empty entities. Then we can change them later if needed. 4.1.2 meaning revisions of versioned collections cannot contain bindings to unversioned resources? Why is this required? How would a new resource be added to a working collection resource? 4.1.3 implies that a working collection resource can contain a null resource which can't be a versioned resource. 4.1.3 Why is PUT on a null resource a special case creating a new versioned resource. PUT on a nonexistent resource would create a resource and set its contents. A subsequent checkin (if any) would make the resource a versioned resource. PUT on a null resource should just set the contents of the resource, and make it a non-null resource. 4.1.4 Again, we should think about DAV:link semantics and make property resources consistent. 4.1.7 COPY of a revision creates a new resource, not a new versioned resource. Should be able to copy a workspace. 4.1.9 There was a section in the model document that described locking on workspaces, activities, and versioned resources. That section didn't get copied into the versioning protocol introduction, and is not consistent with section 4.1.9. We need to revisit locking semantics. - lock on revision prevents unauthorized checkouts of that revision - lock on an activity prevents unauthorized modifications of the activity and therefore checkouts in that activity - lock on a workspace prevents unauthorized modification of the workspace and therefore checkouts in that workspace - lock on a versioned resource (History Resource in this version of the document) prevents any unauthorized checkouts of any revision 4.1.0 We talked about a lot of other information in OPTIONS at Concord. Here's my meeting notes: How is server versioning meta-data discovered? Properties on a distinguished collection? On '/'? With OPTIONS? Consider two approaches: implicit property on all resources, or OPTIONS on a resource or *. Properties can be structured, options can't. Could consider extending options to take and return an XML request/response body. Use PROPFIND semantics to specify the body. Options exists because properties didn't. OPTIONS * is the only way to talk to the server. Everything else is to a resource. Resolution: use OPTIONS with PROPFIND entity request body on * for server and resources for meta-data on resources. Returns server/versioning meta-data. Don't want this information on allprop. Provides extensibility for OPTIONS. Geoff wants to use a repository object so it can be a resource to provide extensibility. Want to put in the repository: workspaces, activities, history resources, configurations, ...? Discover the location of the repositories from OPTIONS *. (MKRESOURCE and REPORT were reviewed from the updates Jeff sent out, not from version 2.2 of the versioning spec) MKRESOURCE should be able to initialize the contents as well as the properties in a single operation. This ensures the resource is created in a consistent state. We can't do this with the current protocol without using multi-part MIME content for the request entity body for the properties and resource content. We don't need this for versioning, but it seems like it would be useful for completeness. Results Marshalling: idempotent is not defined in Webster's dictionary. There may be a lot of people (myself included) who do not understand the implications of idempotnet semantics. Perhaps some explanation would help. The status in the example is not included in the results marshalling. Should have a successful example first. REPORT: DAV:conflicts doesn't sound right. A workspace RSR might specify lots of entries that would generate conflicts that aren't interesting. The DAV:rsr-merge element is to specify which elements in the RSR contribute to potential conflicts. Also, DAV:conflicts isn't for a specified resource, its for the workspace. We could include a target that was empty (all conflicts), an activity (conflicts with this activity), a revision (is there a conflict with this revisions), or any revision selector. But this is accomplished with the DAV:rsr-merge element in the workspace RSR. Results marshalling introduction was copied from MKRESOURCE. Example 1, the D:reports-response should contain <D:conflicts/><D:conflicts/>, etc. These should not be in PCDATA. See also section 1.2.3.2, DAV:reports-request. Example 2, the contributor should be a revision id just like DAV:merge-predecessors, etc. Example 3, D:added and D:deleted should take D:href elements too. This way the report can included all the added (deleted) resources in one D:added (D:deleted) element. Last sentence after the examples was cut off. All of the format sections we cut of when printed. DAV:compare-response: {comment}, configurations don't have activities in them directly, but the revisions in a configuration were created in some activity. <!ELEMENT added (href+)> <!ELEMENT deleted (href+)> <!ELEMENT changed (href+)> DAV:changed: (and added and deleted) need to explain the result separately for workspace, configuration, activity, or versioned collection. The descriptions given don't seem to adequately distinguish or fully describe them. 4.3.1 CHECKOUT, how do we distinguish between a checkout with an automatic creation of a workspace, and checkout in the default workspace (which is used by non-versioning aware clients)? An activity need not be associated with a working resource, even if the server supports activities. If an activity is required, then we should specify a default activity instead of generating one for every checkout. 4.4.1 We need both a workspace header and revision-selection header. The workspace header specifies what revisions of intermediate collections are used to access the target resource while the revision-selection header overrides the workspace RSR to access a particular revision. The revision-selection header should specify a label, revision id, or any other revision selector suitably distinguished. 5.1.5 latest should generate conflicts if connected with rsr-merge with other revision selectors. 5.1 rsr-configuration and activity-latest carry redundant information. The referenced resourcetype determines how the resource should be interpreted. Specifying it in the RSR introduces a redundancy and the need to generate an error at some point. When? When the RSR property is updated? When the workspace is used? Ignore the rsr element and use the resroucetype? The problem is that revision selectors are one of three types: workspace which selects either a revision or working resource (which isn't quite a revision yet, or is it?), activity or configuration resource which selects the member, and label or revision id (which aren't resources). Somehow these should be normalized. Either make a label a resource (might be too heavy), or just distinguish labels and references (with an href). Distinguish between using a URL to access a versioned resource vs. a revision with a header similarly to the old direct references passthrough header. Suggest boolean Versioned-Resource header which defaults to "F". If "T", apply the method to the versioned resource instead of the revision (primarily for PROPFIND/PROPPATCH). Quick comparison to the model: DELETE with Versioned-Resource header "T" deletes the whole versioned resource and all its revisions. Versioned resource properties include a list of mutable properties (so they can be discovered), versioning options (DAV:checkin-policy policies that apply by default to all revisions. Is automatically versioned property that applies by default to all revisions. Can be overridden for any particular revision. Didn't see any method for creating a baseline. Just a CHECKIN with depth: infinity? Model has a method to add or remove a label to the latest revision of all resources in a given activity. This a client convenience, but something the server can do a lot easier than the client. Include it if we think it is a common operation. Protocol doesn't specify how members are added to a configuration. The model has methods to add and remove a revision (using the same revision selection mechanism as any other method). This establishes the roots of the configuration. Doing this as a PROPPATCH may not be sufficient because some action has to take place when the element is added to add it members, check for existence of the selection, etc. The model has a snapshot method for the workspace that creates a configuration containing all the revisions visible in the current workspace. This effectively creates a configuration that can replace the RSR for the workspace in order to select the same revisions at some time in the future. This is a very common requirement. Model has a method to add a label to a collection with depth. Model doesn't have an explicit resource factory that can be used to implement MKRESOURCE. It is implicit in constructors, but they don't take properties as an argument.