Check-in [24c0b662de]
Not logged in
Overview

SHA1 Hash:24c0b662de879bea0436cbba3eb449a639891bab
Date: 2007-11-13 05:09:07
User: aku
Comment:Reworked the in-memory storage of changesets in pass 5 and supporting classes, and added loading of changesets from the persistent state for when the pass is skipped.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified tools/cvs2fossil/lib/c2f_pinitcsets.tcl from [046ff5e25b] to [960f3c67b5].

@@ -98,26 +98,42 @@
 
     typemethod load {} {
 	# Pass manager interface. Executed to load data computed by
 	# this pass into memory when this pass is skipped instead of
 	# executed.
-	# /TODO/load changesets
+
+	state reading changeset
+	state reading csrevision
+	state reading cstype
+
+	foreach {id pid cstype srcid} [state run {
+	    SELECT C.cid, C.pid, C.type, C.src
+	    FROM   changeset C
+	    ORDER BY C.cid
+	}] {
+	    set r [project::rev %AUTO% [repository projectof $pid] $cstype $srcid [state run {
+		SELECT C.rid
+		FROM   csrevision C
+		WHERE  C.cid = $id
+		ORDER  BY C.pos
+	    }]]
+	    $r setid $id
+	}
 
 	project::rev getcstypes
 	return
     }
 
     typemethod run {} {
 	# Pass manager interface. Executed to perform the
 	# functionality of the pass.
 
-	set csets {}
 	state transaction {
-	    CreateRevisionChangesets  csets ; # Group file revisions into csets.
-	    BreakInternalDependencies csets ; # Split the csets based on internal conflicts.
-	    CreateSymbolChangesets    csets ; # Create csets for tags and branches.
-	    PersistTheChangesets     $csets
+	    CreateRevisionChangesets  ; # Group file revisions into csets.
+	    BreakInternalDependencies ; # Split the csets based on internal conflicts.
+	    CreateSymbolChangesets    ; # Create csets for tags and branches.
+	    PersistTheChangesets
 	}
 	return
     }
 
     typemethod discard {} {
@@ -132,13 +148,11 @@
     }
 
     # # ## ### ##### ######## #############
     ## Internal methods
 
-    proc CreateRevisionChangesets {cv} {
-	upvar 1 $cv csets
-
+    proc CreateRevisionChangesets {} {
 	log write 3 initcsets {Create changesets based on revisions}
 
 	# To get the initial of changesets we first group all file
 	# level revisions using the same meta data entry together. As
 	# the meta data encodes not only author and log message, but
@@ -174,11 +188,11 @@
 	}] {
 	    if {$lastmeta != $mid} {
 		if {[llength $revisions]} {
 		    incr n
 		    set  p [repository projectof $lastproject]
-		    lappend csets [project::rev %AUTO% $p rev $lastmeta $revisions]
+		    project::rev %AUTO% $p rev $lastmeta $revisions
 		    set revisions {}
 		}
 		set lastmeta    $mid
 		set lastproject $pid
 	    }
@@ -186,20 +200,18 @@
 	}
 
 	if {[llength $revisions]} {
 	    incr n
 	    set  p [repository projectof $lastproject]
-	    lappend csets [project::rev %AUTO% $p rev $lastmeta $revisions]
+	    project::rev %AUTO% $p rev $lastmeta $revisions
 	}
 
 	log write 4 initcsets "Created [nsp $n {revision changeset}]"
 	return
     }
 
-    proc CreateSymbolChangesets {cv} {
-	upvar 1 $cv csets
-
+    proc CreateSymbolChangesets {} {
 	log write 3 initcsets {Create changesets based on symbols}
 
 	# Tags and branches induce changesets as well, containing the
 	# revisions they are attached to (tags), or spawned from
 	# (branches).
@@ -222,11 +234,11 @@
 	}] {
 	    if {$lastsymbol != $sid} {
 		if {[llength $revisions]} {
 		    incr n
 		    set  p [repository projectof $lastproject]
-		    lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
+		    project::rev %AUTO% $p sym $lastsymbol $revisions
 		    set revisions {}
 		}
 		set lastsymbol  $sid
 		set lastproject $pid
 	    }
@@ -234,11 +246,11 @@
 	}
 
 	if {[llength $revisions]} {
 	    incr n
 	    set  p [repository projectof $lastproject]
-	    lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
+	    project::rev %AUTO% $p sym $lastsymbol $revisions
 	}
 
 	set lastsymbol {}
 	set lasproject {}
 	set revisions  {}
@@ -252,11 +264,11 @@
 	}] {
 	    if {$lastsymbol != $sid} {
 		if {[llength $revisions]} {
 		    incr n
 		    set  p [repository projectof $lastproject]
-		    lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
+		    project::rev %AUTO% $p sym $lastsymbol $revisions
 		    set revisions {}
 		}
 		set lastsymbol  $sid
 		set lastproject $pid
 	    }
@@ -264,45 +276,43 @@
 	}
 
 	if {[llength $revisions]} {
 	    incr n
 	    set  p [repository projectof $lastproject]
-	    lappend csets [project::rev %AUTO% $p sym $lastsymbol $revisions]
+	    project::rev %AUTO% $p sym $lastsymbol $revisions
 	}
 
 	log write 4 initcsets "Created [nsp $n {symbol changeset}]"
 	return
     }
 
-    proc BreakInternalDependencies {cv} {
-	upvar 1 $cv csets
-
+    proc BreakInternalDependencies {} {
 	# This code operates on the revision changesets created by
 	# 'CreateRevisionChangesets'. As such it has to follow after
 	# it, before the symbol changesets are made. The changesets
 	# are inspected for internal conflicts and any such are broken
 	# by splitting the problematic changeset into multiple
 	# fragments. The results are changesets which have no internal
 	# dependencies, only external ones.
 
 	log write 3 initcsets {Break internal dependencies}
-	set old [llength $csets]
+	set old [llength [project::rev all]]
 
-	foreach cset $csets {
-	    $cset breakinternaldependencies csets
+	foreach cset [project::rev all] {
+	    $cset breakinternaldependencies
 	}
 
-	set n [expr {[llength $csets] - $old}]
+	set n [expr {[llength [project::rev all]] - $old}]
 	log write 4 initcsets "Created [nsp $n {additional revision changeset}]"
 	log write 4 initcsets Ok.
 	return
     }
 
-    proc PersistTheChangesets {csets} {
-	log write 3 initcsets "Saving [nsp [llength $csets] {initial changeset}] to the persistent state"
+    proc PersistTheChangesets {} {
+	log write 3 initcsets "Saving [nsp [llength [project::rev all]] {initial changeset}] to the persistent state"
 
-	foreach cset $csets {
+	foreach cset [project::rev all] {
 	    $cset persist
 	}
 
 	log write 4 initcsets Ok.
 	return

Modified tools/cvs2fossil/lib/c2f_prev.tcl from [987e3e6cdd] to [971e3d4db2].

@@ -34,18 +34,20 @@
 	set myid        [incr mycounter]
 	set myproject   $project
 	set mytype      $cstype
 	set mysrcid	$srcid
 	set myrevisions $revisions
+
+	# Keep track of the generated changesets.
+	lappend mychangesets $self
 	return
     }
 
     method id {} { return $myid }
-
-    method breakinternaldependencies {cv} {
-	upvar 2 $cv csets ; # simple-dispatch!
-
+    method setid {id} { set myid $id ; return }
+
+    method breakinternaldependencies {} {
 	# This method inspects the changesets for internal
 	# dependencies. Nothing is done if there are no
 	# such. Otherwise the changeset is split into a set of
 	# fragments without internal dependencies, transforming the
 	# internal dependencies into external ones. The new changesets
@@ -165,11 +167,10 @@
 	    if {$laste != ($s - 1)} {
 		trouble internal "Bad fragment border <$laste | $s>, gap or overlap"
 	    }
 
 	    set new [$type %AUTO% $myproject $mytype $mysrcid [lrange $myrevisions $s $e]]
-	    lappend csets $new
 
             log write 4 csets "Breaking <$myid> @ $laste, new <[$new id]>, cutting $breaks($laste)"
 
 	    set laste $e
 	}
@@ -465,10 +466,18 @@
     proc Border {range sv ev} {
 	upvar 1 $sv s $ev e
 	set s [lindex $range 0]
 	set e [lindex $range end]
 	return
+    }
+
+    # # ## ### ##### ######## #############
+
+    typevariable mychangesets {} ; # List of all known changesets.
+
+    typemethod all {} {
+	return $mychangesets
     }
 
     # # ## ### ##### ######## #############
     ## Configuration