Hey WC-NG folks, please tell me what's right/wrong/unsure in the
additions and changes below. Feel free to commit any parts that are
right: I'm not yet familiar enough to really be comfortable committing
it myself but I will if you want.
- Julian
* subversion/libsvn_wc/wc-metadata.sql
(PRISTINE, WORKING_NODE, ACTUAL_NODE): Add doc strings, notes and queries.
--This line, and those below, will be ignored--
Index: subversion/libsvn_wc/wc-metadata.sql
===================================================================
--- subversion/libsvn_wc/wc-metadata.sql (revision 910914)
+++ subversion/libsvn_wc/wc-metadata.sql (working copy)
@@ -175,6 +175,7 @@ CREATE TABLE PRISTINE (
### that no compression has been applied. */
compression INTEGER,
+ /* Size in bytes of the (uncompressed) pristine text. */
/* ### used to verify the pristine file is "proper". NULL if unknown,
### and (thus) the pristine copy is incomplete/unusable. */
size INTEGER,
@@ -189,6 +190,33 @@ CREATE TABLE PRISTINE (
/* ------------------------------------------------------------------------- */
+/* The WORKING_NODE table describes tree changes in the WC relative to the
+ BASE_NODE table.
+
+ The WORKING_NODE entry for a given path exists iff a node at this path
+ is directly (not just a child) one of:
+
+ - deleted
+ - the source path of a move
+
+ and/or one of:
+
+ - added
+ - copied here (from WC or from repos)
+ - moved here [MOVE1]
+
+ If a path is a child (or grandchild, etc.) under any such operation on a
+ directory, and is otherwise not subject to its own tree change, it is not
+ represented in the WORKING_NODE table.
+
+ Every path for which an entry exists in the WORKING_NODE table also has
+ an entry in the BASE_NODE table.
+
+ [MOVE1] The "move" operation in WC-NG requires that both the source and
+ destination paths are represented in the BASE_NODE and WORKING_NODE
+ tables.
+
+ */
CREATE TABLE WORKING_NODE (
/* specifies the location of this node in the local filesystem */
wc_id INTEGER NOT NULL REFERENCES WCROOT (id),
@@ -209,6 +237,7 @@ CREATE TABLE WORKING_NODE (
to detect the type of operation constructing this node.
not-present: the node (or parent) was originally copied or moved-here.
+ ### ?
A subtree of that source has since been deleted. There may be
underlying BASE node to replace. For an add-without-history, the
records are simply removed rather than switched to not-present.
@@ -221,8 +250,9 @@ CREATE TABLE WORKING_NODE (
incomplete: nodes are being added into the WORKING tree, and the full
information about this node is not (yet) present.
- base-deleted: the underlying BASE node has been marked for deletion due
- to a delete or a move-away (see the moved_to column to determine). */
+ base-deleted: the node which in the BASE tree exists at local_relpath
+ has in the WORKING tree been deleted or moved away (see the moved_to
+ column to determine which), and has not been not replaced. */
presence TEXT NOT NULL,
/* the kind of the new node. may be "unknown" if the node is not present. */
@@ -254,23 +284,28 @@ CREATE TABLE WORKING_NODE (
/* for kind==symlink, this specifies the target. */
symlink_target TEXT,
- /* Where this node was copied/moved from. Set only on the root of the
- operation, and implied for all children. */
+ /* Where this node was copied/moved from. All copyfrom_* fields are set
+ only on the root of the operation, and is NULL for all children. */
copyfrom_repos_id INTEGER REFERENCES REPOSITORY (id),
/* ### BH: Should we call this copyfrom_repos_relpath and skip the initial '/'
### to match the other repository paths used in sqlite and to make it easier
### to join these paths? */
+ /* ### JF: For a move, we need to store or deduce the copyfrom local-
+ relpath. (A move is a "true rename" and the copyfrom revision is implicit,
+ being in effect (new head - 1) at commit time.) */
copyfrom_repos_path TEXT,
copyfrom_revnum INTEGER,
- /* Boolean value, specifying if this node was moved here (rather than just
- copied). The source of the move is specified in copyfrom_*. */
+ /* Boolean value, TRUE if this node was moved here, FALSE if copied here,
+ NULL if neither. Iff not NULL, the source of the move is specified in
+ copyfrom_*. */
moved_here INTEGER,
/* If the underlying node was moved (rather than just deleted), this
specifies the local_relpath of where the BASE node was moved to.
- This is set only on the root of a move, and implied for all children.
- The whole moved subtree is marked with presence=base-deleted
+ This is set only on the root of a move, and is NULL for all children.
+ Each path in the whole moved subtree is marked with
+ presence 'base-deleted', or 'normal' if replaced.
Note that moved_to never refers to *this* node. It always refers
to the "underlying" node, whether that is BASE or a child node
@@ -282,7 +317,7 @@ CREATE TABLE WORKING_NODE (
### question which is better answered some other way. */
last_mod_time INTEGER, /* an APR date/time (usec since 1970) */
- /* serialized skel of this node's properties. could be NULL if we
+ /* serialized skel of this node's properties. NULL if we
have no information about the properties (a non-present node). */
properties BLOB,
@@ -305,6 +340,16 @@ CREATE INDEX I_WORKING_PARENT ON WORKING
/* ------------------------------------------------------------------------- */
+/*
+ The ACTUAL_NODE table describes text changes and property changes in the
+ WC, relative to the WORKING_NODE table.
+
+ The ACTUAL_NODE table entry for a given path exists iff the node at that
+ path is known to have text or property changes relative to its
+ WORKING_NODE entry. ("Is known" because a text change on disk may not yet
+ have been discovered and recorded here.)
+
+ */
CREATE TABLE ACTUAL_NODE (
/* specifies the location of this node in the local filesystem */
wc_id INTEGER NOT NULL REFERENCES WCROOT (id),