Artifact 0d5893505cae5cd1208aff43417c5cf319d3bc1e:
File
tools/cvs2fossil/lib/c2f_cyclebreaker.tcl
part of check-in
[5f5620fbd2]
- Modified cycle breaker API. Hook for processed nodes now takes the graph as new first argument. Extended API, exposed method for dumping the current state of the graph, including ability to dump a sub graph.
by
aku on
2007-11-23 05:43:25.
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 20 0a 0a 73 6e 69 74 3a 3a 74 79 ##.## ..snit::ty
0640: 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a pe ::vc::fossil:
0650: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 63 79 :import::cvs::cy
0660: 63 6c 65 62 72 65 61 6b 65 72 20 7b 0a 20 20 20 clebreaker {.
0670: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
0680: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
0690: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 ########. ##
06a0: 50 75 62 6c 69 63 20 41 50 49 0a 0a 20 20 20 20 Public API..
06b0: 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 63 6d typemethod precm
06c0: 64 20 7b 63 6d 64 7d 20 7b 0a 09 3a 3a 76 61 72 d {cmd} {..::var
06d0: 69 61 62 6c 65 20 6d 79 70 72 65 63 6d 64 20 24 iable myprecmd $
06e0: 63 6d 64 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 cmd..return.
06f0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }.. typemetho
0700: 64 20 73 61 76 65 63 6d 64 20 7b 63 6d 64 7d 20 d savecmd {cmd}
0710: 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 {..::variable my
0720: 73 61 76 65 63 6d 64 20 24 63 6d 64 0a 09 72 65 savecmd $cmd..re
0730: 74 75 72 6e 0a 20 20 20 20 7d 0a 20 0a 20 20 20 turn. }. .
0740: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 72 65 61 typemethod brea
0750: 6b 63 6d 64 20 7b 63 6d 64 7d 20 7b 0a 09 3a 3a kcmd {cmd} {..::
0760: 76 61 72 69 61 62 6c 65 20 6d 79 62 72 65 61 6b variable mybreak
0770: 63 6d 64 20 24 63 6d 64 0a 09 72 65 74 75 72 6e cmd $cmd..return
0780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
0790: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
07a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
07b0: 23 23 23 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 ###.. typemet
07c0: 68 6f 64 20 64 6f 74 73 74 6f 20 7b 70 61 74 68 hod dotsto {path
07d0: 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 } {..::variable
07e0: 6d 79 64 6f 74 64 65 73 74 69 6e 61 74 69 6f 6e mydotdestination
07f0: 20 24 70 61 74 68 0a 09 72 65 74 75 72 6e 0a 20 $path..return.
0800: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme
0810: 74 68 6f 64 20 64 6f 74 20 7b 6c 61 62 65 6c 20 thod dot {label
0820: 63 68 61 6e 67 65 73 65 74 73 7d 20 7b 0a 09 3a changesets} {..:
0830: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 70 :variable mydotp
0840: 72 65 66 69 78 20 24 6c 61 62 65 6c 0a 09 3a 3a refix $label..::
0850: 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69 64 variable mydotid
0860: 20 20 20 20 20 30 0a 0a 09 73 65 74 20 64 67 20 0...set dg
0870: 5b 53 65 74 75 70 20 24 63 68 61 6e 67 65 73 65 [Setup $changese
0880: 74 73 20 30 5d 0a 09 4d 61 72 6b 20 24 64 67 0a ts 0]..Mark $dg.
0890: 09 24 64 67 20 64 65 73 74 72 6f 79 0a 09 72 65 .$dg destroy..re
08a0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
08b0: 74 79 70 65 6d 65 74 68 6f 64 20 6d 61 72 6b 20 typemethod mark
08c0: 7b 67 72 61 70 68 20 73 75 66 66 69 78 20 7b 73 {graph suffix {s
08d0: 75 62 67 72 61 70 68 20 7b 7d 7d 7d 20 7b 0a 09 ubgraph {}}} {..
08e0: 4d 61 72 6b 20 24 67 72 61 70 68 20 24 73 75 66 Mark $graph $suf
08f0: 66 69 78 20 24 73 75 62 67 72 61 70 68 0a 09 72 fix $subgraph..r
0900: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
0910: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
0920: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
0930: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 ########.. ty
0940: 70 65 6d 65 74 68 6f 64 20 72 75 6e 20 7b 6c 61 pemethod run {la
0950: 62 65 6c 20 63 68 61 6e 67 65 73 65 74 63 6d 64 bel changesetcmd
0960: 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 } {..::variable
0970: 6d 79 61 74 20 20 20 20 20 20 20 20 30 0a 09 3a myat 0..:
0980: 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 70 :variable mydotp
0990: 72 65 66 69 78 20 24 6c 61 62 65 6c 0a 09 3a 3a refix $label..::
09a0: 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69 64 variable mydotid
09b0: 20 20 20 20 20 30 0a 0a 09 23 20 57 65 20 63 72 0...# We cr
09c0: 65 61 74 65 20 61 20 67 72 61 70 68 20 6f 66 20 eate a graph of
09d0: 74 68 65 20 72 65 76 69 73 69 6f 6e 20 63 68 61 the revision cha
09e0: 6e 67 65 73 65 74 73 2c 20 75 73 69 6e 67 20 74 ngesets, using t
09f0: 68 65 20 66 69 6c 65 0a 09 23 20 6c 65 76 65 6c he file..# level
0a00: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f dependencies to
0a10: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 66 69 72 construct a fir
0a20: 73 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e st approximation
0a30: 20 6f 66 20 74 68 65 0a 09 23 20 64 65 70 65 6e of the..# depen
0a40: 64 65 6e 63 69 65 73 20 61 74 20 74 68 65 20 70 dencies at the p
0a50: 72 6f 6a 65 63 74 20 6c 65 76 65 6c 2e 20 54 68 roject level. Th
0a60: 65 6e 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 63 en we look for c
0a70: 79 63 6c 65 73 0a 09 23 20 69 6e 20 74 68 61 74 ycles..# in that
0a80: 20 67 72 61 70 68 20 61 6e 64 20 62 72 65 61 6b graph and break
0a90: 20 74 68 65 6d 2e 0a 0a 09 23 20 31 2e 20 43 72 them....# 1. Cr
0aa0: 65 61 74 65 20 6e 6f 64 65 73 20 66 6f 72 20 61 eate nodes for a
0ab0: 6c 6c 20 72 65 6c 65 76 61 6e 74 20 63 68 61 6e ll relevant chan
0ac0: 67 65 73 65 74 73 20 61 6e 64 20 61 20 6d 61 70 gesets and a map
0ad0: 70 69 6e 67 0a 09 23 20 20 20 20 66 72 6f 6d 20 ping..# from
0ae0: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 6f the revisions to
0af0: 20 74 68 65 69 72 20 63 68 61 6e 67 65 73 65 74 their changeset
0b00: 73 2f 6e 6f 64 65 73 2e 0a 0a 09 73 65 74 20 63 s/nodes....set c
0b10: 68 61 6e 67 65 73 65 74 73 20 5b 75 70 6c 65 76 hangesets [uplev
0b20: 65 6c 20 23 30 20 24 63 68 61 6e 67 65 73 65 74 el #0 $changeset
0b30: 63 6d 64 5d 0a 09 73 65 74 20 64 67 20 5b 53 65 cmd]..set dg [Se
0b40: 74 75 70 20 24 63 68 61 6e 67 65 73 65 74 73 5d tup $changesets]
0b50: 0a 0a 09 23 20 33 2e 20 4c 61 73 74 6c 79 20 77 ...# 3. Lastly w
0b60: 65 20 69 74 65 72 61 74 65 20 74 68 65 20 67 72 e iterate the gr
0b70: 61 70 68 20 74 6f 70 6f 6c 6f 67 69 63 61 6c 6c aph topologicall
0b80: 79 2e 20 57 65 20 6d 61 72 6b 20 6f 66 66 0a 09 y. We mark off..
0b90: 23 20 20 20 20 74 68 65 20 6e 6f 64 65 73 20 77 # the nodes w
0ba0: 68 69 63 68 20 68 61 76 65 20 6e 6f 20 70 72 65 hich have no pre
0bb0: 64 65 63 65 73 73 6f 72 73 2c 20 69 6e 20 6f 72 decessors, in or
0bc0: 64 65 72 20 66 72 6f 6d 0a 09 23 20 20 20 20 6f der from..# o
0bd0: 6c 64 65 73 74 20 74 6f 20 79 6f 75 6e 67 65 73 ldest to younges
0be0: 74 2c 20 73 61 76 69 6e 67 20 61 6e 64 20 72 65 t, saving and re
0bf0: 6d 6f 76 69 6e 67 20 64 65 70 65 6e 64 65 6e 63 moving dependenc
0c00: 69 65 73 2e 20 49 66 0a 09 23 20 20 20 20 77 65 ies. If..# we
0c10: 20 66 69 6e 64 20 6e 6f 20 6e 6f 64 65 73 20 77 find no nodes w
0c20: 69 74 68 6f 75 74 20 70 72 65 64 65 63 65 73 73 ithout predecess
0c30: 6f 72 73 20 77 65 20 68 61 76 65 20 61 20 63 79 ors we have a cy
0c40: 63 6c 65 2c 0a 09 23 20 20 20 20 61 6e 64 20 77 cle,..# and w
0c50: 6f 72 6b 20 6f 6e 20 62 72 65 61 6b 69 6e 67 20 ork on breaking
0c60: 69 74 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 it....log write
0c70: 33 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 7b 3 cyclebreaker {
0c80: 4e 6f 77 20 73 6f 72 74 69 6e 67 20 74 68 65 20 Now sorting the
0c90: 63 68 61 6e 67 65 73 65 74 73 2c 20 62 72 65 61 changesets, brea
0ca0: 6b 69 6e 67 20 63 79 63 6c 65 73 7d 0a 0a 09 49 king cycles}...I
0cb0: 6e 69 74 69 61 6c 69 7a 65 43 61 6e 64 69 64 61 nitializeCandida
0cc0: 74 65 73 20 24 64 67 0a 09 77 68 69 6c 65 20 7b tes $dg..while {
0cd0: 31 7d 20 7b 0a 09 20 20 20 20 77 68 69 6c 65 20 1} {.. while
0ce0: 7b 5b 57 69 74 68 6f 75 74 50 72 65 64 65 63 65 {[WithoutPredece
0cf0: 73 73 6f 72 20 24 64 67 20 6e 5d 7d 20 7b 0a 09 ssor $dg n]} {..
0d00: 09 50 72 6f 63 65 73 73 65 64 48 6f 6f 6b 20 24 .ProcessedHook $
0d10: 64 67 20 24 6e 20 24 6d 79 61 74 0a 09 09 24 64 dg $n $myat...$d
0d20: 67 20 6e 6f 64 65 20 64 65 6c 65 74 65 20 24 6e g node delete $n
0d30: 0a 09 09 69 6e 63 72 20 6d 79 61 74 0a 09 09 53 ...incr myat...S
0d40: 68 6f 77 50 65 6e 64 69 6e 67 4e 6f 64 65 73 0a howPendingNodes.
0d50: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 . }... if
0d60: 7b 21 5b 6c 6c 65 6e 67 74 68 20 5b 64 67 20 6e {![llength [dg n
0d70: 6f 64 65 73 5d 5d 7d 20 62 72 65 61 6b 0a 0a 09 odes]]} break...
0d80: 20 20 20 20 42 72 65 61 6b 43 79 63 6c 65 48 6f BreakCycleHo
0d90: 6f 6b 20 20 20 20 20 20 20 24 64 67 0a 09 20 20 ok $dg..
0da0: 20 20 49 6e 69 74 69 61 6c 69 7a 65 43 61 6e 64 InitializeCand
0db0: 69 64 61 74 65 73 20 24 64 67 0a 09 7d 0a 0a 09 idates $dg..}...
0dc0: 24 64 67 20 64 65 73 74 72 6f 79 0a 0a 09 6c 6f $dg destroy...lo
0dd0: 67 20 77 72 69 74 65 20 33 20 63 79 63 6c 65 62 g write 3 cycleb
0de0: 72 65 61 6b 65 72 20 44 6f 6e 65 2e 0a 09 43 6c reaker Done...Cl
0df0: 65 61 72 48 6f 6f 6b 73 0a 0a 09 23 20 52 65 72 earHooks...# Rer
0e00: 65 61 64 20 74 68 65 20 67 72 61 70 68 20 61 6e ead the graph an
0e10: 64 20 64 75 6d 70 20 69 74 73 20 66 69 6e 61 6c d dump its final
0e20: 20 66 6f 72 6d 2c 20 69 66 20 67 72 61 70 68 20 form, if graph
0e30: 65 78 70 6f 72 74 0a 09 23 20 77 61 73 20 61 63 export..# was ac
0e40: 74 69 76 61 74 65 64 2e 0a 0a 09 3a 3a 76 61 72 tivated....::var
0e50: 69 61 62 6c 65 20 6d 79 64 6f 74 64 65 73 74 69 iable mydotdesti
0e60: 6e 61 74 69 6f 6e 0a 09 69 66 20 7b 24 6d 79 64 nation..if {$myd
0e70: 6f 74 64 65 73 74 69 6e 61 74 69 6f 6e 20 65 71 otdestination eq
0e80: 20 22 22 7d 20 72 65 74 75 72 6e 0a 0a 09 73 65 ""} return...se
0e90: 74 20 20 20 64 67 20 5b 53 65 74 75 70 20 5b 75 t dg [Setup [u
0ea0: 70 6c 65 76 65 6c 20 23 30 20 24 63 68 61 6e 67 plevel #0 $chang
0eb0: 65 73 65 74 63 6d 64 5d 20 30 5d 0a 09 4d 61 72 esetcmd] 0]..Mar
0ec0: 6b 20 24 64 67 20 2d 64 6f 6e 65 0a 09 24 64 67 k $dg -done..$dg
0ed0: 20 64 65 73 74 72 6f 79 0a 09 72 65 74 75 72 6e destroy..return
0ee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
0ef0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
0f00: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
0f10: 23 23 23 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 ###.. typemet
0f20: 68 6f 64 20 62 72 65 61 6b 20 7b 67 72 61 70 68 hod break {graph
0f30: 7d 20 7b 0a 09 42 72 65 61 6b 43 79 63 6c 65 20 } {..BreakCycle
0f40: 24 67 72 61 70 68 20 5b 46 69 6e 64 43 79 63 6c $graph [FindCycl
0f50: 65 20 24 67 72 61 70 68 5d 0a 09 72 65 74 75 72 e $graph]..retur
0f60: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 n. }.. typ
0f70: 65 6d 65 74 68 6f 64 20 72 65 70 6c 61 63 65 20 emethod replace
0f80: 7b 67 72 61 70 68 20 6e 20 72 65 70 6c 61 63 65 {graph n replace
0f90: 6d 65 6e 74 73 7d 20 7b 0a 09 52 65 70 6c 61 63 ments} {..Replac
0fa0: 65 20 24 67 72 61 70 68 20 24 6e 20 24 72 65 70 e $graph $n $rep
0fb0: 6c 61 63 65 6d 65 6e 74 73 0a 09 72 65 74 75 72 lacements..retur
0fc0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 n. }.. # #
0fd0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
0fe0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
0ff0: 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 ####. ## Inte
1000: 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 rnal methods..
1010: 20 20 70 72 6f 63 20 53 65 74 75 70 20 7b 63 68 proc Setup {ch
1020: 61 6e 67 65 73 65 74 73 20 7b 6c 6f 67 20 31 7d angesets {log 1}
1030: 7d 20 7b 0a 09 69 66 20 7b 24 6c 6f 67 7d 20 7b } {..if {$log} {
1040: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 .. log write
1050: 33 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 22 3 cyclebreaker "
1060: 43 72 65 61 74 69 6e 67 20 63 68 61 6e 67 65 73 Creating changes
1070: 65 74 20 67 72 61 70 68 2c 20 66 69 6c 6c 69 6e et graph, fillin
1080: 67 20 77 69 74 68 20 6e 6f 64 65 73 22 0a 09 20 g with nodes"..
1090: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 33 20 63 log write 3 c
10a0: 79 63 6c 65 62 72 65 61 6b 65 72 20 22 41 64 64 yclebreaker "Add
10b0: 69 6e 67 20 5b 6e 73 70 20 5b 6c 6c 65 6e 67 74 ing [nsp [llengt
10c0: 68 20 24 63 68 61 6e 67 65 73 65 74 73 5d 20 6e h $changesets] n
10d0: 6f 64 65 5d 22 0a 09 7d 0a 0a 09 73 65 74 20 64 ode]"..}...set d
10e0: 67 20 5b 73 74 72 75 63 74 3a 3a 67 72 61 70 68 g [struct::graph
10f0: 20 64 67 5d 0a 0a 09 66 6f 72 65 61 63 68 20 63 dg]...foreach c
1100: 73 65 74 20 24 63 68 61 6e 67 65 73 65 74 73 20 set $changesets
1110: 7b 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 65 20 {.. $dg node
1120: 69 6e 73 65 72 74 20 24 63 73 65 74 0a 09 20 20 insert $cset..
1130: 20 20 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20 $dg node set
1140: 20 20 24 63 73 65 74 20 74 69 6d 65 72 61 6e 67 $cset timerang
1150: 65 20 5b 24 63 73 65 74 20 74 69 6d 65 72 61 6e e [$cset timeran
1160: 67 65 5d 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 ge].. $dg nod
1170: 65 20 73 65 74 20 20 20 20 24 63 73 65 74 20 6c e set $cset l
1180: 61 62 65 6c 20 20 20 20 20 5b 49 44 20 24 63 73 abel [ID $cs
1190: 65 74 5d 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 et].. $dg nod
11a0: 65 20 73 65 74 20 20 20 20 24 63 73 65 74 20 5f e set $cset _
11b0: 5f 69 64 5f 5f 20 5b 24 63 73 65 74 20 69 64 5d _id__ [$cset id]
11c0: 0a 09 7d 0a 0a 09 23 20 32 2e 20 46 69 6e 64 20 ..}...# 2. Find
11d0: 66 6f 72 20 61 6c 6c 20 72 65 6c 65 76 61 6e 74 for all relevant
11e0: 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 69 72 changeset their
11f0: 20 72 65 76 69 73 69 6f 6e 73 20 61 6e 64 20 74 revisions and t
1200: 68 65 69 72 0a 09 23 20 20 20 20 64 65 70 65 6e heir..# depen
1210: 64 65 6e 63 69 65 73 2e 20 4d 61 70 20 74 68 65 dencies. Map the
1220: 20 6c 61 74 74 65 72 20 62 61 63 6b 20 74 6f 20 latter back to
1230: 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 changesets and..
1240: 23 20 20 20 20 63 6f 6e 73 74 72 75 63 74 20 74 # construct t
1250: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
1260: 20 61 72 63 73 2e 0a 0a 09 69 66 20 7b 24 6c 6f arcs....if {$lo
1270: 67 7d 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 g} {.. log wr
1280: 69 74 65 20 33 20 63 79 63 6c 65 62 72 65 61 6b ite 3 cyclebreak
1290: 65 72 20 7b 53 65 74 74 69 6e 67 20 75 70 20 6e er {Setting up n
12a0: 6f 64 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ode dependencies
12b0: 7d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 }..}...foreach c
12c0: 73 65 74 20 24 63 68 61 6e 67 65 73 65 74 73 20 set $changesets
12d0: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 73 {.. foreach s
12e0: 75 63 63 20 5b 24 63 73 65 74 20 73 75 63 63 65 ucc [$cset succe
12f0: 73 73 6f 72 73 5d 20 7b 0a 09 09 23 20 43 68 61 ssors] {...# Cha
1300: 6e 67 65 73 65 74 73 20 6d 61 79 20 68 61 76 65 ngesets may have
1310: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 75 dependencies ou
1320: 74 73 69 64 65 20 6f 66 20 74 68 65 0a 09 09 23 tside of the...#
1330: 20 63 68 6f 73 65 6e 20 73 65 74 2e 20 54 68 65 chosen set. The
1340: 73 65 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 09 se are ignored..
1350: 09 69 66 20 7b 21 5b 24 64 67 20 6e 6f 64 65 20 .if {![$dg node
1360: 65 78 69 73 74 73 20 24 73 75 63 63 5d 7d 20 63 exists $succ]} c
1370: 6f 6e 74 69 6e 75 65 0a 09 09 24 64 67 20 61 72 ontinue...$dg ar
1380: 63 20 69 6e 73 65 72 74 20 24 63 73 65 74 20 24 c insert $cset $
1390: 73 75 63 63 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a succ.. }..}..
13a0: 09 23 20 52 75 6e 20 74 68 65 20 75 73 65 72 20 .# Run the user
13b0: 68 6f 6f 6b 20 74 6f 20 6d 61 6e 69 70 75 6c 61 hook to manipula
13c0: 74 65 20 74 68 65 20 67 72 61 70 68 20 62 65 66 te the graph bef
13d0: 6f 72 65 0a 09 23 20 63 6f 6e 73 75 6d 6d 61 74 ore..# consummat
13e0: 69 6f 6e 2e 0a 0a 09 69 66 20 7b 24 6c 6f 67 7d ion....if {$log}
13f0: 20 7b 20 4d 61 72 6b 20 24 64 67 20 2d 73 74 61 { Mark $dg -sta
1400: 72 74 20 7d 0a 09 50 72 65 48 6f 6f 6b 20 24 64 rt }..PreHook $d
1410: 67 0a 09 72 65 74 75 72 6e 20 20 24 64 67 0a 20 g..return $dg.
1420: 20 20 20 7d 0a 0a 20 20 20 20 23 20 49 6e 73 74 }.. # Inst
1430: 65 61 64 20 6f 66 20 73 65 61 72 63 68 69 6e 67 ead of searching
1440: 20 74 68 65 20 77 68 6f 6c 65 20 67 72 61 70 68 the whole graph
1450: 20 66 6f 72 20 74 68 65 20 64 65 67 72 65 65 2d for the degree-
1460: 30 20 6e 6f 64 65 73 20 69 6e 0a 20 20 20 20 23 0 nodes in. #
1470: 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 each iteration
1480: 77 65 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c we compute the l
1490: 69 73 74 20 6f 6e 63 65 20 74 6f 20 73 74 61 72 ist once to star
14a0: 74 2c 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 t, and then only
14b0: 0a 20 20 20 20 23 20 75 70 64 61 74 65 20 69 74 . # update it
14c0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 62 incrementally b
14d0: 61 73 65 64 20 6f 6e 20 74 68 65 20 6f 75 74 67 ased on the outg
14e0: 6f 69 6e 67 20 6e 65 69 67 68 62 6f 75 72 73 20 oing neighbours
14f0: 6f 66 20 74 68 65 0a 20 20 20 20 23 20 6e 6f 64 of the. # nod
1500: 65 20 63 68 6f 73 65 6e 20 66 6f 72 20 63 6f 6d e chosen for com
1510: 6d 69 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 49 mit... proc I
1520: 6e 69 74 69 61 6c 69 7a 65 43 61 6e 64 69 64 61 nitializeCandida
1530: 74 65 73 20 7b 64 67 7d 20 7b 0a 09 23 20 62 6f tes {dg} {..# bo
1540: 74 74 6f 6d 20 3d 20 6c 69 73 74 20 28 6c 69 73 ttom = list (lis
1550: 74 20 28 6e 6f 64 65 2c 20 72 61 6e 67 65 20 6d t (node, range m
1560: 69 6e 2c 20 72 61 6e 67 65 20 6d 61 78 29 29 0a in, range max)).
1570: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 6f .::variable mybo
1580: 74 74 6f 6d 0a 09 66 6f 72 65 61 63 68 20 6e 20 ttom..foreach n
1590: 5b 24 64 67 20 6e 6f 64 65 73 5d 20 7b 0a 09 20 [$dg nodes] {..
15a0: 20 20 20 69 66 20 7b 5b 24 64 67 20 6e 6f 64 65 if {[$dg node
15b0: 20 64 65 67 72 65 65 20 2d 69 6e 20 24 6e 5d 7d degree -in $n]}
15c0: 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 6c continue.. l
15d0: 61 70 70 65 6e 64 20 6d 79 62 6f 74 74 6f 6d 20 append mybottom
15e0: 5b 6c 69 6e 73 65 72 74 20 5b 24 64 67 20 6e 6f [linsert [$dg no
15f0: 64 65 20 67 65 74 20 24 6e 20 74 69 6d 65 72 61 de get $n timera
1600: 6e 67 65 5d 20 30 20 24 6e 5d 0a 09 7d 0a 09 73 nge] 0 $n]..}..s
1610: 65 74 20 6d 79 62 6f 74 74 6f 6d 20 5b 6c 73 6f et mybottom [lso
1620: 72 74 20 2d 69 6e 64 65 78 20 31 20 2d 69 6e 74 rt -index 1 -int
1630: 65 67 65 72 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 eger [lsort -ind
1640: 65 78 20 32 20 2d 69 6e 74 65 67 65 72 20 24 6d ex 2 -integer $m
1650: 79 62 6f 74 74 6f 6d 5d 5d 0a 09 53 68 6f 77 50 ybottom]]..ShowP
1660: 65 6e 64 69 6e 67 4e 6f 64 65 73 0a 09 72 65 74 endingNodes..ret
1670: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
1680: 72 6f 63 20 57 69 74 68 6f 75 74 50 72 65 64 65 roc WithoutPrede
1690: 63 65 73 73 6f 72 20 7b 64 67 20 6e 76 7d 20 7b cessor {dg nv} {
16a0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 ..::variable myb
16b0: 6f 74 74 6f 6d 0a 0a 09 75 70 76 61 72 20 31 20 ottom...upvar 1
16c0: 24 6e 76 20 6e 0a 09 69 66 20 7b 21 5b 6c 6c 65 $nv n..if {![lle
16d0: 6e 67 74 68 20 24 6d 79 62 6f 74 74 6f 6d 5d 7d ngth $mybottom]}
16e0: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 09 { return 0 }...
16f0: 73 65 74 20 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c set n [lindex [l
1700: 69 6e 64 65 78 20 24 6d 79 62 6f 74 74 6f 6d 20 index $mybottom
1710: 30 5d 20 30 5d 0a 09 73 65 74 20 6d 79 62 6f 74 0] 0]..set mybot
1720: 74 6f 6d 20 5b 6c 72 61 6e 67 65 20 24 6d 79 62 tom [lrange $myb
1730: 6f 74 74 6f 6d 20 31 20 65 6e 64 5d 0a 09 73 65 ottom 1 end]..se
1740: 74 20 63 68 61 6e 67 65 64 20 30 0a 0a 09 23 20 t changed 0...#
1750: 55 70 64 61 74 65 20 6c 69 73 74 20 6f 66 20 6e Update list of n
1760: 6f 64 65 73 20 77 69 74 68 6f 75 74 20 70 72 65 odes without pre
1770: 64 65 63 65 73 73 6f 72 2c 20 62 61 73 65 64 20 decessor, based
1780: 6f 6e 20 74 68 65 0a 09 23 20 6f 75 74 67 6f 69 on the..# outgoi
1790: 6e 67 20 6e 65 69 67 68 62 6f 75 72 73 20 6f 66 ng neighbours of
17a0: 20 74 68 65 20 63 68 6f 73 65 6e 20 6e 6f 64 65 the chosen node
17b0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 . This should be
17c0: 0a 09 23 20 66 61 73 74 65 72 20 74 68 61 6e 20 ..# faster than
17d0: 69 74 65 72 61 74 69 6e 67 20 6f 66 20 74 68 65 iterating of the
17e0: 20 77 68 6f 6c 65 20 73 65 74 20 6f 66 20 6e 6f whole set of no
17f0: 64 65 73 2c 20 66 69 6e 64 69 6e 67 20 61 6c 6c des, finding all
1800: 0a 09 23 20 77 69 74 68 6f 75 74 20 70 72 65 64 ..# without pred
1810: 65 63 65 73 73 6f 72 73 2c 20 73 6f 72 74 69 6e ecessors, sortin
1820: 67 20 74 68 65 6d 20 62 79 20 74 69 6d 65 2c 20 g them by time,
1830: 65 74 63 2e 20 70 70 2e 0a 09 66 6f 72 65 61 63 etc. pp...foreac
1840: 68 20 6f 75 74 20 5b 24 64 67 20 6e 6f 64 65 73 h out [$dg nodes
1850: 20 2d 6f 75 74 20 24 6e 5d 20 7b 0a 09 20 20 20 -out $n] {..
1860: 20 69 66 20 7b 5b 24 64 67 20 6e 6f 64 65 20 64 if {[$dg node d
1870: 65 67 72 65 65 20 2d 69 6e 20 24 6f 75 74 5d 20 egree -in $out]
1880: 3e 20 31 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 > 1} continue..
1890: 20 20 20 23 20 44 65 67 72 65 65 2d 31 20 6e 65 # Degree-1 ne
18a0: 69 67 68 62 6f 75 72 2c 20 77 69 6c 6c 20 68 61 ighbour, will ha
18b0: 76 65 20 6e 6f 20 70 72 65 64 65 63 65 73 73 6f ve no predecesso
18c0: 72 73 20 61 66 74 65 72 20 74 68 65 0a 09 20 20 rs after the..
18d0: 20 20 23 20 72 65 6d 6f 76 61 6c 20 6f 66 20 6e # removal of n
18e0: 2e 20 50 75 74 20 6f 6e 20 74 68 65 20 6c 69 73 . Put on the lis
18f0: 74 2e 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 t... lappend
1900: 6d 79 62 6f 74 74 6f 6d 20 5b 6c 69 6e 73 65 72 mybottom [linser
1910: 74 20 5b 24 64 67 20 6e 6f 64 65 20 67 65 74 20 t [$dg node get
1920: 24 6f 75 74 20 74 69 6d 65 72 61 6e 67 65 5d 20 $out timerange]
1930: 30 20 24 6f 75 74 5d 0a 09 20 20 20 20 73 65 74 0 $out].. set
1940: 20 63 68 61 6e 67 65 64 20 31 0a 09 7d 0a 09 69 changed 1..}..i
1950: 66 20 7b 24 63 68 61 6e 67 65 64 7d 20 7b 0a 09 f {$changed} {..
1960: 20 20 20 20 73 65 74 20 6d 79 62 6f 74 74 6f 6d set mybottom
1970: 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 31 [lsort -index 1
1980: 20 2d 69 6e 74 65 67 65 72 20 5b 6c 73 6f 72 74 -integer [lsort
1990: 20 2d 69 6e 64 65 78 20 32 20 2d 69 6e 74 65 67 -index 2 -integ
19a0: 65 72 20 24 6d 79 62 6f 74 74 6f 6d 5d 5d 0a 09 er $mybottom]]..
19b0: 7d 0a 0a 09 23 20 57 65 20 64 6f 20 6e 6f 74 20 }...# We do not
19c0: 64 65 6c 65 74 65 20 74 68 65 20 6e 6f 64 65 20 delete the node
19d0: 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 74 6f 20 immediately, to
19e0: 61 6c 6c 6f 77 20 74 68 65 20 53 61 76 65 0a 09 allow the Save..
19f0: 23 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 73 # procedure to s
1a00: 61 76 65 20 74 68 65 20 64 65 70 65 6e 64 65 6e ave the dependen
1a10: 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 65 6e cies as well (en
1a20: 63 6f 64 65 64 20 69 6e 20 74 68 65 0a 09 23 20 coded in the..#
1a30: 61 72 63 73 29 2e 0a 09 72 65 74 75 72 6e 20 31 arcs)...return 1
1a40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
1a50: 20 53 68 6f 77 50 65 6e 64 69 6e 67 4e 6f 64 65 ShowPendingNode
1a60: 73 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6f 67 s {} {..if {[log
1a70: 20 76 65 72 62 6f 73 69 74 79 3f 5d 20 3c 20 31 verbosity?] < 1
1a80: 30 7d 20 72 65 74 75 72 6e 0a 09 3a 3a 76 61 72 0} return..::var
1a90: 69 61 62 6c 65 20 6d 79 62 6f 74 74 6f 6d 0a 09 iable mybottom..
1aa0: 6c 6f 67 20 77 72 69 74 65 20 31 30 20 63 79 63 log write 10 cyc
1ab0: 6c 65 62 72 65 61 6b 65 72 20 5c 0a 09 20 20 20 lebreaker \..
1ac0: 20 22 50 65 6e 64 69 6e 67 3a 20 5b 73 74 72 75 "Pending: [stru
1ad0: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 6d 79 ct::list map $my
1ae0: 62 6f 74 74 6f 6d 20 5b 6d 79 70 72 6f 63 20 46 bottom [myproc F
1af0: 6f 72 6d 61 74 50 65 6e 64 69 6e 67 49 74 65 6d ormatPendingItem
1b00: 5d 5d 22 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ]]"..return.
1b10: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 6f 72 6d }.. proc Form
1b20: 61 74 50 65 6e 64 69 6e 67 49 74 65 6d 20 7b 69 atPendingItem {i
1b30: 74 65 6d 7d 20 7b 20 6c 72 65 70 6c 61 63 65 20 tem} { lreplace
1b40: 24 69 74 65 6d 20 30 20 30 20 3c 5b 5b 6c 69 6e $item 0 0 <[[lin
1b50: 64 65 78 20 24 69 74 65 6d 20 30 5d 20 69 64 5d dex $item 0] id]
1b60: 3e 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 > }.. proc Fi
1b70: 6e 64 43 79 63 6c 65 20 7b 64 67 7d 20 7b 0a 09 ndCycle {dg} {..
1b80: 23 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 # This procedure
1b90: 20 69 73 20 72 75 6e 20 69 66 20 61 6e 64 20 6f is run if and o
1ba0: 6e 6c 79 20 74 68 65 20 67 72 61 70 68 20 69 73 nly the graph is
1bb0: 20 6e 6f 74 20 65 6d 70 74 79 20 61 6e 64 0a 09 not empty and..
1bc0: 23 20 61 6c 6c 20 6e 6f 64 65 73 20 68 61 76 65 # all nodes have
1bd0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 2e 20 54 predecessors. T
1be0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 65 his means that e
1bf0: 61 63 68 20 6e 6f 64 65 20 69 73 0a 09 23 20 65 ach node is..# e
1c00: 69 74 68 65 72 20 70 61 72 74 20 6f 66 20 61 20 ither part of a
1c10: 63 79 63 6c 65 20 6f 72 20 28 69 6e 64 69 72 65 cycle or (indire
1c20: 63 74 6c 79 29 20 64 65 70 65 6e 64 69 6e 67 20 ctly) depending
1c30: 6f 6e 20 61 20 6e 6f 64 65 0a 09 23 20 69 6e 20 on a node..# in
1c40: 61 20 63 79 63 6c 65 2e 20 57 65 20 63 61 6e 20 a cycle. We can
1c50: 73 74 61 72 74 20 61 74 20 61 6e 20 61 72 62 69 start at an arbi
1c60: 74 72 61 72 79 20 6e 6f 64 65 2c 20 66 6f 6c 6c trary node, foll
1c70: 6f 77 20 69 74 73 0a 09 23 20 69 6e 63 6f 6d 69 ow its..# incomi
1c80: 6e 67 20 65 64 67 65 73 20 74 6f 20 69 74 73 20 ng edges to its
1c90: 70 72 65 64 65 63 65 73 73 6f 72 73 20 75 6e 74 predecessors unt
1ca0: 69 6c 20 77 65 20 73 65 65 20 61 20 6e 6f 64 65 il we see a node
1cb0: 20 61 0a 09 23 20 73 65 63 6f 6e 64 20 74 69 6d a..# second tim
1cc0: 65 2e 20 54 68 61 74 20 6e 6f 64 65 20 63 6c 6f e. That node clo
1cd0: 73 65 73 20 74 68 65 20 63 79 63 6c 65 20 61 6e ses the cycle an
1ce0: 64 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 d the beginning
1cf0: 69 73 0a 09 23 20 69 74 73 20 66 69 72 73 74 20 is..# its first
1d00: 6f 63 63 75 72 65 6e 63 65 2e 20 4e 6f 74 65 20 occurence. Note
1d10: 74 68 61 74 20 77 65 20 63 61 6e 20 63 68 6f 6f that we can choo
1d20: 73 65 20 61 6e 20 61 72 62 69 74 72 61 72 79 0a se an arbitrary.
1d30: 09 23 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f .# predecessor o
1d40: 66 20 65 61 63 68 20 6e 6f 64 65 20 61 73 20 77 f each node as w
1d50: 65 6c 6c 2c 20 77 65 20 64 6f 20 6e 6f 74 20 68 ell, we do not h
1d60: 61 76 65 20 74 6f 20 73 65 61 72 63 68 2e 0a 0a ave to search...
1d70: 09 23 20 57 65 20 72 65 63 6f 72 64 20 66 6f 72 .# We record for
1d80: 20 65 61 63 68 20 6e 6f 64 65 20 74 68 65 20 69 each node the i
1d90: 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 ndex of the firs
1da0: 74 20 61 70 70 65 61 72 61 6e 63 65 20 69 6e 0a t appearance in.
1db0: 09 23 20 74 68 65 20 70 61 74 68 2c 20 6d 61 6b .# the path, mak
1dc0: 69 6e 67 20 69 74 20 65 61 73 79 20 61 74 20 74 ing it easy at t
1dd0: 68 65 20 65 6e 64 20 74 6f 20 63 75 74 20 74 68 he end to cut th
1de0: 65 20 63 79 63 6c 65 20 66 72 6f 6d 0a 09 23 20 e cycle from..#
1df0: 69 74 2e 0a 0a 09 23 20 43 68 6f 6f 73 65 20 61 it....# Choose a
1e00: 72 62 69 74 72 61 72 79 20 6e 6f 64 65 20 74 6f rbitrary node to
1e10: 20 73 74 61 72 74 20 6f 75 72 20 73 65 61 72 63 start our searc
1e20: 68 20 61 74 2e 0a 09 73 65 74 20 73 74 61 72 74 h at...set start
1e30: 20 5b 6c 69 6e 64 65 78 20 5b 24 64 67 20 6e 6f [lindex [$dg no
1e40: 64 65 73 5d 20 30 5d 0a 0a 09 23 20 49 6e 69 74 des] 0]...# Init
1e50: 69 61 6c 69 7a 65 20 73 74 61 74 65 2c 20 70 61 ialize state, pa
1e60: 74 68 20 6f 66 20 73 65 65 6e 20 6e 6f 64 65 73 th of seen nodes
1e70: 2c 20 61 6e 64 20 77 68 65 6e 20 73 65 65 6e 2e , and when seen.
1e80: 0a 09 73 65 74 20 20 20 20 20 20 20 70 61 74 68 ..set path
1e90: 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 73 {}..array set s
1ea0: 65 65 6e 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b een {}...while {
1eb0: 31 7d 20 7b 0a 09 20 20 20 20 23 20 53 74 6f 70 1} {.. # Stop
1ec0: 20 73 65 61 72 63 68 69 6e 67 20 77 68 65 6e 20 searching when
1ed0: 77 65 20 68 61 76 65 20 73 65 65 6e 20 74 68 65 we have seen the
1ee0: 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 0a 09 20 current node..
1ef0: 20 20 20 23 20 61 6c 72 65 61 64 79 2c 20 74 68 # already, th
1f00: 65 20 63 69 72 63 6c 65 20 68 61 73 20 62 65 65 e circle has bee
1f10: 6e 20 63 6c 6f 73 65 64 2e 0a 09 20 20 20 20 69 n closed... i
1f20: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 f {[info exists
1f30: 73 65 65 6e 28 24 73 74 61 72 74 29 5d 7d 20 62 seen($start)]} b
1f40: 72 65 61 6b 0a 09 20 20 20 20 6c 61 70 70 65 6e reak.. lappen
1f50: 64 20 70 61 74 68 20 24 73 74 61 72 74 0a 09 20 d path $start..
1f60: 20 20 20 73 65 74 20 73 65 65 6e 28 24 73 74 61 set seen($sta
1f70: 72 74 29 20 5b 65 78 70 72 20 7b 5b 6c 6c 65 6e rt) [expr {[llen
1f80: 67 74 68 20 24 70 61 74 68 5d 2d 31 7d 5d 0a 09 gth $path]-1}]..
1f90: 20 20 20 20 23 20 43 68 6f 6f 73 65 20 61 72 62 # Choose arb
1fa0: 69 74 72 61 72 79 20 70 72 65 64 65 63 65 73 73 itrary predecess
1fb0: 6f 72 0a 09 20 20 20 20 73 65 74 20 73 74 61 72 or.. set star
1fc0: 74 20 5b 6c 69 6e 64 65 78 20 5b 24 64 67 20 6e t [lindex [$dg n
1fd0: 6f 64 65 73 20 2d 69 6e 20 24 73 74 61 72 74 5d odes -in $start]
1fe0: 20 30 5d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 0]..}...return
1ff0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 72 65 [struct::list re
2000: 76 65 72 73 65 20 5b 6c 72 61 6e 67 65 20 24 70 verse [lrange $p
2010: 61 74 68 20 24 73 65 65 6e 28 24 73 74 61 72 74 ath $seen($start
2020: 29 20 65 6e 64 5d 5d 0a 20 20 20 20 7d 0a 0a 20 ) end]]. }..
2030: 20 20 20 70 72 6f 63 20 49 44 20 7b 63 73 65 74 proc ID {cset
2040: 7d 20 7b 20 72 65 74 75 72 6e 20 22 3c 5b 24 63 } { return "<[$c
2050: 73 65 74 20 69 64 5d 3e 22 20 7d 0a 0a 20 20 20 set id]>" }..
2060: 20 70 72 6f 63 20 42 72 65 61 6b 43 79 63 6c 65 proc BreakCycle
2070: 20 7b 64 67 20 63 79 63 6c 65 7d 20 7b 0a 09 23 {dg cycle} {..#
2080: 20 54 68 65 20 63 79 63 6c 65 20 77 65 20 68 61 The cycle we ha
2090: 76 65 20 67 6f 74 74 65 6e 20 69 73 20 62 72 6f ve gotten is bro
20a0: 6b 65 6e 20 62 79 20 62 72 65 61 6b 69 6e 67 20 ken by breaking
20b0: 61 70 61 72 74 20 6f 6e 65 20 6f 72 0a 09 23 20 apart one or..#
20c0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 63 68 61 6e more of the chan
20d0: 67 65 73 65 74 73 20 69 6e 20 74 68 65 20 63 79 gesets in the cy
20e0: 63 6c 65 2e 20 54 68 69 73 20 63 61 75 73 65 73 cle. This causes
20f0: 20 75 73 20 74 6f 0a 09 23 20 63 72 65 61 74 65 us to..# create
2100: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 68 61 one or more cha
2110: 6e 67 65 73 65 74 73 20 77 68 69 63 68 20 61 72 ngesets which ar
2120: 65 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 e to be committe
2130: 64 2c 0a 09 23 20 61 64 64 65 64 20 74 6f 20 74 d,..# added to t
2140: 68 65 20 67 72 61 70 68 2c 20 65 74 63 2e 20 70 he graph, etc. p
2150: 70 2e 0a 0a 09 73 65 74 20 63 70 72 69 6e 74 20 p....set cprint
2160: 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c [join [struct::l
2170: 69 73 74 20 6d 61 70 20 24 63 79 63 6c 65 20 5b ist map $cycle [
2180: 6d 79 70 72 6f 63 20 49 44 5d 5d 20 7b 20 7d 5d myproc ID]] { }]
2190: 0a 0a 09 6c 61 70 70 65 6e 64 20 63 79 63 6c 65 ...lappend cycle
21a0: 20 5b 6c 69 6e 64 65 78 20 24 63 79 63 6c 65 20 [lindex $cycle
21b0: 30 5d 20 5b 6c 69 6e 64 65 78 20 24 63 79 63 6c 0] [lindex $cycl
21c0: 65 20 31 5d 0a 09 73 65 74 20 62 65 73 74 6c 69 e 1]..set bestli
21d0: 6e 6b 20 7b 7d 0a 09 73 65 74 20 62 65 73 74 6e nk {}..set bestn
21e0: 6f 64 65 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 ode {}...foreach
21f0: 20 5c 0a 09 20 20 20 20 70 72 65 76 20 5b 6c 72 \.. prev [lr
2200: 61 6e 67 65 20 24 63 79 63 6c 65 20 30 20 65 6e ange $cycle 0 en
2210: 64 2d 32 5d 20 5c 0a 09 20 20 20 20 63 73 65 74 d-2] \.. cset
2220: 20 5b 6c 72 61 6e 67 65 20 24 63 79 63 6c 65 20 [lrange $cycle
2230: 31 20 65 6e 64 2d 31 5d 20 5c 0a 09 20 20 20 20 1 end-1] \..
2240: 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 63 79 next [lrange $cy
2250: 63 6c 65 20 32 20 65 6e 64 5d 20 7b 0a 0a 09 09 cle 2 end] {....
2260: 23 20 45 61 63 68 20 74 72 69 70 6c 65 20 50 52 # Each triple PR
2270: 45 56 20 2d 3e 20 43 53 45 54 20 2d 3e 20 4e 45 EV -> CSET -> NE
2280: 58 54 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 XT of changesets
2290: 2c 20 61 0a 09 09 23 20 27 6c 69 6e 6b 27 20 69 , a...# 'link' i
22a0: 6e 20 74 68 65 20 63 79 63 6c 65 2c 20 69 73 20 n the cycle, is
22b0: 61 6e 61 6c 79 73 65 64 20 61 6e 64 20 74 68 65 analysed and the
22c0: 20 62 65 73 74 0a 09 09 23 20 6c 6f 63 61 74 69 best...# locati
22d0: 6f 6e 20 77 68 65 72 65 20 74 6f 20 61 74 20 6c on where to at l
22e0: 65 61 73 74 20 77 65 61 6b 65 6e 20 74 68 65 20 east weaken the
22f0: 63 79 63 6c 65 20 69 73 0a 09 09 23 20 63 68 6f cycle is...# cho
2300: 73 65 6e 20 66 6f 72 20 66 75 72 74 68 65 72 20 sen for further
2310: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 0a 09 09 73 processing.....s
2320: 65 74 20 6c 69 6e 6b 20 5b 70 72 6f 6a 65 63 74 et link [project
2330: 3a 3a 72 65 76 6c 69 6e 6b 20 25 41 55 54 4f 25 ::revlink %AUTO%
2340: 20 24 70 72 65 76 20 24 63 73 65 74 20 24 6e 65 $prev $cset $ne
2350: 78 74 5d 0a 09 09 69 66 20 7b 24 62 65 73 74 6c xt]...if {$bestl
2360: 69 6e 6b 20 65 71 20 22 22 7d 20 7b 0a 09 09 20 ink eq ""} {...
2370: 20 20 20 73 65 74 20 62 65 73 74 6c 69 6e 6b 20 set bestlink
2380: 24 6c 69 6e 6b 0a 09 09 20 20 20 20 73 65 74 20 $link... set
2390: 62 65 73 74 6e 6f 64 65 20 24 63 73 65 74 0a 09 bestnode $cset..
23a0: 09 7d 20 65 6c 73 65 69 66 20 7b 5b 24 6c 69 6e .} elseif {[$lin
23b0: 6b 20 62 65 74 74 65 72 74 68 61 6e 20 24 62 65 k betterthan $be
23c0: 73 74 6c 69 6e 6b 5d 7d 20 7b 0a 09 09 20 20 20 stlink]} {...
23d0: 20 24 62 65 73 74 6c 69 6e 6b 20 64 65 73 74 72 $bestlink destr
23e0: 6f 79 0a 09 09 20 20 20 20 73 65 74 20 62 65 73 oy... set bes
23f0: 74 6c 69 6e 6b 20 24 6c 69 6e 6b 0a 09 09 20 20 tlink $link...
2400: 20 20 73 65 74 20 62 65 73 74 6e 6f 64 65 20 24 set bestnode $
2410: 63 73 65 74 0a 09 09 7d 20 65 6c 73 65 20 7b 0a cset...} else {.
2420: 09 09 20 20 20 20 24 6c 69 6e 6b 20 64 65 73 74 .. $link dest
2430: 72 6f 79 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a roy...}.. }..
2440: 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 79 63 .log write 5 cyc
2450: 6c 65 62 72 65 61 6b 65 72 20 22 42 72 65 61 6b lebreaker "Break
2460: 69 6e 67 20 63 79 63 6c 65 20 28 24 63 70 72 69 ing cycle ($cpri
2470: 6e 74 29 20 62 79 20 73 70 6c 69 74 74 69 6e 67 nt) by splitting
2480: 20 63 68 61 6e 67 65 73 65 74 20 3c 5b 24 62 65 changeset <[$be
2490: 73 74 6e 6f 64 65 20 69 64 5d 3e 22 0a 09 73 65 stnode id]>"..se
24a0: 74 20 49 44 20 5b 24 62 65 73 74 6e 6f 64 65 20 t ID [$bestnode
24b0: 69 64 5d 0a 09 4d 61 72 6b 20 24 64 67 20 2d 24 id]..Mark $dg -$
24c0: 7b 49 44 7d 2d 62 65 66 6f 72 65 0a 0a 09 73 65 {ID}-before...se
24d0: 74 20 6e 65 77 63 73 65 74 73 20 5b 24 62 65 73 t newcsets [$bes
24e0: 74 6c 69 6e 6b 20 62 72 65 61 6b 5d 0a 09 24 62 tlink break]..$b
24f0: 65 73 74 6c 69 6e 6b 20 64 65 73 74 72 6f 79 0a estlink destroy.
2500: 0a 20 20 20 20 20 20 20 20 23 20 41 74 20 74 68 . # At th
2510: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 6f 6c 64 is point the old
2520: 20 63 68 61 6e 67 65 73 65 74 20 28 42 45 53 54 changeset (BEST
2530: 4e 4f 44 45 29 20 69 73 20 67 6f 6e 65 0a 20 20 NODE) is gone.
2540: 20 20 20 20 20 20 23 20 61 6c 72 65 61 64 79 2e # already.
2550: 20 57 65 20 72 65 6d 6f 76 65 20 69 74 20 66 72 We remove it fr
2560: 6f 6d 20 74 68 65 20 67 72 61 70 68 20 61 73 20 om the graph as
2570: 77 65 6c 6c 20 61 6e 64 20 74 68 65 6e 20 65 6e well and then en
2580: 74 65 72 0a 20 20 20 20 20 20 20 20 23 20 74 68 ter. # th
2590: 65 20 66 72 61 67 6d 65 6e 74 73 20 67 65 6e 65 e fragments gene
25a0: 72 61 74 65 64 20 66 6f 72 20 69 74 2e 0a 0a 09 rated for it....
25b0: 52 65 70 6c 61 63 65 20 24 64 67 20 24 62 65 73 Replace $dg $bes
25c0: 74 6e 6f 64 65 20 24 6e 65 77 63 73 65 74 73 0a tnode $newcsets.
25d0: 0a 09 4d 61 72 6b 20 24 64 67 20 2d 24 7b 49 44 ..Mark $dg -${ID
25e0: 7d 2d 61 66 74 65 72 0a 09 72 65 74 75 72 6e 0a }-after..return.
25f0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 54 4f 44 }.. # TOD
2600: 4f 3a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 O: This should b
2610: 65 20 61 20 67 72 61 70 68 20 6d 65 74 68 6f 64 e a graph method
2620: 2e 0a 20 20 20 20 70 72 6f 63 20 48 61 73 41 72 .. proc HasAr
2630: 63 20 7b 64 67 20 61 20 62 7d 20 7b 0a 09 23 38 c {dg a b} {..#8
2640: 2e 35 3a 20 72 65 74 75 72 6e 20 5b 65 78 70 72 .5: return [expr
2650: 20 7b 24 62 20 69 6e 20 5b 24 64 67 20 6e 6f 64 {$b in [$dg nod
2660: 65 73 20 2d 6f 75 74 20 24 61 5d 7d 5d 0a 09 69 es -out $a]}]..i
2670: 66 20 7b 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 f {[lsearch -exa
2680: 63 74 20 5b 24 64 67 20 6e 6f 64 65 73 20 2d 6f ct [$dg nodes -o
2690: 75 74 20 24 61 5d 20 24 62 5d 20 3c 20 30 7d 20 ut $a] $b] < 0}
26a0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 09 72 65 { return 0 }..re
26b0: 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 turn 1. }..
26c0: 20 20 70 72 6f 63 20 4d 61 72 6b 20 7b 64 67 20 proc Mark {dg
26d0: 7b 73 75 66 66 69 78 20 7b 7d 7d 20 7b 73 75 62 {suffix {}} {sub
26e0: 67 72 61 70 68 20 7b 7d 7d 7d 20 7b 0a 09 3a 3a graph {}}} {..::
26f0: 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 64 65 variable mydotde
2700: 73 74 69 6e 61 74 69 6f 6e 0a 09 69 66 20 7b 24 stination..if {$
2710: 6d 79 64 6f 74 64 65 73 74 69 6e 61 74 69 6f 6e mydotdestination
2720: 20 65 71 20 22 22 7d 20 72 65 74 75 72 6e 0a 09 eq ""} return..
2730: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 ::variable mydot
2740: 70 72 65 66 69 78 0a 09 3a 3a 76 61 72 69 61 62 prefix..::variab
2750: 6c 65 20 6d 79 64 6f 74 69 64 0a 09 73 65 74 20 le mydotid..set
2760: 66 6e 61 6d 65 20 24 6d 79 64 6f 74 64 65 73 74 fname $mydotdest
2770: 69 6e 61 74 69 6f 6e 2f 24 7b 6d 79 64 6f 74 70 ination/${mydotp
2780: 72 65 66 69 78 7d 24 7b 6d 79 64 6f 74 69 64 7d refix}${mydotid}
2790: 24 7b 73 75 66 66 69 78 7d 2e 64 6f 74 0a 09 66 ${suffix}.dot..f
27a0: 69 6c 65 20 6d 6b 64 69 72 20 5b 66 69 6c 65 20 ile mkdir [file
27b0: 64 69 72 6e 61 6d 65 20 24 66 6e 61 6d 65 5d 0a dirname $fname].
27c0: 09 64 6f 74 20 77 72 69 74 65 20 24 64 67 20 24 .dot write $dg $
27d0: 6d 79 64 6f 74 70 72 65 66 69 78 24 73 75 66 66 mydotprefix$suff
27e0: 69 78 20 24 66 6e 61 6d 65 20 24 73 75 62 67 72 ix $fname $subgr
27f0: 61 70 68 0a 09 69 6e 63 72 20 6d 79 64 6f 74 69 aph..incr mydoti
2800: 64 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 d...log write 5
2810: 63 79 63 6c 65 62 72 65 61 6b 65 72 20 22 2e 64 cyclebreaker ".d
2820: 6f 74 20 65 78 70 6f 72 74 20 24 66 6e 61 6d 65 ot export $fname
2830: 22 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a "..return. }.
2840: 0a 20 20 20 20 70 72 6f 63 20 52 65 70 6c 61 63 . proc Replac
2850: 65 20 7b 64 67 20 6e 20 72 65 70 6c 61 63 65 6d e {dg n replacem
2860: 65 6e 74 73 7d 20 7b 0a 09 23 20 4e 4f 54 45 2e ents} {..# NOTE.
2870: 20 57 65 20 68 61 76 65 20 74 6f 20 67 65 74 20 We have to get
2880: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 63 6f the list of inco
2890: 6d 69 6e 67 20 6e 65 69 67 68 62 6f 75 72 73 20 ming neighbours
28a0: 61 6e 64 0a 09 23 20 72 65 63 6f 6d 70 75 74 65 and..# recompute
28b0: 20 74 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 their successor
28c0: 73 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 20 s after the new
28d0: 6e 6f 64 65 73 20 68 61 76 65 20 62 65 65 6e 0a nodes have been.
28e0: 09 23 20 69 6e 73 65 72 74 65 64 2e 20 54 68 65 .# inserted. The
28f0: 69 72 20 6f 75 74 67 6f 69 6e 67 20 61 72 63 73 ir outgoing arcs
2900: 20 77 69 6c 6c 20 6e 6f 77 20 67 6f 20 74 6f 20 will now go to
2910: 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 0a 09 one or both of..
2920: 23 20 74 68 65 20 6e 65 77 20 6e 6f 64 65 73 2c # the new nodes,
2930: 20 61 6e 64 20 6e 6f 74 20 72 65 64 6f 69 6e 67 and not redoing
2940: 20 74 68 65 6d 20 6d 61 79 20 63 61 75 73 65 20 them may cause
2950: 75 73 20 74 6f 20 66 6f 72 67 65 74 0a 09 23 20 us to forget..#
2960: 63 69 72 63 6c 65 73 2c 20 6c 65 61 76 69 6e 67 circles, leaving
2970: 20 74 68 65 6d 20 69 6e 2c 20 75 6e 62 72 6f 6b them in, unbrok
2980: 65 6e 2e 0a 0a 09 73 65 74 20 70 72 65 20 5b 24 en....set pre [$
2990: 64 67 20 6e 6f 64 65 73 20 2d 69 6e 20 24 6e 5d dg nodes -in $n]
29a0: 0a 0a 20 20 20 20 20 20 20 20 24 64 67 20 6e 6f .. $dg no
29b0: 64 65 20 64 65 6c 65 74 65 20 24 6e 0a 0a 09 66 de delete $n...f
29c0: 6f 72 65 61 63 68 20 63 73 65 74 20 24 72 65 70 oreach cset $rep
29d0: 6c 61 63 65 6d 65 6e 74 73 20 7b 0a 09 20 20 20 lacements {..
29e0: 20 24 64 67 20 6e 6f 64 65 20 69 6e 73 65 72 74 $dg node insert
29f0: 20 24 63 73 65 74 0a 09 20 20 20 20 24 64 67 20 $cset.. $dg
2a00: 6e 6f 64 65 20 73 65 74 20 20 20 20 24 63 73 65 node set $cse
2a10: 74 20 74 69 6d 65 72 61 6e 67 65 20 5b 24 63 73 t timerange [$cs
2a20: 65 74 20 74 69 6d 65 72 61 6e 67 65 5d 0a 09 7d et timerange]..}
2a30: 0a 0a 09 66 6f 72 65 61 63 68 20 63 73 65 74 20 ...foreach cset
2a40: 24 72 65 70 6c 61 63 65 6d 65 6e 74 73 20 7b 0a $replacements {.
2a50: 09 20 20 20 20 66 6f 72 65 61 63 68 20 73 75 63 . foreach suc
2a60: 63 20 5b 24 63 73 65 74 20 73 75 63 63 65 73 73 c [$cset success
2a70: 6f 72 73 5d 20 7b 0a 09 09 23 20 54 68 65 20 6e ors] {...# The n
2a80: 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 6d 61 ew changesets ma
2a90: 79 20 68 61 76 65 20 64 65 70 65 6e 64 65 6e 63 y have dependenc
2aa0: 69 65 73 20 6f 75 74 73 69 64 65 20 6f 66 0a 09 ies outside of..
2ab0: 09 23 20 74 68 65 20 63 68 6f 73 65 6e 20 73 65 .# the chosen se
2ac0: 74 2e 20 54 68 65 73 65 20 61 72 65 20 69 67 6e t. These are ign
2ad0: 6f 72 65 64 0a 09 09 69 66 20 7b 21 5b 24 64 67 ored...if {![$dg
2ae0: 20 6e 6f 64 65 20 65 78 69 73 74 73 20 24 73 75 node exists $su
2af0: 63 63 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 cc]} continue...
2b00: 24 64 67 20 61 72 63 20 69 6e 73 65 72 74 20 24 $dg arc insert $
2b10: 63 73 65 74 20 24 73 75 63 63 0a 09 20 20 20 20 cset $succ..
2b20: 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 63 73 }..}..foreach cs
2b30: 65 74 20 24 70 72 65 20 7b 0a 09 20 20 20 20 66 et $pre {.. f
2b40: 6f 72 65 61 63 68 20 73 75 63 63 20 5b 24 63 73 oreach succ [$cs
2b50: 65 74 20 73 75 63 63 65 73 73 6f 72 73 5d 20 7b et successors] {
2b60: 0a 09 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 ...# Note that t
2b70: 68 65 20 61 72 63 20 6d 61 79 20 61 6c 72 65 61 he arc may alrea
2b80: 64 79 20 65 78 69 73 74 20 69 6e 20 74 68 65 20 dy exist in the
2b90: 67 72 61 70 68 2e 20 49 66 0a 09 09 23 20 73 6f graph. If...# so
2ba0: 20 69 67 6e 6f 72 65 20 69 74 2e 20 54 68 65 20 ignore it. The
2bb0: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 6d new changesets m
2bc0: 61 79 20 68 61 76 65 0a 09 09 23 20 64 65 70 65 ay have...# depe
2bd0: 6e 64 65 6e 63 69 65 73 20 6f 75 74 73 69 64 65 ndencies outside
2be0: 20 6f 66 20 74 68 65 20 63 68 6f 73 65 6e 20 73 of the chosen s
2bf0: 65 74 2e 20 54 68 65 73 65 20 61 72 65 0a 09 09 et. These are...
2c00: 23 20 69 67 6e 6f 72 65 64 0a 09 09 69 66 20 7b # ignored...if {
2c10: 21 5b 24 64 67 20 6e 6f 64 65 20 65 78 69 73 74 ![$dg node exist
2c20: 73 20 24 73 75 63 63 5d 7d 20 63 6f 6e 74 69 6e s $succ]} contin
2c30: 75 65 0a 09 09 69 66 20 7b 5b 48 61 73 41 72 63 ue...if {[HasArc
2c40: 20 24 64 67 20 24 63 73 65 74 20 24 73 75 63 63 $dg $cset $succ
2c50: 5d 7d 20 63 6f 6e 74 69 6e 75 65 3b 23 20 54 4f ]} continue;# TO
2c60: 44 4f 20 73 68 6f 75 6c 64 20 62 65 20 67 72 61 DO should be gra
2c70: 70 68 20 6d 65 74 68 6f 64 2e 0a 09 09 24 64 67 ph method....$dg
2c80: 20 61 72 63 20 69 6e 73 65 72 74 20 24 63 73 65 arc insert $cse
2c90: 74 20 24 73 75 63 63 0a 09 20 20 20 20 7d 0a 09 t $succ.. }..
2ca0: 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d }...return. }
2cb0: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
2cc0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
2cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 #############.
2ce0: 20 20 23 23 20 43 61 6c 6c 62 61 63 6b 20 69 6e ## Callback in
2cf0: 76 6f 6b 61 74 69 6f 6e 20 2e 2e 2e 0a 0a 20 20 vokation .....
2d00: 20 20 70 72 6f 63 20 50 72 65 48 6f 6f 6b 20 7b proc PreHook {
2d10: 67 72 61 70 68 7d 20 7b 0a 09 23 20 47 69 76 65 graph} {..# Give
2d20: 20 74 68 65 20 75 73 65 72 20 6f 66 20 74 68 65 the user of the
2d30: 20 63 79 63 6c 65 20 62 72 65 61 6b 65 72 20 74 cycle breaker t
2d40: 68 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 he opportunity t
2d50: 6f 20 77 6f 72 6b 0a 09 23 20 77 69 74 68 20 74 o work..# with t
2d60: 68 65 20 67 72 61 70 68 20 62 65 74 77 65 65 6e he graph between
2d70: 20 73 65 74 75 70 20 61 6e 64 20 63 6f 6e 73 75 setup and consu
2d80: 6d 6d 61 74 69 6f 6e 2e 0a 0a 09 3a 3a 76 61 72 mmation....::var
2d90: 69 61 62 6c 65 20 6d 79 70 72 65 63 6d 64 0a 09 iable myprecmd..
2da0: 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6d if {![llength $m
2db0: 79 70 72 65 63 6d 64 5d 7d 20 72 65 74 75 72 6e yprecmd]} return
2dc0: 0a 0a 09 75 70 6c 65 76 65 6c 20 23 30 20 5b 6c ...uplevel #0 [l
2dd0: 69 6e 73 65 72 74 20 24 6d 79 70 72 65 63 6d 64 insert $myprecmd
2de0: 20 65 6e 64 20 24 67 72 61 70 68 5d 0a 09 4d 61 end $graph]..Ma
2df0: 72 6b 20 24 67 72 61 70 68 20 2d 70 72 65 2d 64 rk $graph -pre-d
2e00: 6f 6e 65 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 one..return.
2e10: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 72 6f 63 }.. proc Proc
2e20: 65 73 73 65 64 48 6f 6f 6b 20 7b 64 67 20 63 73 essedHook {dg cs
2e30: 65 74 20 70 6f 73 7d 20 7b 0a 09 23 20 47 69 76 et pos} {..# Giv
2e40: 65 20 74 68 65 20 75 73 65 72 20 6f 66 20 74 68 e the user of th
2e50: 65 20 63 79 63 6c 65 20 62 72 65 61 6b 65 72 20 e cycle breaker
2e60: 74 68 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 the opportunity
2e70: 74 6f 20 77 6f 72 6b 0a 09 23 20 77 69 74 68 20 to work..# with
2e80: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 62 65 the changeset be
2e90: 66 6f 72 65 20 69 74 20 69 73 20 72 65 6d 6f 76 fore it is remov
2ea0: 65 64 20 66 72 6f 6d 20 74 68 65 20 67 72 61 70 ed from the grap
2eb0: 68 2e 0a 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 h....::variable
2ec0: 6d 79 73 61 76 65 63 6d 64 0a 09 69 66 20 7b 21 mysavecmd..if {!
2ed0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 73 61 76 65 [llength $mysave
2ee0: 63 6d 64 5d 7d 20 72 65 74 75 72 6e 0a 0a 09 75 cmd]} return...u
2ef0: 70 6c 65 76 65 6c 20 23 30 20 5b 6c 69 6e 73 65 plevel #0 [linse
2f00: 72 74 20 24 6d 79 73 61 76 65 63 6d 64 20 65 6e rt $mysavecmd en
2f10: 64 20 24 64 67 20 24 70 6f 73 20 24 63 73 65 74 d $dg $pos $cset
2f20: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a ]..return. }.
2f30: 0a 20 20 20 20 70 72 6f 63 20 42 72 65 61 6b 43 . proc BreakC
2f40: 79 63 6c 65 48 6f 6f 6b 20 7b 67 72 61 70 68 7d ycleHook {graph}
2f50: 20 7b 0a 09 23 20 43 61 6c 6c 20 6f 75 74 20 74 {..# Call out t
2f60: 6f 20 74 68 65 20 63 68 6f 73 65 6e 20 61 6c 67 o the chosen alg
2f70: 6f 72 69 74 68 6d 20 66 6f 72 20 63 79 63 6c 65 orithm for cycle
2f80: 20 62 72 65 61 6b 69 6e 67 2e 20 46 69 6e 64 69 breaking. Findi
2f90: 6e 67 0a 09 23 20 61 20 63 79 63 6c 65 20 69 66 ng..# a cycle if
2fa0: 20 6e 6f 20 62 72 65 61 6b 65 72 20 77 61 73 20 no breaker was
2fb0: 63 68 6f 73 65 6e 20 69 73 20 61 6e 20 65 72 72 chosen is an err
2fc0: 6f 72 2e 0a 0a 09 3a 3a 76 61 72 69 61 62 6c 65 or....::variable
2fd0: 20 6d 79 62 72 65 61 6b 63 6d 64 0a 09 69 66 20 mybreakcmd..if
2fe0: 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 62 72 {![llength $mybr
2ff0: 65 61 6b 63 6d 64 5d 7d 20 7b 0a 09 20 20 20 20 eakcmd]} {..
3000: 74 72 6f 75 62 6c 65 20 66 61 74 61 6c 20 22 46 trouble fatal "F
3010: 6f 75 6e 64 20 61 20 63 79 63 6c 65 2c 20 65 78 ound a cycle, ex
3020: 70 65 63 74 69 6e 67 20 6e 6f 6e 65 2e 22 0a 09 pecting none."..
3030: 20 20 20 20 65 78 69 74 20 31 0a 09 7d 0a 0a 09 exit 1..}...
3040: 75 70 6c 65 76 65 6c 20 23 30 20 5b 6c 69 6e 73 uplevel #0 [lins
3050: 65 72 74 20 24 6d 79 62 72 65 61 6b 63 6d 64 20 ert $mybreakcmd
3060: 65 6e 64 20 24 67 72 61 70 68 5d 0a 09 72 65 74 end $graph]..ret
3070: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
3080: 72 6f 63 20 43 6c 65 61 72 48 6f 6f 6b 73 20 7b roc ClearHooks {
3090: 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 } {..::variable
30a0: 6d 79 70 72 65 63 6d 64 20 20 20 7b 7d 0a 09 3a myprecmd {}..:
30b0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 73 61 76 65 :variable mysave
30c0: 63 6d 64 20 20 7b 7d 0a 09 3a 3a 76 61 72 69 61 cmd {}..::varia
30d0: 62 6c 65 20 6d 79 62 72 65 61 6b 63 6d 64 20 7b ble mybreakcmd {
30e0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a }..return. }.
30f0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 . # # ## ###
3100: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 ##### ######## #
3110: 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 ############..
3120: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d typevariable m
3130: 79 61 74 20 20 20 20 20 20 30 20 3b 20 23 20 43 yat 0 ; # C
3140: 6f 75 6e 74 65 72 20 66 6f 72 20 63 6f 6d 6d 69 ounter for commi
3150: 74 20 69 64 73 20 66 6f 72 20 74 68 65 0a 09 09 t ids for the...
3160: 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 . # change
3170: 73 65 74 73 2e 0a 20 20 20 20 74 79 70 65 76 61 sets.. typeva
3180: 72 69 61 62 6c 65 20 6d 79 62 6f 74 74 6f 6d 20 riable mybottom
3190: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74 {} ; # List of t
31a0: 68 65 20 63 61 6e 64 69 64 61 74 65 20 6e 6f 64 he candidate nod
31b0: 65 73 20 66 6f 72 0a 09 09 09 20 20 20 20 20 20 es for....
31c0: 20 23 20 63 6f 6d 6d 69 74 74 69 6e 67 2e 0a 0a # committing...
31d0: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 typevariable
31e0: 20 6d 79 70 72 65 63 6d 64 20 20 20 7b 7d 20 3b myprecmd {} ;
31f0: 20 23 20 43 61 6c 6c 62 61 63 6b 2c 20 63 68 61 # Callback, cha
3200: 6e 67 65 20 67 72 61 70 68 20 62 65 66 6f 72 65 nge graph before
3210: 20 77 61 6c 6b 2e 0a 20 20 20 20 74 79 70 65 76 walk.. typev
3220: 61 72 69 61 62 6c 65 20 6d 79 73 61 76 65 63 6d ariable mysavecm
3230: 64 20 20 7b 7d 20 3b 20 23 20 43 61 6c 6c 62 61 d {} ; # Callba
3240: 63 6b 2c 20 66 6f 72 20 65 61 63 68 20 70 72 6f ck, for each pro
3250: 63 65 73 73 65 64 20 6e 6f 64 65 2e 0a 20 20 20 cessed node..
3260: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 typevariable my
3270: 62 72 65 61 6b 63 6d 64 20 7b 7d 20 3b 20 23 20 breakcmd {} ; #
3280: 43 61 6c 6c 62 61 63 6b 2c 20 66 6f 72 20 65 61 Callback, for ea
3290: 63 68 20 66 6f 75 6e 64 20 63 79 63 6c 65 2e 0a ch found cycle..
32a0: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
32b0: 65 20 6d 79 64 6f 74 64 65 73 74 69 6e 61 74 69 e mydotdestinati
32c0: 6f 6e 20 7b 7d 20 3b 20 23 20 44 65 73 74 69 6e on {} ; # Destin
32d0: 61 74 69 6f 6e 20 64 69 72 65 63 74 6f 72 79 20 ation directory
32e0: 66 6f 72 20 74 68 65 0a 09 09 09 09 20 20 20 20 for the.....
32f0: 20 20 20 23 20 67 65 6e 65 72 61 74 65 64 20 2e # generated .
3300: 64 6f 74 20 66 69 6c 65 73 2e 0a 20 20 20 20 74 dot files.. t
3310: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 64 6f ypevariable mydo
3320: 74 70 72 65 66 69 78 20 20 20 20 20 20 7b 7d 20 tprefix {}
3330: 3b 20 23 20 50 72 65 66 69 78 20 66 6f 72 20 64 ; # Prefix for d
3340: 6f 74 20 66 69 6c 65 73 20 77 68 65 6e 0a 09 09 ot files when...
3350: 09 09 20 20 20 20 20 20 20 23 20 65 78 70 6f 72 .. # expor
3360: 74 69 6e 67 20 74 68 65 20 67 72 61 70 68 73 2e ting the graphs.
3370: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
3380: 65 20 6d 79 64 6f 74 69 64 20 20 20 20 20 20 20 e mydotid
3390: 20 20 20 20 30 20 3b 20 23 20 43 6f 75 6e 74 65 0 ; # Counte
33a0: 72 20 66 6f 72 20 64 6f 74 20 66 69 6c 65 20 6e r for dot file n
33b0: 61 6d 65 0a 09 09 09 09 20 20 20 20 20 20 20 23 ame..... #
33c0: 20 67 65 6e 65 72 61 74 69 6f 6e 2e 0a 0a 20 20 generation...
33d0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
33e0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
33f0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ##
3400: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a Configuration..
3410: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 pragma -hasi
3420: 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 nstances no ;
3430: 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 # singleton.
3440: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 pragma -hastypei
3450: 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f nfo no ; # no
3460: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 introspection.
3470: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 pragma -hasty
3480: 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 pedestroy no ; #
3490: 20 69 6d 6d 6f 72 74 61 6c 0a 0a 20 20 20 20 23 immortal.. #
34a0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
34b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
34c0: 23 23 23 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 ######.}..namesp
34d0: 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 ace eval ::vc::f
34e0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
34f0: 76 73 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 vs {. namespa
3500: 63 65 20 65 78 70 6f 72 74 20 63 79 63 6c 65 62 ce export cycleb
3510: 72 65 61 6b 65 72 0a 20 20 20 20 6e 61 6d 65 73 reaker. names
3520: 70 61 63 65 20 65 76 61 6c 20 63 79 63 6c 65 62 pace eval cycleb
3530: 72 65 61 6b 65 72 20 7b 0a 09 6e 61 6d 65 73 70 reaker {..namesp
3540: 61 63 65 20 65 76 61 6c 20 70 72 6f 6a 65 63 74 ace eval project
3550: 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 {.. namespac
3560: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 e import ::vc::f
3570: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
3580: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 vs::project::rev
3590: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 .. namespace
35a0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 import ::vc::fos
35b0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
35c0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 6c 69 ::project::revli
35d0: 6e 6b 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 nk..}..namespace
35e0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f import ::vc::to
35f0: 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 ols::misc::*..na
3600: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
3610: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a :vc::tools::log.
3620: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 .namespace impor
3630: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 t ::vc::tools::t
3640: 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 rouble..namespac
3650: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 e import ::vc::t
3660: 6f 6f 6c 73 3a 3a 64 6f 74 0a 09 6c 6f 67 20 72 ools::dot..log r
3670: 65 67 69 73 74 65 72 20 63 79 63 6c 65 62 72 65 egister cyclebre
3680: 61 6b 65 72 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 aker. }.}..#
3690: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
36a0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
36b0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
36c0: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 ###########.## R
36d0: 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 eady..package pr
36e0: 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c ovide vc::fossil
36f0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 63 ::import::cvs::c
3700: 79 63 6c 65 62 72 65 61 6b 65 72 20 31 2e 30 0a yclebreaker 1.0.
3710: 72 65 74 75 72 6e 0a return.