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
- branch=trunk inherited from [a28c83647d]
- sym-trunk inherited from [a28c83647d]
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