Ugh, this was a really poor email I tried to dash off in a hurry before stopping for the day. Some background was Bert suggested a couple of weeks back that I could add a validation that "where op_depth > 0: repos_path:repos_id:revision should match that of the op-root, extended by the right relpath" so I was trying to do such a thing. Will follow up tomorrow.
- Julian On Tue, 2011-05-31 at 21:02 +0100, Julian Foad wrote: > A question which I want to validate. wc-metadata.sql says: > > /* Repository location fields */ > > /* When op_depth == 0, these fields refer to the repository location > of the BASE node, the location of the initial checkout. > > When op_depth != 0, they indicate where this node was copied/moved > from. In this case, the fields are set only on the root of the > operation, and are NULL for all children. */ > repos_id INTEGER REFERENCES REPOSITORY (id), > repos_path TEXT, > revision INTEGER, > > But this doesn't seem to be true. What are the rules for these fields? > I'm trying various things like the snippets of patch shown below, but > have not come up with a good answer yet. > > - Julian > > > [[[ > Bits of experimental change and experimental validation. These don't > pass all tests. > > Index: subversion/libsvn_wc/wc-checks.sql > =================================================================== > --- subversion/libsvn_wc/wc-checks.sql (revision 1129848) > +++ subversion/libsvn_wc/wc-checks.sql (working copy) > @@ -73,3 +73,29 @@ BEGIN > SELECT RAISE(FAIL, 'WC DB validity check 04 failed'); > END; > > +/* Verify: on every NODES row where op_depth > 0: if it's not an op-root then > + * repos_path:repos_id:revision should be null. */ > +/* > +CREATE TEMP TRIGGER validation_05 BEFORE INSERT ON nodes > +WHEN NOT (new.op_depth = 0 > + OR new.op_depth = relpath_depth(new.local_relpath) > + OR (new.repos_id IS NULL AND new.repos_path IS NULL)) > +BEGIN > + SELECT RAISE(FAIL, 'WC DB validity check 05 failed'); > +END; > +*/ > + > +/* Verify: on every NODES row where op_depth > 0: > repos_path:repos_id:revision > + * should match that of the op-root, extended by the right relpath. */ > +/* ### TODO: Check repos_path. */ > +CREATE TEMP TRIGGER validation_05 BEFORE INSERT ON nodes > +WHEN NOT (new.op_depth = 0 > + OR new.op_depth = relpath_depth(new.local_relpath) > + OR EXISTS (SELECT 1 FROM nodes > + WHERE wc_id = new.wc_id AND op_depth = new.op_depth > + AND local_relpath = new.parent_relpath > + AND repos_id = new.repos_id > + AND revision = new.revision)) > +BEGIN > + SELECT RAISE(FAIL, 'WC DB validity check 05 failed'); > +END; > Index: subversion/libsvn_wc/wc_db.c > =================================================================== > --- subversion/libsvn_wc/wc_db.c (revision 1129848) > +++ subversion/libsvn_wc/wc_db.c (working copy) > @@ -1039,8 +1039,8 @@ insert_working_node(void *baton, > if (piwb->kind == svn_wc__db_kind_dir && piwb->children) > SVN_ERR(insert_incomplete_children(wcroot->sdb, wcroot->wc_id, > local_relpath, > - INVALID_REPOS_ID /* inherit repos_id > */, > - NULL /* inherit repos_path */, > + piwb->original_repos_id, > + piwb->original_repos_relpath, > piwb->original_revnum, > piwb->children, > piwb->op_depth, > @@ -3606,9 +3606,7 @@ db_op_copy(svn_wc__db_wcroot_t *src_wcro > dst_wcroot->sdb, > dst_wcroot->wc_id, > dst_relpath, > - INVALID_REPOS_ID /* inherit repos_id */, > - NULL /* inherit repos_path */, > - copyfrom_rev, > + copyfrom_id, copyfrom_relpath, copyfrom_rev, > children, > dst_op_depth, > scratch_pool)); > Index: subversion/libsvn_wc/wc-metadata.sql > =================================================================== > --- subversion/libsvn_wc/wc-metadata.sql (revision 1129848) > +++ subversion/libsvn_wc/wc-metadata.sql (working copy) > @@ -313,11 +313,11 @@ CREATE TABLE NODES ( > /* Repository location fields */ > > /* When op_depth == 0, these fields refer to the repository location of the > - BASE node, the location of the initial checkout. > + BASE node, the location of the initial checkout, and are never null. > > When op_depth != 0, they indicate where this node was copied/moved from. > - In this case, the fields are set only on the root of the operation, > - and are NULL for all children. */ > + revision is not null; repos_id and repos_path are null if not copied or > + moved. */ > repos_id INTEGER REFERENCES REPOSITORY (id), > repos_path TEXT, > revision INTEGER, > ]]] > >