Check-in [727f370c29]
Not logged in
Overview

SHA1 Hash:727f370c2927c0788f0adc64f16d67258b237c34
Date: 2008-01-27 20:38:17
User: aku
Comment:Added comments to the sql commands in the integrity checks.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified tools/cvs2fossil/lib/c2f_integrity.tcl from [565865cf88] to [ec6d87872c].

@@ -78,38 +78,38 @@
 	CheckRev \
 	    {Revisions and their LODs have to be in the same project} \
 	    {disagrees with its LOD about owning project} {
 		SELECT F.name, R.rev
 		FROM revision R, file F, symbol S
-		WHERE R.fid = F.fid
-		AND   R.lod = S.sid
-		AND   F.pid != S.pid
+		WHERE R.fid = F.fid   -- get file of rev
+		AND   R.lod = S.sid   -- get symbol of its lod
+		AND   F.pid != S.pid  -- disagreement about the owning project
 		;
 	    }
 	# Find all revisions which disgree with their meta data about
 	# the project they are owned by.
 	CheckRev \
 	    {Revisions and their meta data have to be in the same project} \
 	    {disagrees with its meta data about owning project} {
 		SELECT F.name, R.rev
 		FROM revision R, file F, meta M
-		WHERE R.fid = F.fid
-		AND   R.mid = M.mid
-		AND   F.pid != M.pid
+		WHERE R.fid = F.fid   -- get file of rev
+		AND   R.mid = M.mid   -- get meta of rev
+		AND   F.pid != M.pid  -- disagreement about owning project
 		;
 	    }
 	# Find all revisions with a primary child which disagrees
 	# about the file they belong to.
 	CheckRev \
 	    {Revisions and their primary children have to be in the same file} \
 	    {disagrees with its primary child about the owning file} {
 		SELECT F.name, R.rev
 		FROM revision R, revision C, file F
-		WHERE R.fid = F.fid
-		AND   R.child IS NOT NULL
-		AND   R.child = C.rid
-		AND   C.fid != R.fid
+		WHERE R.fid = F.fid       -- get file of rev
+		AND   R.child IS NOT NULL -- get all with primary children
+		AND   R.child = C.rid     -- get primary child
+		AND   C.fid != R.fid      -- wrongly in different file
 		;
 	    }
 
 	# Find all revisions with a branch parent symbol whose parent
 	# disagrees about the file they belong to.
@@ -116,170 +116,170 @@
 	CheckRev \
 	    {Revisions and their branch children have to be in the same file} \
 	    {at the beginning of its branch and its parent disagree about the owning file} {
 		SELECT F.name, R.rev
 		FROM revision R, revision P, file F
-		WHERE R.fid = F.fid
-		AND   R.bparent IS NOT NULL
-		AND   R.parent = P.rid
-		AND   R.fid != P.fid
+		WHERE R.fid = F.fid         -- get file of rev
+		AND   R.bparent IS NOT NULL -- get first-of-branch revisions
+		AND   R.parent = P.rid      -- get out-of-branch parent
+		AND   R.fid != P.fid        -- wrongly in different file
 		;
 	    }
 	# Find all revisions with a non-NTDB child which disagrees
 	# about the file they belong to.
 	CheckRev \
 	    {Revisions and their non-NTDB children have to be in the same file} \
 	    {disagrees with its non-NTDB child about the owning file} {
 		SELECT F.name, R.rev
 		FROM revision R, revision C, file F
-		WHERE R.fid = F.fid
-		AND   R.dbchild IS NOT NULL
-		AND   R.dbchild = C.rid
-		AND   C.fid != R.fid
+		WHERE R.fid = F.fid         -- get file of rev
+		AND   R.dbchild IS NOT NULL -- get last NTDB revisions
+		AND   R.dbchild = C.rid     -- get their child
+		AND   C.fid != R.fid        -- wrongly in different file
 		;
 	    }
 	# Find all revisions which have a primary child, but the child
 	# does not have them as parent.
 	CheckRev \
 	    {Revisions have to be parents of their primary children} \
 	    {is not the parent of its primary child} {
 		SELECT F.name, R.rev
 		FROM revision R, revision C, file F
-		WHERE R.fid = F.fid
-		AND   R.child IS NOT NULL
-		AND   R.child = C.rid
-		AND   C.parent != R.rid
+		WHERE R.fid = F.fid         -- get file of rev
+		AND   R.child IS NOT NULL   -- get all with primary children
+		AND   R.child = C.rid       -- get primary child
+		AND   C.parent != R.rid     -- child's parent wrongly not us
 		;
 	    }
 	# Find all revisions which have a primrary child, but the
 	# child has a branch parent symbol making them brach starters.
 	CheckRev \
 	    {Primary children of revisions must not start branches} \
 	    {is parent of a primary child which is the beginning of a branch} {
 		SELECT F.name, R.rev
 		FROM revision R, revision C, file F
-		WHERE R.fid = F.fid
-		AND   R.child IS NOT NULL
-		AND   R.child = C.rid
-		AND   C.bparent IS NOT NULL
+		WHERE R.fid = F.fid         -- get file of rev
+		AND   R.child IS NOT NULL   -- get all with primary children
+		AND   R.child = C.rid       -- get primary child
+		AND   C.bparent IS NOT NULL -- but indicates to be on branch
 		;
 	    }
 	# Find all revisions without branch parent symbol which have a
 	# parent, but the parent does not have them as primary child.
 	CheckRev \
 	    {Revisions have to be primary children of their parents, if any} \
 	    {is not the child of its parent} {
 		SELECT F.name, R.rev
 		FROM revision R, revision P, file F
-		WHERE R.fid = F.fid
-		AND   R.bparent IS NULL
-		AND   R.parent IS NOT NULL
-		AND   R.parent = P.rid
-		AND   P.child != R.rid
+		WHERE R.fid = F.fid        -- get file of revision
+		AND   R.bparent IS NULL    -- exclude all first-on-branch revisions
+		AND   R.parent IS NOT NULL -- which are not root of their line
+		AND   R.parent = P.rid     -- get in-lod parent
+		AND   P.child != R.rid     -- but does not have rev as primary child
 		;
 	    }
 	# Find all revisions with a branch parent symbol which do not
 	# have a parent.
 	CheckRev \
 	    {Branch starting revisions have to have a parent, if not detached} \
 	    {at the beginning of its branch has no parent, but its branch has} {
 		SELECT F.name, R.rev
 		FROM revision R, file F, branch B
-		WHERE R.fid = F.fid
-		AND   R.bparent IS NOT NULL
-		AND   R.parent  IS NULL
-		AND   B.sid = R.bparent
-		AND   B.fid = R.fid
-		AND   B.root    IS NOT NULL
+		WHERE R.fid = F.fid         -- get file of revision
+		AND   R.bparent IS NOT NULL -- limit to first-on-branch revisions
+		AND   R.parent  IS NULL     -- which are detached
+		AND   B.sid = R.bparent     -- get branch governing the rev
+		AND   B.fid = R.fid         -- in the revision's file
+		AND   B.root    IS NOT NULL -- but says that branch is attached
 		;
 	    }
 	# Find all revisions with a branch parent symbol whose parent
 	# has them as primary child.
 	CheckRev \
 	    {Branch starting revisions must not be primary children of their parents} \
 	    {at the beginning of its branch is the primary child of its parent} {
 		SELECT F.name, R.rev
 		FROM revision R, revision P, file F
-		WHERE R.fid = F.fid
-		AND   R.bparent IS NOT NULL
-		AND   R.parent IS NOT NULL
-		AND   R.parent = P.rid
-		AND   P.child = R.rid
+		WHERE R.fid = F.fid         -- get file of revision
+		AND   R.bparent IS NOT NULL -- limit to first-on-branch revisions
+		AND   R.parent IS NOT NULL  -- which are attached
+		AND   R.parent = P.rid      -- get out-of-branch parent
+		AND   P.child = R.rid       -- wrongly has rev as primary child
 		;
 	    }
 	# Find all revisions with a non-NTDB child which are not on
 	# the NTDB.
 	CheckRev \
 	    {NTDB to trunk transition has to begin on NTDB} \
 	    {has a non-NTDB child, yet is not on the NTDB} {
 		SELECT F.name, R.rev
 		FROM revision R, file F
-		WHERE R.fid = F.fid
-		AND   R.dbchild IS NOT NULL
-		AND   NOT R.isdefault
+		WHERE R.fid = F.fid         -- get file of revision
+		AND   R.dbchild IS NOT NULL -- limit to last NTDB revision
+		AND   NOT R.isdefault       -- but signals not-NTDB
 		;
 	    }
 	# Find all revisions with a NTDB parent which are on the NTDB.
 	CheckRev \
 	    {NTDB to trunk transition has to end on non-NTDB} \
 	    {has a NTDB parent, yet is on the NTDB} {
 		SELECT F.name, R.rev
 		FROM revision R, file F
-		WHERE R.fid = F.fid
-		AND   R.dbparent IS NOT NULL
-		AND   R.isdefault
+		WHERE R.fid = F.fid          -- get file of revision
+		AND   R.dbparent IS NOT NULL -- limit to roots of non-NTDB
+		AND   R.isdefault            -- but signals to be NTDB
 		;
 	    }
 	# Find all revisions with a child which disagrees about the
 	# line of development they belong to.
 	CheckRev \
 	    {Revisions and their primary children have to be in the same LOD} \
 	    {and its primary child disagree about their LOD} {
 		SELECT F.name, R.rev
 		FROM revision R, revision C, file F
-		WHERE R.fid = F.fid
-		AND   R.child IS NOT NULL
-		AND   R.child = C.rid
-		AND   C.lod != R.lod
+		WHERE R.fid = F.fid       -- get file of revision
+		AND   R.child IS NOT NULL -- revision has a primary child
+		AND   R.child = C.rid     -- get that child
+		AND   C.lod != R.lod      -- child wrongly disagrees with lod
 		;
 	    }
 	# Find all revisions with a non-NTDB child which agrees about
 	# the line of development they belong to.
 	CheckRev \
 	    {NTDB and trunk revisions have to be in different LODs} \
 	    {on NTDB and its non-NTDB child wrongly agree about their LOD} {
 		SELECT F.name, R.rev
 		FROM revision R, revision C, file F
-		WHERE R.fid = F.fid
-		AND   R.dbchild IS NOT NULL
-		AND   R.dbchild = C.rid
-		AND   C.lod = R.lod
+		WHERE R.fid = F.fid         -- get file of revision
+		AND   R.dbchild IS NOT NULL -- limit to last NTDB revision
+		AND   R.dbchild = C.rid     -- get non-NTDB child
+		AND   C.lod = R.lod         -- child wrongly has same lod
 		;
 	    }
 	# Find all revisions with a branch parent symbol which is not
 	# their LOD.
 	CheckRev \
 	    {Branch starting revisions have to have their LOD as branch parent symbol} \
 	    {at the beginning of its branch does not have the branch symbol as its LOD} {
 		SELECT F.name, R.rev
 		FROM revision R, file F
-		WHERE R.fid = F.fid
-		AND   R.bparent IS NOT NULL
-		AND   R.lod != R.bparent
+		WHERE R.fid = F.fid         -- get file of revision
+		AND   R.bparent IS NOT NULL -- limit to branch-first revisions
+		AND   R.lod != R.bparent    -- out-of-branch parent wrongly is not the lod
 		;
 	    }
 	# Find all revisions with a branch parent symbol whose parent
 	# is in the same line of development.
 	CheckRev \
 	    {Revisions and their branch children have to be in different LODs} \
 	    {at the beginning of its branch and its parent wrongly agree about their LOD} {
 		SELECT F.name, R.rev
 		FROM revision R, revision P, file F
-		WHERE R.fid = F.fid
-		AND   R.bparent IS NOT NULL
-		AND   R.parent = P.rid
-		AND   R.lod = P.lod
+		WHERE R.fid = F.fid          -- get file of revision
+		AND   R.bparent IS NOT NULL  -- limit to branch-first revisions
+		AND   R.parent = P.rid       -- get out-of-branch parent of revision
+		AND   R.lod = P.lod          -- rev and parent wrongly agree on lod
 		;
 	    }
 	return
     }
 
@@ -295,13 +295,13 @@
 	CheckRev \
 	    {Revisions and their meta data have to be in the same LOD} \
 	    {disagrees with its meta data about owning LOD} {
 		SELECT F.name, R.rev
 		FROM revision R, meta M, file F
-		WHERE R.mid = M.mid
-		AND   R.lod != M.bid
-		AND   R.fid = F.fid
+		WHERE R.mid = M.mid   -- get meta data of revision
+		AND   R.lod != M.bid  -- rev wrongly disagrees with meta about lod
+		AND   R.fid = F.fid   -- get file of revision
 		;
 	    }
 	return
     }
 
@@ -348,18 +348,20 @@
                 -- select those with more than one user, and get their
                 -- associated file (name) for display.
 
 		SELECT F.name, R.rev
 		FROM revision R, file F,
-		     (SELECT CI.iid AS rid, count(CI.cid) AS count
+		     (SELECT CI.iid        AS rid,  -- revision item
+		             count(CI.cid) AS count -- number of csets using item
 		      FROM csitem CI, changeset C
-		      WHERE C.type = 0
-		      AND   C.cid = CI.cid
-		      GROUP BY CI.iid) AS U
-		WHERE U.count > 1
-		AND R.rid = U.rid
-		AND R.fid = F.fid
+		      WHERE C.type = 0            -- limit to revision csets
+		      AND   C.cid  = CI.cid       -- get item in changeset
+		      GROUP BY CI.iid             -- aggregate by item, count csets/item
+		     ) AS U
+		WHERE U.count > 1    -- limit to item with multiple users
+		AND   R.rid = U.rid  -- get revision of item
+		AND   R.fid = F.fid  -- get file of revision
 	    }
 	# All revisions have to refer to the same meta information as
 	# their changeset.
 	CheckRevCS \
 	    {All revisions have to agree with their changeset about the used meta information} \
@@ -386,16 +388,21 @@
 	    {All revisions in a changeset have to belong to the same LOD} \
 	    {: Its revisions disagree about the LOD they belong to} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT U.cid
-				 FROM (SELECT DISTINCT CI.cid AS cid, R.lod AS lod
+				 FROM (SELECT DISTINCT       -- unique cset/lod pairs
+				              CI.cid AS cid, -- revision cset
+				              R.lod  AS lod  -- lod of item in cset
 				       FROM   csitem CI, changeset C, revision R
-				       WHERE  CI.iid = R.rid
-				       AND    C.cid = CI.cid
-				       AND    C.type = 0) AS U
-				 GROUP BY U.cid HAVING COUNT(U.lod) > 1)
+				       WHERE  CI.iid = R.rid  -- get rev of item in cset
+				       AND    C.cid  = CI.cid -- get changeset of item
+				       AND    C.type = 0      -- limit to rev csets
+				      ) AS U
+				 GROUP BY U.cid          -- aggregate by cset, count lods/cset
+				 HAVING COUNT(U.lod) > 1 -- find csets with multiple lods
+				)
 		AND    T.tid = C.type
 	    }
 	# All revisions have to agree on the project their changeset
 	# belongs to. In other words, all revisions in a changeset
 	# have to refer to the same project.
@@ -409,18 +416,23 @@
 	    {All revisions in a changeset have to belong to the same project} \
 	    {: Its revisions disagree about the project they belong to} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT U.cid
-				 FROM (SELECT DISTINCT CI.cid AS cid, F.pid AS pid
+				 FROM (SELECT DISTINCT       -- unique cset/proj pairs
+				              CI.cid AS cid, -- rev cset
+				              F.pid  AS pid  -- project of item in cset
 				       FROM   csitem CI, changeset C, revision R, file F
-				       WHERE  CI.iid = R.rid
-				       AND    C.cid = CI.cid
-				       AND    C.type = 0
-				       AND    F.fid  = R.fid) AS U
-				 GROUP BY U.cid HAVING COUNT(U.pid) > 1)
-		AND    T.tid = C.type
+				       WHERE  CI.iid = R.rid  -- get rev of item in cset
+				       AND    C.cid  = CI.cid -- get changeset of item
+				       AND    C.type = 0      -- limit to rev changesets
+				       AND    F.fid  = R.fid  -- get file of revision
+				      ) AS U
+				 GROUP BY U.cid          -- aggregate by csets, count proj/cset
+				 HAVING COUNT(U.pid) > 1 -- find csets with multiple projects
+				)
+		AND    T.tid = C.type -- get readable changeset type
 	    }
 	# All revisions in a single changeset have to belong to
 	# different files. Conversely: No two revisions of a single
 	# file are allowed to be in the same changeset.
 	#
@@ -434,26 +446,34 @@
 	    {All revisions in a changeset have to belong to different files} \
 	    {: Its revisions share files} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT VV.cid
-				 FROM (SELECT U.cid as cid, COUNT (U.fid) AS fcount
-				       FROM (SELECT DISTINCT CI.cid AS cid, R.fid AS fid
+				 FROM (SELECT U.cid         AS cid,   -- rev changeset
+				              COUNT (U.fid) AS fcount -- number of files by items
+				       FROM (SELECT DISTINCT       -- unique cset/file pairs
+					            CI.cid AS cid, -- rev changeset
+					            R.fid AS fid   -- file of item in changeset
 					     FROM   csitem CI, changeset C, revision R
-					     WHERE  CI.iid = R.rid
-					     AND    C.cid = CI.cid
-					     AND    C.type = 0
+					     WHERE  CI.iid = R.rid  -- get rev of item in changeset
+					     AND    C.cid  = CI.cid -- get changeset of item
+					     AND    C.type = 0      -- limit to rev csets
 					     ) AS U
-				       GROUP BY U.cid) AS UU,
-				      (SELECT V.cid AS cid, COUNT (V.iid) AS rcount
+				       GROUP BY U.cid -- aggregate by csets, count files/cset
+				      ) AS UU,
+				      (SELECT V.cid         AS cid,   -- rev changeset
+				              COUNT (V.iid) AS rcount -- number of items
 				       FROM   csitem V, changeset X
-				       WHERE  X.cid = V.cid
-				       AND    X.type = 0
-				       GROUP BY V.cid) AS VV
-				 WHERE VV.cid = UU.cid
-				 AND   UU.fcount < VV.rcount)
-		AND    T.tid = C.type
+				       WHERE  X.cid  = V.cid  -- get changeset of item
+				       AND    X.type = 0      -- limit to rev csets
+				       GROUP BY V.cid         -- aggregate by csets, count items/cset
+				      ) AS VV
+				 WHERE VV.cid = UU.cid        -- sync #items/cset with #files/cset
+				 AND   UU.fcount < VV.rcount  -- less files than items
+				                              -- => items belong to the same file.
+				)
+		AND    T.tid = C.type -- get readable changeset type
 	    }
 	return
     }
 
     proc TagChangesets {} {
@@ -498,19 +518,21 @@
                 -- user, and get their associated file (name) for
                 -- display.
 
 		SELECT P.name, S.name
 		FROM tag T, project P, symbol S,
-		     (SELECT CI.iid AS iid, count(CI.cid) AS count
+		     (SELECT CI.iid        AS iid,  -- item
+		             count(CI.cid) AS count -- number of csets using item
 		      FROM csitem CI, changeset C
-		      WHERE C.type = 1
-		      AND   C.cid = CI.cid
-		      GROUP BY CI.iid) AS U
-		WHERE U.count > 1
-		AND   T.tid = U.iid
-		AND   S.sid = T.sid               -- get symbol of tag
-		AND   P.pid = S.pid               -- get project of symbol
+		      WHERE C.type = 1       -- limit to tag csets
+		      AND   C.cid  = CI.cid  -- get items of cset
+		      GROUP BY CI.iid        -- aggregate by item, count csets/item
+		     ) AS U
+		WHERE U.count > 1            -- find tag item used multiple times
+		AND   T.tid = U.iid          -- get tag of item
+		AND   S.sid = T.sid          -- get symbol of tag
+		AND   P.pid = S.pid          -- get project of symbol
 	    }
 	if 0 {
 	    # This check is disabled for the moment. Apparently tags
 	    # can cross lines of development, at least if the involved
 	    # LODs are the trunk, and the NTDB. That makes sense, as
@@ -556,18 +578,23 @@
 	    {All tags in a changeset have to belong to the same project} \
 	    {: Its tags disagree about the project they belong to} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT U.cid
-				 FROM (SELECT DISTINCT CI.cid AS cid, F.pid AS pid
+				 FROM (SELECT DISTINCT       -- unique cset/proj pairs
+				              CI.cid AS cid, -- tag cset
+				              F.pid  AS pid  -- project of item in cset
 				       FROM   csitem CI, changeset C, tag T, file F
-				       WHERE  CI.iid = T.tid
-				       AND    C.cid = CI.cid
-				       AND    C.type = 1
-				       AND    F.fid  = T.fid) AS U
-				 GROUP BY U.cid HAVING COUNT(U.pid) > 1)
-		AND    T.tid = C.type
+				       WHERE  CI.iid = T.tid  -- get tag of item in cset
+				       AND    C.cid  = CI.cid -- get changeset of item
+				       AND    C.type = 1      -- limit to tag changesets
+				       AND    F.fid  = T.fid  -- get file of tag
+                                      ) AS U
+				 GROUP BY U.cid           -- aggregate by csets, count proj/cset
+				 HAVING COUNT(U.pid) > 1  -- find csets with multiple projects
+		                )
+		AND    T.tid = C.type -- get readable changeset type
 	    }
 	# All tags in a single changeset have to belong to different
 	# files. Conversely: No two tags of a single file are allowed
 	# to be in the same changeset.
 	#
@@ -580,26 +607,34 @@
 	    {All tags in a changeset have to belong to different files} \
 	    {: Its tags share files} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT VV.cid
-				 FROM (SELECT U.cid as cid, COUNT (U.fid) AS fcount
-				       FROM (SELECT DISTINCT CI.cid AS cid, T.fid AS fid
+				 FROM (SELECT U.cid         AS cid,   -- changeset
+				              COUNT (U.fid) AS fcount -- number of files by items
+				       FROM (SELECT DISTINCT       -- unique cset/file pairs
+					            CI.cid AS cid, -- tag changeset
+					            T.fid  AS fid  -- file of item in changeset
 					     FROM   csitem CI, changeset C, tag T
-					     WHERE  CI.iid = T.tid
-					     AND    C.cid = CI.cid
-					     AND    C.type = 1
+					     WHERE  CI.iid = T.tid -- get tag of item in changeset
+					     AND    C.cid = CI.cid -- get changeset of item
+					     AND    C.type = 1     -- limit to tag changesets
 					     ) AS U
-				       GROUP BY U.cid) AS UU,
-				      (SELECT V.cid AS cid, COUNT (V.iid) AS rcount
+				       GROUP BY U.cid -- aggregate by csets, count files/cset
+                                      ) AS UU,
+				      (SELECT V.cid         AS cid,   -- changeset
+				              COUNT (V.iid) AS rcount -- number of items in cset
 				       FROM   csitem V, changeset X
-				       WHERE  X.cid = V.cid
-				       AND    X.type = 1
-				       GROUP BY V.cid) AS VV
-				 WHERE VV.cid = UU.cid
-				 AND   UU.fcount < VV.rcount)
-		AND    T.tid = C.type
+				       WHERE  X.cid  = V.cid -- get changeset of item
+				       AND    X.type = 1     -- limit to tag changesets
+				       GROUP BY V.cid        -- aggregate by csets, count items/cset
+                                      ) AS VV
+				 WHERE VV.cid = UU.cid       -- sync #items/cset with #files/cset
+				 AND   UU.fcount < VV.rcount -- less files than items
+				                             -- => items belong to the same file.
+				)
+		AND    T.tid = C.type -- get readable changeset type
 	    }
 	return
     }
 
     proc BranchChangesets {} {
@@ -628,11 +663,12 @@
 				FROM   branch
 				EXCEPT                        -- subtract
 				SELECT CI.iid                 -- branches used
 				FROM   csitem CI, changeset C
 				WHERE  C.cid = CI.cid         -- by any branch
-				AND    C.type = 2)            -- changeset
+				AND    C.type = 2             -- changeset
+			       )
 		AND   S.sid = B.sid               -- get symbol of branch
 		AND   P.pid = S.pid               -- get project of symbol
 	    }
 	# Find all branches which are used by more than one changeset.
 	CheckRev \
@@ -645,19 +681,21 @@
                 -- than one user, and get their associated file (name)
                 -- for display.
 
 		SELECT P.name, S.name
 		FROM branch B, project P, symbol S,
-		     (SELECT CI.iid AS iid, count(CI.cid) AS count
+		     (SELECT CI.iid        AS iid,  -- item
+                             count(CI.cid) AS count -- number of csets for item
 		      FROM csitem CI, changeset C
-		      WHERE C.type = 2
-		      AND   C.cid = CI.cid
-		      GROUP BY CI.iid ) AS U
-		WHERE U.count > 1
-		AND   B.bid = U.iid
-		AND   S.sid = B.sid               -- get symbol of branch
-		AND   P.pid = S.pid               -- get project of symbol
+		      WHERE C.type = 2        -- limit to branch changesets,
+		      AND   C.cid = CI.cid    -- get the items they contain,
+		      GROUP BY CI.iid         -- aggregate by items, count csets/item (x)
+                     ) AS U
+		WHERE U.count > 1             -- find items used multiple times
+		AND   B.bid = U.iid           -- get the users (branch changesets)
+		AND   S.sid = B.sid           -- get symbol of branch
+		AND   P.pid = S.pid           -- get project of symbol
 	    }
 	if 0 {
 	    # This check has been disabled. When the converter was run
 	    # on the Tcl CVS several branches tripped this
 	    # constraint. One of them was a free-floating branch, and
@@ -719,18 +757,23 @@
 	    {All branches in a changeset have to belong to the same project} \
 	    {: Its branches disagree about the project they belong to} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT U.cid
-				 FROM (SELECT DISTINCT CI.cid AS cid, F.pid AS pid
+				 FROM (SELECT DISTINCT        -- Unique cset/proj pairs
+				              CI.cid AS cid,  -- Branch cset
+				              F.pid  AS pid   -- Project of item in cset
 				       FROM   csitem CI, changeset C, branch B, file F
-				       WHERE  CI.iid = B.bid
-				       AND    C.cid = CI.cid
-				       AND    C.type = 2
-				       AND    F.fid  = B.fid) AS U
-				 GROUP BY U.cid HAVING COUNT(U.pid) > 1)
-		AND    T.tid = C.type
+				       WHERE  CI.iid = B.bid  -- get branch of item in cset
+				       AND    C.cid  = CI.cid -- get changeset of item
+				       AND    C.type = 2      -- limit to branch changesets
+				       AND    F.fid  = B.fid  -- get file of branch
+                                      ) AS U
+				 GROUP BY U.cid          -- aggregate by csets, count proj/cset
+				 HAVING COUNT(U.pid) > 1 -- find cset with multiple projects
+				)
+		AND    T.tid = C.type -- get readable changeset type
 	    }
 	# All branches in a single changeset have to belong to
 	# different files. Conversely: No two branches of a single
 	# file are allowed to be in the same changeset.
 	#
@@ -744,26 +787,34 @@
 	    {All branches in a changeset have to belong to different files} \
 	    {: Its branches share files} {
 		SELECT T.name, C.cid
 		FROM   changeset C, cstype T
 		WHERE  C.cid IN (SELECT VV.cid
-				 FROM (SELECT U.cid as cid, COUNT (U.fid) AS fcount
-				       FROM (SELECT DISTINCT CI.cid AS cid, B.fid AS fid
+				 FROM (SELECT U.cid         AS cid,   -- changeset
+				              COUNT (U.fid) AS fcount -- number of files by items
+				       FROM (SELECT DISTINCT       -- unique cset/file pairs
+					            CI.cid AS cid, -- Branch changeset
+					            B.fid  AS fid  -- File of item in changeset
 					     FROM   csitem CI, changeset C, branch B
-					     WHERE  CI.iid = B.bid
-					     AND    C.cid = CI.cid
-					     AND    C.type = 2
+					     WHERE  CI.iid = B.bid  -- get tag of item in changeset
+					     AND    C.cid  = CI.cid -- get changeset of item
+					     AND    C.type = 2      -- limit to branch changesets
 					     ) AS U
-				       GROUP BY U.cid) AS UU,
-				      (SELECT V.cid AS cid, COUNT (V.iid) AS rcount
+				       GROUP BY U.cid -- aggregate by csets, count files/cset
+				      ) AS UU,
+				      (SELECT V.cid         AS cid,   -- changeset
+				              COUNT (V.iid) AS rcount -- number of items in cset
 				       FROM   csitem V, changeset X
-				       WHERE  X.cid = V.cid
-				       AND    X.type = 2
-				       GROUP BY V.cid) AS VV
-				 WHERE VV.cid = UU.cid
-				 AND   UU.fcount < VV.rcount)
-		AND    T.tid = C.type
+				       WHERE  X.cid  = V.cid -- get changeset of item
+				       AND    X.type = 2     -- limit to branch changesets
+				       GROUP BY V.cid	     -- aggregate by csets, count items/cset
+				      ) AS VV
+				 WHERE VV.cid = UU.cid       -- sync #items/cset with #files/cset
+				 AND   UU.fcount < VV.rcount -- less files than items
+							     -- => items belong to the same file.
+				)
+		AND    T.tid = C.type -- get readable changeset type
 	    }
 	return
     }
 
     proc ___UnusedChangesetChecks___ {} {