(It turns out Branko's DTD had a way of transmitting ancestor
information which I hadn't noticed, incidentally. Still not sure how
the current XML format transmits directory entry properties.)
Here is a DTD and sample delta in my new proposed non-hierarchical
format. Having to follow IDs around isn't as readable as being able
to see the hierarchy of changes, but this way is a lot more flexible.
(Plus, it doesn't run off the right side of the screen. :) )
<?xml version="1.0" encoding="UTF-8"?>
<!-- XML DTD for Subversion's delta packages. -->
<!ELEMENT delta-pkg (replace-root | delete | add-dir | replace-dir
| change-dir-prop | change-dirent-prop | close-dir
| add-file | replace-file | text-delta | change-file-prop
| close-file)*>
<!-- replace-root: specify ID of root directory -->
<!ELEMENT replace-root>
<!ATTLIST replace-root
dir-id ID #REQUIRED
>
<!-- delete-dirent: delete a directory entry -->
<!ELEMENT delete-dirent>
<!ATTLIST delete-dirent
parent-id IDREF #REQUIRED
name CDATA #REQUIRED
>
<!-- add-dir: Create a new directory -->
<!ELEMENT add-dir>
<!ATTLIST add-dir
parent-id IDREF #REQUIRED
name CDATA #REQUIRED
dir-id ID #REQUIRED
ancestor CDATA #IMPLIED
ancver CDATA #IMPLIED
>
<!-- replace-dir: Modify a directory -->
<!ELEMENT replace-dir>
<!ATTLIST replace-dir
parent-id IDREF #REQUIRED
name CDATA #REQUIRED
dir-id ID #REQUIRED
ancestor CDATA #IMPLIED
ancver CDATA #IMPLIED
>
<!-- change-dir-prop: Edit the properties of a directory -->
<!ELEMENT change-dir-prop (set | delete)+>
<!ATTLIST change-dir-prop
dir-id IDREF #REQUIRED
>
<!-- change-dirent-prop: Edit the properties of a directory entry -->
<!ELEMENT change-dirent-prop (set | delete)+>
<!ATTLIST change-dirent-prop
dir-id IDREF #REQUIRED
name CDATA #REQUIRED
>
<!-- close-dir: Indicate that we are done with a directory -->
<!ELEMENT close-dir>
<!ATTLIST close-dir
dir-id IDREF #REQUIRED
>
<!-- add-file: Create a new file -->
<!ELEMENT add-file>
<!ATTLIST add-file
dir-id IDREF #REQUIRED
name CDATA #REQUIRED
file-id ID #REQUIRED
ancestor CDATA #IMPLIED
ancver CDATA #IMPLIED
>
<!-- replace-file: Modify a file -->
<!ELEMENT replace-file>
<!ATTLIST replace-file
dir-id IDREF #REQUIRED
name CDATA #REQUIRED
file-id ID #REQUIRED
ancestor CDATA #IMPLIED
ancver CDATA #IMPLIED
>
<!-- text-delta: Edit the text of a file -->
<!ELEMENT text-delta (#PCDATA)>
<!ATTLIST text-delta
file-id IDREF #REQUIRED
>
<!-- change-file-prop: Edit the properties of a file -->
<!ELEMENT change-file-prop (set | delete)+>
<!ATTLIST change-file-prop
file-id IDREF #REQUIRED
>
<!-- close-file: Indicate that we are done with a file -->
<!ELEMENT close-file>
<!ATTLIST close-file
file-id CDATA #REQUIRED
>
<!-- set: Set a property's value -->
<!ELEMENT set (#PCDATA)>
<!ATTLIST set
name CDATA #REQUIRED
>
<!-- delete: Delete a property -->
<!ELEMENT delete EMPTY>
<!ATTLIST delete
name CDATA #REQUIRED
>
<?xml version="1.0" encoding="UTF-8"?>
<delta-pkg>
<replace-root dir-id="ROOT"/>
<add-dir parent-id="ROOT" name="A" dir-id="D1" ancestor="/A" ancver="1"/>
<add-file dir-id="D1" name="mu" file-id="F1" ancestor="/A/mu"/>
<text-delta file-id="F1">This is the file 'mu'.</text-delta>
<close-file file-id="F1"/>
<add-dir parent-id="D1" name="B" dir-id="D2" ancestor="/A/B"/>
<add-file dir-id="D2" name="lambda" file-id="F2" ancestor="/A/B/lambda"/>
<text-delta file-id="F1">This is the file 'lambda'.</text-delta>
<close-file file-id="F2"/>
<add-dir parent-id="D2" name="E" dir-id="D3" ancestor="/A/B/E"/>
<change-dir-prop dir-id="D3">
<set name="car">buick</set>
</change-dir-prop>
<close-dir dir-id="D3"/>
<add-dir parent-id="D2" name="F" dir-id="D4" ancestor="/A/B/F"/>
<change-dir-prop dir-id="D4">
<delete name="glub"/>
</change-dir-prop>
<close-dir dir-id="D4"/>
<close-dir dir-id="D2"/>
<add-dir parent-id="D1" name="C" dir-id="D5" ancestor="/A/C"/>
<close-dir dir-id="D5"/>
<add-dir parent-id="D1" name="D" dir-id="D6" ancestor="/A/D"/>
<add-file dir-id="D6" name="gamma" file-id="F3" ancestor="/A/D/gamma"/>
<change-file-prop file-id="F3">
<set name="banana">yellow</set>
<delete name="lemon"/>
<set name="crabgrass">epistemological</set>
</change-file-prop>
<text-delta file-id="F3">This is the file 'gamma'.</text-delta>
<close-file file-id="F3"/>
<close-dir dir-id="D6"/>
<close-dir dir-id="D1"/>
<close-dir dir-id="ROOT"/>
</delta-pkg>
Received on Sat Oct 21 14:36:10 2006