Artifact 60fbae5ce7277f575adbf2c0d3f9f48e12b32605:
File
tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
part of check-in
[04d76a9e79]
- Renamed changeset method to describe modified results, and updated the one invoker. Modified the sorting of time ranges. Now by max, min as tiebreaker, and object name as last tiebreaker.
by
aku on
2007-11-29 07:55:01.
0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23 ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30 Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65 tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69 d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20 SE, which.# you
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 ived as part of
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74 n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72 voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75 many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20 als. For exact
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73 contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65 tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79 vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66 able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23 com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 54 68 69 ########..## Thi
0200: 73 20 66 69 6c 65 20 70 72 6f 76 69 64 65 73 20 s file provides
0210: 61 20 68 65 6c 70 65 72 20 70 61 63 6b 61 67 65 a helper package
0220: 20 66 6f 72 20 74 68 65 20 70 61 73 73 65 73 20 for the passes
0230: 36 20 61 6e 64 20 37 20 77 68 69 63 68 0a 23 23 6 and 7 which.##
0240: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f contains the co
0250: 6d 6d 6f 6e 20 63 6f 64 65 20 6f 66 20 74 68 65 mmon code of the
0260: 20 63 79 63 6c 65 20 62 72 65 61 6b 69 6e 67 20 cycle breaking
0270: 61 6c 67 6f 72 69 74 68 6d 2e 0a 0a 23 20 23 20 algorithm...# #
0280: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
0290: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
02a0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
02b0: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 71 #########.## Req
02c0: 75 69 72 65 6d 65 6e 74 73 0a 0a 70 61 63 6b 61 uirements..packa
02d0: 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20 38 ge require Tcl 8
02e0: 2e 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .4
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0300: 20 20 20 20 20 3b 20 23 20 52 65 71 75 69 72 65 ; # Require
0310: 64 20 72 75 6e 74 69 6d 65 2e 0a 70 61 63 6b 61 d runtime..packa
0320: 67 65 20 72 65 71 75 69 72 65 20 73 6e 69 74 20 ge require snit
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0350: 20 20 20 20 20 3b 20 23 20 4f 4f 20 73 79 73 74 ; # OO syst
0360: 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 em..package requ
0370: 69 72 65 20 73 74 72 75 63 74 3a 3a 67 72 61 70 ire struct::grap
0380: 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 h
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 ;
03a0: 23 20 47 72 61 70 68 20 68 61 6e 64 6c 69 6e 67 # Graph handling
03b0: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 ..package requir
03c0: 65 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 20 e struct::list
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 ; #
03f0: 48 69 67 68 65 72 20 6f 72 64 65 72 20 6c 69 73 Higher order lis
0400: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 70 61 t operations..pa
0410: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63 ckage require vc
0420: 3a 3a 74 6f 6f 6c 73 3a 3a 64 6f 74 20 20 20 20 ::tools::dot
0430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0440: 20 20 20 20 20 20 20 20 3b 20 23 20 55 73 65 72 ; # User
0450: 20 66 65 65 64 62 61 63 6b 2e 20 44 4f 54 20 65 feedback. DOT e
0460: 78 70 6f 72 74 2e 0a 70 61 63 6b 61 67 65 20 72 xport..package r
0470: 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 equire vc::tools
0480: 3a 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 ::log
0490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
04a0: 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62 61 ; # User feedba
04b0: 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 ck..package requ
04c0: 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 ire vc::tools::t
04d0: 72 6f 75 62 6c 65 20 20 20 20 20 20 20 20 20 20 rouble
04e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 ;
04f0: 23 20 45 72 72 6f 72 20 72 65 70 6f 72 74 69 6e # Error reportin
0500: 67 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 g..package requi
0510: 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 re vc::tools::mi
0520: 73 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 sc
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 ; #
0540: 20 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67 Text formatting
0550: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 ..package requir
0560: 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d e vc::fossil::im
0570: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
0580: 63 74 3a 3a 72 65 76 20 20 20 20 20 3b 20 23 20 ct::rev ; #
0590: 50 72 6f 6a 65 63 74 20 6c 65 76 65 6c 20 63 68 Project level ch
05a0: 61 6e 67 65 73 65 74 73 0a 70 61 63 6b 61 67 65 angesets.package
05b0: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 require vc::fos
05c0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
05d0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 6c 69 ::project::revli
05e0: 6e 6b 20 3b 20 23 20 43 79 63 6c 65 20 6c 69 6e nk ; # Cycle lin
05f0: 6b 73 2e 0a 0a 23 20 23 20 23 23 20 23 23 23 20 ks...# # ## ###
0600: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 ##### ######## #
0610: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 ############ ###
0620: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0630: 23 23 0a 23 23 0a 0a 73 6e 69 74 3a 3a 74 79 70 ##.##..snit::typ
0640: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a e ::vc::fossil::
0650: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 63 79 63 import::cvs::cyc
0660: 6c 65 62 72 65 61 6b 65 72 20 7b 0a 20 20 20 20 lebreaker {.
0670: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 # # ## ### #####
0680: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 ######## ######
0690: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 50 #######. ## P
06a0: 75 62 6c 69 63 20 41 50 49 0a 0a 20 20 20 20 74 ublic API.. t
06b0: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 63 6d 64 ypemethod precmd
06c0: 20 7b 63 6d 64 7d 20 7b 0a 09 3a 3a 76 61 72 69 {cmd} {..::vari
06d0: 61 62 6c 65 20 6d 79 70 72 65 63 6d 64 20 24 63 able myprecmd $c
06e0: 6d 64 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d md..return. }
06f0: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
0700: 20 73 61 76 65 63 6d 64 20 7b 63 6d 64 7d 20 7b savecmd {cmd} {
0710: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 73 ..::variable mys
0720: 61 76 65 63 6d 64 20 24 63 6d 64 0a 09 72 65 74 avecmd $cmd..ret
0730: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 urn. }.. t
0740: 79 70 65 6d 65 74 68 6f 64 20 62 72 65 61 6b 63 ypemethod breakc
0750: 6d 64 20 7b 63 6d 64 7d 20 7b 0a 09 3a 3a 76 61 md {cmd} {..::va
0760: 72 69 61 62 6c 65 20 6d 79 62 72 65 61 6b 63 6d riable mybreakcm
0770: 64 20 24 63 6d 64 0a 09 72 65 74 75 72 6e 0a 20 d $cmd..return.
0780: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 }.. # # ##
0790: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
07a0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
07b0: 23 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f #.. typemetho
07c0: 64 20 64 6f 74 73 74 6f 20 7b 70 61 74 68 7d 20 d dotsto {path}
07d0: 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 {..::variable my
07e0: 64 6f 74 64 65 73 74 69 6e 61 74 69 6f 6e 20 24 dotdestination $
07f0: 70 61 74 68 0a 09 72 65 74 75 72 6e 0a 20 20 20 path..return.
0800: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 }.. typemeth
0810: 6f 64 20 77 61 74 63 68 20 7b 69 64 7d 20 7b 0a od watch {id} {.
0820: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 77 61 .::variable mywa
0830: 74 63 68 69 64 73 0a 09 6c 61 70 70 65 6e 64 20 tchids..lappend
0840: 6d 79 77 61 74 63 68 69 64 73 20 24 69 64 0a 20 mywatchids $id.
0850: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme
0860: 74 68 6f 64 20 64 6f 74 20 7b 6c 61 62 65 6c 20 thod dot {label
0870: 63 68 61 6e 67 65 73 65 74 73 7d 20 7b 0a 09 3a changesets} {..:
0880: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 70 :variable mydotp
0890: 72 65 66 69 78 20 24 6c 61 62 65 6c 0a 09 3a 3a refix $label..::
08a0: 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69 64 variable mydotid
08b0: 20 20 20 20 20 30 0a 0a 09 73 65 74 20 64 67 20 0...set dg
08c0: 5b 53 65 74 75 70 20 24 63 68 61 6e 67 65 73 65 [Setup $changese
08d0: 74 73 20 30 5d 0a 09 4d 61 72 6b 20 24 64 67 0a ts 0]..Mark $dg.
08e0: 09 24 64 67 20 64 65 73 74 72 6f 79 0a 09 72 65 .$dg destroy..re
08f0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
0900: 74 79 70 65 6d 65 74 68 6f 64 20 6d 61 72 6b 20 typemethod mark
0910: 7b 67 72 61 70 68 20 73 75 66 66 69 78 20 7b 73 {graph suffix {s
0920: 75 62 67 72 61 70 68 20 7b 7d 7d 7d 20 7b 0a 09 ubgraph {}}} {..
0930: 4d 61 72 6b 20 24 67 72 61 70 68 20 24 73 75 66 Mark $graph $suf
0940: 66 69 78 20 24 73 75 62 67 72 61 70 68 0a 09 72 fix $subgraph..r
0950: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
0960: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
0970: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
0980: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 ########.. ty
0990: 70 65 6d 65 74 68 6f 64 20 72 75 6e 20 7b 6c 61 pemethod run {la
09a0: 62 65 6c 20 63 68 61 6e 67 65 73 65 74 63 6d 64 bel changesetcmd
09b0: 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 } {..::variable
09c0: 6d 79 61 74 20 20 20 20 20 20 20 20 30 0a 09 3a myat 0..:
09d0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 70 :variable mydotp
09e0: 72 65 66 69 78 20 24 6c 61 62 65 6c 0a 09 3a 3a refix $label..::
09f0: 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69 64 variable mydotid
0a00: 20 20 20 20 20 30 0a 0a 09 23 20 57 65 20 63 72 0...# We cr
0a10: 65 61 74 65 20 61 20 67 72 61 70 68 20 6f 66 20 eate a graph of
0a20: 74 68 65 20 72 65 76 69 73 69 6f 6e 20 63 68 61 the revision cha
0a30: 6e 67 65 73 65 74 73 2c 20 75 73 69 6e 67 20 74 ngesets, using t
0a40: 68 65 20 66 69 6c 65 0a 09 23 20 6c 65 76 65 6c he file..# level
0a50: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f dependencies to
0a60: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 66 69 72 construct a fir
0a70: 73 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e st approximation
0a80: 20 6f 66 20 74 68 65 0a 09 23 20 64 65 70 65 6e of the..# depen
0a90: 64 65 6e 63 69 65 73 20 61 74 20 74 68 65 20 70 dencies at the p
0aa0: 72 6f 6a 65 63 74 20 6c 65 76 65 6c 2e 20 54 68 roject level. Th
0ab0: 65 6e 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 63 en we look for c
0ac0: 79 63 6c 65 73 0a 09 23 20 69 6e 20 74 68 61 74 ycles..# in that
0ad0: 20 67 72 61 70 68 20 61 6e 64 20 62 72 65 61 6b graph and break
0ae0: 20 74 68 65 6d 2e 0a 0a 09 23 20 31 2e 20 43 72 them....# 1. Cr
0af0: 65 61 74 65 20 6e 6f 64 65 73 20 66 6f 72 20 61 eate nodes for a
0b00: 6c 6c 20 72 65 6c 65 76 61 6e 74 20 63 68 61 6e ll relevant chan
0b10: 67 65 73 65 74 73 20 61 6e 64 20 61 20 6d 61 70 gesets and a map
0b20: 70 69 6e 67 0a 09 23 20 20 20 20 66 72 6f 6d 20 ping..# from
0b30: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 6f the revisions to
0b40: 20 74 68 65 69 72 20 63 68 61 6e 67 65 73 65 74 their changeset
0b50: 73 2f 6e 6f 64 65 73 2e 0a 0a 09 73 65 74 20 63 s/nodes....set c
0b60: 68 61 6e 67 65 73 65 74 73 20 5b 75 70 6c 65 76 hangesets [uplev
0b70: 65 6c 20 23 30 20 24 63 68 61 6e 67 65 73 65 74 el #0 $changeset
0b80: 63 6d 64 5d 0a 09 73 65 74 20 64 67 20 5b 53 65 cmd]..set dg [Se
0b90: 74 75 70 20 24 63 68 61 6e 67 65 73 65 74 73 5d tup $changesets]
0ba0: 0a 0a 09 23 20 33 2e 20 4c 61 73 74 6c 79 20 77 ...# 3. Lastly w
0bb0: 65 20 69 74 65 72 61 74 65 20 74 68 65 20 67 72 e iterate the gr
0bc0: 61 70 68 20 74 6f 70 6f 6c 6f 67 69 63 61 6c 6c aph topologicall
0bd0: 79 2e 20 57 65 20 6d 61 72 6b 20 6f 66 66 0a 09 y. We mark off..
0be0: 23 20 20 20 20 74 68 65 20 6e 6f 64 65 73 20 77 # the nodes w
0bf0: 68 69 63 68 20 68 61 76 65 20 6e 6f 20 70 72 65 hich have no pre
0c00: 64 65 63 65 73 73 6f 72 73 2c 20 69 6e 20 6f 72 decessors, in or
0c10: 64 65 72 20 66 72 6f 6d 0a 09 23 20 20 20 20 6f der from..# o
0c20: 6c 64 65 73 74 20 74 6f 20 79 6f 75 6e 67 65 73 ldest to younges
0c30: 74 2c 20 73 61 76 69 6e 67 20 61 6e 64 20 72 65 t, saving and re
0c40: 6d 6f 76 69 6e 67 20 64 65 70 65 6e 64 65 6e 63 moving dependenc
0c50: 69 65 73 2e 20 49 66 0a 09 23 20 20 20 20 77 65 ies. If..# we
0c60: 20 66 69 6e 64 20 6e 6f 20 6e 6f 64 65 73 20 77 find no nodes w
0c70: 69 74 68 6f 75 74 20 70 72 65 64 65 63 65 73 73 ithout predecess
0c80: 6f 72 73 20 77 65 20 68 61 76 65 20 61 20 63 79 ors we have a cy
0c90: 63 6c 65 2c 0a 09 23 20 20 20 20 61 6e 64 20 77 cle,..# and w
0ca0: 6f 72 6b 20 6f 6e 20 62 72 65 61 6b 69 6e 67 20 ork on breaking
0cb0: 69 74 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 it....log write
0cc0: 33 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 7b 3 cyclebreaker {
0cd0: 54 72 61 76 65 72 73 65 20 63 68 61 6e 67 65 73 Traverse changes
0ce0: 65 74 73 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a ets}...Initializ
0cf0: 65 43 61 6e 64 69 64 61 74 65 73 20 24 64 67 0a eCandidates $dg.
0d00: 09 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 20 20 .while {1} {..
0d10: 20 20 77 68 69 6c 65 20 7b 5b 57 69 74 68 6f 75 while {[Withou
0d20: 74 50 72 65 64 65 63 65 73 73 6f 72 20 24 64 67 tPredecessor $dg
0d30: 20 6e 5d 7d 20 7b 0a 09 09 4d 61 72 6b 57 61 74 n]} {...MarkWat
0d40: 63 68 20 24 64 67 0a 09 09 50 72 6f 63 65 73 73 ch $dg...Process
0d50: 65 64 48 6f 6f 6b 20 24 64 67 20 24 6e 20 24 6d edHook $dg $n $m
0d60: 79 61 74 0a 09 09 24 64 67 20 6e 6f 64 65 20 64 yat...$dg node d
0d70: 65 6c 65 74 65 20 24 6e 0a 09 09 69 6e 63 72 20 elete $n...incr
0d80: 6d 79 61 74 0a 09 09 53 68 6f 77 50 65 6e 64 69 myat...ShowPendi
0d90: 6e 67 4e 6f 64 65 73 0a 09 20 20 20 20 7d 0a 0a ngNodes.. }..
0da0: 09 20 20 20 20 69 66 20 7b 21 5b 6c 6c 65 6e 67 . if {![lleng
0db0: 74 68 20 5b 64 67 20 6e 6f 64 65 73 5d 5d 7d 20 th [dg nodes]]}
0dc0: 62 72 65 61 6b 0a 0a 09 20 20 20 20 42 72 65 61 break... Brea
0dd0: 6b 43 79 63 6c 65 48 6f 6f 6b 20 20 20 20 20 20 kCycleHook
0de0: 20 24 64 67 0a 09 20 20 20 20 49 6e 69 74 69 61 $dg.. Initia
0df0: 6c 69 7a 65 43 61 6e 64 69 64 61 74 65 73 20 24 lizeCandidates $
0e00: 64 67 0a 09 20 20 20 20 4d 61 72 6b 57 61 74 63 dg.. MarkWatc
0e10: 68 20 20 20 20 20 20 20 20 20 20 20 20 24 64 67 h $dg
0e20: 0a 09 7d 0a 0a 09 24 64 67 20 64 65 73 74 72 6f ..}...$dg destro
0e30: 79 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 33 20 y...log write 3
0e40: 63 79 63 6c 65 62 72 65 61 6b 65 72 20 44 6f 6e cyclebreaker Don
0e50: 65 2e 0a 09 43 6c 65 61 72 48 6f 6f 6b 73 0a 0a e...ClearHooks..
0e60: 09 23 20 52 65 72 65 61 64 20 74 68 65 20 67 72 .# Reread the gr
0e70: 61 70 68 20 61 6e 64 20 64 75 6d 70 20 69 74 73 aph and dump its
0e80: 20 66 69 6e 61 6c 20 66 6f 72 6d 2c 20 69 66 20 final form, if
0e90: 67 72 61 70 68 20 65 78 70 6f 72 74 0a 09 23 20 graph export..#
0ea0: 77 61 73 20 61 63 74 69 76 61 74 65 64 2e 0a 0a was activated...
0eb0: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 6f .::variable mydo
0ec0: 74 64 65 73 74 69 6e 61 74 69 6f 6e 0a 09 69 66 tdestination..if
0ed0: 20 7b 24 6d 79 64 6f 74 64 65 73 74 69 6e 61 74 {$mydotdestinat
0ee0: 69 6f 6e 20 65 71 20 22 22 7d 20 72 65 74 75 72 ion eq ""} retur
0ef0: 6e 0a 0a 09 73 65 74 20 20 20 64 67 20 5b 53 65 n...set dg [Se
0f00: 74 75 70 20 5b 75 70 6c 65 76 65 6c 20 23 30 20 tup [uplevel #0
0f10: 24 63 68 61 6e 67 65 73 65 74 63 6d 64 5d 20 30 $changesetcmd] 0
0f20: 5d 0a 09 4d 61 72 6b 20 24 64 67 20 2d 64 6f 6e ]..Mark $dg -don
0f30: 65 0a 09 24 64 67 20 64 65 73 74 72 6f 79 0a 09 e..$dg destroy..
0f40: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
0f50: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
0f60: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
0f70: 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 #########.. t
0f80: 79 70 65 6d 65 74 68 6f 64 20 62 72 65 61 6b 2d ypemethod break-
0f90: 73 65 67 6d 65 6e 74 20 7b 67 72 61 70 68 7d 20 segment {graph}
0fa0: 7b 0a 09 42 72 65 61 6b 53 65 67 6d 65 6e 74 20 {..BreakSegment
0fb0: 24 67 72 61 70 68 20 24 70 61 74 68 20 22 73 65 $graph $path "se
0fc0: 67 6d 65 6e 74 20 28 5b 70 72 6f 6a 65 63 74 3a gment ([project:
0fd0: 3a 72 65 76 20 73 74 72 6c 69 73 74 20 24 70 61 :rev strlist $pa
0fe0: 74 68 5d 29 22 0a 09 72 65 74 75 72 6e 0a 20 20 th])"..return.
0ff0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
1000: 68 6f 64 20 62 72 65 61 6b 20 7b 67 72 61 70 68 hod break {graph
1010: 7d 20 7b 0a 09 73 65 74 20 63 79 63 6c 65 20 5b } {..set cycle [
1020: 46 69 6e 64 43 79 63 6c 65 20 24 67 72 61 70 68 FindCycle $graph
1030: 5d 0a 09 73 65 74 20 6c 61 62 65 6c 20 22 63 79 ]..set label "cy
1040: 63 6c 65 20 28 5b 70 72 6f 6a 65 63 74 3a 3a 72 cle ([project::r
1050: 65 76 20 73 74 72 6c 69 73 74 20 24 63 79 63 6c ev strlist $cycl
1060: 65 5d 29 22 0a 0a 09 23 20 4e 4f 54 45 3a 20 63 e])"...# NOTE: c
1070: 76 73 32 73 76 6e 20 75 73 65 73 20 74 68 65 20 vs2svn uses the
1080: 73 65 71 75 65 6e 63 65 20 22 65 6e 64 2d 31 2c sequence "end-1,
1090: 20 63 79 63 6c 65 2c 20 30 22 20 74 6f 20 63 72 cycle, 0" to cr
10a0: 65 61 74 65 0a 09 23 20 20 20 20 20 20 20 74 68 eate..# th
10b0: 65 20 70 61 74 68 20 66 72 6f 6d 20 74 68 65 20 e path from the
10c0: 63 79 63 6c 65 2e 20 54 68 65 20 6f 6e 6c 79 20 cycle. The only
10d0: 65 66 66 65 63 74 20 49 20 63 61 6e 20 73 65 65 effect I can see
10e0: 20 69 73 0a 09 23 20 20 20 20 20 20 20 74 68 61 is..# tha
10f0: 74 20 74 68 69 73 20 63 61 75 73 65 73 20 74 68 t this causes th
1100: 65 20 6c 69 6e 6b 2d 74 72 69 70 6c 65 73 20 74 e link-triples t
1110: 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20 69 o be generated i
1120: 6e 20 61 0a 09 23 20 20 20 20 20 20 20 73 69 67 n a..# sig
1130: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 6f htly different o
1140: 72 64 65 72 2c 20 69 2e 65 2e 20 6f 6e 65 20 6c rder, i.e. one l
1150: 69 6e 6b 20 72 6f 74 61 74 65 64 20 74 6f 20 74 ink rotated to t
1160: 68 65 0a 09 23 20 20 20 20 20 20 20 72 69 67 68 he..# righ
1170: 74 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 68 t. This should h
1180: 61 76 65 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e ave no effect on
1190: 20 74 68 65 20 73 65 61 72 63 68 20 66 6f 72 0a the search for.
11a0: 09 23 20 20 20 20 20 20 20 74 68 65 20 62 65 73 .# the bes
11b0: 74 20 6f 66 20 61 6c 6c 2e 0a 0a 09 6c 61 70 70 t of all....lapp
11c0: 65 6e 64 20 63 79 63 6c 65 20 5b 6c 69 6e 64 65 end cycle [linde
11d0: 78 20 24 63 79 63 6c 65 20 30 5d 20 5b 6c 69 6e x $cycle 0] [lin
11e0: 64 65 78 20 24 63 79 63 6c 65 20 31 5d 0a 09 42 dex $cycle 1]..B
11f0: 72 65 61 6b 53 65 67 6d 65 6e 74 20 24 67 72 61 reakSegment $gra
1200: 70 68 20 24 63 79 63 6c 65 20 24 6c 61 62 65 6c ph $cycle $label
1210: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
1220: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 72 typemethod r
1230: 65 70 6c 61 63 65 20 7b 67 72 61 70 68 20 6e 20 eplace {graph n
1240: 72 65 70 6c 61 63 65 6d 65 6e 74 73 7d 20 7b 0a replacements} {.
1250: 09 52 65 70 6c 61 63 65 20 24 67 72 61 70 68 20 .Replace $graph
1260: 24 6e 20 24 72 65 70 6c 61 63 65 6d 65 6e 74 73 $n $replacements
1270: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
1280: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 # # ## ### #
1290: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
12a0: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 ###########.
12b0: 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 ## Internal meth
12c0: 6f 64 73 0a 0a 20 20 20 20 70 72 6f 63 20 53 65 ods.. proc Se
12d0: 74 75 70 20 7b 63 68 61 6e 67 65 73 65 74 73 20 tup {changesets
12e0: 7b 6c 6f 67 20 31 7d 7d 20 7b 0a 09 69 66 20 7b {log 1}} {..if {
12f0: 24 6c 6f 67 7d 20 7b 0a 09 20 20 20 20 6c 6f 67 $log} {.. log
1300: 20 77 72 69 74 65 20 33 20 63 79 63 6c 65 62 72 write 3 cyclebr
1310: 65 61 6b 65 72 20 22 43 72 65 61 74 69 6e 67 20 eaker "Creating
1320: 67 72 61 70 68 20 6f 66 20 63 68 61 6e 67 65 73 graph of changes
1330: 65 74 73 22 0a 09 7d 0a 0a 09 73 65 74 20 64 67 ets"..}...set dg
1340: 20 5b 73 74 72 75 63 74 3a 3a 67 72 61 70 68 20 [struct::graph
1350: 64 67 5d 0a 0a 09 66 6f 72 65 61 63 68 20 63 73 dg]...foreach cs
1360: 65 74 20 24 63 68 61 6e 67 65 73 65 74 73 20 7b et $changesets {
1370: 0a 09 20 20 20 20 73 65 74 20 74 72 20 5b 24 63 .. set tr [$c
1380: 73 65 74 20 74 69 6d 65 72 61 6e 67 65 5d 0a 09 set timerange]..
1390: 20 20 20 20 24 64 67 20 6e 6f 64 65 20 69 6e 73 $dg node ins
13a0: 65 72 74 20 24 63 73 65 74 0a 09 20 20 20 20 24 ert $cset.. $
13b0: 64 67 20 6e 6f 64 65 20 73 65 74 20 20 20 20 24 dg node set $
13c0: 63 73 65 74 20 74 69 6d 65 72 61 6e 67 65 20 24 cset timerange $
13d0: 74 72 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 65 tr.. $dg node
13e0: 20 73 65 74 20 20 20 20 24 63 73 65 74 20 6c 61 set $cset la
13f0: 62 65 6c 20 20 20 20 20 22 5b 24 63 73 65 74 20 bel "[$cset
1400: 73 74 72 5d 5c 5c 6e 5b 6a 6f 69 6e 20 5b 73 74 str]\\n[join [st
1410: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 ruct::list map $
1420: 74 72 20 7b 3a 3a 63 6c 6f 63 6b 20 66 6f 72 6d tr {::clock form
1430: 61 74 7d 5d 20 22 5c 5c 6e 22 5d 22 0a 09 20 20 at}] "\\n"]"..
1440: 20 20 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20 $dg node set
1450: 20 20 24 63 73 65 74 20 5f 5f 69 64 5f 5f 20 20 $cset __id__
1460: 20 20 5b 24 63 73 65 74 20 69 64 5d 0a 09 20 20 [$cset id]..
1470: 20 20 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20 $dg node set
1480: 20 20 24 63 73 65 74 20 73 68 61 70 65 20 20 20 $cset shape
1490: 20 20 5b 65 78 70 72 20 7b 5b 24 63 73 65 74 20 [expr {[$cset
14a0: 62 79 73 79 6d 62 6f 6c 5d 0a 09 09 09 09 09 09 bysymbol].......
14b0: 20 20 20 3f 20 22 65 6c 6c 69 70 73 65 22 0a 09 ? "ellipse"..
14c0: 09 09 09 09 09 20 20 20 3a 20 22 62 6f 78 22 7d ..... : "box"}
14d0: 5d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6c 6f 67 7d ]..}...if {$log}
14e0: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 {.. log writ
14f0: 65 20 33 20 63 79 63 6c 65 62 72 65 61 6b 65 72 e 3 cyclebreaker
1500: 20 22 48 61 73 20 5b 6e 73 70 20 5b 6c 6c 65 6e "Has [nsp [llen
1510: 67 74 68 20 24 63 68 61 6e 67 65 73 65 74 73 5d gth $changesets]
1520: 20 63 68 61 6e 67 65 73 65 74 5d 22 0a 09 7d 0a changeset]"..}.
1530: 0a 09 23 20 32 2e 20 46 69 6e 64 20 66 6f 72 20 ..# 2. Find for
1540: 61 6c 6c 20 72 65 6c 65 76 61 6e 74 20 63 68 61 all relevant cha
1550: 6e 67 65 73 65 74 20 74 68 65 69 72 20 72 65 76 ngeset their rev
1560: 69 73 69 6f 6e 73 20 61 6e 64 20 74 68 65 69 72 isions and their
1570: 0a 09 23 20 20 20 20 64 65 70 65 6e 64 65 6e 63 ..# dependenc
1580: 69 65 73 2e 20 4d 61 70 20 74 68 65 20 6c 61 74 ies. Map the lat
1590: 74 65 72 20 62 61 63 6b 20 74 6f 20 63 68 61 6e ter back to chan
15a0: 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 20 20 gesets and..#
15b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 construct the c
15c0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 72 63 orresponding arc
15d0: 73 2e 0a 0a 09 66 6f 72 65 61 63 68 20 63 73 65 s....foreach cse
15e0: 74 20 24 63 68 61 6e 67 65 73 65 74 73 20 7b 0a t $changesets {.
15f0: 09 20 20 20 20 66 6f 72 65 61 63 68 20 73 75 63 . foreach suc
1600: 63 20 5b 24 63 73 65 74 20 73 75 63 63 65 73 73 c [$cset success
1610: 6f 72 73 5d 20 7b 0a 09 09 23 20 43 68 61 6e 67 ors] {...# Chang
1620: 65 73 65 74 73 20 6d 61 79 20 68 61 76 65 20 64 esets may have d
1630: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 75 74 73 ependencies outs
1640: 69 64 65 20 6f 66 20 74 68 65 0a 09 09 23 20 63 ide of the...# c
1650: 68 6f 73 65 6e 20 73 65 74 2e 20 54 68 65 73 65 hosen set. These
1660: 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 09 09 69 are ignored...i
1670: 66 20 7b 21 5b 24 64 67 20 6e 6f 64 65 20 65 78 f {![$dg node ex
1680: 69 73 74 73 20 24 73 75 63 63 5d 7d 20 63 6f 6e ists $succ]} con
1690: 74 69 6e 75 65 0a 09 09 24 64 67 20 61 72 63 20 tinue...$dg arc
16a0: 69 6e 73 65 72 74 20 24 63 73 65 74 20 24 73 75 insert $cset $su
16b0: 63 63 0a 0a 09 09 23 20 43 68 65 63 6b 20 66 6f cc....# Check fo
16c0: 72 20 63 68 61 6e 67 65 73 65 74 73 20 72 65 66 r changesets ref
16d0: 65 72 65 6e 63 69 6e 67 20 74 68 65 6d 73 65 6c erencing themsel
16e0: 76 65 73 2e 20 53 75 63 68 20 61 0a 09 09 23 20 ves. Such a...#
16f0: 6c 6f 6f 70 20 73 68 6f 77 73 20 74 68 61 74 20 loop shows that
1700: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 6e the changeset in
1710: 20 71 75 65 73 74 69 6f 6e 20 68 61 73 0a 09 09 question has...
1720: 23 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e # internal depen
1730: 64 65 6e 63 69 65 73 2e 20 53 6f 6d 65 74 68 69 dencies. Somethi
1740: 6e 67 20 77 68 69 63 68 20 69 73 20 73 75 70 70 ng which is supp
1750: 6f 73 65 64 0a 09 09 23 20 74 6f 20 62 65 20 6e osed...# to be n
1760: 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 61 73 20 ot possible, as
1770: 70 61 73 73 20 35 20 28 49 6e 69 74 43 73 65 74 pass 5 (InitCset
1780: 73 29 20 74 61 6b 65 73 20 63 61 72 65 0a 09 09 s) takes care...
1790: 23 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 69 # to transform i
17a0: 6e 74 65 72 6e 61 6c 20 69 6e 74 6f 20 65 78 74 nternal into ext
17b0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 ernal dependenci
17c0: 65 73 20 62 79 0a 09 09 23 20 62 72 65 61 6b 69 es by...# breaki
17d0: 6e 67 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 ng the relevant
17e0: 63 68 61 6e 67 65 73 65 74 73 20 61 70 61 72 74 changesets apart
17f0: 2e 20 53 6f 20 68 61 76 69 6e 67 0a 09 09 23 20 . So having...#
1800: 6f 6e 65 20 69 6e 64 69 63 61 74 65 73 20 62 69 one indicates bi
1810: 67 20 74 72 6f 75 62 6c 65 20 69 6e 20 70 61 73 g trouble in pas
1820: 73 20 35 2e 20 57 65 20 72 65 70 6f 72 74 20 74 s 5. We report t
1830: 68 65 6d 0a 09 09 23 20 61 6e 64 20 64 75 6d 70 hem...# and dump
1840: 20 69 6e 74 65 72 6e 61 6c 20 73 74 72 75 63 74 internal struct
1850: 75 72 65 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 ures to make it
1860: 65 61 73 69 65 72 20 74 6f 0a 09 09 23 20 74 72 easier to...# tr
1870: 61 63 65 20 74 68 65 20 6c 69 6e 6b 73 20 63 61 ace the links ca
1880: 75 73 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 using the proble
1890: 6d 2e 0a 09 09 69 66 20 7b 24 73 75 63 63 20 65 m....if {$succ e
18a0: 71 20 24 63 73 65 74 7d 20 7b 0a 09 09 20 20 20 q $cset} {...
18b0: 20 74 72 6f 75 62 6c 65 20 66 61 74 61 6c 20 22 trouble fatal "
18c0: 53 65 6c 66 2d 72 65 66 65 72 65 6e 63 69 6e 67 Self-referencing
18d0: 20 63 68 61 6e 67 65 73 65 74 20 5b 24 63 73 65 changeset [$cse
18e0: 74 20 73 74 72 5d 22 0a 09 09 20 20 20 20 6c 6f t str]"... lo
18f0: 67 20 77 72 69 74 65 20 32 20 63 79 63 6c 65 62 g write 2 cycleb
1900: 72 65 61 6b 65 72 20 22 4c 4f 4f 50 20 63 68 61 reaker "LOOP cha
1910: 6e 67 65 73 65 74 20 5b 24 63 73 65 74 20 73 74 ngeset [$cset st
1920: 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f r] _____________
1930: 5f 5f 5f 5f 5f 22 0a 09 09 20 20 20 20 61 72 72 _____"... arr
1940: 61 79 20 73 65 74 20 6e 6d 61 70 20 5b 24 63 73 ay set nmap [$cs
1950: 65 74 20 6e 65 78 74 6d 61 70 5d 0a 09 09 20 20 et nextmap]...
1960: 20 20 66 6f 72 65 61 63 68 20 72 20 5b 6c 73 6f foreach r [lso
1970: 72 74 20 2d 64 69 63 74 20 5b 61 72 72 61 79 20 rt -dict [array
1980: 6e 61 6d 65 73 20 6e 6d 61 70 5d 5d 20 7b 0a 09 names nmap]] {..
1990: 09 09 66 6f 72 65 61 63 68 20 73 75 63 63 72 65 ..foreach succre
19a0: 76 20 24 6e 6d 61 70 28 24 72 29 20 7b 0a 09 09 v $nmap($r) {...
19b0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 32 . log write 2
19c0: 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 5c 0a cyclebreaker \.
19d0: 09 09 09 09 22 4c 4f 4f 50 20 2a 20 72 65 76 20 ...."LOOP * rev
19e0: 3c 24 72 3e 20 2d 2d 3e 20 72 65 76 20 3c 24 73 <$r> --> rev <$s
19f0: 75 63 63 72 65 76 3e 20 2d 2d 3e 20 63 73 20 5b uccrev> --> cs [
1a00: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 73 74 72 project::rev str
1a10: 20 5b 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 6f [project::rev o
1a20: 66 69 74 65 6d 20 24 73 75 63 63 72 65 76 5d 5d fitem $succrev]]
1a30: 22 0a 09 09 09 7d 0a 09 09 20 20 20 20 7d 0a 09 "....}... }..
1a40: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 .}.. }..}...i
1a50: 66 20 7b 24 6c 6f 67 7d 20 7b 0a 09 20 20 20 20 f {$log} {..
1a60: 6c 6f 67 20 77 72 69 74 65 20 33 20 63 79 63 6c log write 3 cycl
1a70: 65 62 72 65 61 6b 65 72 20 22 48 61 73 20 5b 6e ebreaker "Has [n
1a80: 73 70 20 5b 6c 6c 65 6e 67 74 68 20 5b 24 64 67 sp [llength [$dg
1a90: 20 61 72 63 73 5d 5d 20 64 65 70 65 6e 64 65 6e arcs]] dependen
1aa0: 63 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d cy dependencies]
1ab0: 22 0a 09 7d 0a 0a 09 23 20 52 75 6e 20 74 68 65 "..}...# Run the
1ac0: 20 75 73 65 72 20 68 6f 6f 6b 20 74 6f 20 6d 61 user hook to ma
1ad0: 6e 69 70 75 6c 61 74 65 20 74 68 65 20 67 72 61 nipulate the gra
1ae0: 70 68 20 62 65 66 6f 72 65 0a 09 23 20 63 6f 6e ph before..# con
1af0: 73 75 6d 6d 61 74 69 6f 6e 2e 0a 0a 09 69 66 20 summation....if
1b00: 7b 24 6c 6f 67 7d 20 7b 20 4d 61 72 6b 20 24 64 {$log} { Mark $d
1b10: 67 20 2d 73 74 61 72 74 20 7d 0a 09 4d 61 72 6b g -start }..Mark
1b20: 57 61 74 63 68 20 24 64 67 0a 09 50 72 65 48 6f Watch $dg..PreHo
1b30: 6f 6b 20 20 20 24 64 67 0a 09 4d 61 72 6b 57 61 ok $dg..MarkWa
1b40: 74 63 68 20 24 64 67 0a 0a 09 23 20 54 68 69 73 tch $dg...# This
1b50: 20 6b 69 6c 6c 73 20 74 68 65 20 61 70 70 6c 69 kills the appli
1b60: 63 61 74 69 6f 6e 20 69 66 20 6c 6f 6f 70 73 20 cation if loops
1b70: 28 73 65 65 20 61 62 6f 76 65 29 20 77 65 72 65 (see above) were
1b80: 20 66 6f 75 6e 64 2e 0a 09 74 72 6f 75 62 6c 65 found...trouble
1b90: 20 61 62 6f 72 74 3f 0a 09 72 65 74 75 72 6e 20 abort?..return
1ba0: 20 24 64 67 0a 20 20 20 20 7d 0a 0a 20 20 20 20 $dg. }..
1bb0: 23 20 49 6e 73 74 65 61 64 20 6f 66 20 73 65 61 # Instead of sea
1bc0: 72 63 68 69 6e 67 20 74 68 65 20 77 68 6f 6c 65 rching the whole
1bd0: 20 67 72 61 70 68 20 66 6f 72 20 74 68 65 20 64 graph for the d
1be0: 65 67 72 65 65 2d 30 20 6e 6f 64 65 73 20 69 6e egree-0 nodes in
1bf0: 0a 20 20 20 20 23 20 65 61 63 68 20 69 74 65 72 . # each iter
1c00: 61 74 69 6f 6e 20 77 65 20 63 6f 6d 70 75 74 65 ation we compute
1c10: 20 74 68 65 20 6c 69 73 74 20 6f 6e 63 65 20 74 the list once t
1c20: 6f 20 73 74 61 72 74 2c 20 61 6e 64 20 74 68 65 o start, and the
1c30: 6e 20 6f 6e 6c 79 0a 20 20 20 20 23 20 75 70 64 n only. # upd
1c40: 61 74 65 20 69 74 20 69 6e 63 72 65 6d 65 6e 74 ate it increment
1c50: 61 6c 6c 79 20 62 61 73 65 64 20 6f 6e 20 74 68 ally based on th
1c60: 65 20 6f 75 74 67 6f 69 6e 67 20 6e 65 69 67 68 e outgoing neigh
1c70: 62 6f 75 72 73 20 6f 66 20 74 68 65 0a 20 20 20 bours of the.
1c80: 20 23 20 6e 6f 64 65 20 63 68 6f 73 65 6e 20 66 # node chosen f
1c90: 6f 72 20 63 6f 6d 6d 69 74 2e 0a 0a 20 20 20 20 or commit...
1ca0: 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 43 proc InitializeC
1cb0: 61 6e 64 69 64 61 74 65 73 20 7b 64 67 7d 20 7b andidates {dg} {
1cc0: 0a 09 23 20 62 6f 74 74 6f 6d 20 3d 20 6c 69 73 ..# bottom = lis
1cd0: 74 20 28 6c 69 73 74 20 28 6e 6f 64 65 2c 20 72 t (list (node, r
1ce0: 61 6e 67 65 20 6d 69 6e 2c 20 72 61 6e 67 65 20 ange min, range
1cf0: 6d 61 78 29 29 0a 09 3a 3a 76 61 72 69 61 62 6c max))..::variabl
1d00: 65 20 6d 79 62 6f 74 74 6f 6d 0a 09 66 6f 72 65 e mybottom..fore
1d10: 61 63 68 20 6e 20 5b 24 64 67 20 6e 6f 64 65 73 ach n [$dg nodes
1d20: 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 24 64 ] {.. if {[$d
1d30: 67 20 6e 6f 64 65 20 64 65 67 72 65 65 20 2d 69 g node degree -i
1d40: 6e 20 24 6e 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a n $n]} continue.
1d50: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 79 62 . lappend myb
1d60: 6f 74 74 6f 6d 20 5b 6c 69 6e 73 65 72 74 20 5b ottom [linsert [
1d70: 24 64 67 20 6e 6f 64 65 20 67 65 74 20 24 6e 20 $dg node get $n
1d80: 74 69 6d 65 72 61 6e 67 65 5d 20 30 20 24 6e 5d timerange] 0 $n]
1d90: 0a 09 7d 0a 09 53 63 68 65 64 75 6c 65 43 61 6e ..}..ScheduleCan
1da0: 64 69 64 61 74 65 73 0a 09 53 68 6f 77 50 65 6e didates..ShowPen
1db0: 64 69 6e 67 4e 6f 64 65 73 0a 09 72 65 74 75 72 dingNodes..retur
1dc0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f n. }.. pro
1dd0: 63 20 57 69 74 68 6f 75 74 50 72 65 64 65 63 65 c WithoutPredece
1de0: 73 73 6f 72 20 7b 64 67 20 6e 76 7d 20 7b 0a 09 ssor {dg nv} {..
1df0: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 6f 74 ::variable mybot
1e00: 74 6f 6d 0a 0a 09 75 70 76 61 72 20 31 20 24 6e tom...upvar 1 $n
1e10: 76 20 6e 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 v n..if {![lleng
1e20: 74 68 20 24 6d 79 62 6f 74 74 6f 6d 5d 7d 20 7b th $mybottom]} {
1e30: 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 09 73 65 return 0 }...se
1e40: 74 20 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c 69 6e t n [lindex [lin
1e50: 64 65 78 20 24 6d 79 62 6f 74 74 6f 6d 20 30 5d dex $mybottom 0]
1e60: 20 30 5d 0a 09 73 65 74 20 6d 79 62 6f 74 74 6f 0]..set mybotto
1e70: 6d 20 5b 6c 72 61 6e 67 65 20 24 6d 79 62 6f 74 m [lrange $mybot
1e80: 74 6f 6d 20 31 20 65 6e 64 5d 0a 09 73 65 74 20 tom 1 end]..set
1e90: 63 68 61 6e 67 65 64 20 30 0a 0a 09 23 20 55 70 changed 0...# Up
1ea0: 64 61 74 65 20 6c 69 73 74 20 6f 66 20 6e 6f 64 date list of nod
1eb0: 65 73 20 77 69 74 68 6f 75 74 20 70 72 65 64 65 es without prede
1ec0: 63 65 73 73 6f 72 2c 20 62 61 73 65 64 20 6f 6e cessor, based on
1ed0: 20 74 68 65 0a 09 23 20 6f 75 74 67 6f 69 6e 67 the..# outgoing
1ee0: 20 6e 65 69 67 68 62 6f 75 72 73 20 6f 66 20 74 neighbours of t
1ef0: 68 65 20 63 68 6f 73 65 6e 20 6e 6f 64 65 2e 20 he chosen node.
1f00: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 09 This should be..
1f10: 23 20 66 61 73 74 65 72 20 74 68 61 6e 20 69 74 # faster than it
1f20: 65 72 61 74 69 6e 67 20 6f 66 20 74 68 65 20 77 erating of the w
1f30: 68 6f 6c 65 20 73 65 74 20 6f 66 20 6e 6f 64 65 hole set of node
1f40: 73 2c 20 66 69 6e 64 69 6e 67 20 61 6c 6c 0a 09 s, finding all..
1f50: 23 20 77 69 74 68 6f 75 74 20 70 72 65 64 65 63 # without predec
1f60: 65 73 73 6f 72 73 2c 20 73 6f 72 74 69 6e 67 20 essors, sorting
1f70: 74 68 65 6d 20 62 79 20 74 69 6d 65 2c 20 65 74 them by time, et
1f80: 63 2e 20 70 70 2e 0a 09 66 6f 72 65 61 63 68 20 c. pp...foreach
1f90: 6f 75 74 20 5b 24 64 67 20 6e 6f 64 65 73 20 2d out [$dg nodes -
1fa0: 6f 75 74 20 24 6e 5d 20 7b 0a 09 20 20 20 20 69 out $n] {.. i
1fb0: 66 20 7b 5b 24 64 67 20 6e 6f 64 65 20 64 65 67 f {[$dg node deg
1fc0: 72 65 65 20 2d 69 6e 20 24 6f 75 74 5d 20 3e 20 ree -in $out] >
1fd0: 31 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 1} continue..
1fe0: 20 23 20 44 65 67 72 65 65 2d 31 20 6e 65 69 67 # Degree-1 neig
1ff0: 68 62 6f 75 72 2c 20 77 69 6c 6c 20 68 61 76 65 hbour, will have
2000: 20 6e 6f 20 70 72 65 64 65 63 65 73 73 6f 72 73 no predecessors
2010: 20 61 66 74 65 72 20 74 68 65 0a 09 20 20 20 20 after the..
2020: 23 20 72 65 6d 6f 76 61 6c 20 6f 66 20 6e 2e 20 # removal of n.
2030: 50 75 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e Put on the list.
2040: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 79 .. lappend my
2050: 62 6f 74 74 6f 6d 20 5b 6c 69 6e 73 65 72 74 20 bottom [linsert
2060: 5b 24 64 67 20 6e 6f 64 65 20 67 65 74 20 24 6f [$dg node get $o
2070: 75 74 20 74 69 6d 65 72 61 6e 67 65 5d 20 30 20 ut timerange] 0
2080: 24 6f 75 74 5d 0a 09 20 20 20 20 73 65 74 20 63 $out].. set c
2090: 68 61 6e 67 65 64 20 31 0a 09 7d 0a 09 69 66 20 hanged 1..}..if
20a0: 7b 24 63 68 61 6e 67 65 64 7d 20 7b 0a 09 20 20 {$changed} {..
20b0: 20 20 53 63 68 65 64 75 6c 65 43 61 6e 64 69 64 ScheduleCandid
20c0: 61 74 65 73 0a 09 7d 0a 0a 09 23 20 57 65 20 64 ates..}...# We d
20d0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 o not delete the
20e0: 20 6e 6f 64 65 20 69 6d 6d 65 64 69 61 74 65 6c node immediatel
20f0: 79 2c 20 74 6f 20 61 6c 6c 6f 77 20 74 68 65 20 y, to allow the
2100: 53 61 76 65 0a 09 23 20 70 72 6f 63 65 64 75 72 Save..# procedur
2110: 65 20 74 6f 20 73 61 76 65 20 74 68 65 20 64 65 e to save the de
2120: 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 pendencies as we
2130: 6c 6c 20 28 65 6e 63 6f 64 65 64 20 69 6e 20 74 ll (encoded in t
2140: 68 65 0a 09 23 20 61 72 63 73 29 2e 0a 09 72 65 he..# arcs)...re
2150: 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 turn 1. }..
2160: 20 20 70 72 6f 63 20 53 63 68 65 64 75 6c 65 43 proc ScheduleC
2170: 61 6e 64 69 64 61 74 65 73 20 7b 7d 20 7b 0a 09 andidates {} {..
2180: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 6f 74 ::variable mybot
2190: 74 6f 6d 0a 09 23 20 53 6f 72 74 20 62 79 20 63 tom..# Sort by c
21a0: 73 65 74 20 6f 62 6a 65 63 74 20 6e 61 6d 65 2c set object name,
21b0: 20 6c 6f 77 65 72 20 62 6f 72 64 65 72 20 6f 66 lower border of
21c0: 20 74 69 6d 65 72 61 6e 67 65 2c 20 61 74 20 6c timerange, at l
21d0: 61 73 74 0a 09 23 20 62 79 20 74 68 65 20 75 70 ast..# by the up
21e0: 70 65 72 20 62 6f 72 64 65 72 2e 0a 09 73 65 74 per border...set
21f0: 20 6d 79 62 6f 74 74 6f 6d 20 5b 6c 73 6f 72 74 mybottom [lsort
2200: 20 2d 69 6e 64 65 78 20 32 20 2d 69 6e 74 65 67 -index 2 -integ
2210: 65 72 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 er [lsort -index
2220: 20 31 20 2d 69 6e 74 65 67 65 72 20 5b 6c 73 6f 1 -integer [lso
2230: 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 64 69 63 rt -index 0 -dic
2240: 74 20 24 6d 79 62 6f 74 74 6f 6d 5d 5d 5d 0a 09 t $mybottom]]]..
2250: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
2260: 20 20 70 72 6f 63 20 53 68 6f 77 50 65 6e 64 69 proc ShowPendi
2270: 6e 67 4e 6f 64 65 73 20 7b 7d 20 7b 0a 09 69 66 ngNodes {} {..if
2280: 20 7b 5b 6c 6f 67 20 76 65 72 62 6f 73 69 74 79 {[log verbosity
2290: 3f 5d 20 3c 20 31 30 7d 20 72 65 74 75 72 6e 0a ?] < 10} return.
22a0: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 6f .::variable mybo
22b0: 74 74 6f 6d 0a 09 6c 6f 67 20 77 72 69 74 65 20 ttom..log write
22c0: 31 30 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 10 cyclebreaker
22d0: 22 50 65 6e 64 69 6e 67 2e 2e 2e 2e 2e 2e 2e 2e "Pending........
22e0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
22f0: 2e 2e 2e 2e 2e 2e 2e 22 0a 09 66 6f 72 65 61 63 ......."..foreac
2300: 68 20 69 74 65 6d 20 5b 73 74 72 75 63 74 3a 3a h item [struct::
2310: 6c 69 73 74 20 6d 61 70 20 24 6d 79 62 6f 74 74 list map $mybott
2320: 6f 6d 20 5b 6d 79 70 72 6f 63 20 46 6f 72 6d 61 om [myproc Forma
2330: 74 50 65 6e 64 69 6e 67 49 74 65 6d 5d 5d 20 7b tPendingItem]] {
2340: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 .. log write
2350: 31 30 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 10 cyclebreaker
2360: 22 50 65 6e 64 69 6e 67 3a 20 20 20 20 20 24 69 "Pending: $i
2370: 74 65 6d 22 0a 09 7d 0a 09 72 65 74 75 72 6e 0a tem"..}..return.
2380: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
2390: 46 6f 72 6d 61 74 50 65 6e 64 69 6e 67 49 74 65 FormatPendingIte
23a0: 6d 20 7b 69 74 65 6d 7d 20 7b 0a 09 6a 6f 69 6e m {item} {..join
23b0: 20 5b 6c 69 73 74 20 5b 5b 6c 69 6e 64 65 78 20 [list [[lindex
23c0: 24 69 74 65 6d 20 30 5d 20 73 74 72 5d 20 5b 63 $item 0] str] [c
23d0: 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 6c 69 6e lock format [lin
23e0: 64 65 78 20 24 69 74 65 6d 20 31 5d 5d 20 5b 63 dex $item 1]] [c
23f0: 6c 6f 63 6b 20 66 6f 72 6d 61 74 20 5b 6c 69 6e lock format [lin
2400: 64 65 78 20 24 69 74 65 6d 20 32 5d 5d 5d 0a 20 dex $item 2]]].
2410: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 }.. proc F
2420: 69 6e 64 43 79 63 6c 65 20 7b 64 67 7d 20 7b 0a indCycle {dg} {.
2430: 09 23 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 .# This procedur
2440: 65 20 69 73 20 72 75 6e 20 69 66 20 61 6e 64 20 e is run if and
2450: 6f 6e 6c 79 20 74 68 65 20 67 72 61 70 68 20 69 only the graph i
2460: 73 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 0a s not empty and.
2470: 09 23 20 61 6c 6c 20 6e 6f 64 65 73 20 68 61 76 .# all nodes hav
2480: 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 2e 20 e predecessors.
2490: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 This means that
24a0: 65 61 63 68 20 6e 6f 64 65 20 69 73 0a 09 23 20 each node is..#
24b0: 65 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 61 either part of a
24c0: 20 63 79 63 6c 65 20 6f 72 20 28 69 6e 64 69 72 cycle or (indir
24d0: 65 63 74 6c 79 29 20 64 65 70 65 6e 64 69 6e 67 ectly) depending
24e0: 20 6f 6e 20 61 20 6e 6f 64 65 0a 09 23 20 69 6e on a node..# in
24f0: 20 61 20 63 79 63 6c 65 2e 20 57 65 20 63 61 6e a cycle. We can
2500: 20 73 74 61 72 74 20 61 74 20 61 6e 20 61 72 62 start at an arb
2510: 69 74 72 61 72 79 20 6e 6f 64 65 2c 20 66 6f 6c itrary node, fol
2520: 6c 6f 77 20 69 74 73 0a 09 23 20 69 6e 63 6f 6d low its..# incom
2530: 69 6e 67 20 65 64 67 65 73 20 74 6f 20 69 74 73 ing edges to its
2540: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 75 6e predecessors un
2550: 74 69 6c 20 77 65 20 73 65 65 20 61 20 6e 6f 64 til we see a nod
2560: 65 20 61 0a 09 23 20 73 65 63 6f 6e 64 20 74 69 e a..# second ti
2570: 6d 65 2e 20 54 68 61 74 20 6e 6f 64 65 20 63 6c me. That node cl
2580: 6f 73 65 73 20 74 68 65 20 63 79 63 6c 65 20 61 oses the cycle a
2590: 6e 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 nd the beginning
25a0: 20 69 73 0a 09 23 20 69 74 73 20 66 69 72 73 74 is..# its first
25b0: 20 6f 63 63 75 72 65 6e 63 65 2e 20 4e 6f 74 65 occurence. Note
25c0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 6f that we can cho
25d0: 6f 73 65 20 61 6e 20 61 72 62 69 74 72 61 72 79 ose an arbitrary
25e0: 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f 72 20 ..# predecessor
25f0: 6f 66 20 65 61 63 68 20 6e 6f 64 65 20 61 73 20 of each node as
2600: 77 65 6c 6c 2c 20 77 65 20 64 6f 20 6e 6f 74 20 well, we do not
2610: 68 61 76 65 20 74 6f 20 73 65 61 72 63 68 2e 0a have to search..
2620: 0a 09 23 20 57 65 20 72 65 63 6f 72 64 20 66 6f ..# We record fo
2630: 72 20 65 61 63 68 20 6e 6f 64 65 20 74 68 65 20 r each node the
2640: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 index of the fir
2650: 73 74 20 61 70 70 65 61 72 61 6e 63 65 20 69 6e st appearance in
2660: 0a 09 23 20 74 68 65 20 70 61 74 68 2c 20 6d 61 ..# the path, ma
2670: 6b 69 6e 67 20 69 74 20 65 61 73 79 20 61 74 20 king it easy at
2680: 74 68 65 20 65 6e 64 20 74 6f 20 63 75 74 20 74 the end to cut t
2690: 68 65 20 63 79 63 6c 65 20 66 72 6f 6d 0a 09 23 he cycle from..#
26a0: 20 69 74 2e 0a 0a 09 23 20 43 68 6f 6f 73 65 20 it....# Choose
26b0: 61 72 62 69 74 72 61 72 79 20 6e 6f 64 65 20 74 arbitrary node t
26c0: 6f 20 73 74 61 72 74 20 6f 75 72 20 73 65 61 72 o start our sear
26d0: 63 68 20 61 74 2e 0a 09 73 65 74 20 73 74 61 72 ch at...set star
26e0: 74 20 5b 6c 69 6e 64 65 78 20 5b 24 64 67 20 6e t [lindex [$dg n
26f0: 6f 64 65 73 5d 20 30 5d 0a 0a 09 23 20 49 6e 69 odes] 0]...# Ini
2700: 74 69 61 6c 69 7a 65 20 73 74 61 74 65 2c 20 70 tialize state, p
2710: 61 74 68 20 6f 66 20 73 65 65 6e 20 6e 6f 64 65 ath of seen node
2720: 73 2c 20 61 6e 64 20 77 68 65 6e 20 73 65 65 6e s, and when seen
2730: 2e 0a 09 73 65 74 20 20 20 20 20 20 20 70 61 74 ...set pat
2740: 68 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 h {}..array set
2750: 73 65 65 6e 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 seen {}...while
2760: 7b 31 7d 20 7b 0a 09 20 20 20 20 23 20 53 74 6f {1} {.. # Sto
2770: 70 20 73 65 61 72 63 68 69 6e 67 20 77 68 65 6e p searching when
2780: 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 74 68 we have seen th
2790: 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 0a 09 e current node..
27a0: 20 20 20 20 23 20 61 6c 72 65 61 64 79 2c 20 74 # already, t
27b0: 68 65 20 63 69 72 63 6c 65 20 68 61 73 20 62 65 he circle has be
27c0: 65 6e 20 63 6c 6f 73 65 64 2e 0a 09 20 20 20 20 en closed...
27d0: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 if {[info exists
27e0: 20 73 65 65 6e 28 24 73 74 61 72 74 29 5d 7d 20 seen($start)]}
27f0: 62 72 65 61 6b 0a 09 20 20 20 20 6c 61 70 70 65 break.. lappe
2800: 6e 64 20 70 61 74 68 20 24 73 74 61 72 74 0a 09 nd path $start..
2810: 20 20 20 20 73 65 74 20 73 65 65 6e 28 24 73 74 set seen($st
2820: 61 72 74 29 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 art) [expr {[lle
2830: 6e 67 74 68 20 24 70 61 74 68 5d 2d 31 7d 5d 0a ngth $path]-1}].
2840: 09 20 20 20 20 23 20 43 68 6f 6f 73 65 20 61 72 . # Choose ar
2850: 62 69 74 72 61 72 79 20 70 72 65 64 65 63 65 73 bitrary predeces
2860: 73 6f 72 0a 09 20 20 20 20 73 65 74 20 73 74 61 sor.. set sta
2870: 72 74 20 5b 6c 69 6e 64 65 78 20 5b 24 64 67 20 rt [lindex [$dg
2880: 6e 6f 64 65 73 20 2d 69 6e 20 24 73 74 61 72 74 nodes -in $start
2890: 5d 20 30 5d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e ] 0]..}...return
28a0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 72 [struct::list r
28b0: 65 76 65 72 73 65 20 5b 6c 72 61 6e 67 65 20 24 everse [lrange $
28c0: 70 61 74 68 20 24 73 65 65 6e 28 24 73 74 61 72 path $seen($star
28d0: 74 29 20 65 6e 64 5d 5d 0a 20 20 20 20 7d 0a 0a t) end]]. }..
28e0: 20 20 20 20 70 72 6f 63 20 42 72 65 61 6b 53 65 proc BreakSe
28f0: 67 6d 65 6e 74 20 7b 64 67 20 70 61 74 68 20 6c gment {dg path l
2900: 61 62 65 6c 7d 20 7b 0a 09 23 20 54 68 65 20 70 abel} {..# The p
2910: 61 74 68 2c 20 75 73 75 61 6c 6c 79 20 61 20 63 ath, usually a c
2920: 79 63 6c 65 2c 20 77 65 20 68 61 76 65 20 67 6f ycle, we have go
2930: 74 74 65 6e 20 69 73 20 62 72 6f 6b 65 6e 20 62 tten is broken b
2940: 79 0a 09 23 20 62 72 65 61 6b 69 6e 67 20 61 70 y..# breaking ap
2950: 61 72 74 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 art one or more
2960: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 of the changeset
2970: 73 20 69 6e 20 74 68 65 0a 09 23 20 63 79 63 6c s in the..# cycl
2980: 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 75 e. This causes u
2990: 73 20 74 6f 20 63 72 65 61 74 65 20 6f 6e 65 20 s to create one
29a0: 6f 72 20 6d 6f 72 65 20 63 68 61 6e 67 65 73 65 or more changese
29b0: 74 73 20 77 68 69 63 68 0a 09 23 20 61 72 65 20 ts which..# are
29c0: 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2c to be committed,
29d0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 72 added to the gr
29e0: 61 70 68 2c 20 65 74 63 2e 20 70 70 2e 0a 0a 09 aph, etc. pp....
29f0: 73 65 74 20 62 65 73 74 6c 69 6e 6b 20 7b 7d 0a set bestlink {}.
2a00: 09 73 65 74 20 62 65 73 74 6e 6f 64 65 20 7b 7d .set bestnode {}
2a10: 0a 0a 09 66 6f 72 65 61 63 68 20 5c 0a 09 20 20 ...foreach \..
2a20: 20 20 70 72 65 76 20 5b 6c 72 61 6e 67 65 20 24 prev [lrange $
2a30: 70 61 74 68 20 30 20 65 6e 64 2d 32 5d 20 5c 0a path 0 end-2] \.
2a40: 09 20 20 20 20 63 73 65 74 20 5b 6c 72 61 6e 67 . cset [lrang
2a50: 65 20 24 70 61 74 68 20 31 20 65 6e 64 2d 31 5d e $path 1 end-1]
2a60: 20 5c 0a 09 20 20 20 20 6e 65 78 74 20 5b 6c 72 \.. next [lr
2a70: 61 6e 67 65 20 24 70 61 74 68 20 32 20 65 6e 64 ange $path 2 end
2a80: 5d 20 7b 0a 0a 09 09 23 20 45 61 63 68 20 74 72 ] {....# Each tr
2a90: 69 70 6c 65 20 50 52 45 56 20 2d 3e 20 43 53 45 iple PREV -> CSE
2aa0: 54 20 2d 3e 20 4e 45 58 54 20 6f 66 20 63 68 61 T -> NEXT of cha
2ab0: 6e 67 65 73 65 74 73 2c 20 61 0a 09 09 23 20 27 ngesets, a...# '
2ac0: 6c 69 6e 6b 27 20 69 6e 20 74 68 65 20 63 79 63 link' in the cyc
2ad0: 6c 65 2c 20 69 73 20 61 6e 61 6c 79 73 65 64 20 le, is analysed
2ae0: 61 6e 64 20 74 68 65 20 62 65 73 74 0a 09 09 23 and the best...#
2af0: 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 20 location where
2b00: 74 6f 20 61 74 20 6c 65 61 73 74 20 77 65 61 6b to at least weak
2b10: 65 6e 20 74 68 65 20 63 79 63 6c 65 20 69 73 0a en the cycle is.
2b20: 09 09 23 20 63 68 6f 73 65 6e 20 66 6f 72 20 66 ..# chosen for f
2b30: 75 72 74 68 65 72 20 70 72 6f 63 65 73 73 69 6e urther processin
2b40: 67 2e 0a 0a 09 09 73 65 74 20 6c 69 6e 6b 20 5b g.....set link [
2b50: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 6c 69 6e 6b project::revlink
2b60: 20 25 41 55 54 4f 25 20 24 70 72 65 76 20 24 63 %AUTO% $prev $c
2b70: 73 65 74 20 24 6e 65 78 74 5d 0a 09 09 69 66 20 set $next]...if
2b80: 7b 24 62 65 73 74 6c 69 6e 6b 20 65 71 20 22 22 {$bestlink eq ""
2b90: 7d 20 7b 0a 09 09 20 20 20 20 73 65 74 20 62 65 } {... set be
2ba0: 73 74 6c 69 6e 6b 20 24 6c 69 6e 6b 0a 09 09 20 stlink $link...
2bb0: 20 20 20 73 65 74 20 62 65 73 74 6e 6f 64 65 20 set bestnode
2bc0: 24 63 73 65 74 0a 09 09 7d 20 65 6c 73 65 69 66 $cset...} elseif
2bd0: 20 7b 5b 24 6c 69 6e 6b 20 62 65 74 74 65 72 74 {[$link bettert
2be0: 68 61 6e 20 24 62 65 73 74 6c 69 6e 6b 5d 7d 20 han $bestlink]}
2bf0: 7b 0a 09 09 20 20 20 20 24 62 65 73 74 6c 69 6e {... $bestlin
2c00: 6b 20 64 65 73 74 72 6f 79 0a 09 09 20 20 20 20 k destroy...
2c10: 73 65 74 20 62 65 73 74 6c 69 6e 6b 20 24 6c 69 set bestlink $li
2c20: 6e 6b 0a 09 09 20 20 20 20 73 65 74 20 62 65 73 nk... set bes
2c30: 74 6e 6f 64 65 20 24 63 73 65 74 0a 09 09 7d 20 tnode $cset...}
2c40: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 24 6c 69 else {... $li
2c50: 6e 6b 20 64 65 73 74 72 6f 79 0a 09 09 7d 0a 09 nk destroy...}..
2c60: 20 20 20 20 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 }...log writ
2c70: 65 20 35 20 63 79 63 6c 65 62 72 65 61 6b 65 72 e 5 cyclebreaker
2c80: 20 22 42 72 65 61 6b 69 6e 67 20 24 6c 61 62 65 "Breaking $labe
2c90: 6c 20 62 79 20 73 70 6c 69 74 74 69 6e 67 20 63 l by splitting c
2ca0: 68 61 6e 67 65 73 65 74 20 5b 24 62 65 73 74 6e hangeset [$bestn
2cb0: 6f 64 65 20 73 74 72 5d 22 0a 09 73 65 74 20 49 ode str]"..set I
2cc0: 44 20 5b 24 62 65 73 74 6e 6f 64 65 20 69 64 5d D [$bestnode id]
2cd0: 0a 09 4d 61 72 6b 20 24 64 67 20 2d 24 7b 49 44 ..Mark $dg -${ID
2ce0: 7d 2d 62 65 66 6f 72 65 0a 0a 09 73 65 74 20 6e }-before...set n
2cf0: 65 77 63 73 65 74 73 20 5b 24 62 65 73 74 6c 69 ewcsets [$bestli
2d00: 6e 6b 20 62 72 65 61 6b 5d 0a 09 24 62 65 73 74 nk break]..$best
2d10: 6c 69 6e 6b 20 64 65 73 74 72 6f 79 0a 0a 20 20 link destroy..
2d20: 20 20 20 20 20 20 23 20 41 74 20 74 68 69 73 20 # At this
2d30: 70 6f 69 6e 74 20 74 68 65 20 6f 6c 64 20 63 68 point the old ch
2d40: 61 6e 67 65 73 65 74 20 28 42 45 53 54 4e 4f 44 angeset (BESTNOD
2d50: 45 29 20 69 73 20 67 6f 6e 65 0a 20 20 20 20 20 E) is gone.
2d60: 20 20 20 23 20 61 6c 72 65 61 64 79 2e 20 57 65 # already. We
2d70: 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 remove it from
2d80: 74 68 65 20 67 72 61 70 68 20 61 73 20 77 65 6c the graph as wel
2d90: 6c 20 61 6e 64 20 74 68 65 6e 20 65 6e 74 65 72 l and then enter
2da0: 0a 20 20 20 20 20 20 20 20 23 20 74 68 65 20 66 . # the f
2db0: 72 61 67 6d 65 6e 74 73 20 67 65 6e 65 72 61 74 ragments generat
2dc0: 65 64 20 66 6f 72 20 69 74 2e 0a 0a 09 52 65 70 ed for it....Rep
2dd0: 6c 61 63 65 20 24 64 67 20 24 62 65 73 74 6e 6f lace $dg $bestno
2de0: 64 65 20 24 6e 65 77 63 73 65 74 73 0a 0a 09 4d de $newcsets...M
2df0: 61 72 6b 20 24 64 67 20 2d 24 7b 49 44 7d 2d 61 ark $dg -${ID}-a
2e00: 66 74 65 72 0a 09 72 65 74 75 72 6e 0a 20 20 20 fter..return.
2e10: 20 7d 0a 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 }.. # TODO:
2e20: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 61 This should be a
2e30: 20 67 72 61 70 68 20 6d 65 74 68 6f 64 2e 0a 20 graph method..
2e40: 20 20 20 70 72 6f 63 20 48 61 73 41 72 63 20 7b proc HasArc {
2e50: 64 67 20 61 20 62 7d 20 7b 0a 09 23 38 2e 35 3a dg a b} {..#8.5:
2e60: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 return [expr {$
2e70: 62 20 69 6e 20 5b 24 64 67 20 6e 6f 64 65 73 20 b in [$dg nodes
2e80: 2d 6f 75 74 20 24 61 5d 7d 5d 0a 09 69 66 20 7b -out $a]}]..if {
2e90: 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 [lsearch -exact
2ea0: 5b 24 64 67 20 6e 6f 64 65 73 20 2d 6f 75 74 20 [$dg nodes -out
2eb0: 24 61 5d 20 24 62 5d 20 3c 20 30 7d 20 7b 20 72 $a] $b] < 0} { r
2ec0: 65 74 75 72 6e 20 30 20 7d 0a 09 72 65 74 75 72 eturn 0 }..retur
2ed0: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 n 1. }.. p
2ee0: 72 6f 63 20 4d 61 72 6b 20 7b 64 67 20 7b 73 75 roc Mark {dg {su
2ef0: 66 66 69 78 20 7b 7d 7d 20 7b 73 75 62 67 72 61 ffix {}} {subgra
2f00: 70 68 20 7b 7d 7d 7d 20 7b 0a 09 3a 3a 76 61 72 ph {}}} {..::var
2f10: 69 61 62 6c 65 20 6d 79 64 6f 74 64 65 73 74 69 iable mydotdesti
2f20: 6e 61 74 69 6f 6e 0a 09 69 66 20 7b 24 6d 79 64 nation..if {$myd
2f30: 6f 74 64 65 73 74 69 6e 61 74 69 6f 6e 20 65 71 otdestination eq
2f40: 20 22 22 7d 20 72 65 74 75 72 6e 0a 09 3a 3a 76 ""} return..::v
2f50: 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 70 72 65 ariable mydotpre
2f60: 66 69 78 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 fix..::variable
2f70: 6d 79 64 6f 74 69 64 0a 09 73 65 74 20 66 6e 61 mydotid..set fna
2f80: 6d 65 20 24 6d 79 64 6f 74 64 65 73 74 69 6e 61 me $mydotdestina
2f90: 74 69 6f 6e 2f 24 7b 6d 79 64 6f 74 70 72 65 66 tion/${mydotpref
2fa0: 69 78 7d 24 7b 6d 79 64 6f 74 69 64 7d 24 7b 73 ix}${mydotid}${s
2fb0: 75 66 66 69 78 7d 2e 64 6f 74 0a 09 66 69 6c 65 uffix}.dot..file
2fc0: 20 6d 6b 64 69 72 20 5b 66 69 6c 65 20 64 69 72 mkdir [file dir
2fd0: 6e 61 6d 65 20 24 66 6e 61 6d 65 5d 0a 09 64 6f name $fname]..do
2fe0: 74 20 77 72 69 74 65 20 24 64 67 20 24 6d 79 64 t write $dg $myd
2ff0: 6f 74 70 72 65 66 69 78 24 73 75 66 66 69 78 20 otprefix$suffix
3000: 24 66 6e 61 6d 65 20 24 73 75 62 67 72 61 70 68 $fname $subgraph
3010: 0a 09 69 6e 63 72 20 6d 79 64 6f 74 69 64 0a 0a ..incr mydotid..
3020: 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 79 63 .log write 5 cyc
3030: 6c 65 62 72 65 61 6b 65 72 20 22 2e 64 6f 74 20 lebreaker ".dot
3040: 65 78 70 6f 72 74 20 24 66 6e 61 6d 65 22 0a 09 export $fname"..
3050: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
3060: 20 20 70 72 6f 63 20 52 65 70 6c 61 63 65 20 7b proc Replace {
3070: 64 67 20 6e 20 72 65 70 6c 61 63 65 6d 65 6e 74 dg n replacement
3080: 73 7d 20 7b 0a 09 23 20 4e 4f 54 45 2e 20 57 65 s} {..# NOTE. We
3090: 20 68 61 76 65 20 74 6f 20 67 65 74 20 74 68 65 have to get the
30a0: 20 6c 69 73 74 20 6f 66 20 69 6e 63 6f 6d 69 6e list of incomin
30b0: 67 20 6e 65 69 67 68 62 6f 75 72 73 20 61 6e 64 g neighbours and
30c0: 0a 09 23 20 72 65 63 6f 6d 70 75 74 65 20 74 68 ..# recompute th
30d0: 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20 61 eir successors a
30e0: 66 74 65 72 20 74 68 65 20 6e 65 77 20 6e 6f 64 fter the new nod
30f0: 65 73 20 68 61 76 65 20 62 65 65 6e 0a 09 23 20 es have been..#
3100: 69 6e 73 65 72 74 65 64 2e 20 54 68 65 69 72 20 inserted. Their
3110: 6f 75 74 67 6f 69 6e 67 20 61 72 63 73 20 77 69 outgoing arcs wi
3120: 6c 6c 20 6e 6f 77 20 67 6f 20 74 6f 20 6f 6e 65 ll now go to one
3130: 20 6f 72 20 62 6f 74 68 20 6f 66 0a 09 23 20 74 or both of..# t
3140: 68 65 20 6e 65 77 20 6e 6f 64 65 73 2c 20 61 6e he new nodes, an
3150: 64 20 6e 6f 74 20 72 65 64 6f 69 6e 67 20 74 68 d not redoing th
3160: 65 6d 20 6d 61 79 20 63 61 75 73 65 20 75 73 20 em may cause us
3170: 74 6f 20 66 6f 72 67 65 74 0a 09 23 20 63 69 72 to forget..# cir
3180: 63 6c 65 73 2c 20 6c 65 61 76 69 6e 67 20 74 68 cles, leaving th
3190: 65 6d 20 69 6e 2c 20 75 6e 62 72 6f 6b 65 6e 2e em in, unbroken.
31a0: 0a 0a 09 73 65 74 20 70 72 65 20 5b 24 64 67 20 ...set pre [$dg
31b0: 6e 6f 64 65 73 20 2d 69 6e 20 24 6e 5d 0a 0a 20 nodes -in $n]..
31c0: 20 20 20 20 20 20 20 24 64 67 20 6e 6f 64 65 20 $dg node
31d0: 64 65 6c 65 74 65 20 24 6e 0a 0a 09 66 6f 72 65 delete $n...fore
31e0: 61 63 68 20 63 73 65 74 20 24 72 65 70 6c 61 63 ach cset $replac
31f0: 65 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 73 65 ements {.. se
3200: 74 20 74 72 20 5b 24 63 73 65 74 20 74 69 6d 65 t tr [$cset time
3210: 72 61 6e 67 65 5d 0a 09 20 20 20 20 24 64 67 20 range].. $dg
3220: 6e 6f 64 65 20 69 6e 73 65 72 74 20 24 63 73 65 node insert $cse
3230: 74 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 65 20 t.. $dg node
3240: 73 65 74 20 20 20 20 24 63 73 65 74 20 74 69 6d set $cset tim
3250: 65 72 61 6e 67 65 20 24 74 72 0a 09 20 20 20 20 erange $tr..
3260: 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20 20 20 $dg node set
3270: 24 63 73 65 74 20 6c 61 62 65 6c 20 20 20 20 20 $cset label
3280: 22 5b 24 63 73 65 74 20 73 74 72 5d 5c 5c 6e 5b "[$cset str]\\n[
3290: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 join [struct::li
32a0: 73 74 20 6d 61 70 20 24 74 72 20 7b 3a 3a 63 6c st map $tr {::cl
32b0: 6f 63 6b 20 66 6f 72 6d 61 74 7d 5d 20 22 5c 5c ock format}] "\\
32c0: 6e 22 5d 22 0a 09 20 20 20 20 24 64 67 20 6e 6f n"]".. $dg no
32d0: 64 65 20 73 65 74 20 20 20 20 24 63 73 65 74 20 de set $cset
32e0: 5f 5f 69 64 5f 5f 20 20 20 20 5b 24 63 73 65 74 __id__ [$cset
32f0: 20 69 64 5d 0a 09 20 20 20 20 24 64 67 20 6e 6f id].. $dg no
3300: 64 65 20 73 65 74 20 20 20 20 24 63 73 65 74 20 de set $cset
3310: 73 68 61 70 65 20 20 20 20 20 5b 65 78 70 72 20 shape [expr
3320: 7b 5b 24 63 73 65 74 20 62 79 73 79 6d 62 6f 6c {[$cset bysymbol
3330: 5d 0a 09 09 09 09 09 09 20 20 20 3f 20 22 65 6c ]....... ? "el
3340: 6c 69 70 73 65 22 0a 09 09 09 09 09 09 20 20 20 lipse".......
3350: 3a 20 22 62 6f 78 22 7d 5d 0a 09 7d 0a 0a 09 66 : "box"}]..}...f
3360: 6f 72 65 61 63 68 20 63 73 65 74 20 24 72 65 70 oreach cset $rep
3370: 6c 61 63 65 6d 65 6e 74 73 20 7b 0a 09 20 20 20 lacements {..
3380: 20 66 6f 72 65 61 63 68 20 73 75 63 63 20 5b 24 foreach succ [$
3390: 63 73 65 74 20 73 75 63 63 65 73 73 6f 72 73 5d cset successors]
33a0: 20 7b 0a 09 09 23 20 54 68 65 20 6e 65 77 20 63 {...# The new c
33b0: 68 61 6e 67 65 73 65 74 73 20 6d 61 79 20 68 61 hangesets may ha
33c0: 76 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 ve dependencies
33d0: 6f 75 74 73 69 64 65 20 6f 66 0a 09 09 23 20 74 outside of...# t
33e0: 68 65 20 63 68 6f 73 65 6e 20 73 65 74 2e 20 54 he chosen set. T
33f0: 68 65 73 65 20 61 72 65 20 69 67 6e 6f 72 65 64 hese are ignored
3400: 0a 09 09 69 66 20 7b 21 5b 24 64 67 20 6e 6f 64 ...if {![$dg nod
3410: 65 20 65 78 69 73 74 73 20 24 73 75 63 63 5d 7d e exists $succ]}
3420: 20 63 6f 6e 74 69 6e 75 65 0a 09 09 24 64 67 20 continue...$dg
3430: 61 72 63 20 69 6e 73 65 72 74 20 24 63 73 65 74 arc insert $cset
3440: 20 24 73 75 63 63 0a 09 09 69 66 20 7b 24 73 75 $succ...if {$su
3450: 63 63 20 65 71 20 24 63 73 65 74 7d 20 7b 0a 09 cc eq $cset} {..
3460: 09 20 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 . trouble int
3470: 65 72 6e 61 6c 20 22 53 65 6c 66 2d 72 65 66 65 ernal "Self-refe
3480: 72 65 6e 63 69 6e 67 20 63 68 61 6e 67 65 73 65 rencing changese
3490: 74 20 5b 24 63 73 65 74 20 73 74 72 5d 22 0a 09 t [$cset str]"..
34a0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f .}.. }..}..fo
34b0: 72 65 61 63 68 20 63 73 65 74 20 24 70 72 65 20 reach cset $pre
34c0: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 73 {.. foreach s
34d0: 75 63 63 20 5b 24 63 73 65 74 20 73 75 63 63 65 ucc [$cset succe
34e0: 73 73 6f 72 73 5d 20 7b 0a 09 09 23 20 4e 6f 74 ssors] {...# Not
34f0: 65 20 74 68 61 74 20 74 68 65 20 61 72 63 20 6d e that the arc m
3500: 61 79 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 ay already exist
3510: 20 69 6e 20 74 68 65 20 67 72 61 70 68 2e 20 49 in the graph. I
3520: 66 0a 09 09 23 20 73 6f 20 69 67 6e 6f 72 65 20 f...# so ignore
3530: 69 74 2e 20 54 68 65 20 6e 65 77 20 63 68 61 6e it. The new chan
3540: 67 65 73 65 74 73 20 6d 61 79 20 68 61 76 65 0a gesets may have.
3550: 09 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ..# dependencies
3560: 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65 20 outside of the
3570: 63 68 6f 73 65 6e 20 73 65 74 2e 20 54 68 65 73 chosen set. Thes
3580: 65 20 61 72 65 0a 09 09 23 20 69 67 6e 6f 72 65 e are...# ignore
3590: 64 0a 09 09 69 66 20 7b 21 5b 24 64 67 20 6e 6f d...if {![$dg no
35a0: 64 65 20 65 78 69 73 74 73 20 24 73 75 63 63 5d de exists $succ]
35b0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 69 66 20 } continue...if
35c0: 7b 5b 48 61 73 41 72 63 20 24 64 67 20 24 63 73 {[HasArc $dg $cs
35d0: 65 74 20 24 73 75 63 63 5d 7d 20 63 6f 6e 74 69 et $succ]} conti
35e0: 6e 75 65 3b 23 20 54 4f 44 4f 20 73 68 6f 75 6c nue;# TODO shoul
35f0: 64 20 62 65 20 67 72 61 70 68 20 6d 65 74 68 6f d be graph metho
3600: 64 2e 0a 09 09 24 64 67 20 61 72 63 20 69 6e 73 d....$dg arc ins
3610: 65 72 74 20 24 63 73 65 74 20 24 73 75 63 63 0a ert $cset $succ.
3620: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 72 65 74 75 . }..}...retu
3630: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
3640: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
3650: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
3660: 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 61 6c #####. ## Cal
3670: 6c 62 61 63 6b 20 69 6e 76 6f 6b 61 74 69 6f 6e lback invokation
3680: 20 2e 2e 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 ..... proc P
3690: 72 65 48 6f 6f 6b 20 7b 67 72 61 70 68 7d 20 7b reHook {graph} {
36a0: 0a 09 23 20 47 69 76 65 20 74 68 65 20 75 73 65 ..# Give the use
36b0: 72 20 6f 66 20 74 68 65 20 63 79 63 6c 65 20 62 r of the cycle b
36c0: 72 65 61 6b 65 72 20 74 68 65 20 6f 70 70 6f 72 reaker the oppor
36d0: 74 75 6e 69 74 79 20 74 6f 20 77 6f 72 6b 0a 09 tunity to work..
36e0: 23 20 77 69 74 68 20 74 68 65 20 67 72 61 70 68 # with the graph
36f0: 20 62 65 74 77 65 65 6e 20 73 65 74 75 70 20 61 between setup a
3700: 6e 64 20 63 6f 6e 73 75 6d 6d 61 74 69 6f 6e 2e nd consummation.
3710: 0a 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 ...::variable my
3720: 70 72 65 63 6d 64 0a 09 69 66 20 7b 21 5b 6c 6c precmd..if {![ll
3730: 65 6e 67 74 68 20 24 6d 79 70 72 65 63 6d 64 5d ength $myprecmd]
3740: 7d 20 72 65 74 75 72 6e 0a 0a 09 75 70 6c 65 76 } return...uplev
3750: 65 6c 20 23 30 20 5b 6c 69 6e 73 65 72 74 20 24 el #0 [linsert $
3760: 6d 79 70 72 65 63 6d 64 20 65 6e 64 20 24 67 72 myprecmd end $gr
3770: 61 70 68 5d 0a 09 4d 61 72 6b 20 24 67 72 61 70 aph]..Mark $grap
3780: 68 20 2d 70 72 65 2d 64 6f 6e 65 0a 09 72 65 74 h -pre-done..ret
3790: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
37a0: 72 6f 63 20 50 72 6f 63 65 73 73 65 64 48 6f 6f roc ProcessedHoo
37b0: 6b 20 7b 64 67 20 63 73 65 74 20 70 6f 73 7d 20 k {dg cset pos}
37c0: 7b 0a 09 23 20 47 69 76 65 20 74 68 65 20 75 73 {..# Give the us
37d0: 65 72 20 6f 66 20 74 68 65 20 63 79 63 6c 65 20 er of the cycle
37e0: 62 72 65 61 6b 65 72 20 74 68 65 20 6f 70 70 6f breaker the oppo
37f0: 72 74 75 6e 69 74 79 20 74 6f 20 77 6f 72 6b 0a rtunity to work.
3800: 09 23 20 77 69 74 68 20 74 68 65 20 63 68 61 6e .# with the chan
3810: 67 65 73 65 74 20 62 65 66 6f 72 65 20 69 74 20 geset before it
3820: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 is removed from
3830: 74 68 65 20 67 72 61 70 68 2e 0a 0a 09 3a 3a 76 the graph....::v
3840: 61 72 69 61 62 6c 65 20 6d 79 73 61 76 65 63 6d ariable mysavecm
3850: 64 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 d..if {![llength
3860: 20 24 6d 79 73 61 76 65 63 6d 64 5d 7d 20 72 65 $mysavecmd]} re
3870: 74 75 72 6e 0a 0a 09 75 70 6c 65 76 65 6c 20 23 turn...uplevel #
3880: 30 20 5b 6c 69 6e 73 65 72 74 20 24 6d 79 73 61 0 [linsert $mysa
3890: 76 65 63 6d 64 20 65 6e 64 20 24 64 67 20 24 70 vecmd end $dg $p
38a0: 6f 73 20 24 63 73 65 74 5d 0a 09 72 65 74 75 72 os $cset]..retur
38b0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f n. }.. pro
38c0: 63 20 42 72 65 61 6b 43 79 63 6c 65 48 6f 6f 6b c BreakCycleHook
38d0: 20 7b 67 72 61 70 68 7d 20 7b 0a 09 23 20 43 61 {graph} {..# Ca
38e0: 6c 6c 20 6f 75 74 20 74 6f 20 74 68 65 20 63 68 ll out to the ch
38f0: 6f 73 65 6e 20 61 6c 67 6f 72 69 74 68 6d 20 66 osen algorithm f
3900: 6f 72 20 63 79 63 6c 65 20 62 72 65 61 6b 69 6e or cycle breakin
3910: 67 2e 20 46 69 6e 64 69 6e 67 0a 09 23 20 61 20 g. Finding..# a
3920: 63 79 63 6c 65 20 69 66 20 6e 6f 20 62 72 65 61 cycle if no brea
3930: 6b 65 72 20 77 61 73 20 63 68 6f 73 65 6e 20 69 ker was chosen i
3940: 73 20 61 6e 20 65 72 72 6f 72 2e 0a 0a 09 3a 3a s an error....::
3950: 76 61 72 69 61 62 6c 65 20 6d 79 62 72 65 61 6b variable mybreak
3960: 63 6d 64 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 cmd..if {![lleng
3970: 74 68 20 24 6d 79 62 72 65 61 6b 63 6d 64 5d 7d th $mybreakcmd]}
3980: 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 {.. trouble
3990: 66 61 74 61 6c 20 22 46 6f 75 6e 64 20 61 20 63 fatal "Found a c
39a0: 79 63 6c 65 2c 20 65 78 70 65 63 74 69 6e 67 20 ycle, expecting
39b0: 6e 6f 6e 65 2e 22 0a 09 20 20 20 20 65 78 69 74 none.".. exit
39c0: 20 31 0a 09 7d 0a 0a 09 75 70 6c 65 76 65 6c 20 1..}...uplevel
39d0: 23 30 20 5b 6c 69 6e 73 65 72 74 20 24 6d 79 62 #0 [linsert $myb
39e0: 72 65 61 6b 63 6d 64 20 65 6e 64 20 24 67 72 61 reakcmd end $gra
39f0: 70 68 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ph]..return.
3a00: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 6c 65 61 }.. proc Clea
3a10: 72 48 6f 6f 6b 73 20 7b 7d 20 7b 0a 09 3a 3a 76 rHooks {} {..::v
3a20: 61 72 69 61 62 6c 65 20 6d 79 70 72 65 63 6d 64 ariable myprecmd
3a30: 20 20 20 7b 7d 0a 09 3a 3a 76 61 72 69 61 62 6c {}..::variabl
3a40: 65 20 6d 79 73 61 76 65 63 6d 64 20 20 7b 7d 0a e mysavecmd {}.
3a50: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 72 .::variable mybr
3a60: 65 61 6b 63 6d 64 20 7b 7d 0a 09 72 65 74 75 72 eakcmd {}..retur
3a70: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 n. }.. # #
3a80: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
3a90: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
3aa0: 23 23 23 23 0a 0a 20 20 20 20 70 72 6f 63 20 4d ####.. proc M
3ab0: 61 72 6b 57 61 74 63 68 20 7b 67 72 61 70 68 7d arkWatch {graph}
3ac0: 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d {..::variable m
3ad0: 79 77 61 74 63 68 69 64 73 0a 09 73 65 74 20 77 ywatchids..set w
3ae0: 61 74 63 68 65 64 20 5b 57 61 74 63 68 65 64 20 atched [Watched
3af0: 24 67 72 61 70 68 20 24 6d 79 77 61 74 63 68 69 $graph $mywatchi
3b00: 64 73 5d 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 ds]..if {![lleng
3b10: 74 68 20 24 77 61 74 63 68 65 64 5d 7d 20 72 65 th $watched]} re
3b20: 74 75 72 6e 0a 09 73 65 74 20 6e 65 69 67 68 62 turn..set neighb
3b30: 6f 75 72 73 20 5b 65 76 61 6c 20 5b 6c 69 6e 73 ours [eval [lins
3b40: 65 72 74 20 24 77 61 74 63 68 65 64 20 30 20 24 ert $watched 0 $
3b50: 67 72 61 70 68 20 6e 6f 64 65 73 20 2d 61 64 6a graph nodes -adj
3b60: 5d 5d 0a 09 23 66 6f 72 65 61 63 68 20 6e 20 24 ]]..#foreach n $
3b70: 6e 65 69 67 68 62 6f 75 72 73 20 7b 20 6c 6f 67 neighbours { log
3b80: 20 77 72 69 74 65 20 36 20 63 79 63 6c 65 62 72 write 6 cyclebr
3b90: 65 61 6b 65 72 20 22 4e 65 69 67 68 62 6f 72 20 eaker "Neighbor
3ba0: 5b 24 6e 20 69 64 5d 20 3d 3e 20 24 6e 22 20 7d [$n id] => $n" }
3bb0: 0a 09 4d 61 72 6b 20 24 67 72 61 70 68 20 77 61 ..Mark $graph wa
3bc0: 74 63 68 65 64 20 5b 63 6f 6e 63 61 74 20 24 77 tched [concat $w
3bd0: 61 74 63 68 65 64 20 24 6e 65 69 67 68 62 6f 75 atched $neighbou
3be0: 72 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 rs]..return.
3bf0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 57 61 74 63 }.. proc Watc
3c00: 68 65 64 20 7b 67 72 61 70 68 20 77 61 74 63 68 hed {graph watch
3c10: 69 64 73 7d 20 7b 0a 09 73 65 74 20 72 65 73 20 ids} {..set res
3c20: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 69 64 20 24 {}..foreach id $
3c30: 77 61 74 63 68 69 64 73 20 7b 0a 09 20 20 20 20 watchids {..
3c40: 73 65 74 20 6e 6c 20 5b 24 67 72 61 70 68 20 6e set nl [$graph n
3c50: 6f 64 65 73 20 2d 6b 65 79 20 5f 5f 69 64 5f 5f odes -key __id__
3c60: 20 2d 76 61 6c 75 65 20 24 69 64 5d 0a 09 20 20 -value $id]..
3c70: 20 20 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 if {![llength
3c80: 24 6e 6c 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 $nl]} continue..
3c90: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 lappend res
3ca0: 24 6e 6c 0a 09 20 20 20 20 23 6c 6f 67 20 77 72 $nl.. #log wr
3cb0: 69 74 65 20 36 20 62 72 65 61 6b 72 63 79 63 6c ite 6 breakrcycl
3cc0: 65 20 22 57 61 74 63 68 69 6e 67 20 24 69 64 20 e "Watching $id
3cd0: 3d 3e 20 24 6e 6c 22 0a 09 20 20 20 20 24 67 72 => $nl".. $gr
3ce0: 61 70 68 20 6e 6f 64 65 20 73 65 74 20 24 6e 6c aph node set $nl
3cf0: 20 66 6f 6e 74 63 6f 6c 6f 72 20 72 65 64 0a 09 fontcolor red..
3d00: 7d 0a 09 72 65 74 75 72 6e 20 24 72 65 73 0a 20 }..return $res.
3d10: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 }.. # # ##
3d20: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
3d30: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
3d40: 23 0a 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 #... typevari
3d50: 61 62 6c 65 20 6d 79 61 74 20 20 20 20 20 20 30 able myat 0
3d60: 20 3b 20 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 ; # Counter for
3d70: 20 63 6f 6d 6d 69 74 20 69 64 73 20 66 6f 72 20 commit ids for
3d80: 74 68 65 0a 09 09 09 20 20 20 20 20 20 20 23 20 the.... #
3d90: 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 changesets..
3da0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 62 typevariable myb
3db0: 6f 74 74 6f 6d 20 7b 7d 20 3b 20 23 20 4c 69 73 ottom {} ; # Lis
3dc0: 74 20 6f 66 20 74 68 65 20 63 61 6e 64 69 64 61 t of the candida
3dd0: 74 65 20 6e 6f 64 65 73 20 66 6f 72 0a 09 09 09 te nodes for....
3de0: 20 20 20 20 20 20 20 23 20 63 6f 6d 6d 69 74 74 # committ
3df0: 69 6e 67 2e 0a 0a 20 20 20 20 74 79 70 65 76 61 ing... typeva
3e00: 72 69 61 62 6c 65 20 6d 79 70 72 65 63 6d 64 20 riable myprecmd
3e10: 20 20 7b 7d 20 3b 20 23 20 43 61 6c 6c 62 61 63 {} ; # Callbac
3e20: 6b 2c 20 63 68 61 6e 67 65 20 67 72 61 70 68 20 k, change graph
3e30: 62 65 66 6f 72 65 20 77 61 6c 6b 2e 0a 20 20 20 before walk..
3e40: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 typevariable my
3e50: 73 61 76 65 63 6d 64 20 20 7b 7d 20 3b 20 23 20 savecmd {} ; #
3e60: 43 61 6c 6c 62 61 63 6b 2c 20 66 6f 72 20 65 61 Callback, for ea
3e70: 63 68 20 70 72 6f 63 65 73 73 65 64 20 6e 6f 64 ch processed nod
3e80: 65 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 e.. typevaria
3e90: 62 6c 65 20 6d 79 62 72 65 61 6b 63 6d 64 20 7b ble mybreakcmd {
3ea0: 7d 20 3b 20 23 20 43 61 6c 6c 62 61 63 6b 2c 20 } ; # Callback,
3eb0: 66 6f 72 20 65 61 63 68 20 66 6f 75 6e 64 20 63 for each found c
3ec0: 79 63 6c 65 2e 0a 0a 20 20 20 20 74 79 70 65 76 ycle... typev
3ed0: 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 64 65 73 ariable mydotdes
3ee0: 74 69 6e 61 74 69 6f 6e 20 7b 7d 20 3b 20 23 20 tination {} ; #
3ef0: 44 65 73 74 69 6e 61 74 69 6f 6e 20 64 69 72 65 Destination dire
3f00: 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a 09 09 ctory for the...
3f10: 09 09 20 20 20 20 20 20 20 23 20 67 65 6e 65 72 .. # gener
3f20: 61 74 65 64 20 2e 64 6f 74 20 66 69 6c 65 73 2e ated .dot files.
3f30: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
3f40: 65 20 6d 79 64 6f 74 70 72 65 66 69 78 20 20 20 e mydotprefix
3f50: 20 20 20 7b 7d 20 3b 20 23 20 50 72 65 66 69 78 {} ; # Prefix
3f60: 20 66 6f 72 20 64 6f 74 20 66 69 6c 65 73 20 77 for dot files w
3f70: 68 65 6e 0a 09 09 09 09 20 20 20 20 20 20 20 23 hen..... #
3f80: 20 65 78 70 6f 72 74 69 6e 67 20 74 68 65 20 67 exporting the g
3f90: 72 61 70 68 73 2e 0a 20 20 20 20 74 79 70 65 76 raphs.. typev
3fa0: 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69 64 20 ariable mydotid
3fb0: 20 20 20 20 20 20 20 20 20 20 30 20 3b 20 23 20 0 ; #
3fc0: 43 6f 75 6e 74 65 72 20 66 6f 72 20 64 6f 74 20 Counter for dot
3fd0: 66 69 6c 65 20 6e 61 6d 65 0a 09 09 09 09 20 20 file name.....
3fe0: 20 20 20 20 20 23 20 67 65 6e 65 72 61 74 69 6f # generatio
3ff0: 6e 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 n.. typevaria
4000: 62 6c 65 20 6d 79 77 61 74 63 68 69 64 73 20 20 ble mywatchids
4010: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 68 61 6e {} ; # Chan
4020: 67 65 73 65 74 73 20 74 6f 20 77 61 74 63 68 20 gesets to watch
4030: 74 68 65 0a 09 09 09 09 20 20 20 20 20 20 20 23 the..... #
4040: 20 6e 65 69 67 68 62 6f 75 72 68 6f 6f 64 20 6f neighbourhood o
4050: 66 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 f... # # ## #
4060: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
4070: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a # #############.
4080: 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 ## Configura
4090: 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 tion.. pragma
40a0: 20 2d 68 61 73 69 6e 73 74 61 6e 63 65 73 20 20 -hasinstances
40b0: 20 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f no ; # singleto
40c0: 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 n. pragma -ha
40d0: 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 stypeinfo no
40e0: 3b 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63 ; # no introspec
40f0: 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 tion. pragma
4100: 2d 68 61 73 74 79 70 65 64 65 73 74 72 6f 79 20 -hastypedestroy
4110: 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a no ; # immortal.
4120: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 . # # ## ###
4130: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 ##### ######## #
4140: 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a ############.}..
4150: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a namespace eval :
4160: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
4170: 6f 72 74 3a 3a 63 76 73 20 7b 0a 20 20 20 20 6e ort::cvs {. n
4180: 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 amespace export
4190: 63 79 63 6c 65 62 72 65 61 6b 65 72 0a 20 20 20 cyclebreaker.
41a0: 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 namespace eval
41b0: 63 79 63 6c 65 62 72 65 61 6b 65 72 20 7b 0a 09 cyclebreaker {..
41c0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 70 namespace eval p
41d0: 72 6f 6a 65 63 74 20 7b 0a 09 20 20 20 20 6e 61 roject {.. na
41e0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
41f0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
4200: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 ort::cvs::projec
4210: 74 3a 3a 72 65 76 0a 09 20 20 20 20 6e 61 6d 65 t::rev.. name
4220: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 space import ::v
4230: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
4240: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a t::cvs::project:
4250: 3a 72 65 76 6c 69 6e 6b 0a 09 7d 0a 09 6e 61 6d :revlink..}..nam
4260: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
4270: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a vc::tools::misc:
4280: 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d :*..namespace im
4290: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 port ::vc::tools
42a0: 3a 3a 6c 6f 67 0a 09 6e 61 6d 65 73 70 61 63 65 ::log..namespace
42b0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f import ::vc::to
42c0: 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 ols::trouble..na
42d0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
42e0: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 64 6f 74 0a :vc::tools::dot.
42f0: 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 79 .log register cy
4300: 63 6c 65 62 72 65 61 6b 65 72 0a 20 20 20 20 7d clebreaker. }
4310: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 .}..# # ## ### #
4320: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
4330: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 ########### ####
4340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
4350: 23 0a 23 23 20 52 65 61 64 79 0a 0a 70 61 63 6b #.## Ready..pack
4360: 61 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a age provide vc::
4370: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
4380: 63 76 73 3a 3a 63 79 63 6c 65 62 72 65 61 6b 65 cvs::cyclebreake
4390: 72 20 31 2e 30 0a 72 65 74 75 72 6e 0a r 1.0.return.