Check-in [96b7bfb834]
Not logged in
Overview

SHA1 Hash:96b7bfb83401cc7e8ea8ad0eb803e6f50b3b50ff
Date: 2007-11-16 08:32:40
User: aku
Comment:Added convenience command to the state package when the sql returns a single row. Added more statistics about revisions, tags, branches, symbols, changesets to various passes.
Timelines: ancestors | descendants | both | trunk
Other Links: files | ZIP archive | manifest

Tags And Properties
Changes
[hide diffs]

Modified tools/cvs2fossil/lib/c2f_pbreakrcycle.tcl from [95b71ab788] to [030100362a].

@@ -20,10 +20,11 @@
 
 package require Tcl 8.4                                   ; # Required runtime.
 package require snit                                      ; # OO system.
 package require struct::list                              ; # Higher order list operations.
 package require vc::tools::log                            ; # User feedback.
+package require vc::fossil::import::cvs::repository       ; # Repository management.
 package require vc::fossil::import::cvs::cyclebreaker     ; # Breaking dependency cycles.
 package require vc::fossil::import::cvs::state            ; # State storage.
 package require vc::fossil::import::cvs::project::rev     ; # Project level changesets
 
 # # ## ### ##### ######## ############# #####################
@@ -76,10 +77,12 @@
 	state transaction {
 	    cyclebreaker run [struct::list filter [project::rev all] \
 				  [myproc IsByRevision]] \
 		[myproc SaveOrder]
 	}
+
+	repository printcsetstatistics
 	return
     }
 
     typemethod discard {} {
 	# Pass manager interface. Executed for all passes after the
@@ -119,10 +122,11 @@
 
 namespace eval ::vc::fossil::import::cvs::pass {
     namespace export breakrcycle
     namespace eval breakrcycle {
 	namespace import ::vc::fossil::import::cvs::cyclebreaker
+	namespace import ::vc::fossil::import::cvs::repository
 	namespace import ::vc::fossil::import::cvs::state
 	namespace eval project {
 	    namespace import ::vc::fossil::import::cvs::project::rev
 	}
 	namespace import ::vc::tools::log

Modified tools/cvs2fossil/lib/c2f_pbreakscycle.tcl from [0e581d0498] to [a1d5600281].

@@ -20,10 +20,11 @@
 
 package require Tcl 8.4                                   ; # Required runtime.
 package require snit                                      ; # OO system.
 package require struct::list                              ; # Higher order list operations.
 package require vc::fossil::import::cvs::cyclebreaker     ; # Breaking dependency cycles.
+package require vc::fossil::import::cvs::repository       ; # Repository management.
 package require vc::fossil::import::cvs::state            ; # State storage.
 package require vc::fossil::import::cvs::project::rev     ; # Project level changesets
 
 # # ## ### ##### ######## ############# #####################
 ## Register the pass with the management
@@ -63,10 +64,12 @@
 
 	state transaction {
 	    cyclebreaker run [struct::list filter [project::rev all] \
 				  [myproc IsBySymbol]]
 	}
+
+	repository printcsetstatistics
 	return
     }
 
     typemethod discard {} {
 	# Pass manager interface. Executed for all passes after the
@@ -92,10 +95,11 @@
 
 namespace eval ::vc::fossil::import::cvs::pass {
     namespace export breakscycle
     namespace eval breakscycle {
 	namespace import ::vc::fossil::import::cvs::cyclebreaker
+	namespace import ::vc::fossil::import::cvs::repository
 	namespace import ::vc::fossil::import::cvs::state
 	namespace eval project {
 	    namespace import ::vc::fossil::import::cvs::project::rev
 	}
     }

Modified tools/cvs2fossil/lib/c2f_pcollrev.tcl from [9385b6cf1b] to [e9c8eea44f].

@@ -339,12 +339,12 @@
 	    }
 
 	    $project purgeghostsymbols
 	}
 
-	repository printrevstatistics
 	repository persistrev
+	repository printrevstatistics
 	integrity  strict
 
 	log write 1 collrev "Scan completed"
 	return
     }

Modified tools/cvs2fossil/lib/c2f_pfiltersym.tcl from [852144546e] to [29f48baf16].

@@ -19,10 +19,11 @@
 
 package require Tcl 8.4                               ; # Required runtime.
 package require snit                                  ; # OO system.
 package require vc::tools::misc                       ; # Text formatting.
 package require vc::tools::log                        ; # User feedback.
+package require vc::fossil::import::cvs::repository   ; # Repository management.
 package require vc::fossil::import::cvs::state        ; # State storage.
 package require vc::fossil::import::cvs::integrity    ; # State storage integrity checks.
 package require vc::fossil::import::cvs::project::sym ; # Project level symbols
 
 # # ## ### ##### ######## ############# #####################
@@ -81,10 +82,12 @@
 	    FilterExcludedSymbols
 	    MutateSymbols
 	    AdjustParents
 	    RefineSymbols
 
+	    repository printrevstatistics
+
 	    # Strict integrity enforces that all meta entries are in
 	    # the same LOD as the revision using them. At this point
 	    # this may not be true any longer. If a NTDB was excluded
 	    # then all revisions it shared with the trunk were moved
 	    # to the trunk LOD, however their meta entries will still
@@ -111,11 +114,11 @@
 
     # # ## ### ##### ######## #############
     ## Internal methods
 
     proc FilterExcludedSymbols {} {
-	log write 3 filtersym "Filter out excluded symbols and users"
+	log write 3 filtersym "Remove the excluded symbols and their users"
 
 	# We pull all the excluded symbols together into a table for
 	# easy reference by the upcoming DELETE and other statements.
 	# ('x IN table' clauses).
 
@@ -159,13 +162,13 @@
 	    # 'dbchild'. The associated 'dbparent' is squashed
 	    # instead. All parents of the joints are moved to the
 	    # trunk as well.
 
 	    set tjoint $link($joint)
-	    set tlod [lindex [state run {
+	    set tlod [state one {
 		SELECT lod FROM revision WHERE rid = $tjoint
-	    }] 0]
+	    }]
 
 	    # Covnert db/parent/child into regular parent/child links.
 	    state run {
 		UPDATE revision SET dbparent = NULL, parent = $joint  WHERE rid = $tjoint ;
 		UPDATE revision SET dbchild  = NULL, child  = $tjoint WHERE rid = $joint  ;
@@ -349,16 +352,16 @@
 	    #
 	    # ... AND P.pid IN (SELECT B.sid
 	    #                   FROM branch B
 	    #                   WHERE B.root = R.rid)
 
-	    if {![lindex [state run {
+	    if {![state one {
 		SELECT COUNT(*)
 		FROM branch B
 		WHERE  B.sid  = $pid
 		AND    B.root = $rid
-	    }] 0]} {
+	    }]} {
 		incr tmax -1
 		set  mxs [format $fmt $tmax]
 		continue
 	    }
 
@@ -406,17 +409,17 @@
 	    # ... AND P.pid IN (SELECT BX.sid
 	    #                   FROM branch BX
 	    #                   WHERE BX.root = R.rid
 	    #                   AND   BX.pos > B.pos)
 
-	    if {![lindex [state run {
+	    if {![state one {
 		SELECT COUNT(*)
 		FROM branch B
 		WHERE  B.sid  = $pid
 		AND    B.root = $rid
 		AND    B.pos  > $pos
-	    }] 0]} {
+	    }]} {
 		incr bmax -1
 		set  mxs [format $fmt $bmax]
 		continue
 	    }
 
@@ -498,10 +501,11 @@
 }
 
 namespace eval ::vc::fossil::import::cvs::pass {
     namespace export filtersym
     namespace eval filtersym {
+	namespace import ::vc::fossil::import::cvs::repository
 	namespace import ::vc::fossil::import::cvs::state
 	namespace import ::vc::fossil::import::cvs::integrity
 	namespace eval project {
 	    namespace import ::vc::fossil::import::cvs::project::sym
 	}

Modified tools/cvs2fossil/lib/c2f_pinitcsets.tcl from [bb434d64fd] to [10710518c2].

@@ -131,10 +131,12 @@
 	state transaction {
 	    CreateRevisionChangesets  ; # Group file revisions into csets.
 	    BreakInternalDependencies ; # Split the csets based on internal conflicts.
 	    CreateSymbolChangesets    ; # Create csets for tags and branches.
 	    PersistTheChangesets
+
+	    repository printcsetstatistics
 	}
 	return
     }
 
     typemethod discard {} {

Modified tools/cvs2fossil/lib/c2f_prev.tcl from [bd4777ddd8] to [458c8956e4].

@@ -142,11 +142,11 @@
 		# dependencies cut before we remove them from
 		# consideration, for documentation later.
 
 		set breaks($best) $cross($best)
 
-		log write 6 csets "Best break @ $best, cuts [nsp $cross($best) dependency dependencies]"
+		log write 6 csets "Best break @ $best, cutting [nsp $cross($best) dependency dependencies]"
 
 		# Note: The value of best is an abolute location in
 		# myrevisions. Use the start of current to make it an
 		# index absolute to current.
 
@@ -286,13 +286,11 @@
 	return
     }
 
     typemethod loadcounter {} {
 	# Initialize the counter from the state
-	set mycounter [lindex [state run {
-	    SELECT MAX(cid) FROM changeset
-	}] 0]
+	set mycounter [state one { SELECT MAX(cid) FROM changeset }]
 	return
     }
 
     proc PullInternalSuccessorRevisions {dv revisions} {
 	upvar 1 $dv dependencies

Modified tools/cvs2fossil/lib/c2f_repository.tcl from [fccbbea0d2] to [6cbcf7b826].

@@ -89,11 +89,11 @@
     # pass I results
     typemethod printstatistics {} {
 	set prlist [TheProjects]
 	set npr [llength $prlist]
 
-	log write 2 repository "Scanned [nsp $npr project]"
+	log write 2 repository "Statistics: Scanned [nsp $npr project]"
 
 	if {$npr > 1} {
 	    set  bmax [max [struct::list map $prlist [myproc .BaseLength]]]
 	    incr bmax 2
 	    set  bfmt %-${bmax}s
@@ -106,11 +106,11 @@
 	}
 
 	set keep {}
 	foreach p $prlist {
 	    set nfiles [llength [$p filenames]]
-	    set line "Project [format $bfmt \"[$p printbase]\"] : [format $nfmt $nfiles] [sp $nfiles file]"
+	    set line "Statistics: Project [format $bfmt \"[$p printbase]\"] : [format $nfmt $nfiles] [sp $nfiles file]"
 	    if {$nfiles < 1} {
 		append line ", dropped"
 	    } else {
 		lappend keep $p
 	    }
@@ -164,12 +164,59 @@
 	return
     }
 
     # pass II results
     typemethod printrevstatistics {} {
-	log write 2 repository "Scanned ..."
-	# number of revisions, symbols, repository wide, per project ...
+	log write 2 repository "Revision statistics"
+	# number of revisions, symbols, repository wide, and per project ...
+
+	set rcount [state one { SELECT COUNT (*) FROM revision }]
+	set tcount [state one { SELECT COUNT (*) FROM tag      }]
+	set bcount [state one { SELECT COUNT (*) FROM branch   }]
+	set scount [state one { SELECT COUNT (*) FROM symbol   }]
+	set acount [state one { SELECT COUNT (*) FROM author   }]
+	set ccount [state one { SELECT COUNT (*) FROM cmessage }]
+	set fmt %[string length [max [list $rcount $tcount $bcount $scount $acount $ccount]]]s
+
+	log write 2 repository "Statistics: [format $fmt $rcount] [sp $rcount revision]"
+	log write 2 repository "Statistics: [format $fmt $tcount] [sp $tcount tag]"
+	log write 2 repository "Statistics: [format $fmt $bcount] [sp $bcount branch branches]"
+	log write 2 repository "Statistics: [format $fmt $scount] [sp $scount symbol]"
+	log write 2 repository "Statistics: [format $fmt $acount] [sp $acount author]"
+	log write 2 repository "Statistics: [format $fmt $ccount] [sp $ccount {log message}]"
+
+	set prlist [TheProjects]
+	set npr [llength $prlist]
+
+	if {$npr > 1} {
+	    set  bmax [max [struct::list map $prlist [myproc .BaseLength]]]
+	    incr bmax 2
+	    set  bfmt %-${bmax}s
+	} else {
+	    set bfmt %s
+	}
+
+	foreach p $prlist {
+	    set pid [$p id]
+	    set prefix "Statistics: Project [format $bfmt \"[$p printbase]\"]"
+	    regsub -all {[^	]} $prefix { } blanks
+	    set sep " : "
+
+	    set rcount [state one { SELECT COUNT (*) FROM revision R, file F WHERE R.fid = F.fid AND F.pid = $pid }]
+	    set tcount [state one { SELECT COUNT (*) FROM tag T,      file F WHERE T.fid = F.fid AND F.pid = $pid }]
+	    set bcount [state one { SELECT COUNT (*) FROM branch B,   file F WHERE B.fid = F.fid AND F.pid = $pid }]
+	    set scount [state one { SELECT COUNT (*) FROM symbol             WHERE pid = $pid                     }]
+	    set acount [state one { SELECT COUNT (*) FROM author   WHERE aid IN (SELECT DISTINCT aid FROM meta WHERE pid = $pid) }]
+	    set ccount [state one { SELECT COUNT (*) FROM cmessage WHERE cid IN (SELECT DISTINCT cid FROM meta WHERE pid = $pid) }]
+
+	    log write 2 repository "$prefix$sep[format $fmt $rcount] [sp $rcount revision]"
+	    log write 2 repository "$blanks$sep[format $fmt $tcount] [sp $tcount tag]"
+	    log write 2 repository "$blanks$sep[format $fmt $bcount] [sp $bcount branch branches]"
+	    log write 2 repository "$blanks$sep[format $fmt $scount] [sp $scount symbol]"
+	    log write 2 repository "$blanks$sep[format $fmt $acount] [sp $acount author]"
+	    log write 2 repository "$blanks$sep[format $fmt $ccount] [sp $ccount {log message}]"
+	}
 	return
     }
 
     # pass II persistence
     typemethod persistrev {} {
@@ -224,10 +271,53 @@
 	return
     }
 
     typemethod projectof {pid} {
 	return $myprojmap($pid)
+    }
+
+
+    # pass IV+ results
+    typemethod printcsetstatistics {} {
+	log write 2 repository "Changeset statistics"
+	# number of revisions, symbols, repository wide, and per project ...
+
+	set ccount [state one { SELECT COUNT (*) FROM changeset                }]
+	set rcount [state one { SELECT COUNT (*) FROM changeset WHERE type = 0 }]
+	set scount [state one { SELECT COUNT (*) FROM changeset WHERE type = 1 }]
+	set fmt %[string length [max [list $ccount $rcount $scount]]]s
+
+	log write 2 repository "Statistics: [format $fmt $ccount] [sp $ccount changeset]"
+	log write 2 repository "Statistics: [format $fmt $rcount] [sp $rcount {revision changeset}]"
+	log write 2 repository "Statistics: [format $fmt $scount] [sp $scount {symbol changeset}]"
+
+	set prlist [TheProjects]
+	set npr [llength $prlist]
+
+	if {$npr > 1} {
+	    set  bmax [max [struct::list map $prlist [myproc .BaseLength]]]
+	    incr bmax 2
+	    set  bfmt %-${bmax}s
+	} else {
+	    set bfmt %s
+	}
+
+	foreach p $prlist {
+	    set pid [$p id]
+	    set prefix "Statistics: Project [format $bfmt \"[$p printbase]\"]"
+	    regsub -all {[^	]} $prefix { } blanks
+	    set sep " : "
+
+	    set ccount [state one { SELECT COUNT (*) FROM changeset WHERE pid = $pid              }]
+	    set rcount [state one { SELECT COUNT (*) FROM changeset WHERE pid = $pid AND type = 0 }]
+	    set scount [state one { SELECT COUNT (*) FROM changeset WHERE pid = $pid AND type = 1 }]
+
+	    log write 2 repository "$prefix$sep[format $fmt $ccount] [sp $ccount changeset]"
+	    log write 2 repository "$blanks$sep[format $fmt $rcount] [sp $rcount {revision changeset}]"
+	    log write 2 repository "$blanks$sep[format $fmt $scount] [sp $scount {symbol changeset}]"
+	}
+	return
     }
 
     # # ## ### ##### ######## #############
     ## State
 

Modified tools/cvs2fossil/lib/c2f_state.tcl from [03d1122d66] to [5356f2147d].

@@ -143,10 +143,14 @@
 	return
     }
 
     typemethod run {args} {
 	return [uplevel 1 [linsert $args 0 $mystate eval]]
+    }
+
+    typemethod one {args} {
+	return [lindex [uplevel 1 [linsert $args 0 $mystate eval]] 0]
     }
 
     typemethod transaction {script} {
 	return [uplevel 1 [list $mystate transaction $script]]
     }