Diff
Not logged in

Differences From:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [17ec2d682c] - Bugfix in changeset class. Forgot to update the map from revisions to containing changesets when breaking the internal dependencies of the initial changesets. This affected only the first fragment as all the revisions put into separate fragments where still pointing to the original changeset. This lead to bogus links at the level of changesets, the changeset was seemingly still referencing itself. by aku on 2007-11-24 04:34:26. [view]

To:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [184c56327e] - Bugfix in changeset class. Documented and fixed the SQL statements pulling the successor and predecessor information out of the state. It mishandled the Trunk <-> NTDB transitions. by aku on 2007-11-24 04:40:11. [view]

@@ -439,26 +439,64 @@
     proc PullSuccessorRevisions {dv revisions} {
 	upvar 1 $dv dependencies
 	set theset ('[join $revisions {','}]')
 
+	# The following cases specify when a revision S is a successor
+	# of a revision R. Each of the cases translates into one of
+	# the branches of the SQL UNION coming below.
+	#
+	# (1) S can be a primary child of R, i.e. in the same LOD. R
+	#     references S directly. R.child = S(.rid), if it exists.
+	#
+	# (2) S can be a secondary, i.e. branch, child of R. Here the
+	#     link is made through the helper table
+	#     REVISIONBRANCHCHILDREN. R.rid -> RBC.rid, RBC.brid =
+	#     S(.rid)
+	#
+	# (3) If R is the trunk root of its file and S is the root of
+	#     the NTDB of the same file, then S is a successor of
+	#     R. There is no direct link between the two in the
+	#     database. An indirect link can be made through the FILE
+	#     they belong too, and their combination of attributes to
+	#     identify them. We check R for trunk rootness and then
+	#     select for the NTDB root, crossing the table with
+	#     itself.
+	#
+	# (4) If R is the last of the NTDB revisions which belong to
+	#     the trunk, then the primary child of the trunk root (the
+	#     '1.2' revision) is a successor, if it exists.
+
 	foreach {rid child} [state run "
-   -- Primary children
+   -- (1) Primary child
 	    SELECT R.rid, R.child
 	    FROM   revision R
-	    WHERE  R.rid   IN $theset
-	    AND    R.child IS NOT NULL
+	    WHERE  R.rid   IN $theset     -- Restrict to revisions of interest
+	    AND    R.child IS NOT NULL    -- Has primary child
     UNION
-    -- Transition NTDB to trunk
-	    SELECT R.rid, R.dbchild
-	    FROM   revision R
-	    WHERE  R.rid   IN $theset
-	    AND    R.dbchild IS NOT NULL
-    UNION
-    -- Secondary (branch) children
+    -- (2) Secondary (branch) children
 	    SELECT R.rid, B.brid
 	    FROM   revision R, revisionbranchchildren B
-	    WHERE  R.rid   IN $theset
-	    AND    R.rid = B.rid
+	    WHERE  R.rid   IN $theset     -- Restrict to revisions of interest
+	    AND    R.rid = B.rid          -- Select subset of branch children
+    UNION
+    -- (3) NTDB root successor of Trunk root
+	    SELECT R.rid, RX.rid
+	    FROM   revision R, revision RX
+	    WHERE  R.rid   IN $theset     -- Restrict to revisions of interest
+	    AND    R.parent IS NULL       -- Restrict to root
+	    AND    NOT R.isdefault        -- on the trunk
+	    AND    R.fid = RX.fid         -- Select all revision in the same file
+	    AND    RX.parent IS NULL      -- Restrict to root
+	    AND    RX.isdefault           -- on the NTDB
+    UNION
+    -- (4) Child of trunk root successor of last NTDB on trunk.
+	    SELECT R.rid, RA.child
+	    FROM revision R, revision RA
+	    WHERE R.rid   IN $theset      -- Restrict to revisions of interest
+	    AND   R.isdefault             -- Restrict to NTDB
+	    AND   R.dbchild IS NOT NULL   -- and last NTDB belonging to trunk
+	    AND   RA.rid = R.dbchild      -- Go directly to trunk root
+	    AND   RA.child IS NOT NULL    -- Has primary child.
 	"] {
 	    # Consider moving this to the integrity module.
 	    if {$rid == $child} {
 		trouble internal "Revision $rid depends on itself."
@@ -471,20 +509,50 @@
     proc PullPredecessorRevisions {dv revisions} {
 	upvar 1 $dv dependencies
 	set theset ('[join $revisions {','}]')
 
+	# The following cases specify when a revision P is a
+	# predecessor of a revision R. Each of the cases translates
+	# into one of the branches of the SQL UNION coming below.
+	#
+	# (1) The immediate parent R.parent of R is a predecessor of
+	#     R. NOTE: This is true for R either primary or secondary
+	#     child of P. It not necessary to distinguish the two
+	#     cases, in contrast to the code retrieving the successor
+	#     information.
+	#
+	# (2) The complement of successor case (3). The trunk root is
+	#     a predecessor of a NTDB root.
+	#
+	# (3) The complement of successor case (4). The last NTDB
+	#     revision belonging to the trunk is a predecessor of the
+	#     primary child of the trunk root (The '1.2' revision).
+
 	foreach {rid parent} [state run "
-   -- Primary parent, can be in different LOD for first in a branch
+   -- (1) Primary parent, can be in different LOD for first in a branch
 	    SELECT R.rid, R.parent
 	    FROM   revision R
-	    WHERE  R.rid   IN $theset
-	    AND    R.parent IS NOT NULL
+	    WHERE  R.rid   IN $theset     -- Restrict to revisions of interest
+	    AND    R.parent IS NOT NULL   -- Has primary parent
+    UNION
+    -- (2) Trunk root predecessor of NTDB root.
+	    SELECT R.rid, RX.rid
+	    FROM   revision R, revision RX
+	    WHERE  R.rid IN $theset     -- Restrict to revisions of interest
+	    AND    R.parent IS NULL     -- which are root
+	    AND    R.isdefault          -- on NTDB
+	    AND    R.fid = RX.fid       -- Select all revision in the same file
+	    AND    RX.parent IS NULL    -- which are root
+	    AND    NOT RX.isdefault     -- on the trunk
     UNION
-    -- Transition trunk to NTDB
-	    SELECT R.rid, R.dbparent
-	    FROM   revision R
-	    WHERE  R.rid   IN $theset
-	    AND    R.dbparent IS NOT NULL
+    -- (3) Last NTDB on trunk is predecessor of child of trunk root
+	    SELECT R.rid, RA.dbparent
+	    FROM revision R, revision RA
+	    WHERE R.rid IN $theset       -- Restrict to revisions of interest
+	    AND NOT R.isdefault          -- not on NTDB
+	    AND R.parent IS NOT NULL     -- which are not root
+	    AND RA.rid = R.parent        -- go to their parent
+	    AND RA.dbparent IS NOT NULL  -- which has to refer to NTDB's root
 	"] {
 	    # Consider moving this to the integrity module.
 	    if {$rid == $parent} {
 		trouble internal "Revision $rid depends on itself."