File Annotation
Not logged in
e7c805f137 2007-11-16       aku: ## -*- tcl -*-
e7c805f137 2007-11-16       aku: # # ## ### ##### ######## ############# #####################
e7c805f137 2007-11-16       aku: ## Copyright (c) 2007 Andreas Kupries.
e7c805f137 2007-11-16       aku: #
e7c805f137 2007-11-16       aku: # This software is licensed as described in the file LICENSE, which
e7c805f137 2007-11-16       aku: # you should have received as part of this distribution.
e7c805f137 2007-11-16       aku: #
e7c805f137 2007-11-16       aku: # This software consists of voluntary contributions made by many
e7c805f137 2007-11-16       aku: # individuals.  For exact contribution history, see the revision
e7c805f137 2007-11-16       aku: # history and logs, available at http://fossil-scm.hwaci.com/fossil
e7c805f137 2007-11-16       aku: # # ## ### ##### ######## ############# #####################
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: ## Pass VIII. This is the final pass for breaking changeset dependency
e7c805f137 2007-11-16       aku: ## cycles. The two previous passes broke cycles covering revision and
e7c805f137 2007-11-16       aku: ## symbol changesets, respectively. This pass now breaks any remaining
e7c805f137 2007-11-16       aku: ## cycles each of which has to contain at least one revision and at
e7c805f137 2007-11-16       aku: ## least one symbol changeset.
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: # # ## ### ##### ######## ############# #####################
e7c805f137 2007-11-16       aku: ## Requirements
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: package require Tcl 8.4                                   ; # Required runtime.
e7c805f137 2007-11-16       aku: package require snit                                      ; # OO system.
e7c805f137 2007-11-16       aku: package require struct::list                              ; # Higher order list operations.
4866889e88 2007-11-22       aku: package require vc::tools::misc                           ; # Min, max.
e7c805f137 2007-11-16       aku: package require vc::tools::log                            ; # User feedback.
4866889e88 2007-11-22       aku: package require vc::tools::trouble                        ; # Error reporting.
1f60018119 2007-11-21       aku: package require vc::fossil::import::cvs::repository       ; # Repository management.
e7c805f137 2007-11-16       aku: package require vc::fossil::import::cvs::cyclebreaker     ; # Breaking dependency cycles.
e7c805f137 2007-11-16       aku: package require vc::fossil::import::cvs::state            ; # State storage.
e7c805f137 2007-11-16       aku: package require vc::fossil::import::cvs::project::rev     ; # Project level changesets
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: # # ## ### ##### ######## ############# #####################
e7c805f137 2007-11-16       aku: ## Register the pass with the management
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: vc::fossil::import::cvs::pass define \
e7c805f137 2007-11-16       aku:     BreakAllCsetCycles \
e7c805f137 2007-11-16       aku:     {Break Remaining ChangeSet Dependency Cycles} \
e7c805f137 2007-11-16       aku:     ::vc::fossil::import::cvs::pass::breakacycle
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: # # ## ### ##### ######## ############# #####################
e7c805f137 2007-11-16       aku: ##
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: snit::type ::vc::fossil::import::cvs::pass::breakacycle {
e7c805f137 2007-11-16       aku:     # # ## ### ##### ######## #############
e7c805f137 2007-11-16       aku:     ## Public API
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     typemethod setup {} {
e7c805f137 2007-11-16       aku: 	# Define the names and structure of the persistent state of
e7c805f137 2007-11-16       aku: 	# this pass.
de4cff4142 2007-11-22       aku: 
de4cff4142 2007-11-22       aku: 	state reading csorder
e7c805f137 2007-11-16       aku: 	return
e7c805f137 2007-11-16       aku:     }
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     typemethod load {} {
e7c805f137 2007-11-16       aku: 	# Pass manager interface. Executed to load data computed by
e7c805f137 2007-11-16       aku: 	# this pass into memory when this pass is skipped instead of
e7c805f137 2007-11-16       aku: 	# executed.
e7c805f137 2007-11-16       aku: 	return
e7c805f137 2007-11-16       aku:     }
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     typemethod run {} {
e7c805f137 2007-11-16       aku: 	# Pass manager interface. Executed to perform the
e7c805f137 2007-11-16       aku: 	# functionality of the pass.
7f15be9078 2007-11-20       aku: 
1f60018119 2007-11-21       aku: 	cyclebreaker precmd   [myproc BreakRetrogradeBranches]
1f60018119 2007-11-21       aku: 	cyclebreaker savecmd  [myproc SaveOrder]
1f60018119 2007-11-21       aku: 	cyclebreaker breakcmd [myproc BreakCycle]
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku: 	state transaction {
de4cff4142 2007-11-22       aku: 	    LoadCommitOrder
1f60018119 2007-11-21       aku: 	    cyclebreaker run break-all [myproc Changesets]
1f60018119 2007-11-21       aku: 	}
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku: 	repository printcsetstatistics
e7c805f137 2007-11-16       aku: 	return
e7c805f137 2007-11-16       aku:     }
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     typemethod discard {} {
e7c805f137 2007-11-16       aku: 	# Pass manager interface. Executed for all passes after the
e7c805f137 2007-11-16       aku: 	# run passes, to remove all data of this pass from the state,
e7c805f137 2007-11-16       aku: 	# as being out of date.
e7c805f137 2007-11-16       aku: 	return
e7c805f137 2007-11-16       aku:     }
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     # # ## ### ##### ######## #############
e7c805f137 2007-11-16       aku:     ## Internal methods
e7c805f137 2007-11-16       aku: 
2a0ec504c5 2007-11-21       aku:     proc Changesets {} { project::rev all }
2a0ec504c5 2007-11-21       aku: 
de4cff4142 2007-11-22       aku:     proc LoadCommitOrder {} {
de4cff4142 2007-11-22       aku: 	::variable mycset
de4cff4142 2007-11-22       aku: 
de4cff4142 2007-11-22       aku: 	state transaction {
de4cff4142 2007-11-22       aku: 	    foreach {cid pos} [state run { SELECT cid, pos FROM csorder }] {
de4cff4142 2007-11-22       aku: 		set cset [project::rev of $cid]
de4cff4142 2007-11-22       aku: 		$cset setpos $pos
de4cff4142 2007-11-22       aku: 		set mycset($pos) $cset
de4cff4142 2007-11-22       aku: 	    }
de4cff4142 2007-11-22       aku: 	    # Remove the order information now that we have it in
de4cff4142 2007-11-22       aku: 	    # memory, so that we can save it once more, for all
de4cff4142 2007-11-22       aku: 	    # changesets, while breaking the remaining cycles.
de4cff4142 2007-11-22       aku: 	    state run { DELETE FROM csorder }
de4cff4142 2007-11-22       aku: 	}
de4cff4142 2007-11-22       aku: 	return
de4cff4142 2007-11-22       aku:     }
de4cff4142 2007-11-22       aku: 
1f60018119 2007-11-21       aku:     # # ## ### ##### ######## #############
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku:     proc BreakRetrogradeBranches {graph} {
4866889e88 2007-11-22       aku: 	# We go over all branch changesets, i.e. the changesets
4866889e88 2007-11-22       aku: 	# created by the symbols which are translated as branches, and
4866889e88 2007-11-22       aku: 	# break any which are 'retrograde'. Meaning that they have
4866889e88 2007-11-22       aku: 	# incoming revision changesets which are committed after some
4866889e88 2007-11-22       aku: 	# outgoing revision changeset.
4866889e88 2007-11-22       aku: 
4866889e88 2007-11-22       aku: 	# NOTE: We might be able to use our knowledge that we are
4866889e88 2007-11-22       aku: 	# looking at all changesets to create a sql which selects all
4866889e88 2007-11-22       aku: 	# the branch changesets from the state in one go instead of
4866889e88 2007-11-22       aku: 	# having to check each changeset separately. Consider this
4866889e88 2007-11-22       aku: 	# later, get the pass working first.
4866889e88 2007-11-22       aku: 	#
4866889e88 2007-11-22       aku: 	# NOTE 2: Might we even be able to select the retrograde
4866889e88 2007-11-22       aku: 	# changesets too ?
4866889e88 2007-11-22       aku: 
4866889e88 2007-11-22       aku: 	foreach cset [$graph nodes] {
4866889e88 2007-11-22       aku: 	    if {![$cset isbranch]} continue
4866889e88 2007-11-22       aku: 	    CheckAndBreakRetrograde $graph $cset
4866889e88 2007-11-22       aku: 	}
4866889e88 2007-11-22       aku: 	return
4866889e88 2007-11-22       aku:     }
4866889e88 2007-11-22       aku: 
4866889e88 2007-11-22       aku:     proc CheckAndBreakRetrograde {graph cset} {
4866889e88 2007-11-22       aku: 	while {[IsRetrograde $graph $cset]} {
4866889e88 2007-11-22       aku: 	    log write 5 breakacycle "Breaking retrograde changeset <[$cset id]>"
4866889e88 2007-11-22       aku: 
4866889e88 2007-11-22       aku: 	    break
4866889e88 2007-11-22       aku: 	}
4866889e88 2007-11-22       aku: 	return
4866889e88 2007-11-22       aku:     }
4866889e88 2007-11-22       aku: 
4866889e88 2007-11-22       aku:     proc IsRetrograde {dg cset} {
4866889e88 2007-11-22       aku: 	return 0
1f60018119 2007-11-21       aku:     }
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku:     # # ## ### ##### ######## #############
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku:     proc SaveOrder {cset pos} {
1f60018119 2007-11-21       aku:     }
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku:     # # ## ### ##### ######## #############
1f60018119 2007-11-21       aku: 
1f60018119 2007-11-21       aku:     proc BreakCycle {graph} {
1f60018119 2007-11-21       aku: 	cyclebreaker break $graph
1f60018119 2007-11-21       aku:     }
de4cff4142 2007-11-22       aku: 
de4cff4142 2007-11-22       aku:     # # ## ### ##### ######## #############
de4cff4142 2007-11-22       aku: 
de4cff4142 2007-11-22       aku:     typevariable mycset -array {} ; # Map from commit positions to the
de4cff4142 2007-11-22       aku: 				    # changeset (object ref) at that
de4cff4142 2007-11-22       aku: 				    # position.
1f60018119 2007-11-21       aku: 
e7c805f137 2007-11-16       aku:     # # ## ### ##### ######## #############
e7c805f137 2007-11-16       aku:     ## Configuration
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     pragma -hasinstances   no ; # singleton
e7c805f137 2007-11-16       aku:     pragma -hastypeinfo    no ; # no introspection
e7c805f137 2007-11-16       aku:     pragma -hastypedestroy no ; # immortal
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku:     # # ## ### ##### ######## #############
e7c805f137 2007-11-16       aku: }
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: namespace eval ::vc::fossil::import::cvs::pass {
e7c805f137 2007-11-16       aku:     namespace export breakacycle
e7c805f137 2007-11-16       aku:     namespace eval breakacycle {
e7c805f137 2007-11-16       aku: 	namespace import ::vc::fossil::import::cvs::cyclebreaker
1f60018119 2007-11-21       aku: 	namespace import ::vc::fossil::import::cvs::repository
e7c805f137 2007-11-16       aku: 	namespace import ::vc::fossil::import::cvs::state
e7c805f137 2007-11-16       aku: 	namespace eval project {
e7c805f137 2007-11-16       aku: 	    namespace import ::vc::fossil::import::cvs::project::rev
e7c805f137 2007-11-16       aku: 	}
4866889e88 2007-11-22       aku: 	namespace import ::vc::tools::misc::*
4866889e88 2007-11-22       aku: 	namespace import ::vc::tools::trouble
e7c805f137 2007-11-16       aku: 	namespace import ::vc::tools::log
e7c805f137 2007-11-16       aku: 	log register breakacycle
e7c805f137 2007-11-16       aku:     }
e7c805f137 2007-11-16       aku: }
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: # # ## ### ##### ######## ############# #####################
e7c805f137 2007-11-16       aku: ## Ready
e7c805f137 2007-11-16       aku: 
e7c805f137 2007-11-16       aku: package provide vc::fossil::import::cvs::pass::breakacycle 1.0
e7c805f137 2007-11-16       aku: return