Hex Artifact Content
Not logged in

Artifact c1b1baf75a8fe079500c46028c9963855d490dec:

File tools/cvs2fossil/lib/c2f_cyclebreaker.tcl part of check-in [41d41c7b57] - Added progress output to the code loading up the graph to traverse, nodes, and arcs. by aku on 2007-12-02 03:41:33.

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 70 61 63 6b 61 67 65 20 72 65 71 75  ks..package requ
0600: 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  ire vc::fossil::
0610: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74  import::cvs::int
0620: 65 67 72 69 74 79 20 20 20 20 20 20 20 20 3b 20  egrity        ; 
0630: 23 20 53 74 61 74 65 20 69 6e 74 65 67 72 69 74  # State integrit
0640: 79 20 63 68 65 63 6b 73 2e 0a 0a 23 20 23 20 23  y checks...# # #
0650: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
0660: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
0670: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
0680: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 73 6e 69  ########.##..sni
0690: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
06a0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
06b0: 73 3a 3a 63 79 63 6c 65 62 72 65 61 6b 65 72 20  s::cyclebreaker 
06c0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  {.    # # ## ###
06d0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
06e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
06f0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a    ## Public API.
0700: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
0710: 70 72 65 63 6d 64 20 7b 63 6d 64 7d 20 7b 0a 09  precmd {cmd} {..
0720: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65  ::variable mypre
0730: 63 6d 64 20 24 63 6d 64 0a 09 72 65 74 75 72 6e  cmd $cmd..return
0740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65  .    }..    type
0750: 6d 65 74 68 6f 64 20 73 61 76 65 63 6d 64 20 7b  method savecmd {
0760: 63 6d 64 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62  cmd} {..::variab
0770: 6c 65 20 6d 79 73 61 76 65 63 6d 64 20 24 63 6d  le mysavecmd $cm
0780: 64 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  d..return.    }.
0790: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
07a0: 62 72 65 61 6b 63 6d 64 20 7b 63 6d 64 7d 20 7b  breakcmd {cmd} {
07b0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62  ..::variable myb
07c0: 72 65 61 6b 63 6d 64 20 24 63 6d 64 0a 09 72 65  reakcmd $cmd..re
07d0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
07e0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
07f0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
0800: 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 70  #######..    typ
0810: 65 6d 65 74 68 6f 64 20 64 6f 74 73 74 6f 20 7b  emethod dotsto {
0820: 70 61 74 68 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  path} {..::varia
0830: 62 6c 65 20 6d 79 64 6f 74 64 65 73 74 69 6e 61  ble mydotdestina
0840: 74 69 6f 6e 20 24 70 61 74 68 0a 09 72 65 74 75  tion $path..retu
0850: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79  rn.    }..    ty
0860: 70 65 6d 65 74 68 6f 64 20 77 61 74 63 68 20 7b  pemethod watch {
0870: 69 64 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c  id} {..::variabl
0880: 65 20 6d 79 77 61 74 63 68 69 64 73 0a 09 6c 61  e mywatchids..la
0890: 70 70 65 6e 64 20 6d 79 77 61 74 63 68 69 64 73  ppend mywatchids
08a0: 20 24 69 64 0a 20 20 20 20 7d 0a 0a 20 20 20 20   $id.    }..    
08b0: 74 79 70 65 6d 65 74 68 6f 64 20 64 6f 74 20 7b  typemethod dot {
08c0: 6c 61 62 65 6c 20 63 68 61 6e 67 65 73 65 74 73  label changesets
08d0: 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20  } {..::variable 
08e0: 6d 79 64 6f 74 70 72 65 66 69 78 20 24 6c 61 62  mydotprefix $lab
08f0: 65 6c 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d  el..::variable m
0900: 79 64 6f 74 69 64 20 20 20 20 20 30 0a 0a 09 73  ydotid     0...s
0910: 65 74 20 64 67 20 5b 53 65 74 75 70 20 24 63 68  et dg [Setup $ch
0920: 61 6e 67 65 73 65 74 73 20 30 5d 0a 09 4d 61 72  angesets 0]..Mar
0930: 6b 20 24 64 67 0a 09 24 64 67 20 64 65 73 74 72  k $dg..$dg destr
0940: 6f 79 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  oy..return.    }
0950: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
0960: 20 6d 61 72 6b 20 7b 67 72 61 70 68 20 73 75 66   mark {graph suf
0970: 66 69 78 20 7b 73 75 62 67 72 61 70 68 20 7b 7d  fix {subgraph {}
0980: 7d 7d 20 7b 0a 09 4d 61 72 6b 20 24 67 72 61 70  }} {..Mark $grap
0990: 68 20 24 73 75 66 66 69 78 20 24 73 75 62 67 72  h $suffix $subgr
09a0: 61 70 68 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  aph..return.    
09b0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
09c0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
09d0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
09e0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 72      typemethod r
09f0: 75 6e 20 7b 6c 61 62 65 6c 20 63 68 61 6e 67 65  un {label change
0a00: 73 65 74 63 6d 64 7d 20 7b 0a 09 3a 3a 76 61 72  setcmd} {..::var
0a10: 69 61 62 6c 65 20 6d 79 61 74 20 20 20 20 20 20  iable myat      
0a20: 20 20 30 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20    0..::variable 
0a30: 6d 79 64 6f 74 70 72 65 66 69 78 20 24 6c 61 62  mydotprefix $lab
0a40: 65 6c 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d  el..::variable m
0a50: 79 64 6f 74 69 64 20 20 20 20 20 30 0a 0a 09 23  ydotid     0...#
0a60: 20 57 65 20 63 72 65 61 74 65 20 61 20 67 72 61   We create a gra
0a70: 70 68 20 6f 66 20 74 68 65 20 72 65 76 69 73 69  ph of the revisi
0a80: 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 2c 20 75  on changesets, u
0a90: 73 69 6e 67 20 74 68 65 20 66 69 6c 65 0a 09 23  sing the file..#
0aa0: 20 6c 65 76 65 6c 20 64 65 70 65 6e 64 65 6e 63   level dependenc
0ab0: 69 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ies to construct
0ac0: 20 61 20 66 69 72 73 74 20 61 70 70 72 6f 78 69   a first approxi
0ad0: 6d 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 09 23  mation of the..#
0ae0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 74   dependencies at
0af0: 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6c 65 76   the project lev
0b00: 65 6c 2e 20 54 68 65 6e 20 77 65 20 6c 6f 6f 6b  el. Then we look
0b10: 20 66 6f 72 20 63 79 63 6c 65 73 0a 09 23 20 69   for cycles..# i
0b20: 6e 20 74 68 61 74 20 67 72 61 70 68 20 61 6e 64  n that graph and
0b30: 20 62 72 65 61 6b 20 74 68 65 6d 2e 0a 0a 09 23   break them....#
0b40: 20 31 2e 20 43 72 65 61 74 65 20 6e 6f 64 65 73   1. Create nodes
0b50: 20 66 6f 72 20 61 6c 6c 20 72 65 6c 65 76 61 6e   for all relevan
0b60: 74 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64  t changesets and
0b70: 20 61 20 6d 61 70 70 69 6e 67 0a 09 23 20 20 20   a mapping..#   
0b80: 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69   from the revisi
0b90: 6f 6e 73 20 74 6f 20 74 68 65 69 72 20 63 68 61  ons to their cha
0ba0: 6e 67 65 73 65 74 73 2f 6e 6f 64 65 73 2e 0a 0a  ngesets/nodes...
0bb0: 09 73 65 74 20 63 68 61 6e 67 65 73 65 74 73 20  .set changesets 
0bc0: 5b 75 70 6c 65 76 65 6c 20 23 30 20 24 63 68 61  [uplevel #0 $cha
0bd0: 6e 67 65 73 65 74 63 6d 64 5d 0a 09 73 65 74 20  ngesetcmd]..set 
0be0: 64 67 20 5b 53 65 74 75 70 20 24 63 68 61 6e 67  dg [Setup $chang
0bf0: 65 73 65 74 73 5d 0a 0a 09 23 20 33 2e 20 4c 61  esets]...# 3. La
0c00: 73 74 6c 79 20 77 65 20 69 74 65 72 61 74 65 20  stly we iterate 
0c10: 74 68 65 20 67 72 61 70 68 20 74 6f 70 6f 6c 6f  the graph topolo
0c20: 67 69 63 61 6c 6c 79 2e 20 57 65 20 6d 61 72 6b  gically. We mark
0c30: 20 6f 66 66 0a 09 23 20 20 20 20 74 68 65 20 6e   off..#    the n
0c40: 6f 64 65 73 20 77 68 69 63 68 20 68 61 76 65 20  odes which have 
0c50: 6e 6f 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c  no predecessors,
0c60: 20 69 6e 20 6f 72 64 65 72 20 66 72 6f 6d 0a 09   in order from..
0c70: 23 20 20 20 20 6f 6c 64 65 73 74 20 74 6f 20 79  #    oldest to y
0c80: 6f 75 6e 67 65 73 74 2c 20 73 61 76 69 6e 67 20  oungest, saving 
0c90: 61 6e 64 20 72 65 6d 6f 76 69 6e 67 20 64 65 70  and removing dep
0ca0: 65 6e 64 65 6e 63 69 65 73 2e 20 49 66 0a 09 23  endencies. If..#
0cb0: 20 20 20 20 77 65 20 66 69 6e 64 20 6e 6f 20 6e      we find no n
0cc0: 6f 64 65 73 20 77 69 74 68 6f 75 74 20 70 72 65  odes without pre
0cd0: 64 65 63 65 73 73 6f 72 73 20 77 65 20 68 61 76  decessors we hav
0ce0: 65 20 61 20 63 79 63 6c 65 2c 0a 09 23 20 20 20  e a cycle,..#   
0cf0: 20 61 6e 64 20 77 6f 72 6b 20 6f 6e 20 62 72 65   and work on bre
0d00: 61 6b 69 6e 67 20 69 74 2e 0a 0a 09 6c 6f 67 20  aking it....log 
0d10: 77 72 69 74 65 20 33 20 63 79 63 6c 65 62 72 65  write 3 cyclebre
0d20: 61 6b 65 72 20 7b 54 72 61 76 65 72 73 65 20 63  aker {Traverse c
0d30: 68 61 6e 67 65 73 65 74 73 7d 0a 0a 09 49 6e 69  hangesets}...Ini
0d40: 74 69 61 6c 69 7a 65 43 61 6e 64 69 64 61 74 65  tializeCandidate
0d50: 73 20 24 64 67 0a 09 77 68 69 6c 65 20 7b 31 7d  s $dg..while {1}
0d60: 20 7b 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 5b   {..    while {[
0d70: 57 69 74 68 6f 75 74 50 72 65 64 65 63 65 73 73  WithoutPredecess
0d80: 6f 72 20 24 64 67 20 6e 5d 7d 20 7b 0a 09 09 4d  or $dg n]} {...M
0d90: 61 72 6b 57 61 74 63 68 20 24 64 67 0a 09 09 50  arkWatch $dg...P
0da0: 72 6f 63 65 73 73 65 64 48 6f 6f 6b 20 24 64 67  rocessedHook $dg
0db0: 20 24 6e 20 24 6d 79 61 74 0a 09 09 24 64 67 20   $n $myat...$dg 
0dc0: 6e 6f 64 65 20 64 65 6c 65 74 65 20 24 6e 0a 09  node delete $n..
0dd0: 09 69 6e 63 72 20 6d 79 61 74 0a 09 09 53 68 6f  .incr myat...Sho
0de0: 77 50 65 6e 64 69 6e 67 4e 6f 64 65 73 0a 09 20  wPendingNodes.. 
0df0: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 7b 21     }...    if {!
0e00: 5b 6c 6c 65 6e 67 74 68 20 5b 64 67 20 6e 6f 64  [llength [dg nod
0e10: 65 73 5d 5d 7d 20 62 72 65 61 6b 0a 0a 09 20 20  es]]} break...  
0e20: 20 20 42 72 65 61 6b 43 79 63 6c 65 48 6f 6f 6b    BreakCycleHook
0e30: 20 20 20 20 20 20 20 24 64 67 0a 09 20 20 20 20         $dg..    
0e40: 49 6e 69 74 69 61 6c 69 7a 65 43 61 6e 64 69 64  InitializeCandid
0e50: 61 74 65 73 20 24 64 67 0a 09 20 20 20 20 4d 61  ates $dg..    Ma
0e60: 72 6b 57 61 74 63 68 20 20 20 20 20 20 20 20 20  rkWatch         
0e70: 20 20 20 24 64 67 0a 09 7d 0a 0a 09 24 64 67 20     $dg..}...$dg 
0e80: 64 65 73 74 72 6f 79 0a 0a 09 6c 6f 67 20 77 72  destroy...log wr
0e90: 69 74 65 20 33 20 63 79 63 6c 65 62 72 65 61 6b  ite 3 cyclebreak
0ea0: 65 72 20 44 6f 6e 65 2e 0a 09 43 6c 65 61 72 48  er Done...ClearH
0eb0: 6f 6f 6b 73 0a 0a 09 23 20 52 65 72 65 61 64 20  ooks...# Reread 
0ec0: 74 68 65 20 67 72 61 70 68 20 61 6e 64 20 64 75  the graph and du
0ed0: 6d 70 20 69 74 73 20 66 69 6e 61 6c 20 66 6f 72  mp its final for
0ee0: 6d 2c 20 69 66 20 67 72 61 70 68 20 65 78 70 6f  m, if graph expo
0ef0: 72 74 0a 09 23 20 77 61 73 20 61 63 74 69 76 61  rt..# was activa
0f00: 74 65 64 2e 0a 0a 09 3a 3a 76 61 72 69 61 62 6c  ted....::variabl
0f10: 65 20 6d 79 64 6f 74 64 65 73 74 69 6e 61 74 69  e mydotdestinati
0f20: 6f 6e 0a 09 69 66 20 7b 24 6d 79 64 6f 74 64 65  on..if {$mydotde
0f30: 73 74 69 6e 61 74 69 6f 6e 20 65 71 20 22 22 7d  stination eq ""}
0f40: 20 72 65 74 75 72 6e 0a 0a 09 73 65 74 20 20 20   return...set   
0f50: 64 67 20 5b 53 65 74 75 70 20 5b 75 70 6c 65 76  dg [Setup [uplev
0f60: 65 6c 20 23 30 20 24 63 68 61 6e 67 65 73 65 74  el #0 $changeset
0f70: 63 6d 64 5d 20 30 5d 0a 09 4d 61 72 6b 20 24 64  cmd] 0]..Mark $d
0f80: 67 20 2d 64 6f 6e 65 0a 09 24 64 67 20 64 65 73  g -done..$dg des
0f90: 74 72 6f 79 0a 09 72 65 74 75 72 6e 0a 20 20 20  troy..return.   
0fa0: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23   }..    # # ## #
0fb0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
0fc0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
0fd0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
0fe0: 62 72 65 61 6b 2d 73 65 67 6d 65 6e 74 20 7b 67  break-segment {g
0ff0: 72 61 70 68 7d 20 7b 0a 09 42 72 65 61 6b 53 65  raph} {..BreakSe
1000: 67 6d 65 6e 74 20 24 67 72 61 70 68 20 24 70 61  gment $graph $pa
1010: 74 68 20 22 73 65 67 6d 65 6e 74 20 28 5b 70 72  th "segment ([pr
1020: 6f 6a 65 63 74 3a 3a 72 65 76 20 73 74 72 6c 69  oject::rev strli
1030: 73 74 20 24 70 61 74 68 5d 29 22 0a 09 72 65 74  st $path])"..ret
1040: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  urn.    }..    t
1050: 79 70 65 6d 65 74 68 6f 64 20 62 72 65 61 6b 20  ypemethod break 
1060: 7b 67 72 61 70 68 7d 20 7b 0a 09 73 65 74 20 63  {graph} {..set c
1070: 79 63 6c 65 20 5b 46 69 6e 64 43 79 63 6c 65 20  ycle [FindCycle 
1080: 24 67 72 61 70 68 5d 0a 09 73 65 74 20 6c 61 62  $graph]..set lab
1090: 65 6c 20 22 63 79 63 6c 65 20 28 5b 70 72 6f 6a  el "cycle ([proj
10a0: 65 63 74 3a 3a 72 65 76 20 73 74 72 6c 69 73 74  ect::rev strlist
10b0: 20 24 63 79 63 6c 65 5d 29 22 0a 0a 09 23 20 4e   $cycle])"...# N
10c0: 4f 54 45 3a 20 63 76 73 32 73 76 6e 20 75 73 65  OTE: cvs2svn use
10d0: 73 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 22  s the sequence "
10e0: 65 6e 64 2d 31 2c 20 63 79 63 6c 65 2c 20 30 22  end-1, cycle, 0"
10f0: 20 74 6f 20 63 72 65 61 74 65 0a 09 23 20 20 20   to create..#   
1100: 20 20 20 20 74 68 65 20 70 61 74 68 20 66 72 6f      the path fro
1110: 6d 20 74 68 65 20 63 79 63 6c 65 2e 20 54 68 65  m the cycle. The
1120: 20 6f 6e 6c 79 20 65 66 66 65 63 74 20 49 20 63   only effect I c
1130: 61 6e 20 73 65 65 20 69 73 0a 09 23 20 20 20 20  an see is..#    
1140: 20 20 20 74 68 61 74 20 74 68 69 73 20 63 61 75     that this cau
1150: 73 65 73 20 74 68 65 20 6c 69 6e 6b 2d 74 72 69  ses the link-tri
1160: 70 6c 65 73 20 74 6f 20 62 65 20 67 65 6e 65 72  ples to be gener
1170: 61 74 65 64 20 69 6e 20 61 0a 09 23 20 20 20 20  ated in a..#    
1180: 20 20 20 73 69 67 68 74 6c 79 20 64 69 66 66 65     sightly diffe
1190: 72 65 6e 74 20 6f 72 64 65 72 2c 20 69 2e 65 2e  rent order, i.e.
11a0: 20 6f 6e 65 20 6c 69 6e 6b 20 72 6f 74 61 74 65   one link rotate
11b0: 64 20 74 6f 20 74 68 65 0a 09 23 20 20 20 20 20  d to the..#     
11c0: 20 20 72 69 67 68 74 2e 20 54 68 69 73 20 73 68    right. This sh
11d0: 6f 75 6c 64 20 68 61 76 65 20 6e 6f 20 65 66 66  ould have no eff
11e0: 65 63 74 20 6f 6e 20 74 68 65 20 73 65 61 72 63  ect on the searc
11f0: 68 20 66 6f 72 0a 09 23 20 20 20 20 20 20 20 74  h for..#       t
1200: 68 65 20 62 65 73 74 20 6f 66 20 61 6c 6c 2e 0a  he best of all..
1210: 0a 09 6c 61 70 70 65 6e 64 20 63 79 63 6c 65 20  ..lappend cycle 
1220: 5b 6c 69 6e 64 65 78 20 24 63 79 63 6c 65 20 30  [lindex $cycle 0
1230: 5d 20 5b 6c 69 6e 64 65 78 20 24 63 79 63 6c 65  ] [lindex $cycle
1240: 20 31 5d 0a 09 42 72 65 61 6b 53 65 67 6d 65 6e   1]..BreakSegmen
1250: 74 20 24 67 72 61 70 68 20 24 63 79 63 6c 65 20  t $graph $cycle 
1260: 24 6c 61 62 65 6c 0a 09 72 65 74 75 72 6e 0a 20  $label..return. 
1270: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
1280: 74 68 6f 64 20 72 65 70 6c 61 63 65 20 7b 67 72  thod replace {gr
1290: 61 70 68 20 6e 20 72 65 70 6c 61 63 65 6d 65 6e  aph n replacemen
12a0: 74 73 7d 20 7b 0a 09 52 65 70 6c 61 63 65 20 24  ts} {..Replace $
12b0: 67 72 61 70 68 20 24 6e 20 24 72 65 70 6c 61 63  graph $n $replac
12c0: 65 6d 65 6e 74 73 0a 09 72 65 74 75 72 6e 0a 20  ements..return. 
12d0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23     }..    # # ##
12e0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
12f0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
1300: 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61  #.    ## Interna
1310: 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 70  l methods..    p
1320: 72 6f 63 20 53 65 74 75 70 20 7b 63 68 61 6e 67  roc Setup {chang
1330: 65 73 65 74 73 20 7b 6c 6f 67 20 31 7d 7d 20 7b  esets {log 1}} {
1340: 0a 09 69 66 20 7b 24 6c 6f 67 7d 20 7b 0a 09 20  ..if {$log} {.. 
1350: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 33 20 63     log write 3 c
1360: 79 63 6c 65 62 72 65 61 6b 65 72 20 22 43 72 65  yclebreaker "Cre
1370: 61 74 69 6e 67 20 67 72 61 70 68 20 6f 66 20 63  ating graph of c
1380: 68 61 6e 67 65 73 65 74 73 22 0a 09 7d 0a 0a 09  hangesets"..}...
1390: 73 65 74 20 64 67 20 5b 73 74 72 75 63 74 3a 3a  set dg [struct::
13a0: 67 72 61 70 68 20 64 67 5d 0a 0a 09 73 65 74 20  graph dg]...set 
13b0: 6e 20 30 0a 09 73 65 74 20 6d 61 78 20 5b 6c 6c  n 0..set max [ll
13c0: 65 6e 67 74 68 20 24 63 68 61 6e 67 65 73 65 74  ength $changeset
13d0: 73 5d 0a 0a 09 66 6f 72 65 61 63 68 20 63 73 65  s]...foreach cse
13e0: 74 20 24 63 68 61 6e 67 65 73 65 74 73 20 7b 0a  t $changesets {.
13f0: 09 20 20 20 20 6c 6f 67 20 70 72 6f 67 72 65 73  .    log progres
1400: 73 20 32 20 63 79 63 6c 65 62 72 65 61 6b 65 72  s 2 cyclebreaker
1410: 20 24 6e 20 24 6d 61 78 0a 09 20 20 20 20 73 65   $n $max..    se
1420: 74 20 74 72 20 5b 24 63 73 65 74 20 74 69 6d 65  t tr [$cset time
1430: 72 61 6e 67 65 5d 0a 09 20 20 20 20 24 64 67 20  range]..    $dg 
1440: 6e 6f 64 65 20 69 6e 73 65 72 74 20 24 63 73 65  node insert $cse
1450: 74 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 65 20  t..    $dg node 
1460: 73 65 74 20 20 20 20 24 63 73 65 74 20 74 69 6d  set    $cset tim
1470: 65 72 61 6e 67 65 20 24 74 72 0a 09 20 20 20 20  erange $tr..    
1480: 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20 20 20  $dg node set    
1490: 24 63 73 65 74 20 6c 61 62 65 6c 20 20 20 20 20  $cset label     
14a0: 22 5b 24 63 73 65 74 20 73 74 72 5d 5c 5c 6e 5b  "[$cset str]\\n[
14b0: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  join [struct::li
14c0: 73 74 20 6d 61 70 20 24 74 72 20 7b 3a 3a 63 6c  st map $tr {::cl
14d0: 6f 63 6b 20 66 6f 72 6d 61 74 7d 5d 20 22 5c 5c  ock format}] "\\
14e0: 6e 22 5d 22 0a 09 20 20 20 20 24 64 67 20 6e 6f  n"]"..    $dg no
14f0: 64 65 20 73 65 74 20 20 20 20 24 63 73 65 74 20  de set    $cset 
1500: 5f 5f 69 64 5f 5f 20 20 20 20 5b 24 63 73 65 74  __id__    [$cset
1510: 20 69 64 5d 0a 09 20 20 20 20 24 64 67 20 6e 6f   id]..    $dg no
1520: 64 65 20 73 65 74 20 20 20 20 24 63 73 65 74 20  de set    $cset 
1530: 73 68 61 70 65 20 20 20 20 20 5b 65 78 70 72 20  shape     [expr 
1540: 7b 5b 24 63 73 65 74 20 62 79 73 79 6d 62 6f 6c  {[$cset bysymbol
1550: 5d 0a 09 09 09 09 09 09 20 20 20 3f 20 22 65 6c  ].......   ? "el
1560: 6c 69 70 73 65 22 0a 09 09 09 09 09 09 20 20 20  lipse".......   
1570: 3a 20 22 62 6f 78 22 7d 5d 0a 09 20 20 20 20 69  : "box"}]..    i
1580: 6e 63 72 20 6e 0a 09 7d 0a 0a 09 69 66 20 7b 24  ncr n..}...if {$
1590: 6c 6f 67 7d 20 7b 0a 09 20 20 20 20 6c 6f 67 20  log} {..    log 
15a0: 77 72 69 74 65 20 33 20 63 79 63 6c 65 62 72 65  write 3 cyclebre
15b0: 61 6b 65 72 20 22 48 61 73 20 5b 6e 73 70 20 5b  aker "Has [nsp [
15c0: 6c 6c 65 6e 67 74 68 20 24 63 68 61 6e 67 65 73  llength $changes
15d0: 65 74 73 5d 20 63 68 61 6e 67 65 73 65 74 5d 22  ets] changeset]"
15e0: 0a 09 7d 0a 0a 09 23 20 32 2e 20 46 69 6e 64 20  ..}...# 2. Find 
15f0: 66 6f 72 20 61 6c 6c 20 72 65 6c 65 76 61 6e 74  for all relevant
1600: 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 69 72   changeset their
1610: 20 72 65 76 69 73 69 6f 6e 73 20 61 6e 64 20 74   revisions and t
1620: 68 65 69 72 0a 09 23 20 20 20 20 64 65 70 65 6e  heir..#    depen
1630: 64 65 6e 63 69 65 73 2e 20 4d 61 70 20 74 68 65  dencies. Map the
1640: 20 6c 61 74 74 65 72 20 62 61 63 6b 20 74 6f 20   latter back to 
1650: 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09  changesets and..
1660: 23 20 20 20 20 63 6f 6e 73 74 72 75 63 74 20 74  #    construct t
1670: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1680: 20 61 72 63 73 2e 0a 0a 09 73 65 74 20 6e 20 30   arcs....set n 0
1690: 0a 09 66 6f 72 65 61 63 68 20 63 73 65 74 20 24  ..foreach cset $
16a0: 63 68 61 6e 67 65 73 65 74 73 20 7b 0a 09 20 20  changesets {..  
16b0: 20 20 6c 6f 67 20 70 72 6f 67 72 65 73 73 20 32    log progress 2
16c0: 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 24 6e   cyclebreaker $n
16d0: 20 24 6d 61 78 0a 09 20 20 20 20 66 6f 72 65 61   $max..    forea
16e0: 63 68 20 73 75 63 63 20 5b 24 63 73 65 74 20 73  ch succ [$cset s
16f0: 75 63 63 65 73 73 6f 72 73 5d 20 7b 0a 09 09 23  uccessors] {...#
1700: 20 43 68 61 6e 67 65 73 65 74 73 20 6d 61 79 20   Changesets may 
1710: 68 61 76 65 20 64 65 70 65 6e 64 65 6e 63 69 65  have dependencie
1720: 73 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68 65  s outside of the
1730: 0a 09 09 23 20 63 68 6f 73 65 6e 20 73 65 74 2e  ...# chosen set.
1740: 20 54 68 65 73 65 20 61 72 65 20 69 67 6e 6f 72   These are ignor
1750: 65 64 0a 09 09 69 66 20 7b 21 5b 24 64 67 20 6e  ed...if {![$dg n
1760: 6f 64 65 20 65 78 69 73 74 73 20 24 73 75 63 63  ode exists $succ
1770: 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 24 64  ]} continue...$d
1780: 67 20 61 72 63 20 69 6e 73 65 72 74 20 24 63 73  g arc insert $cs
1790: 65 74 20 24 73 75 63 63 0a 09 09 69 66 20 7b 24  et $succ...if {$
17a0: 73 75 63 63 20 65 71 20 24 63 73 65 74 7d 20 7b  succ eq $cset} {
17b0: 0a 09 09 20 20 20 20 24 63 73 65 74 20 6c 6f 6f  ...    $cset loo
17c0: 70 63 68 65 63 6b 0a 09 09 20 20 20 20 74 72 6f  pcheck...    tro
17d0: 75 62 6c 65 20 66 61 74 61 6c 20 22 5b 24 63 73  uble fatal "[$cs
17e0: 65 74 20 73 74 72 5d 20 64 65 70 65 6e 64 73 20  et str] depends 
17f0: 6f 6e 20 69 74 73 65 6c 66 22 0a 09 09 7d 0a 09  on itself"...}..
1800: 20 20 20 20 7d 0a 09 20 20 20 20 69 6e 63 72 20      }..    incr 
1810: 6e 0a 09 7d 0a 0a 09 69 66 20 7b 24 6c 6f 67 7d  n..}...if {$log}
1820: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74   {..    log writ
1830: 65 20 33 20 63 79 63 6c 65 62 72 65 61 6b 65 72  e 3 cyclebreaker
1840: 20 22 48 61 73 20 5b 6e 73 70 20 5b 6c 6c 65 6e   "Has [nsp [llen
1850: 67 74 68 20 5b 24 64 67 20 61 72 63 73 5d 5d 20  gth [$dg arcs]] 
1860: 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e  dependency depen
1870: 64 65 6e 63 69 65 73 5d 22 0a 09 7d 0a 0a 09 23  dencies]"..}...#
1880: 20 52 75 6e 20 74 68 65 20 75 73 65 72 20 68 6f   Run the user ho
1890: 6f 6b 20 74 6f 20 6d 61 6e 69 70 75 6c 61 74 65  ok to manipulate
18a0: 20 74 68 65 20 67 72 61 70 68 20 62 65 66 6f 72   the graph befor
18b0: 65 0a 09 23 20 63 6f 6e 73 75 6d 6d 61 74 69 6f  e..# consummatio
18c0: 6e 2e 0a 0a 09 69 66 20 7b 24 6c 6f 67 7d 20 7b  n....if {$log} {
18d0: 20 4d 61 72 6b 20 24 64 67 20 2d 73 74 61 72 74   Mark $dg -start
18e0: 20 7d 0a 09 4d 61 72 6b 57 61 74 63 68 20 24 64   }..MarkWatch $d
18f0: 67 0a 09 50 72 65 48 6f 6f 6b 20 20 20 24 64 67  g..PreHook   $dg
1900: 0a 09 4d 61 72 6b 57 61 74 63 68 20 24 64 67 0a  ..MarkWatch $dg.
1910: 09 72 65 74 75 72 6e 20 20 24 64 67 0a 20 20 20  .return  $dg.   
1920: 20 7d 0a 0a 20 20 20 20 23 20 49 6e 73 74 65 61   }..    # Instea
1930: 64 20 6f 66 20 73 65 61 72 63 68 69 6e 67 20 74  d of searching t
1940: 68 65 20 77 68 6f 6c 65 20 67 72 61 70 68 20 66  he whole graph f
1950: 6f 72 20 74 68 65 20 64 65 67 72 65 65 2d 30 20  or the degree-0 
1960: 6e 6f 64 65 73 20 69 6e 0a 20 20 20 20 23 20 65  nodes in.    # e
1970: 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 77 65  ach iteration we
1980: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6c 69 73   compute the lis
1990: 74 20 6f 6e 63 65 20 74 6f 20 73 74 61 72 74 2c  t once to start,
19a0: 20 61 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 0a 20   and then only. 
19b0: 20 20 20 23 20 75 70 64 61 74 65 20 69 74 20 69     # update it i
19c0: 6e 63 72 65 6d 65 6e 74 61 6c 6c 79 20 62 61 73  ncrementally bas
19d0: 65 64 20 6f 6e 20 74 68 65 20 6f 75 74 67 6f 69  ed on the outgoi
19e0: 6e 67 20 6e 65 69 67 68 62 6f 75 72 73 20 6f 66  ng neighbours of
19f0: 20 74 68 65 0a 20 20 20 20 23 20 6e 6f 64 65 20   the.    # node 
1a00: 63 68 6f 73 65 6e 20 66 6f 72 20 63 6f 6d 6d 69  chosen for commi
1a10: 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69  t...    proc Ini
1a20: 74 69 61 6c 69 7a 65 43 61 6e 64 69 64 61 74 65  tializeCandidate
1a30: 73 20 7b 64 67 7d 20 7b 0a 09 23 20 62 6f 74 74  s {dg} {..# bott
1a40: 6f 6d 20 3d 20 6c 69 73 74 20 28 6c 69 73 74 20  om = list (list 
1a50: 28 6e 6f 64 65 2c 20 72 61 6e 67 65 20 6d 69 6e  (node, range min
1a60: 2c 20 72 61 6e 67 65 20 6d 61 78 29 29 0a 09 3a  , range max))..:
1a70: 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 6f 74 74  :variable mybott
1a80: 6f 6d 0a 09 66 6f 72 65 61 63 68 20 6e 20 5b 24  om..foreach n [$
1a90: 64 67 20 6e 6f 64 65 73 5d 20 7b 0a 09 20 20 20  dg nodes] {..   
1aa0: 20 69 66 20 7b 5b 24 64 67 20 6e 6f 64 65 20 64   if {[$dg node d
1ab0: 65 67 72 65 65 20 2d 69 6e 20 24 6e 5d 7d 20 63  egree -in $n]} c
1ac0: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 6c 61 70  ontinue..    lap
1ad0: 70 65 6e 64 20 6d 79 62 6f 74 74 6f 6d 20 5b 6c  pend mybottom [l
1ae0: 69 6e 73 65 72 74 20 5b 24 64 67 20 6e 6f 64 65  insert [$dg node
1af0: 20 67 65 74 20 24 6e 20 74 69 6d 65 72 61 6e 67   get $n timerang
1b00: 65 5d 20 30 20 24 6e 5d 0a 09 7d 0a 09 53 63 68  e] 0 $n]..}..Sch
1b10: 65 64 75 6c 65 43 61 6e 64 69 64 61 74 65 73 0a  eduleCandidates.
1b20: 09 53 68 6f 77 50 65 6e 64 69 6e 67 4e 6f 64 65  .ShowPendingNode
1b30: 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  s..return.    }.
1b40: 0a 20 20 20 20 70 72 6f 63 20 57 69 74 68 6f 75  .    proc Withou
1b50: 74 50 72 65 64 65 63 65 73 73 6f 72 20 7b 64 67  tPredecessor {dg
1b60: 20 6e 76 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62   nv} {..::variab
1b70: 6c 65 20 6d 79 62 6f 74 74 6f 6d 0a 0a 09 75 70  le mybottom...up
1b80: 76 61 72 20 31 20 24 6e 76 20 6e 0a 09 69 66 20  var 1 $nv n..if 
1b90: 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 62 6f  {![llength $mybo
1ba0: 74 74 6f 6d 5d 7d 20 7b 20 72 65 74 75 72 6e 20  ttom]} { return 
1bb0: 30 20 7d 0a 0a 09 73 65 74 20 6e 20 5b 6c 69 6e  0 }...set n [lin
1bc0: 64 65 78 20 5b 6c 69 6e 64 65 78 20 24 6d 79 62  dex [lindex $myb
1bd0: 6f 74 74 6f 6d 20 30 5d 20 30 5d 0a 09 73 65 74  ottom 0] 0]..set
1be0: 20 6d 79 62 6f 74 74 6f 6d 20 5b 6c 72 61 6e 67   mybottom [lrang
1bf0: 65 20 24 6d 79 62 6f 74 74 6f 6d 20 31 20 65 6e  e $mybottom 1 en
1c00: 64 5d 0a 09 73 65 74 20 63 68 61 6e 67 65 64 20  d]..set changed 
1c10: 30 0a 0a 09 23 20 55 70 64 61 74 65 20 6c 69 73  0...# Update lis
1c20: 74 20 6f 66 20 6e 6f 64 65 73 20 77 69 74 68 6f  t of nodes witho
1c30: 75 74 20 70 72 65 64 65 63 65 73 73 6f 72 2c 20  ut predecessor, 
1c40: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 09 23 20  based on the..# 
1c50: 6f 75 74 67 6f 69 6e 67 20 6e 65 69 67 68 62 6f  outgoing neighbo
1c60: 75 72 73 20 6f 66 20 74 68 65 20 63 68 6f 73 65  urs of the chose
1c70: 6e 20 6e 6f 64 65 2e 20 54 68 69 73 20 73 68 6f  n node. This sho
1c80: 75 6c 64 20 62 65 0a 09 23 20 66 61 73 74 65 72  uld be..# faster
1c90: 20 74 68 61 6e 20 69 74 65 72 61 74 69 6e 67 20   than iterating 
1ca0: 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 73 65 74  of the whole set
1cb0: 20 6f 66 20 6e 6f 64 65 73 2c 20 66 69 6e 64 69   of nodes, findi
1cc0: 6e 67 20 61 6c 6c 0a 09 23 20 77 69 74 68 6f 75  ng all..# withou
1cd0: 74 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c 20  t predecessors, 
1ce0: 73 6f 72 74 69 6e 67 20 74 68 65 6d 20 62 79 20  sorting them by 
1cf0: 74 69 6d 65 2c 20 65 74 63 2e 20 70 70 2e 0a 09  time, etc. pp...
1d00: 66 6f 72 65 61 63 68 20 6f 75 74 20 5b 24 64 67  foreach out [$dg
1d10: 20 6e 6f 64 65 73 20 2d 6f 75 74 20 24 6e 5d 20   nodes -out $n] 
1d20: 7b 0a 09 20 20 20 20 69 66 20 7b 5b 24 64 67 20  {..    if {[$dg 
1d30: 6e 6f 64 65 20 64 65 67 72 65 65 20 2d 69 6e 20  node degree -in 
1d40: 24 6f 75 74 5d 20 3e 20 31 7d 20 63 6f 6e 74 69  $out] > 1} conti
1d50: 6e 75 65 0a 09 20 20 20 20 23 20 44 65 67 72 65  nue..    # Degre
1d60: 65 2d 31 20 6e 65 69 67 68 62 6f 75 72 2c 20 77  e-1 neighbour, w
1d70: 69 6c 6c 20 68 61 76 65 20 6e 6f 20 70 72 65 64  ill have no pred
1d80: 65 63 65 73 73 6f 72 73 20 61 66 74 65 72 20 74  ecessors after t
1d90: 68 65 0a 09 20 20 20 20 23 20 72 65 6d 6f 76 61  he..    # remova
1da0: 6c 20 6f 66 20 6e 2e 20 50 75 74 20 6f 6e 20 74  l of n. Put on t
1db0: 68 65 20 6c 69 73 74 2e 0a 09 20 20 20 20 6c 61  he list...    la
1dc0: 70 70 65 6e 64 20 6d 79 62 6f 74 74 6f 6d 20 5b  ppend mybottom [
1dd0: 6c 69 6e 73 65 72 74 20 5b 24 64 67 20 6e 6f 64  linsert [$dg nod
1de0: 65 20 67 65 74 20 24 6f 75 74 20 74 69 6d 65 72  e get $out timer
1df0: 61 6e 67 65 5d 20 30 20 24 6f 75 74 5d 0a 09 20  ange] 0 $out].. 
1e00: 20 20 20 73 65 74 20 63 68 61 6e 67 65 64 20 31     set changed 1
1e10: 0a 09 7d 0a 09 69 66 20 7b 24 63 68 61 6e 67 65  ..}..if {$change
1e20: 64 7d 20 7b 0a 09 20 20 20 20 53 63 68 65 64 75  d} {..    Schedu
1e30: 6c 65 43 61 6e 64 69 64 61 74 65 73 0a 09 7d 0a  leCandidates..}.
1e40: 0a 09 23 20 57 65 20 64 6f 20 6e 6f 74 20 64 65  ..# We do not de
1e50: 6c 65 74 65 20 74 68 65 20 6e 6f 64 65 20 69 6d  lete the node im
1e60: 6d 65 64 69 61 74 65 6c 79 2c 20 74 6f 20 61 6c  mediately, to al
1e70: 6c 6f 77 20 74 68 65 20 53 61 76 65 0a 09 23 20  low the Save..# 
1e80: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 73 61 76  procedure to sav
1e90: 65 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63 69  e the dependenci
1ea0: 65 73 20 61 73 20 77 65 6c 6c 20 28 65 6e 63 6f  es as well (enco
1eb0: 64 65 64 20 69 6e 20 74 68 65 0a 09 23 20 61 72  ded in the..# ar
1ec0: 63 73 29 2e 0a 09 72 65 74 75 72 6e 20 31 0a 20  cs)...return 1. 
1ed0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 53     }..    proc S
1ee0: 63 68 65 64 75 6c 65 43 61 6e 64 69 64 61 74 65  cheduleCandidate
1ef0: 73 20 7b 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62  s {} {..::variab
1f00: 6c 65 20 6d 79 62 6f 74 74 6f 6d 0a 09 23 20 53  le mybottom..# S
1f10: 6f 72 74 20 62 79 20 63 73 65 74 20 6f 62 6a 65  ort by cset obje
1f20: 63 74 20 6e 61 6d 65 2c 20 6c 6f 77 65 72 20 62  ct name, lower b
1f30: 6f 72 64 65 72 20 6f 66 20 74 69 6d 65 72 61 6e  order of timeran
1f40: 67 65 2c 20 61 74 20 6c 61 73 74 0a 09 23 20 62  ge, at last..# b
1f50: 79 20 74 68 65 20 75 70 70 65 72 20 62 6f 72 64  y the upper bord
1f60: 65 72 2e 0a 09 73 65 74 20 6d 79 62 6f 74 74 6f  er...set mybotto
1f70: 6d 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20  m [lsort -index 
1f80: 32 20 2d 69 6e 74 65 67 65 72 20 5b 6c 73 6f 72  2 -integer [lsor
1f90: 74 20 2d 69 6e 64 65 78 20 31 20 2d 69 6e 74 65  t -index 1 -inte
1fa0: 67 65 72 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65  ger [lsort -inde
1fb0: 78 20 30 20 2d 64 69 63 74 20 24 6d 79 62 6f 74  x 0 -dict $mybot
1fc0: 74 6f 6d 5d 5d 5d 0a 09 72 65 74 75 72 6e 0a 20  tom]]]..return. 
1fd0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 53     }..    proc S
1fe0: 68 6f 77 50 65 6e 64 69 6e 67 4e 6f 64 65 73 20  howPendingNodes 
1ff0: 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6f 67 20 76  {} {..if {[log v
2000: 65 72 62 6f 73 69 74 79 3f 5d 20 3c 20 31 30 7d  erbosity?] < 10}
2010: 20 72 65 74 75 72 6e 0a 09 3a 3a 76 61 72 69 61   return..::varia
2020: 62 6c 65 20 6d 79 62 6f 74 74 6f 6d 0a 09 6c 6f  ble mybottom..lo
2030: 67 20 77 72 69 74 65 20 31 30 20 63 79 63 6c 65  g write 10 cycle
2040: 62 72 65 61 6b 65 72 20 22 50 65 6e 64 69 6e 67  breaker "Pending
2050: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
2060: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22  ..............."
2070: 0a 09 66 6f 72 65 61 63 68 20 69 74 65 6d 20 5b  ..foreach item [
2080: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70  struct::list map
2090: 20 24 6d 79 62 6f 74 74 6f 6d 20 5b 6d 79 70 72   $mybottom [mypr
20a0: 6f 63 20 46 6f 72 6d 61 74 50 65 6e 64 69 6e 67  oc FormatPending
20b0: 49 74 65 6d 5d 5d 20 7b 0a 09 20 20 20 20 6c 6f  Item]] {..    lo
20c0: 67 20 77 72 69 74 65 20 31 30 20 63 79 63 6c 65  g write 10 cycle
20d0: 62 72 65 61 6b 65 72 20 22 50 65 6e 64 69 6e 67  breaker "Pending
20e0: 3a 20 20 20 20 20 24 69 74 65 6d 22 0a 09 7d 0a  :     $item"..}.
20f0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
2100: 20 20 20 70 72 6f 63 20 46 6f 72 6d 61 74 50 65     proc FormatPe
2110: 6e 64 69 6e 67 49 74 65 6d 20 7b 69 74 65 6d 7d  ndingItem {item}
2120: 20 7b 0a 09 6a 6f 69 6e 20 5b 6c 69 73 74 20 5b   {..join [list [
2130: 5b 6c 69 6e 64 65 78 20 24 69 74 65 6d 20 30 5d  [lindex $item 0]
2140: 20 73 74 72 5d 20 5b 63 6c 6f 63 6b 20 66 6f 72   str] [clock for
2150: 6d 61 74 20 5b 6c 69 6e 64 65 78 20 24 69 74 65  mat [lindex $ite
2160: 6d 20 31 5d 5d 20 5b 63 6c 6f 63 6b 20 66 6f 72  m 1]] [clock for
2170: 6d 61 74 20 5b 6c 69 6e 64 65 78 20 24 69 74 65  mat [lindex $ite
2180: 6d 20 32 5d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  m 2]]].    }..  
2190: 20 20 70 72 6f 63 20 46 69 6e 64 43 79 63 6c 65    proc FindCycle
21a0: 20 7b 64 67 7d 20 7b 0a 09 23 20 54 68 69 73 20   {dg} {..# This 
21b0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 72 75 6e  procedure is run
21c0: 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65   if and only the
21d0: 20 67 72 61 70 68 20 69 73 20 6e 6f 74 20 65 6d   graph is not em
21e0: 70 74 79 20 61 6e 64 0a 09 23 20 61 6c 6c 20 6e  pty and..# all n
21f0: 6f 64 65 73 20 68 61 76 65 20 70 72 65 64 65 63  odes have predec
2200: 65 73 73 6f 72 73 2e 20 54 68 69 73 20 6d 65 61  essors. This mea
2210: 6e 73 20 74 68 61 74 20 65 61 63 68 20 6e 6f 64  ns that each nod
2220: 65 20 69 73 0a 09 23 20 65 69 74 68 65 72 20 70  e is..# either p
2230: 61 72 74 20 6f 66 20 61 20 63 79 63 6c 65 20 6f  art of a cycle o
2240: 72 20 28 69 6e 64 69 72 65 63 74 6c 79 29 20 64  r (indirectly) d
2250: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 61 20 6e 6f  epending on a no
2260: 64 65 0a 09 23 20 69 6e 20 61 20 63 79 63 6c 65  de..# in a cycle
2270: 2e 20 57 65 20 63 61 6e 20 73 74 61 72 74 20 61  . We can start a
2280: 74 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6e  t an arbitrary n
2290: 6f 64 65 2c 20 66 6f 6c 6c 6f 77 20 69 74 73 0a  ode, follow its.
22a0: 09 23 20 69 6e 63 6f 6d 69 6e 67 20 65 64 67 65  .# incoming edge
22b0: 73 20 74 6f 20 69 74 73 20 70 72 65 64 65 63 65  s to its predece
22c0: 73 73 6f 72 73 20 75 6e 74 69 6c 20 77 65 20 73  ssors until we s
22d0: 65 65 20 61 20 6e 6f 64 65 20 61 0a 09 23 20 73  ee a node a..# s
22e0: 65 63 6f 6e 64 20 74 69 6d 65 2e 20 54 68 61 74  econd time. That
22f0: 20 6e 6f 64 65 20 63 6c 6f 73 65 73 20 74 68 65   node closes the
2300: 20 63 79 63 6c 65 20 61 6e 64 20 74 68 65 20 62   cycle and the b
2310: 65 67 69 6e 6e 69 6e 67 20 69 73 0a 09 23 20 69  eginning is..# i
2320: 74 73 20 66 69 72 73 74 20 6f 63 63 75 72 65 6e  ts first occuren
2330: 63 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65  ce. Note that we
2340: 20 63 61 6e 20 63 68 6f 6f 73 65 20 61 6e 20 61   can choose an a
2350: 72 62 69 74 72 61 72 79 0a 09 23 20 70 72 65 64  rbitrary..# pred
2360: 65 63 65 73 73 6f 72 20 6f 66 20 65 61 63 68 20  ecessor of each 
2370: 6e 6f 64 65 20 61 73 20 77 65 6c 6c 2c 20 77 65  node as well, we
2380: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
2390: 73 65 61 72 63 68 2e 0a 0a 09 23 20 57 65 20 72  search....# We r
23a0: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 6e  ecord for each n
23b0: 6f 64 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ode the index of
23c0: 20 74 68 65 20 66 69 72 73 74 20 61 70 70 65 61   the first appea
23d0: 72 61 6e 63 65 20 69 6e 0a 09 23 20 74 68 65 20  rance in..# the 
23e0: 70 61 74 68 2c 20 6d 61 6b 69 6e 67 20 69 74 20  path, making it 
23f0: 65 61 73 79 20 61 74 20 74 68 65 20 65 6e 64 20  easy at the end 
2400: 74 6f 20 63 75 74 20 74 68 65 20 63 79 63 6c 65  to cut the cycle
2410: 20 66 72 6f 6d 0a 09 23 20 69 74 2e 0a 0a 09 23   from..# it....#
2420: 20 43 68 6f 6f 73 65 20 61 72 62 69 74 72 61 72   Choose arbitrar
2430: 79 20 6e 6f 64 65 20 74 6f 20 73 74 61 72 74 20  y node to start 
2440: 6f 75 72 20 73 65 61 72 63 68 20 61 74 2e 0a 09  our search at...
2450: 73 65 74 20 73 74 61 72 74 20 5b 6c 69 6e 64 65  set start [linde
2460: 78 20 5b 24 64 67 20 6e 6f 64 65 73 5d 20 30 5d  x [$dg nodes] 0]
2470: 0a 0a 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20  ...# Initialize 
2480: 73 74 61 74 65 2c 20 70 61 74 68 20 6f 66 20 73  state, path of s
2490: 65 65 6e 20 6e 6f 64 65 73 2c 20 61 6e 64 20 77  een nodes, and w
24a0: 68 65 6e 20 73 65 65 6e 2e 0a 09 73 65 74 20 20  hen seen...set  
24b0: 20 20 20 20 20 70 61 74 68 20 7b 7d 0a 09 61 72       path {}..ar
24c0: 72 61 79 20 73 65 74 20 73 65 65 6e 20 7b 7d 0a  ray set seen {}.
24d0: 0a 09 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 20  ..while {1} {.. 
24e0: 20 20 20 23 20 53 74 6f 70 20 73 65 61 72 63 68     # Stop search
24f0: 69 6e 67 20 77 68 65 6e 20 77 65 20 68 61 76 65  ing when we have
2500: 20 73 65 65 6e 20 74 68 65 20 63 75 72 72 65 6e   seen the curren
2510: 74 20 6e 6f 64 65 0a 09 20 20 20 20 23 20 61 6c  t node..    # al
2520: 72 65 61 64 79 2c 20 74 68 65 20 63 69 72 63 6c  ready, the circl
2530: 65 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  e has been close
2540: 64 2e 0a 09 20 20 20 20 69 66 20 7b 5b 69 6e 66  d...    if {[inf
2550: 6f 20 65 78 69 73 74 73 20 73 65 65 6e 28 24 73  o exists seen($s
2560: 74 61 72 74 29 5d 7d 20 62 72 65 61 6b 0a 09 20  tart)]} break.. 
2570: 20 20 20 6c 61 70 70 65 6e 64 20 70 61 74 68 20     lappend path 
2580: 24 73 74 61 72 74 0a 09 20 20 20 20 73 65 74 20  $start..    set 
2590: 73 65 65 6e 28 24 73 74 61 72 74 29 20 5b 65 78  seen($start) [ex
25a0: 70 72 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 70 61  pr {[llength $pa
25b0: 74 68 5d 2d 31 7d 5d 0a 09 20 20 20 20 23 20 43  th]-1}]..    # C
25c0: 68 6f 6f 73 65 20 61 72 62 69 74 72 61 72 79 20  hoose arbitrary 
25d0: 70 72 65 64 65 63 65 73 73 6f 72 0a 09 20 20 20  predecessor..   
25e0: 20 73 65 74 20 73 74 61 72 74 20 5b 6c 69 6e 64   set start [lind
25f0: 65 78 20 5b 24 64 67 20 6e 6f 64 65 73 20 2d 69  ex [$dg nodes -i
2600: 6e 20 24 73 74 61 72 74 5d 20 30 5d 0a 09 7d 0a  n $start] 0]..}.
2610: 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74  ..return [struct
2620: 3a 3a 6c 69 73 74 20 72 65 76 65 72 73 65 20 5b  ::list reverse [
2630: 6c 72 61 6e 67 65 20 24 70 61 74 68 20 24 73 65  lrange $path $se
2640: 65 6e 28 24 73 74 61 72 74 29 20 65 6e 64 5d 5d  en($start) end]]
2650: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
2660: 20 42 72 65 61 6b 53 65 67 6d 65 6e 74 20 7b 64   BreakSegment {d
2670: 67 20 70 61 74 68 20 6c 61 62 65 6c 7d 20 7b 0a  g path label} {.
2680: 09 23 20 54 68 65 20 70 61 74 68 2c 20 75 73 75  .# The path, usu
2690: 61 6c 6c 79 20 61 20 63 79 63 6c 65 2c 20 77 65  ally a cycle, we
26a0: 20 68 61 76 65 20 67 6f 74 74 65 6e 20 69 73 20   have gotten is 
26b0: 62 72 6f 6b 65 6e 20 62 79 0a 09 23 20 62 72 65  broken by..# bre
26c0: 61 6b 69 6e 67 20 61 70 61 72 74 20 6f 6e 65 20  aking apart one 
26d0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 63  or more of the c
26e0: 68 61 6e 67 65 73 65 74 73 20 69 6e 20 74 68 65  hangesets in the
26f0: 0a 09 23 20 63 79 63 6c 65 2e 20 54 68 69 73 20  ..# cycle. This 
2700: 63 61 75 73 65 73 20 75 73 20 74 6f 20 63 72 65  causes us to cre
2710: 61 74 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ate one or more 
2720: 63 68 61 6e 67 65 73 65 74 73 20 77 68 69 63 68  changesets which
2730: 0a 09 23 20 61 72 65 20 74 6f 20 62 65 20 63 6f  ..# are to be co
2740: 6d 6d 69 74 74 65 64 2c 20 61 64 64 65 64 20 74  mmitted, added t
2750: 6f 20 74 68 65 20 67 72 61 70 68 2c 20 65 74 63  o the graph, etc
2760: 2e 20 70 70 2e 0a 0a 09 73 65 74 20 62 65 73 74  . pp....set best
2770: 6c 69 6e 6b 20 7b 7d 0a 09 73 65 74 20 62 65 73  link {}..set bes
2780: 74 6e 6f 64 65 20 7b 7d 0a 0a 09 66 6f 72 65 61  tnode {}...forea
2790: 63 68 20 5c 0a 09 20 20 20 20 70 72 65 76 20 5b  ch \..    prev [
27a0: 6c 72 61 6e 67 65 20 24 70 61 74 68 20 30 20 65  lrange $path 0 e
27b0: 6e 64 2d 32 5d 20 5c 0a 09 20 20 20 20 63 73 65  nd-2] \..    cse
27c0: 74 20 5b 6c 72 61 6e 67 65 20 24 70 61 74 68 20  t [lrange $path 
27d0: 31 20 65 6e 64 2d 31 5d 20 5c 0a 09 20 20 20 20  1 end-1] \..    
27e0: 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 70 61  next [lrange $pa
27f0: 74 68 20 32 20 65 6e 64 5d 20 7b 0a 0a 09 09 23  th 2 end] {....#
2800: 20 45 61 63 68 20 74 72 69 70 6c 65 20 50 52 45   Each triple PRE
2810: 56 20 2d 3e 20 43 53 45 54 20 2d 3e 20 4e 45 58  V -> CSET -> NEX
2820: 54 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2c  T of changesets,
2830: 20 61 0a 09 09 23 20 27 6c 69 6e 6b 27 20 69 6e   a...# 'link' in
2840: 20 74 68 65 20 63 79 63 6c 65 2c 20 69 73 20 61   the cycle, is a
2850: 6e 61 6c 79 73 65 64 20 61 6e 64 20 74 68 65 20  nalysed and the 
2860: 62 65 73 74 0a 09 09 23 20 6c 6f 63 61 74 69 6f  best...# locatio
2870: 6e 20 77 68 65 72 65 20 74 6f 20 61 74 20 6c 65  n where to at le
2880: 61 73 74 20 77 65 61 6b 65 6e 20 74 68 65 20 63  ast weaken the c
2890: 79 63 6c 65 20 69 73 0a 09 09 23 20 63 68 6f 73  ycle is...# chos
28a0: 65 6e 20 66 6f 72 20 66 75 72 74 68 65 72 20 70  en for further p
28b0: 72 6f 63 65 73 73 69 6e 67 2e 0a 0a 09 09 73 65  rocessing.....se
28c0: 74 20 6c 69 6e 6b 20 5b 70 72 6f 6a 65 63 74 3a  t link [project:
28d0: 3a 72 65 76 6c 69 6e 6b 20 25 41 55 54 4f 25 20  :revlink %AUTO% 
28e0: 24 70 72 65 76 20 24 63 73 65 74 20 24 6e 65 78  $prev $cset $nex
28f0: 74 5d 0a 09 09 69 66 20 7b 24 62 65 73 74 6c 69  t]...if {$bestli
2900: 6e 6b 20 65 71 20 22 22 7d 20 7b 0a 09 09 20 20  nk eq ""} {...  
2910: 20 20 73 65 74 20 62 65 73 74 6c 69 6e 6b 20 24    set bestlink $
2920: 6c 69 6e 6b 0a 09 09 20 20 20 20 73 65 74 20 62  link...    set b
2930: 65 73 74 6e 6f 64 65 20 24 63 73 65 74 0a 09 09  estnode $cset...
2940: 7d 20 65 6c 73 65 69 66 20 7b 5b 24 6c 69 6e 6b  } elseif {[$link
2950: 20 62 65 74 74 65 72 74 68 61 6e 20 24 62 65 73   betterthan $bes
2960: 74 6c 69 6e 6b 5d 7d 20 7b 0a 09 09 20 20 20 20  tlink]} {...    
2970: 24 62 65 73 74 6c 69 6e 6b 20 64 65 73 74 72 6f  $bestlink destro
2980: 79 0a 09 09 20 20 20 20 73 65 74 20 62 65 73 74  y...    set best
2990: 6c 69 6e 6b 20 24 6c 69 6e 6b 0a 09 09 20 20 20  link $link...   
29a0: 20 73 65 74 20 62 65 73 74 6e 6f 64 65 20 24 63   set bestnode $c
29b0: 73 65 74 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  set...} else {..
29c0: 09 20 20 20 20 24 6c 69 6e 6b 20 64 65 73 74 72  .    $link destr
29d0: 6f 79 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 09  oy...}..    }...
29e0: 6c 6f 67 20 77 72 69 74 65 20 35 20 63 79 63 6c  log write 5 cycl
29f0: 65 62 72 65 61 6b 65 72 20 22 42 72 65 61 6b 69  ebreaker "Breaki
2a00: 6e 67 20 24 6c 61 62 65 6c 20 62 79 20 73 70 6c  ng $label by spl
2a10: 69 74 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  itting changeset
2a20: 20 5b 24 62 65 73 74 6e 6f 64 65 20 73 74 72 5d   [$bestnode str]
2a30: 22 0a 09 73 65 74 20 49 44 20 5b 24 62 65 73 74  "..set ID [$best
2a40: 6e 6f 64 65 20 69 64 5d 0a 09 4d 61 72 6b 20 24  node id]..Mark $
2a50: 64 67 20 2d 24 7b 49 44 7d 2d 62 65 66 6f 72 65  dg -${ID}-before
2a60: 0a 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20  ...set newcsets 
2a70: 5b 24 62 65 73 74 6c 69 6e 6b 20 62 72 65 61 6b  [$bestlink break
2a80: 5d 0a 09 24 62 65 73 74 6c 69 6e 6b 20 64 65 73  ]..$bestlink des
2a90: 74 72 6f 79 0a 0a 20 20 20 20 20 20 20 20 23 20  troy..        # 
2aa0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
2ab0: 65 20 6f 6c 64 20 63 68 61 6e 67 65 73 65 74 20  e old changeset 
2ac0: 28 42 45 53 54 4e 4f 44 45 29 20 69 73 20 67 6f  (BESTNODE) is go
2ad0: 6e 65 0a 20 20 20 20 20 20 20 20 23 20 61 6c 72  ne.        # alr
2ae0: 65 61 64 79 2e 20 57 65 20 72 65 6d 6f 76 65 20  eady. We remove 
2af0: 69 74 20 66 72 6f 6d 20 74 68 65 20 67 72 61 70  it from the grap
2b00: 68 20 61 73 20 77 65 6c 6c 20 61 6e 64 20 74 68  h as well and th
2b10: 65 6e 20 65 6e 74 65 72 0a 20 20 20 20 20 20 20  en enter.       
2b20: 20 23 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73   # the fragments
2b30: 20 67 65 6e 65 72 61 74 65 64 20 66 6f 72 20 69   generated for i
2b40: 74 2e 0a 0a 09 52 65 70 6c 61 63 65 20 24 64 67  t....Replace $dg
2b50: 20 24 62 65 73 74 6e 6f 64 65 20 24 6e 65 77 63   $bestnode $newc
2b60: 73 65 74 73 0a 0a 09 4d 61 72 6b 20 24 64 67 20  sets...Mark $dg 
2b70: 2d 24 7b 49 44 7d 2d 61 66 74 65 72 0a 09 72 65  -${ID}-after..re
2b80: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
2b90: 23 20 54 4f 44 4f 3a 20 54 68 69 73 20 73 68 6f  # TODO: This sho
2ba0: 75 6c 64 20 62 65 20 61 20 67 72 61 70 68 20 6d  uld be a graph m
2bb0: 65 74 68 6f 64 2e 0a 20 20 20 20 70 72 6f 63 20  ethod..    proc 
2bc0: 48 61 73 41 72 63 20 7b 64 67 20 61 20 62 7d 20  HasArc {dg a b} 
2bd0: 7b 0a 09 23 38 2e 35 3a 20 72 65 74 75 72 6e 20  {..#8.5: return 
2be0: 5b 65 78 70 72 20 7b 24 62 20 69 6e 20 5b 24 64  [expr {$b in [$d
2bf0: 67 20 6e 6f 64 65 73 20 2d 6f 75 74 20 24 61 5d  g nodes -out $a]
2c00: 7d 5d 0a 09 69 66 20 7b 5b 6c 73 65 61 72 63 68  }]..if {[lsearch
2c10: 20 2d 65 78 61 63 74 20 5b 24 64 67 20 6e 6f 64   -exact [$dg nod
2c20: 65 73 20 2d 6f 75 74 20 24 61 5d 20 24 62 5d 20  es -out $a] $b] 
2c30: 3c 20 30 7d 20 7b 20 72 65 74 75 72 6e 20 30 20  < 0} { return 0 
2c40: 7d 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20  }..return 1.    
2c50: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 4d 61 72 6b  }..    proc Mark
2c60: 20 7b 64 67 20 7b 73 75 66 66 69 78 20 7b 7d 7d   {dg {suffix {}}
2c70: 20 7b 73 75 62 67 72 61 70 68 20 7b 7d 7d 7d 20   {subgraph {}}} 
2c80: 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79  {..::variable my
2c90: 64 6f 74 64 65 73 74 69 6e 61 74 69 6f 6e 0a 09  dotdestination..
2ca0: 69 66 20 7b 24 6d 79 64 6f 74 64 65 73 74 69 6e  if {$mydotdestin
2cb0: 61 74 69 6f 6e 20 65 71 20 22 22 7d 20 72 65 74  ation eq ""} ret
2cc0: 75 72 6e 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20  urn..::variable 
2cd0: 6d 79 64 6f 74 70 72 65 66 69 78 0a 09 3a 3a 76  mydotprefix..::v
2ce0: 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69 64 0a  ariable mydotid.
2cf0: 09 73 65 74 20 66 6e 61 6d 65 20 24 6d 79 64 6f  .set fname $mydo
2d00: 74 64 65 73 74 69 6e 61 74 69 6f 6e 2f 24 7b 6d  tdestination/${m
2d10: 79 64 6f 74 70 72 65 66 69 78 7d 24 7b 6d 79 64  ydotprefix}${myd
2d20: 6f 74 69 64 7d 24 7b 73 75 66 66 69 78 7d 2e 64  otid}${suffix}.d
2d30: 6f 74 0a 09 66 69 6c 65 20 6d 6b 64 69 72 20 5b  ot..file mkdir [
2d40: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 6e  file dirname $fn
2d50: 61 6d 65 5d 0a 09 64 6f 74 20 77 72 69 74 65 20  ame]..dot write 
2d60: 24 64 67 20 24 6d 79 64 6f 74 70 72 65 66 69 78  $dg $mydotprefix
2d70: 24 73 75 66 66 69 78 20 24 66 6e 61 6d 65 20 24  $suffix $fname $
2d80: 73 75 62 67 72 61 70 68 0a 09 69 6e 63 72 20 6d  subgraph..incr m
2d90: 79 64 6f 74 69 64 0a 0a 09 6c 6f 67 20 77 72 69  ydotid...log wri
2da0: 74 65 20 35 20 63 79 63 6c 65 62 72 65 61 6b 65  te 5 cyclebreake
2db0: 72 20 22 2e 64 6f 74 20 65 78 70 6f 72 74 20 24  r ".dot export $
2dc0: 66 6e 61 6d 65 22 0a 09 72 65 74 75 72 6e 0a 20  fname"..return. 
2dd0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 52     }..    proc R
2de0: 65 70 6c 61 63 65 20 7b 64 67 20 6e 20 72 65 70  eplace {dg n rep
2df0: 6c 61 63 65 6d 65 6e 74 73 7d 20 7b 0a 09 23 20  lacements} {..# 
2e00: 4e 4f 54 45 2e 20 57 65 20 68 61 76 65 20 74 6f  NOTE. We have to
2e10: 20 67 65 74 20 74 68 65 20 6c 69 73 74 20 6f 66   get the list of
2e20: 20 69 6e 63 6f 6d 69 6e 67 20 6e 65 69 67 68 62   incoming neighb
2e30: 6f 75 72 73 20 61 6e 64 0a 09 23 20 72 65 63 6f  ours and..# reco
2e40: 6d 70 75 74 65 20 74 68 65 69 72 20 73 75 63 63  mpute their succ
2e50: 65 73 73 6f 72 73 20 61 66 74 65 72 20 74 68 65  essors after the
2e60: 20 6e 65 77 20 6e 6f 64 65 73 20 68 61 76 65 20   new nodes have 
2e70: 62 65 65 6e 0a 09 23 20 69 6e 73 65 72 74 65 64  been..# inserted
2e80: 2e 20 54 68 65 69 72 20 6f 75 74 67 6f 69 6e 67  . Their outgoing
2e90: 20 61 72 63 73 20 77 69 6c 6c 20 6e 6f 77 20 67   arcs will now g
2ea0: 6f 20 74 6f 20 6f 6e 65 20 6f 72 20 62 6f 74 68  o to one or both
2eb0: 20 6f 66 0a 09 23 20 74 68 65 20 6e 65 77 20 6e   of..# the new n
2ec0: 6f 64 65 73 2c 20 61 6e 64 20 6e 6f 74 20 72 65  odes, and not re
2ed0: 64 6f 69 6e 67 20 74 68 65 6d 20 6d 61 79 20 63  doing them may c
2ee0: 61 75 73 65 20 75 73 20 74 6f 20 66 6f 72 67 65  ause us to forge
2ef0: 74 0a 09 23 20 63 69 72 63 6c 65 73 2c 20 6c 65  t..# circles, le
2f00: 61 76 69 6e 67 20 74 68 65 6d 20 69 6e 2c 20 75  aving them in, u
2f10: 6e 62 72 6f 6b 65 6e 2e 0a 0a 09 73 65 74 20 70  nbroken....set p
2f20: 72 65 20 5b 24 64 67 20 6e 6f 64 65 73 20 2d 69  re [$dg nodes -i
2f30: 6e 20 24 6e 5d 0a 0a 20 20 20 20 20 20 20 20 24  n $n]..        $
2f40: 64 67 20 6e 6f 64 65 20 64 65 6c 65 74 65 20 24  dg node delete $
2f50: 6e 0a 0a 09 66 6f 72 65 61 63 68 20 63 73 65 74  n...foreach cset
2f60: 20 24 72 65 70 6c 61 63 65 6d 65 6e 74 73 20 7b   $replacements {
2f70: 0a 09 20 20 20 20 73 65 74 20 74 72 20 5b 24 63  ..    set tr [$c
2f80: 73 65 74 20 74 69 6d 65 72 61 6e 67 65 5d 0a 09  set timerange]..
2f90: 20 20 20 20 24 64 67 20 6e 6f 64 65 20 69 6e 73      $dg node ins
2fa0: 65 72 74 20 24 63 73 65 74 0a 09 20 20 20 20 24  ert $cset..    $
2fb0: 64 67 20 6e 6f 64 65 20 73 65 74 20 20 20 20 24  dg node set    $
2fc0: 63 73 65 74 20 74 69 6d 65 72 61 6e 67 65 20 24  cset timerange $
2fd0: 74 72 0a 09 20 20 20 20 24 64 67 20 6e 6f 64 65  tr..    $dg node
2fe0: 20 73 65 74 20 20 20 20 24 63 73 65 74 20 6c 61   set    $cset la
2ff0: 62 65 6c 20 20 20 20 20 22 5b 24 63 73 65 74 20  bel     "[$cset 
3000: 73 74 72 5d 5c 5c 6e 5b 6a 6f 69 6e 20 5b 73 74  str]\\n[join [st
3010: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24  ruct::list map $
3020: 74 72 20 7b 3a 3a 63 6c 6f 63 6b 20 66 6f 72 6d  tr {::clock form
3030: 61 74 7d 5d 20 22 5c 5c 6e 22 5d 22 0a 09 20 20  at}] "\\n"]"..  
3040: 20 20 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20    $dg node set  
3050: 20 20 24 63 73 65 74 20 5f 5f 69 64 5f 5f 20 20    $cset __id__  
3060: 20 20 5b 24 63 73 65 74 20 69 64 5d 0a 09 20 20    [$cset id]..  
3070: 20 20 24 64 67 20 6e 6f 64 65 20 73 65 74 20 20    $dg node set  
3080: 20 20 24 63 73 65 74 20 73 68 61 70 65 20 20 20    $cset shape   
3090: 20 20 5b 65 78 70 72 20 7b 5b 24 63 73 65 74 20    [expr {[$cset 
30a0: 62 79 73 79 6d 62 6f 6c 5d 0a 09 09 09 09 09 09  bysymbol].......
30b0: 20 20 20 3f 20 22 65 6c 6c 69 70 73 65 22 0a 09     ? "ellipse"..
30c0: 09 09 09 09 09 20 20 20 3a 20 22 62 6f 78 22 7d  .....   : "box"}
30d0: 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63  ]..}...foreach c
30e0: 73 65 74 20 24 72 65 70 6c 61 63 65 6d 65 6e 74  set $replacement
30f0: 73 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68  s {..    foreach
3100: 20 73 75 63 63 20 5b 24 63 73 65 74 20 73 75 63   succ [$cset suc
3110: 63 65 73 73 6f 72 73 5d 20 7b 0a 09 09 23 20 54  cessors] {...# T
3120: 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74  he new changeset
3130: 73 20 6d 61 79 20 68 61 76 65 20 64 65 70 65 6e  s may have depen
3140: 64 65 6e 63 69 65 73 20 6f 75 74 73 69 64 65 20  dencies outside 
3150: 6f 66 0a 09 09 23 20 74 68 65 20 63 68 6f 73 65  of...# the chose
3160: 6e 20 73 65 74 2e 20 54 68 65 73 65 20 61 72 65  n set. These are
3170: 20 69 67 6e 6f 72 65 64 0a 09 09 69 66 20 7b 21   ignored...if {!
3180: 5b 24 64 67 20 6e 6f 64 65 20 65 78 69 73 74 73  [$dg node exists
3190: 20 24 73 75 63 63 5d 7d 20 63 6f 6e 74 69 6e 75   $succ]} continu
31a0: 65 0a 09 09 24 64 67 20 61 72 63 20 69 6e 73 65  e...$dg arc inse
31b0: 72 74 20 24 63 73 65 74 20 24 73 75 63 63 0a 09  rt $cset $succ..
31c0: 09 69 66 20 7b 24 73 75 63 63 20 65 71 20 24 63  .if {$succ eq $c
31d0: 73 65 74 7d 20 7b 0a 09 09 20 20 20 20 24 63 73  set} {...    $cs
31e0: 65 74 20 6c 6f 6f 70 63 68 65 63 6b 0a 09 09 20  et loopcheck... 
31f0: 20 20 20 74 72 6f 75 62 6c 65 20 66 61 74 61 6c     trouble fatal
3200: 20 22 5b 24 63 73 65 74 20 73 74 72 5d 20 64 65   "[$cset str] de
3210: 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 22  pends on itself"
3220: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ...}..    }..}..
3230: 66 6f 72 65 61 63 68 20 63 73 65 74 20 24 70 72  foreach cset $pr
3240: 65 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68  e {..    foreach
3250: 20 73 75 63 63 20 5b 24 63 73 65 74 20 73 75 63   succ [$cset suc
3260: 63 65 73 73 6f 72 73 5d 20 7b 0a 09 09 23 20 4e  cessors] {...# N
3270: 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 72 63  ote that the arc
3280: 20 6d 61 79 20 61 6c 72 65 61 64 79 20 65 78 69   may already exi
3290: 73 74 20 69 6e 20 74 68 65 20 67 72 61 70 68 2e  st in the graph.
32a0: 20 49 66 0a 09 09 23 20 73 6f 20 69 67 6e 6f 72   If...# so ignor
32b0: 65 20 69 74 2e 20 54 68 65 20 6e 65 77 20 63 68  e it. The new ch
32c0: 61 6e 67 65 73 65 74 73 20 6d 61 79 20 68 61 76  angesets may hav
32d0: 65 0a 09 09 23 20 64 65 70 65 6e 64 65 6e 63 69  e...# dependenci
32e0: 65 73 20 6f 75 74 73 69 64 65 20 6f 66 20 74 68  es outside of th
32f0: 65 20 63 68 6f 73 65 6e 20 73 65 74 2e 20 54 68  e chosen set. Th
3300: 65 73 65 20 61 72 65 0a 09 09 23 20 69 67 6e 6f  ese are...# igno
3310: 72 65 64 0a 09 09 69 66 20 7b 21 5b 24 64 67 20  red...if {![$dg 
3320: 6e 6f 64 65 20 65 78 69 73 74 73 20 24 73 75 63  node exists $suc
3330: 63 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 69  c]} continue...i
3340: 66 20 7b 5b 48 61 73 41 72 63 20 24 64 67 20 24  f {[HasArc $dg $
3350: 63 73 65 74 20 24 73 75 63 63 5d 7d 20 63 6f 6e  cset $succ]} con
3360: 74 69 6e 75 65 3b 23 20 54 4f 44 4f 20 73 68 6f  tinue;# TODO sho
3370: 75 6c 64 20 62 65 20 67 72 61 70 68 20 6d 65 74  uld be graph met
3380: 68 6f 64 2e 0a 09 09 24 64 67 20 61 72 63 20 69  hod....$dg arc i
3390: 6e 73 65 72 74 20 24 63 73 65 74 20 24 73 75 63  nsert $cset $suc
33a0: 63 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 72 65  c..    }..}...re
33b0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
33c0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
33d0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
33e0: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43  #######.    ## C
33f0: 61 6c 6c 62 61 63 6b 20 69 6e 76 6f 6b 61 74 69  allback invokati
3400: 6f 6e 20 2e 2e 2e 0a 0a 20 20 20 20 70 72 6f 63  on .....    proc
3410: 20 50 72 65 48 6f 6f 6b 20 7b 67 72 61 70 68 7d   PreHook {graph}
3420: 20 7b 0a 09 23 20 47 69 76 65 20 74 68 65 20 75   {..# Give the u
3430: 73 65 72 20 6f 66 20 74 68 65 20 63 79 63 6c 65  ser of the cycle
3440: 20 62 72 65 61 6b 65 72 20 74 68 65 20 6f 70 70   breaker the opp
3450: 6f 72 74 75 6e 69 74 79 20 74 6f 20 77 6f 72 6b  ortunity to work
3460: 0a 09 23 20 77 69 74 68 20 74 68 65 20 67 72 61  ..# with the gra
3470: 70 68 20 62 65 74 77 65 65 6e 20 73 65 74 75 70  ph between setup
3480: 20 61 6e 64 20 63 6f 6e 73 75 6d 6d 61 74 69 6f   and consummatio
3490: 6e 2e 0a 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20  n....::variable 
34a0: 6d 79 70 72 65 63 6d 64 0a 09 69 66 20 7b 21 5b  myprecmd..if {![
34b0: 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 63 6d  llength $myprecm
34c0: 64 5d 7d 20 72 65 74 75 72 6e 0a 0a 09 75 70 6c  d]} return...upl
34d0: 65 76 65 6c 20 23 30 20 5b 6c 69 6e 73 65 72 74  evel #0 [linsert
34e0: 20 24 6d 79 70 72 65 63 6d 64 20 65 6e 64 20 24   $myprecmd end $
34f0: 67 72 61 70 68 5d 0a 09 4d 61 72 6b 20 24 67 72  graph]..Mark $gr
3500: 61 70 68 20 2d 70 72 65 2d 64 6f 6e 65 0a 09 72  aph -pre-done..r
3510: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
3520: 20 70 72 6f 63 20 50 72 6f 63 65 73 73 65 64 48   proc ProcessedH
3530: 6f 6f 6b 20 7b 64 67 20 63 73 65 74 20 70 6f 73  ook {dg cset pos
3540: 7d 20 7b 0a 09 23 20 47 69 76 65 20 74 68 65 20  } {..# Give the 
3550: 75 73 65 72 20 6f 66 20 74 68 65 20 63 79 63 6c  user of the cycl
3560: 65 20 62 72 65 61 6b 65 72 20 74 68 65 20 6f 70  e breaker the op
3570: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 77 6f 72  portunity to wor
3580: 6b 0a 09 23 20 77 69 74 68 20 74 68 65 20 63 68  k..# with the ch
3590: 61 6e 67 65 73 65 74 20 62 65 66 6f 72 65 20 69  angeset before i
35a0: 74 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f  t is removed fro
35b0: 6d 20 74 68 65 20 67 72 61 70 68 2e 0a 0a 09 3a  m the graph....:
35c0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 73 61 76 65  :variable mysave
35d0: 63 6d 64 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67  cmd..if {![lleng
35e0: 74 68 20 24 6d 79 73 61 76 65 63 6d 64 5d 7d 20  th $mysavecmd]} 
35f0: 72 65 74 75 72 6e 0a 0a 09 75 70 6c 65 76 65 6c  return...uplevel
3600: 20 23 30 20 5b 6c 69 6e 73 65 72 74 20 24 6d 79   #0 [linsert $my
3610: 73 61 76 65 63 6d 64 20 65 6e 64 20 24 64 67 20  savecmd end $dg 
3620: 24 70 6f 73 20 24 63 73 65 74 5d 0a 09 72 65 74  $pos $cset]..ret
3630: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
3640: 72 6f 63 20 42 72 65 61 6b 43 79 63 6c 65 48 6f  roc BreakCycleHo
3650: 6f 6b 20 7b 67 72 61 70 68 7d 20 7b 0a 09 23 20  ok {graph} {..# 
3660: 43 61 6c 6c 20 6f 75 74 20 74 6f 20 74 68 65 20  Call out to the 
3670: 63 68 6f 73 65 6e 20 61 6c 67 6f 72 69 74 68 6d  chosen algorithm
3680: 20 66 6f 72 20 63 79 63 6c 65 20 62 72 65 61 6b   for cycle break
3690: 69 6e 67 2e 20 46 69 6e 64 69 6e 67 0a 09 23 20  ing. Finding..# 
36a0: 61 20 63 79 63 6c 65 20 69 66 20 6e 6f 20 62 72  a cycle if no br
36b0: 65 61 6b 65 72 20 77 61 73 20 63 68 6f 73 65 6e  eaker was chosen
36c0: 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 0a 09   is an error....
36d0: 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62 72 65  ::variable mybre
36e0: 61 6b 63 6d 64 0a 09 69 66 20 7b 21 5b 6c 6c 65  akcmd..if {![lle
36f0: 6e 67 74 68 20 24 6d 79 62 72 65 61 6b 63 6d 64  ngth $mybreakcmd
3700: 5d 7d 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c  ]} {..    troubl
3710: 65 20 66 61 74 61 6c 20 22 46 6f 75 6e 64 20 61  e fatal "Found a
3720: 20 63 79 63 6c 65 2c 20 65 78 70 65 63 74 69 6e   cycle, expectin
3730: 67 20 6e 6f 6e 65 2e 22 0a 09 20 20 20 20 65 78  g none."..    ex
3740: 69 74 20 31 0a 09 7d 0a 0a 09 75 70 6c 65 76 65  it 1..}...upleve
3750: 6c 20 23 30 20 5b 6c 69 6e 73 65 72 74 20 24 6d  l #0 [linsert $m
3760: 79 62 72 65 61 6b 63 6d 64 20 65 6e 64 20 24 67  ybreakcmd end $g
3770: 72 61 70 68 5d 0a 09 72 65 74 75 72 6e 0a 20 20  raph]..return.  
3780: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 6c    }..    proc Cl
3790: 65 61 72 48 6f 6f 6b 73 20 7b 7d 20 7b 0a 09 3a  earHooks {} {..:
37a0: 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65 63  :variable myprec
37b0: 6d 64 20 20 20 7b 7d 0a 09 3a 3a 76 61 72 69 61  md   {}..::varia
37c0: 62 6c 65 20 6d 79 73 61 76 65 63 6d 64 20 20 7b  ble mysavecmd  {
37d0: 7d 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79  }..::variable my
37e0: 62 72 65 61 6b 63 6d 64 20 7b 7d 0a 09 72 65 74  breakcmd {}..ret
37f0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
3800: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
3810: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
3820: 23 23 23 23 23 23 0a 0a 20 20 20 20 70 72 6f 63  ######..    proc
3830: 20 4d 61 72 6b 57 61 74 63 68 20 7b 67 72 61 70   MarkWatch {grap
3840: 68 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65  h} {..::variable
3850: 20 6d 79 77 61 74 63 68 69 64 73 0a 09 73 65 74   mywatchids..set
3860: 20 77 61 74 63 68 65 64 20 5b 57 61 74 63 68 65   watched [Watche
3870: 64 20 24 67 72 61 70 68 20 24 6d 79 77 61 74 63  d $graph $mywatc
3880: 68 69 64 73 5d 0a 09 69 66 20 7b 21 5b 6c 6c 65  hids]..if {![lle
3890: 6e 67 74 68 20 24 77 61 74 63 68 65 64 5d 7d 20  ngth $watched]} 
38a0: 72 65 74 75 72 6e 0a 09 73 65 74 20 6e 65 69 67  return..set neig
38b0: 68 62 6f 75 72 73 20 5b 65 76 61 6c 20 5b 6c 69  hbours [eval [li
38c0: 6e 73 65 72 74 20 24 77 61 74 63 68 65 64 20 30  nsert $watched 0
38d0: 20 24 67 72 61 70 68 20 6e 6f 64 65 73 20 2d 61   $graph nodes -a
38e0: 64 6a 5d 5d 0a 09 23 66 6f 72 65 61 63 68 20 6e  dj]]..#foreach n
38f0: 20 24 6e 65 69 67 68 62 6f 75 72 73 20 7b 20 6c   $neighbours { l
3900: 6f 67 20 77 72 69 74 65 20 36 20 63 79 63 6c 65  og write 6 cycle
3910: 62 72 65 61 6b 65 72 20 22 4e 65 69 67 68 62 6f  breaker "Neighbo
3920: 72 20 5b 24 6e 20 69 64 5d 20 3d 3e 20 24 6e 22  r [$n id] => $n"
3930: 20 7d 0a 09 4d 61 72 6b 20 24 67 72 61 70 68 20   }..Mark $graph 
3940: 77 61 74 63 68 65 64 20 5b 63 6f 6e 63 61 74 20  watched [concat 
3950: 24 77 61 74 63 68 65 64 20 24 6e 65 69 67 68 62  $watched $neighb
3960: 6f 75 72 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20  ours]..return.  
3970: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 57 61    }..    proc Wa
3980: 74 63 68 65 64 20 7b 67 72 61 70 68 20 77 61 74  tched {graph wat
3990: 63 68 69 64 73 7d 20 7b 0a 09 73 65 74 20 72 65  chids} {..set re
39a0: 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 69 64  s {}..foreach id
39b0: 20 24 77 61 74 63 68 69 64 73 20 7b 0a 09 20 20   $watchids {..  
39c0: 20 20 73 65 74 20 6e 6c 20 5b 24 67 72 61 70 68    set nl [$graph
39d0: 20 6e 6f 64 65 73 20 2d 6b 65 79 20 5f 5f 69 64   nodes -key __id
39e0: 5f 5f 20 2d 76 61 6c 75 65 20 24 69 64 5d 0a 09  __ -value $id]..
39f0: 20 20 20 20 69 66 20 7b 21 5b 6c 6c 65 6e 67 74      if {![llengt
3a00: 68 20 24 6e 6c 5d 7d 20 63 6f 6e 74 69 6e 75 65  h $nl]} continue
3a10: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ..    lappend re
3a20: 73 20 24 6e 6c 0a 09 20 20 20 20 23 6c 6f 67 20  s $nl..    #log 
3a30: 77 72 69 74 65 20 36 20 62 72 65 61 6b 72 63 79  write 6 breakrcy
3a40: 63 6c 65 20 22 57 61 74 63 68 69 6e 67 20 24 69  cle "Watching $i
3a50: 64 20 3d 3e 20 24 6e 6c 22 0a 09 20 20 20 20 24  d => $nl"..    $
3a60: 67 72 61 70 68 20 6e 6f 64 65 20 73 65 74 20 24  graph node set $
3a70: 6e 6c 20 66 6f 6e 74 63 6f 6c 6f 72 20 72 65 64  nl fontcolor red
3a80: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 72 65 73  ..}..return $res
3a90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
3aa0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
3ab0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
3ac0: 23 23 23 0a 0a 0a 20 20 20 20 74 79 70 65 76 61  ###...    typeva
3ad0: 72 69 61 62 6c 65 20 6d 79 61 74 20 20 20 20 20  riable myat     
3ae0: 20 30 20 3b 20 23 20 43 6f 75 6e 74 65 72 20 66   0 ; # Counter f
3af0: 6f 72 20 63 6f 6d 6d 69 74 20 69 64 73 20 66 6f  or commit ids fo
3b00: 72 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 20  r the....       
3b10: 23 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20  # changesets..  
3b20: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
3b30: 79 62 6f 74 74 6f 6d 20 7b 7d 20 3b 20 23 20 4c  ybottom {} ; # L
3b40: 69 73 74 20 6f 66 20 74 68 65 20 63 61 6e 64 69  ist of the candi
3b50: 64 61 74 65 20 6e 6f 64 65 73 20 66 6f 72 0a 09  date nodes for..
3b60: 09 09 20 20 20 20 20 20 20 23 20 63 6f 6d 6d 69  ..       # commi
3b70: 74 74 69 6e 67 2e 0a 0a 20 20 20 20 74 79 70 65  tting...    type
3b80: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65 63 6d  variable myprecm
3b90: 64 20 20 20 7b 7d 20 3b 20 23 20 43 61 6c 6c 62  d   {} ; # Callb
3ba0: 61 63 6b 2c 20 63 68 61 6e 67 65 20 67 72 61 70  ack, change grap
3bb0: 68 20 62 65 66 6f 72 65 20 77 61 6c 6b 2e 0a 20  h before walk.. 
3bc0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
3bd0: 6d 79 73 61 76 65 63 6d 64 20 20 7b 7d 20 3b 20  mysavecmd  {} ; 
3be0: 23 20 43 61 6c 6c 62 61 63 6b 2c 20 66 6f 72 20  # Callback, for 
3bf0: 65 61 63 68 20 70 72 6f 63 65 73 73 65 64 20 6e  each processed n
3c00: 6f 64 65 2e 0a 20 20 20 20 74 79 70 65 76 61 72  ode..    typevar
3c10: 69 61 62 6c 65 20 6d 79 62 72 65 61 6b 63 6d 64  iable mybreakcmd
3c20: 20 7b 7d 20 3b 20 23 20 43 61 6c 6c 62 61 63 6b   {} ; # Callback
3c30: 2c 20 66 6f 72 20 65 61 63 68 20 66 6f 75 6e 64  , for each found
3c40: 20 63 79 63 6c 65 2e 0a 0a 20 20 20 20 74 79 70   cycle...    typ
3c50: 65 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 64  evariable mydotd
3c60: 65 73 74 69 6e 61 74 69 6f 6e 20 7b 7d 20 3b 20  estination {} ; 
3c70: 23 20 44 65 73 74 69 6e 61 74 69 6f 6e 20 64 69  # Destination di
3c80: 72 65 63 74 6f 72 79 20 66 6f 72 20 74 68 65 0a  rectory for the.
3c90: 09 09 09 09 20 20 20 20 20 20 20 23 20 67 65 6e  ....       # gen
3ca0: 65 72 61 74 65 64 20 2e 64 6f 74 20 66 69 6c 65  erated .dot file
3cb0: 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  s..    typevaria
3cc0: 62 6c 65 20 6d 79 64 6f 74 70 72 65 66 69 78 20  ble mydotprefix 
3cd0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 50 72 65 66       {} ; # Pref
3ce0: 69 78 20 66 6f 72 20 64 6f 74 20 66 69 6c 65 73  ix for dot files
3cf0: 20 77 68 65 6e 0a 09 09 09 09 20 20 20 20 20 20   when.....      
3d00: 20 23 20 65 78 70 6f 72 74 69 6e 67 20 74 68 65   # exporting the
3d10: 20 67 72 61 70 68 73 2e 0a 20 20 20 20 74 79 70   graphs..    typ
3d20: 65 76 61 72 69 61 62 6c 65 20 6d 79 64 6f 74 69  evariable mydoti
3d30: 64 20 20 20 20 20 20 20 20 20 20 20 30 20 3b 20  d           0 ; 
3d40: 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 20 64 6f  # Counter for do
3d50: 74 20 66 69 6c 65 20 6e 61 6d 65 0a 09 09 09 09  t file name.....
3d60: 20 20 20 20 20 20 20 23 20 67 65 6e 65 72 61 74         # generat
3d70: 69 6f 6e 2e 0a 20 20 20 20 74 79 70 65 76 61 72  ion..    typevar
3d80: 69 61 62 6c 65 20 6d 79 77 61 74 63 68 69 64 73  iable mywatchids
3d90: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 68         {} ; # Ch
3da0: 61 6e 67 65 73 65 74 73 20 74 6f 20 77 61 74 63  angesets to watc
3db0: 68 20 74 68 65 0a 09 09 09 09 20 20 20 20 20 20  h the.....      
3dc0: 20 23 20 6e 65 69 67 68 62 6f 75 72 68 6f 6f 64   # neighbourhood
3dd0: 20 6f 66 2e 0a 0a 20 20 20 20 23 20 23 20 23 23   of...    # # ##
3de0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
3df0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
3e00: 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75  #.    ## Configu
3e10: 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67  ration..    prag
3e20: 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e 63 65 73  ma -hasinstances
3e30: 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65     no ; # single
3e40: 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d  ton.    pragma -
3e50: 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e  hastypeinfo    n
3e60: 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70  o ; # no introsp
3e70: 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d  ection.    pragm
3e80: 61 20 2d 68 61 73 74 79 70 65 64 65 73 74 72 6f  a -hastypedestro
3e90: 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61  y no ; # immorta
3ea0: 6c 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  l..    # # ## ##
3eb0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
3ec0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d   #############.}
3ed0: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
3ee0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
3ef0: 6d 70 6f 72 74 3a 3a 63 76 73 20 7b 0a 20 20 20  mport::cvs {.   
3f00: 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72   namespace expor
3f10: 74 20 63 79 63 6c 65 62 72 65 61 6b 65 72 0a 20  t cyclebreaker. 
3f20: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61     namespace eva
3f30: 6c 20 63 79 63 6c 65 62 72 65 61 6b 65 72 20 7b  l cyclebreaker {
3f40: 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
3f50: 20 70 72 6f 6a 65 63 74 20 7b 0a 09 20 20 20 20   project {..    
3f60: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
3f70: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
3f80: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65  mport::cvs::inte
3f90: 67 72 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73  grity..    names
3fa0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
3fb0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
3fc0: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a  ::cvs::project::
3fd0: 72 65 76 0a 09 20 20 20 20 6e 61 6d 65 73 70 61  rev..    namespa
3fe0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
3ff0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
4000: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65  cvs::project::re
4010: 76 6c 69 6e 6b 0a 09 7d 0a 09 6e 61 6d 65 73 70  vlink..}..namesp
4020: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
4030: 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a  :tools::misc::*.
4040: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
4050: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  t ::vc::tools::l
4060: 6f 67 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  og..namespace im
4070: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  port ::vc::tools
4080: 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73  ::trouble..names
4090: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
40a0: 3a 3a 74 6f 6f 6c 73 3a 3a 64 6f 74 0a 09 6c 6f  ::tools::dot..lo
40b0: 67 20 72 65 67 69 73 74 65 72 20 63 79 63 6c 65  g register cycle
40c0: 62 72 65 61 6b 65 72 0a 20 20 20 20 7d 0a 7d 0a  breaker.    }.}.
40d0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
40e0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
40f0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
4100: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
4110: 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65  # Ready..package
4120: 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73   provide vc::fos
4130: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
4140: 3a 3a 63 79 63 6c 65 62 72 65 61 6b 65 72 20 31  ::cyclebreaker 1
4150: 2e 30 0a 72 65 74 75 72 6e 0a                    .0.return.