Hex Artifact Content
Not logged in

Artifact 152bdf41973ec4de636bd8b13508e22d01293e0a:

File tools/lib/cvs_branch.tcl part of check-in [7a64b9e738] - CVS import. First, fixed sig::next regarding two things. One, we have to take the root version of a file into account as a possible predecessor. Two, a missing changed file may be misclassified and actually be added instead. Second, modified the search for a root changeset of a branch. We now try the existing regular intersection first for exactness, and in case of failure we fall back to a voting scheme to locate the most acceptable aka non-conflicting changeset. by aku on 2007-09-27 04:44:19.

0000: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
0010: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
0020: 62 72 61 6e 63 68 20 7b 7d 0a 0a 23 20 54 72 69  branch {}..# Tri
0030: 76 69 61 6c 20 73 74 6f 72 61 67 65 20 6f 66 20  vial storage of 
0040: 61 6c 6c 20 62 72 61 6e 63 68 20 64 61 74 61 20  all branch data 
0050: 61 73 20 61 20 72 65 63 74 61 6e 67 75 6c 61 72  as a rectangular
0060: 20 74 61 62 6c 65 2e 20 20 57 65 20 63 61 6e 0a   table.  We can.
0070: 23 20 74 68 69 6e 6b 20 75 70 20 61 20 62 65 74  # think up a bet
0080: 74 65 72 20 73 75 69 74 65 64 20 73 74 6f 72 61  ter suited stora
0090: 67 65 20 73 79 73 74 65 6d 20 6c 61 74 65 72 2c  ge system later,
00a0: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 77 68   when we know wh
00b0: 61 74 0a 23 20 74 79 70 65 20 6f 66 20 71 75 65  at.# type of que
00c0: 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  ries are made to
00d0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 0a 70   this module...p
00e0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
00f0: 73 3a 3a 62 72 61 6e 63 68 3a 3a 64 65 66 20 7b  s::branch::def {
0100: 66 20 64 76 20 64 65 66 6c 69 73 74 7d 20 7b 0a  f dv deflist} {.
0110: 20 20 20 20 75 70 76 61 72 20 31 20 24 64 76 20      upvar 1 $dv 
0120: 64 61 74 65 0a 20 20 20 20 76 61 72 69 61 62 6c  date.    variabl
0130: 65 20 62 72 61 0a 20 20 20 20 66 6f 72 65 61 63  e bra.    foreac
0140: 68 20 7b 74 61 67 20 72 65 76 7d 20 24 64 65 66  h {tag rev} $def
0150: 6c 69 73 74 20 7b 0a 09 23 20 69 67 6e 6f 72 65  list {..# ignore
0160: 20 6e 6f 6e 2d 62 72 61 6e 63 68 20 74 61 67 73   non-branch tags
0170: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b  ..if {[llength [
0180: 73 70 6c 69 74 20 24 72 65 76 20 2e 5d 5d 20 3c  split $rev .]] <
0190: 20 34 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 69   4} continue...i
01a0: 66 20 30 20 7b 0a 09 20 20 20 20 69 66 20 7b 20  f 0 {..    if { 
01b0: 28 24 72 65 76 20 6e 65 20 22 31 2e 31 2e 31 2e  ($rev ne "1.1.1.
01c0: 31 22 29 20 26 26 20 21 5b 73 74 72 69 6e 67 20  1") && ![string 
01d0: 6d 61 74 63 68 20 2a 2e 30 2e 32 20 24 72 65 76  match *.0.2 $rev
01e0: 5d 20 7d 20 7b 0a 09 09 23 20 31 2e 31 2e 31 2e  ] } {...# 1.1.1.
01f0: 31 20 69 73 20 74 68 65 20 62 61 73 65 20 6f 66  1 is the base of
0200: 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 65 73   vendor branches
0210: 2c 20 75 73 75 61 6c 6c 79 2e 20 2a 2e 30 2e 79  , usually. *.0.y
0220: 0a 09 09 23 20 69 73 20 74 68 65 20 62 61 73 65  ...# is the base
0230: 20 6f 66 20 72 65 67 75 6c 61 72 20 62 72 61 6e   of regular bran
0240: 63 68 65 73 20 77 68 65 72 65 20 6e 6f 74 68 69  ches where nothi
0250: 6e 67 20 69 73 20 6f 6e 20 74 68 65 0a 09 09 23  ng is on the...#
0260: 20 62 72 61 6e 63 68 20 79 65 74 2c 20 6f 6e 6c   branch yet, onl
0270: 79 20 69 74 73 20 72 6f 6f 74 20 69 73 20 6d 61  y its root is ma
0280: 72 6b 65 64 2e 20 45 76 65 72 79 74 68 69 6e 67  rked. Everything
0290: 20 65 6c 73 65 20 69 73 0a 09 09 23 20 6e 6f 74   else is...# not
02a0: 65 77 6f 72 74 68 79 20 66 6f 72 20 6e 6f 77 2e  eworthy for now.
02b0: 0a 09 09 70 75 74 73 20 24 66 2f 24 72 65 76 2f  ...puts $f/$rev/
02c0: 24 74 61 67 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  $tag..    }..}..
02d0: 09 73 65 74 20 72 6f 6f 74 20 5b 72 65 76 72 6f  .set root [revro
02e0: 6f 74 20 24 72 65 76 5d 0a 09 6c 61 70 70 65 6e  ot $rev]..lappen
02f0: 64 20 62 72 61 20 5b 6c 69 73 74 20 24 64 61 74  d bra [list $dat
0300: 65 28 24 72 6f 6f 74 29 20 24 74 61 67 20 24 66  e($root) $tag $f
0310: 20 24 72 65 76 5d 0a 20 20 20 20 7d 0a 7d 0a 0a   $rev].    }.}..
0320: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
0330: 77 73 3a 3a 62 72 61 6e 63 68 3a 3a 72 65 76 72  ws::branch::revr
0340: 6f 6f 74 20 7b 72 65 76 7d 20 7b 0a 20 20 20 20  oot {rev} {.    
0350: 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 6c 72  return [join [lr
0360: 61 6e 67 65 20 5b 73 70 6c 69 74 20 24 72 65 76  ange [split $rev
0370: 20 2e 5d 20 30 20 65 6e 64 2d 32 5d 20 2e 5d 0a   .] 0 end-2] .].
0380: 7d 0a 0a 0a 20 20 20 20 23 20 21 20 46 69 6c 65  }...    # ! File
0390: 73 20 69 6e 20 61 20 62 72 61 6e 63 68 20 63 61  s in a branch ca
03a0: 6e 20 61 70 70 65 61 72 20 6f 6e 6c 79 20 61 66  n appear only af
03b0: 74 65 72 20 74 68 65 69 72 20 72 6f 6f 74 20 72  ter their root r
03c0: 65 76 69 73 69 6f 6e 0a 20 20 20 20 23 20 20 20  evision.    #   
03d0: 65 78 69 73 74 73 2e 20 54 68 69 73 20 63 61 6e  exists. This can
03e0: 20 62 65 20 63 68 65 63 6b 65 64 20 61 67 61 69   be checked agai
03f0: 6e 73 74 20 74 68 65 20 74 69 6d 65 20 6f 66 20  nst the time of 
0400: 74 68 65 20 63 73 65 74 20 77 68 69 63 68 0a 20  the cset which. 
0410: 20 20 20 23 20 20 20 69 73 20 6f 75 72 20 62 61     #   is our ba
0420: 73 65 2e 20 42 72 61 6e 63 68 65 73 20 77 68 69  se. Branches whi
0430: 63 68 20 68 61 76 65 20 6e 6f 20 66 69 6c 65 73  ch have no files
0440: 20 79 65 74 20 63 61 6e 20 62 65 20 65 6c 69 6d   yet can be elim
0450: 69 6e 61 74 65 64 0a 20 20 20 20 23 20 20 20 66  inated.    #   f
0460: 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  rom consideratio
0470: 6e 2e 0a 0a 20 20 20 20 23 20 21 20 41 6c 6c 20  n...    # ! All 
0480: 66 69 6c 65 73 20 6e 6f 74 65 64 20 62 79 20 74  files noted by t
0490: 68 65 20 62 61 73 65 20 63 73 65 74 20 61 73 20  he base cset as 
04a0: 61 64 64 65 64 2f 6d 6f 64 69 66 69 65 64 20 68  added/modified h
04b0: 61 76 65 20 74 6f 20 62 65 0a 20 20 20 20 23 20  ave to be.    # 
04c0: 20 20 69 6e 20 74 68 65 20 62 72 61 6e 63 68 20    in the branch 
04d0: 72 6f 6f 74 2e 20 42 72 61 6e 63 68 65 73 20 77  root. Branches w
04e0: 68 69 63 68 20 64 6f 20 6e 6f 74 20 68 61 76 65  hich do not have
04f0: 20 73 75 63 68 20 61 20 66 69 6c 65 20 63 61 6e   such a file can
0500: 0a 20 20 20 20 23 20 20 20 62 65 20 65 6c 69 6d  .    #   be elim
0510: 69 6e 61 74 65 64 20 66 72 6f 6d 20 63 6f 6e 73  inated from cons
0520: 69 64 65 72 61 74 69 6f 6e 2e 0a 0a 20 20 20 20  ideration...    
0530: 23 20 21 20 54 68 65 20 76 65 72 73 69 6f 6e 73  # ! The versions
0540: 20 6f 66 20 74 68 65 20 61 64 64 65 64 2f 6d 6f   of the added/mo
0550: 64 69 66 69 65 64 20 66 69 6c 65 73 20 69 6e 20  dified files in 
0560: 74 68 65 20 62 61 73 65 20 68 61 76 65 0a 20 20  the base have.  
0570: 20 20 23 20 20 20 6d 61 74 63 68 20 74 68 65 20    #   match the 
0580: 76 65 72 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  versions in the 
0590: 62 72 61 6e 63 68 20 72 6f 6f 74 2e 20 49 6e 20  branch root. In 
05a0: 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 74  the sense that t
05b0: 68 65 79 0a 20 20 20 20 23 20 20 20 68 61 76 65  hey.    #   have
05c0: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 6f 72 20   to be equal or 
05d0: 73 75 63 65 73 73 6f 72 73 2e 20 54 68 65 20 6c  sucessors. The l
05e0: 61 74 65 72 20 69 6d 70 6c 69 65 73 20 69 64 65  ater implies ide
05f0: 6e 74 69 74 79 20 69 6e 20 74 68 65 0a 20 20 20  ntity in the.   
0600: 20 23 20 20 20 75 70 70 65 72 20 70 61 72 74 73   #   upper parts
0610: 20 28 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20   (only the last 
0620: 32 20 70 61 72 74 73 20 61 72 65 20 72 65 6c 65  2 parts are rele
0630: 76 61 6e 74 29 2c 20 61 6e 64 20 65 71 75 61 6c  vant), and equal
0640: 0a 20 20 20 20 23 20 20 20 6c 65 6e 67 74 68 2e  .    #   length.
0650: 0a 0a 20 20 20 20 23 20 54 68 69 73 20 67 69 76  ..    # This giv
0660: 65 73 20 75 73 20 74 68 65 20 62 72 61 6e 63 68  es us the branch
0670: 2c 20 61 6e 64 2c 20 64 75 65 20 74 6f 20 74 68  , and, due to th
0680: 65 20 74 69 6d 65 20 69 6e 66 6f 72 6d 61 74 69  e time informati
0690: 6f 6e 20 61 0a 20 20 20 20 23 20 73 69 67 6e 61  on a.    # signa
06a0: 74 75 72 65 20 66 6f 72 20 74 68 65 20 72 6f 6f  ture for the roo
06b0: 74 2e 0a 0a 20 20 20 20 23 3f 20 43 61 6e 20 73  t...    #? Can s
06c0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 6f  earch for the ro
06d0: 6f 74 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73  ot based on this
06e0: 20 73 69 67 6e 61 74 75 72 65 20 66 61 69 6c 20   signature fail 
06f0: 3f 0a 20 20 20 20 23 20 20 59 65 73 2e 20 42 65  ?.    #  Yes. Be
0700: 63 61 75 73 65 20 74 68 65 20 73 69 67 6e 61 74  cause the signat
0710: 75 72 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ure may contain 
0720: 66 69 6c 65 73 20 77 68 69 63 68 20 77 65 72 65  files which were
0730: 20 6e 6f 74 0a 20 20 20 20 23 20 20 61 63 74 75   not.    #  actu
0740: 61 6c 6c 79 20 79 65 74 20 69 6e 20 74 68 65 20  ally yet in the 
0750: 72 6f 6f 74 2c 20 64 65 73 70 69 74 65 20 62 65  root, despite be
0760: 69 6e 67 20 61 62 6c 65 20 74 6f 2e 20 41 6e 64  ing able to. And
0770: 20 77 68 69 63 68 20 77 65 72 65 0a 20 20 20 20   which were.    
0780: 23 20 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20  #  not modified 
0790: 62 79 20 74 68 65 20 62 61 73 65 2c 20 73 6f 20  by the base, so 
07a0: 74 68 65 20 63 68 65 63 6b 20 32 20 61 62 6f 76  the check 2 abov
07b0: 65 20 73 74 69 6c 6c 20 70 61 73 73 65 73 2e 0a  e still passes..
07c0: 0a 20 20 20 20 23 20 2d 3e 20 53 65 61 72 63 68  .    # -> Search
07d0: 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 73 69   for the full si
07e0: 67 6e 61 74 75 72 65 20 66 69 72 73 74 2c 20 74  gnature first, t
07f0: 68 65 6e 20 64 72 6f 70 20 74 68 65 20 79 6f 75  hen drop the you
0800: 6e 67 65 73 74 0a 20 20 20 20 23 20 66 69 6c 65  ngest.    # file
0810: 73 2c 20 73 65 61 72 63 68 20 61 67 61 69 6e 20  s, search again 
0820: 75 6e 74 69 6c 20 6d 61 74 63 68 2e 20 43 68 65  until match. Che
0830: 63 6b 20 74 68 65 20 72 65 73 75 6c 74 20 61 67  ck the result ag
0840: 61 69 6e 73 74 20 74 68 65 0a 20 20 20 20 23 20  ainst the.    # 
0850: 62 61 73 65 2c 20 74 68 61 74 20 61 6c 6c 20 6e  base, that all n
0860: 65 65 64 65 64 20 66 69 6c 65 73 20 61 72 65 20  eeded files are 
0870: 70 72 65 73 65 6e 74 2e 0a 0a 20 20 20 20 23 20  present...    # 
0880: 48 6f 77 65 76 65 72 20 2d 20 43 61 6e 20 73 65  However - Can se
0890: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 6f 6f  arch for the roo
08a0: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  t based on the c
08b0: 73 65 74 20 64 61 74 61 20 28 6e 65 65 64 65 64  set data (needed
08c0: 0a 20 20 20 20 23 20 66 69 6c 65 73 29 2e 20 47  .    # files). G
08d0: 69 76 65 73 20 75 73 20 61 6e 6f 74 68 65 72 20  ives us another 
08e0: 73 65 74 20 6f 66 20 63 61 6e 64 69 64 61 74 65  set of candidate
08f0: 20 72 6f 6f 74 73 2e 20 49 6e 74 65 72 73 65 63   roots. Intersec
0900: 74 21 0a 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  t!...proc ::vc::
0910: 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a  cvs::ws::branch:
0920: 3a 66 69 6e 64 20 7b 63 73 76 61 6c 75 65 7d 20  :find {csvalue} 
0930: 7b 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20  {.    array set 
0940: 63 73 20 24 63 73 76 61 6c 75 65 0a 0a 20 20 20  cs $csvalue..   
0950: 20 23 76 61 72 69 61 62 6c 65 20 62 72 61 0a 20   #variable bra. 
0960: 20 20 20 23 70 75 74 73 20 5f 5f 5f 5f 5f 5f 5f     #puts _______
0970: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0980: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0990: 5f 5f 5f 5f 0a 20 20 20 20 23 70 75 74 73 20 5b  ____.    #puts [
09a0: 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 2d 69 6e 64  join [lsort -ind
09b0: 65 78 20 30 20 5b 6c 73 6f 72 74 20 2d 69 6e 64  ex 0 [lsort -ind
09c0: 65 78 20 31 20 24 62 72 61 5d 5d 20 5c 6e 5d 0a  ex 1 $bra]] \n].
09d0: 0a 20 20 20 20 53 69 67 6e 61 74 75 72 65 73 20  .    Signatures 
09e0: 20 20 20 20 62 64 20 5b 54 69 6d 65 52 65 6c 65      bd [TimeRele
09f0: 76 61 6e 74 20 24 63 73 28 64 61 74 65 29 5d 0a  vant $cs(date)].
0a00: 20 20 20 20 44 72 6f 70 49 6e 63 6f 6d 70 6c 65      DropIncomple
0a10: 74 65 20 62 64 20 5b 63 6f 6e 63 61 74 20 24 63  te bd [concat $c
0a20: 73 28 61 64 64 65 64 29 20 24 63 73 28 63 68 61  s(added) $cs(cha
0a30: 6e 67 65 64 29 5d 0a 0a 20 20 20 20 23 70 75 74  nged)]..    #put
0a40: 73 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  s ______________
0a50: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0a60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 0a 20 20  _____________.  
0a70: 20 20 23 70 61 72 72 61 79 20 62 64 0a 0a 20 20    #parray bd..  
0a80: 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a    if {[array siz
0a90: 65 20 62 64 5d 20 3c 20 31 7d 20 7b 0a 09 70 75  e bd] < 1} {..pu
0aa0: 74 73 20 22 4e 4f 20 42 52 41 4e 43 48 22 0a 09  ts "NO BRANCH"..
0ab0: 23 20 44 65 61 6c 20 68 6f 77 3f 0a 09 23 20 2d  # Deal how?..# -
0ac0: 20 41 62 6f 72 74 0a 09 23 20 2d 20 49 67 6e 6f   Abort..# - Igno
0ad0: 72 65 20 74 68 69 73 20 63 68 61 6e 67 65 73 65  re this changese
0ae0: 74 20 61 6e 64 20 74 72 79 20 74 68 65 20 6e 65  t and try the ne
0af0: 78 74 20 6f 6e 65 0a 09 23 20 20 20 28 57 68 69  xt one..#   (Whi
0b00: 63 68 20 68 61 73 20 68 69 67 68 65 72 20 70 72  ch has higher pr
0b10: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 6e 6f 74  obability of not
0b20: 20 6d 61 74 63 68 69 6e 67 20 61 73 20 69 74 20   matching as it 
0b30: 6d 69 67 68 74 0a 09 23 20 20 20 20 62 65 20 74  might..#    be t
0b40: 68 65 20 73 75 63 63 65 73 73 6f 72 20 69 6e 20  he successor in 
0b50: 74 68 65 20 62 72 61 6e 63 68 20 74 6f 20 74 68  the branch to th
0b60: 69 73 20 63 73 65 74 20 61 6e 64 20 6e 6f 74 20  is cset and not 
0b70: 61 20 62 61 73 65 29 2e 0a 09 70 75 74 73 20 22  a base)...puts "
0b80: 22 0a 09 70 61 72 72 61 79 20 63 73 0a 09 65 78  "..parray cs..ex
0b90: 69 74 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20  it.    } elseif 
0ba0: 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 62 64 5d  {[array size bd]
0bb0: 20 3e 20 31 7d 20 7b 0a 0a 09 23 20 57 68 69 6c   > 1} {...# Whil
0bc0: 65 20 77 65 20 6d 69 67 68 74 20 68 61 76 65 20  e we might have 
0bd0: 66 6f 75 6e 64 20 73 65 76 65 72 61 6c 20 74 61  found several ta
0be0: 67 20 74 68 65 79 20 6d 61 79 20 61 6c 6c 20 72  g they may all r
0bf0: 65 66 65 72 20 74 6f 0a 09 23 20 74 68 65 20 73  efer to..# the s
0c00: 61 6d 65 20 73 65 74 20 6f 66 20 66 69 6c 65 73  ame set of files
0c10: 2e 20 49 66 20 74 68 61 74 20 69 73 20 73 6f 20  . If that is so 
0c20: 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 65 6d  we consider them
0c30: 0a 09 23 20 69 64 65 6e 74 69 63 61 6c 20 61 6e  ..# identical an
0c40: 64 20 74 61 6b 65 20 6f 6e 65 20 61 73 20 72 65  d take one as re
0c50: 70 72 65 73 65 6e 74 61 74 69 76 65 20 6f 66 20  presentative of 
0c60: 61 6c 6c 2e 0a 0a 09 73 65 74 20 73 75 20 7b 7d  all....set su {}
0c70: 0a 09 66 6f 72 65 61 63 68 20 7b 74 20 73 7d 20  ..foreach {t s} 
0c80: 5b 61 72 72 61 79 20 67 65 74 20 62 64 5d 20 7b  [array get bd] {
0c90: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 73 75  ..    lappend su
0ca0: 20 5b 44 69 63 74 53 6f 72 74 20 24 73 5d 0a 09   [DictSort $s]..
0cb0: 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  }..if {[llength 
0cc0: 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24  [lsort -unique $
0cd0: 73 75 5d 5d 20 3e 20 31 7d 20 7b 0a 09 20 20 20  su]] > 1} {..   
0ce0: 20 70 75 74 73 20 22 41 4d 42 49 47 4f 55 53 2e   puts "AMBIGOUS.
0cf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
0d00: 72 61 6e 63 68 65 73 20 6d 61 74 63 68 3a 22 0a  ranches match:".
0d10: 09 20 20 20 20 23 20 44 65 61 6c 20 68 6f 77 3f  .    # Deal how?
0d20: 20 53 2e 61 2e 0a 09 20 20 20 20 70 75 74 73 20   S.a...    puts 
0d30: 5c 74 5b 6a 6f 69 6e 20 5b 61 72 72 61 79 20 6e  \t[join [array n
0d40: 61 6d 65 73 20 62 64 5d 20 5c 6e 5c 74 5d 0a 09  ames bd] \n\t]..
0d50: 20 20 20 20 70 75 74 73 20 22 22 0a 09 20 20 20      puts ""..   
0d60: 20 70 61 72 72 61 79 20 63 73 0a 09 20 20 20 20   parray cs..    
0d70: 65 78 69 74 0a 09 7d 0a 09 23 20 46 61 6c 6c 20  exit..}..# Fall 
0d80: 74 68 72 6f 75 67 68 20 2e 2e 2e 0a 20 20 20 20  through ....    
0d90: 7d 0a 0a 20 20 20 20 73 65 74 20 74 67 20 5b 6c  }..    set tg [l
0da0: 69 6e 64 65 78 20 5b 61 72 72 61 79 20 6e 61 6d  index [array nam
0db0: 65 73 20 62 64 5d 20 30 5d 0a 20 20 20 20 73 65  es bd] 0].    se
0dc0: 74 20 72 73 20 5b 52 6f 6f 74 4f 66 20 24 62 64  t rs [RootOf $bd
0dd0: 28 24 74 67 29 5d 0a 0a 20 20 20 20 23 70 75 74  ($tg)]..    #put
0de0: 73 20 22 42 52 41 4e 43 48 20 3d 20 24 74 67 22  s "BRANCH = $tg"
0df0: 0a 20 20 20 20 23 70 75 74 73 20 22 52 4f 4f 54  .    #puts "ROOT
0e00: 53 47 20 3d 20 24 72 73 22 0a 0a 20 20 20 20 72  SG = $rs"..    r
0e10: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 74 67 20  eturn [list $tg 
0e20: 24 72 73 5d 0a 7d 0a 0a 0a 70 72 6f 63 20 3a 3a  $rs].}...proc ::
0e30: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61  vc::cvs::ws::bra
0e40: 6e 63 68 3a 3a 68 61 73 20 7b 74 73 20 6e 65 65  nch::has {ts nee
0e50: 64 65 64 7d 20 7b 0a 20 20 20 20 23 76 61 72 69  ded} {.    #vari
0e60: 61 62 6c 65 20 62 72 61 0a 20 20 20 20 23 70 75  able bra.    #pu
0e70: 74 73 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ts _____________
0e80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0e90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 0a 20  ______________. 
0ea0: 20 20 20 23 70 75 74 73 20 5b 6a 6f 69 6e 20 5b     #puts [join [
0eb0: 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 5b  lsort -index 0 [
0ec0: 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 31 20 24  lsort -index 1 $
0ed0: 62 72 61 5d 5d 20 5c 6e 5d 0a 0a 20 20 20 20 53  bra]] \n]..    S
0ee0: 69 67 6e 61 74 75 72 65 73 20 20 20 20 20 62 64  ignatures     bd
0ef0: 20 5b 54 69 6d 65 52 65 6c 65 76 61 6e 74 20 24   [TimeRelevant $
0f00: 74 73 5d 0a 20 20 20 20 44 72 6f 70 49 6e 63 6f  ts].    DropInco
0f10: 6d 70 6c 65 74 65 20 62 64 20 24 6e 65 65 64 65  mplete bd $neede
0f20: 64 0a 0a 20 20 20 20 23 70 75 74 73 20 5f 5f 5f  d..    #puts ___
0f30: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0f40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
0f50: 5f 5f 5f 5f 5f 5f 5f 5f 0a 20 20 20 20 23 70 61  ________.    #pa
0f60: 72 72 61 79 20 62 64 0a 0a 20 20 20 20 69 66 20  rray bd..    if 
0f70: 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 62 64 5d  {[array size bd]
0f80: 20 3c 20 31 7d 20 7b 0a 09 70 75 74 73 20 22 4e   < 1} {..puts "N
0f90: 4f 20 42 52 41 4e 43 48 22 0a 09 23 20 44 65 61  O BRANCH"..# Dea
0fa0: 6c 20 68 6f 77 3f 0a 09 23 20 2d 20 41 62 6f 72  l how?..# - Abor
0fb0: 74 0a 09 23 20 2d 20 49 67 6e 6f 72 65 20 74 68  t..# - Ignore th
0fc0: 69 73 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64  is changeset and
0fd0: 20 74 72 79 20 74 68 65 20 6e 65 78 74 20 6f 6e   try the next on
0fe0: 65 0a 09 23 20 20 20 28 57 68 69 63 68 20 68 61  e..#   (Which ha
0ff0: 73 20 68 69 67 68 65 72 20 70 72 6f 62 61 62 69  s higher probabi
1000: 6c 69 74 79 20 6f 66 20 6e 6f 74 20 6d 61 74 63  lity of not matc
1010: 68 69 6e 67 20 61 73 20 69 74 20 6d 69 67 68 74  hing as it might
1020: 0a 09 23 20 20 20 20 62 65 20 74 68 65 20 73 75  ..#    be the su
1030: 63 63 65 73 73 6f 72 20 69 6e 20 74 68 65 20 62  ccessor in the b
1040: 72 61 6e 63 68 20 74 6f 20 74 68 69 73 20 63 73  ranch to this cs
1050: 65 74 20 61 6e 64 20 6e 6f 74 20 61 20 62 61 73  et and not a bas
1060: 65 29 2e 0a 09 65 78 69 74 0a 20 20 20 20 7d 20  e)...exit.    } 
1070: 65 6c 73 65 69 66 20 7b 5b 61 72 72 61 79 20 73  elseif {[array s
1080: 69 7a 65 20 62 64 5d 20 3e 20 31 7d 20 7b 0a 09  ize bd] > 1} {..
1090: 70 75 74 73 20 22 41 4d 42 49 47 4f 55 53 2e 20  puts "AMBIGOUS. 
10a0: 46 6f 6c 6c 6f 77 69 6e 67 20 62 72 61 6e 63 68  Following branch
10b0: 65 73 20 6d 61 74 63 68 3a 22 0a 09 23 20 44 65  es match:"..# De
10c0: 61 6c 20 68 6f 77 3f 20 53 2e 61 2e 0a 09 70 75  al how? S.a...pu
10d0: 74 73 20 5c 74 5b 6a 6f 69 6e 20 5b 61 72 72 61  ts \t[join [arra
10e0: 79 20 6e 61 6d 65 73 20 62 64 5d 20 5c 6e 5c 74  y names bd] \n\t
10f0: 5d 0a 09 65 78 69 74 0a 20 20 20 20 7d 0a 0a 20  ]..exit.    }.. 
1100: 20 20 20 73 65 74 20 74 67 20 5b 6c 69 6e 64 65     set tg [linde
1110: 78 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 62  x [array names b
1120: 64 5d 20 30 5d 0a 0a 20 20 20 20 23 70 75 74 73  d] 0]..    #puts
1130: 20 22 42 52 41 4e 43 48 20 3d 20 24 74 67 22 0a   "BRANCH = $tg".
1140: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 74 67 0a  .    return $tg.
1150: 7d 0a 0a 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  }....proc ::vc::
1160: 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a  cvs::ws::branch:
1170: 3a 52 6f 6f 74 4f 66 20 7b 64 69 63 74 7d 20 7b  :RootOf {dict} {
1180: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 7d 0a  .    set res {}.
1190: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66 20 72      foreach {f r
11a0: 7d 20 24 64 69 63 74 20 7b 0a 09 6c 61 70 70 65  } $dict {..lappe
11b0: 6e 64 20 72 65 73 20 24 66 20 5b 72 65 76 72 6f  nd res $f [revro
11c0: 6f 74 20 24 72 5d 0a 20 20 20 20 7d 0a 20 20 20  ot $r].    }.   
11d0: 20 72 65 74 75 72 6e 20 24 72 65 73 0a 7d 0a 0a   return $res.}..
11e0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
11f0: 77 73 3a 3a 62 72 61 6e 63 68 3a 3a 44 69 63 74  ws::branch::Dict
1200: 53 6f 72 74 20 7b 64 69 63 74 7d 20 7b 0a 20 20  Sort {dict} {.  
1210: 20 20 61 72 72 61 79 20 73 65 74 20 61 20 24 64    array set a $d
1220: 69 63 74 0a 20 20 20 20 73 65 74 20 72 20 7b 7d  ict.    set r {}
1230: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6b 20 5b  .    foreach k [
1240: 6c 73 6f 72 74 20 5b 61 72 72 61 79 20 6e 61 6d  lsort [array nam
1250: 65 73 20 61 5d 5d 20 7b 0a 09 6c 61 70 70 65 6e  es a]] {..lappen
1260: 64 20 72 20 24 6b 20 24 61 28 24 6b 29 0a 20 20  d r $k $a($k).  
1270: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24    }.    return $
1280: 72 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  r.}..proc ::vc::
1290: 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a  cvs::ws::branch:
12a0: 3a 44 72 6f 70 49 6e 63 6f 6d 70 6c 65 74 65 20  :DropIncomplete 
12b0: 7b 62 76 20 6e 65 65 64 65 64 7d 20 7b 0a 20 20  {bv needed} {.  
12c0: 20 20 75 70 76 61 72 20 31 20 24 62 76 20 62 64    upvar 1 $bv bd
12d0: 61 74 61 0a 0a 20 20 20 20 23 20 43 68 65 63 6b  ata..    # Check
12e0: 20 74 68 65 20 6e 65 65 64 65 64 20 66 69 6c 65   the needed file
12f0: 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 62 72  s against the br
1300: 61 6e 63 68 20 73 69 67 6e 61 74 75 72 65 2e 20  anch signature. 
1310: 49 66 20 66 69 6c 65 73 0a 20 20 20 20 23 20 61  If files.    # a
1320: 72 65 20 6d 69 73 73 69 6e 67 20 6f 72 20 6e 6f  re missing or no
1330: 74 20 6f 66 20 61 20 6d 61 74 63 68 69 6e 67 20  t of a matching 
1340: 76 65 72 73 69 6f 6e 20 64 72 6f 70 20 74 68 65  version drop the
1350: 20 62 72 61 6e 63 68 20 66 72 6f 6d 0a 20 20 20   branch from.   
1360: 20 23 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69   # further consi
1370: 64 65 72 61 74 69 6f 6e 2e 0a 0a 20 20 20 20 66  deration...    f
1380: 6f 72 65 61 63 68 20 7b 74 61 67 20 73 69 67 7d  oreach {tag sig}
1390: 20 5b 61 72 72 61 79 20 67 65 74 20 62 64 61 74   [array get bdat
13a0: 61 5d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20  a] {..array set 
13b0: 72 65 76 20 24 73 69 67 0a 09 66 6f 72 65 61 63  rev $sig..foreac
13c0: 68 20 7b 66 69 6c 65 20 72 76 7d 20 24 6e 65 65  h {file rv} $nee
13d0: 64 65 64 20 7b 0a 09 20 20 20 20 69 66 20 7b 21  ded {..    if {!
13e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 76  [info exists rev
13f0: 28 24 66 69 6c 65 29 5d 20 7c 7c 20 21 5b 73 75  ($file)] || ![su
1400: 63 63 65 73 73 6f 72 20 24 72 76 20 24 72 65 76  ccessor $rv $rev
1410: 28 24 66 69 6c 65 29 5d 7d 20 7b 0a 09 09 23 20  ($file)]} {...# 
1420: 66 69 6c 65 20 69 6e 20 63 73 65 74 20 69 73 20  file in cset is 
1430: 6e 6f 74 20 69 6e 20 74 68 65 20 62 72 61 6e 63  not in the branc
1440: 68 20 6f 72 20 69 73 20 70 72 65 73 65 6e 74 2c  h or is present,
1450: 20 62 75 74 0a 09 09 23 20 6e 6f 74 20 70 72 6f   but...# not pro
1460: 70 65 72 20 76 65 72 73 69 6f 6e 20 28 64 69 66  per version (dif
1470: 66 65 72 65 6e 74 20 6c 65 6e 67 74 68 73 2c 20  ferent lengths, 
1480: 6e 6f 74 20 6d 61 74 63 68 69 6e 67 0a 09 09 23  not matching...#
1490: 20 69 6e 20 75 70 70 65 72 20 30 2e 2e 65 6e 64   in upper 0..end
14a0: 2d 32 20 70 61 72 74 73 2c 20 6e 6f 74 20 65 71  -2 parts, not eq
14b0: 75 61 6c 7c 73 75 63 63 65 73 73 6f 72 29 2e 0a  ual|successor)..
14c0: 09 09 75 6e 73 65 74 20 62 64 61 74 61 28 24 74  ..unset bdata($t
14d0: 61 67 29 0a 09 09 62 72 65 61 6b 0a 09 20 20 20  ag)...break..   
14e0: 20 7d 20 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75   } ..    continu
14f0: 65 0a 09 7d 0a 09 75 6e 73 65 74 20 72 65 76 0a  e..}..unset rev.
1500: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1510: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  .}..proc ::vc::c
1520: 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a 3a  vs::ws::branch::
1530: 73 75 63 63 65 73 73 6f 72 20 7b 72 61 20 72 62  successor {ra rb
1540: 7d 20 7b 0a 20 20 20 20 23 20 61 20 73 75 63 63  } {.    # a succ
1550: 65 73 73 6f 72 2d 6f 66 20 62 20 3f 0a 0a 20 20  essor-of b ?..  
1560: 20 20 73 65 74 20 6c 61 20 5b 73 70 6c 69 74 20    set la [split 
1570: 24 72 61 20 2e 5d 0a 20 20 20 20 73 65 74 20 6c  $ra .].    set l
1580: 62 20 5b 73 70 6c 69 74 20 24 72 62 20 2e 5d 0a  b [split $rb .].
1590: 20 20 20 20 69 66 20 7b 0a 09 28 5b 6c 6c 65 6e      if {..([llen
15a0: 67 74 68 20 24 6c 61 5d 20 20 20 20 20 20 20 20  gth $la]        
15b0: 20 21 3d 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 62   != [llength $lb
15c0: 5d 29 20 20 20 20 20 20 20 20 20 7c 7c 0a 09 28  ])         ||..(
15d0: 5b 6c 72 61 6e 67 65 20 20 24 6c 61 20 30 20 65  [lrange  $la 0 e
15e0: 6e 64 2d 32 5d 20 6e 65 20 5b 6c 72 61 6e 67 65  nd-2] ne [lrange
15f0: 20 20 24 6c 62 20 30 20 65 6e 64 2d 32 5d 29 20    $lb 0 end-2]) 
1600: 7c 7c 0a 09 28 5b 70 61 63 6b 61 67 65 20 76 63  ||..([package vc
1610: 6f 6d 70 61 72 65 20 24 72 61 20 24 72 62 5d 20  ompare $ra $rb] 
1620: 3c 20 30 29 0a 20 20 20 20 7d 20 7b 0a 09 72 65  < 0).    } {..re
1630: 74 75 72 6e 20 30 0a 20 20 20 20 7d 20 65 6c 73  turn 0.    } els
1640: 65 20 7b 0a 09 72 65 74 75 72 6e 20 31 0a 20 20  e {..return 1.  
1650: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63    }.}..proc ::vc
1660: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63  ::cvs::ws::branc
1670: 68 3a 3a 72 6f 6f 74 53 75 63 63 65 73 73 6f 72  h::rootSuccessor
1680: 20 7b 72 61 20 72 62 7d 20 7b 0a 20 20 20 20 23   {ra rb} {.    #
1690: 20 61 20 72 6f 6f 74 2d 73 75 63 63 65 73 73 6f   a root-successo
16a0: 72 2d 6f 66 20 62 20 3f 20 28 3c 3d 3e 20 62 20  r-of b ? (<=> b 
16b0: 72 6f 6f 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  root version of 
16c0: 61 20 3f 29 0a 0a 20 20 20 20 69 66 20 7b 24 72  a ?)..    if {$r
16d0: 62 20 65 71 20 5b 72 65 76 72 6f 6f 74 20 24 72  b eq [revroot $r
16e0: 61 5d 7d 20 7b 0a 09 72 65 74 75 72 6e 20 31 0a  a]} {..return 1.
16f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
1700: 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a 7d 0a 0a  turn 0.    }.}..
1710: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
1720: 77 73 3a 3a 62 72 61 6e 63 68 3a 3a 53 69 67 6e  ws::branch::Sign
1730: 61 74 75 72 65 73 20 7b 62 76 20 64 65 66 6c 69  atures {bv defli
1740: 73 74 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20  st} {.    upvar 
1750: 31 20 24 62 76 20 62 64 61 74 61 0a 20 20 20 20  1 $bv bdata.    
1760: 23 20 53 6f 72 74 20 62 72 61 6e 63 68 20 64 61  # Sort branch da
1770: 74 61 20 62 79 20 73 79 6d 62 6f 6c 69 63 20 6e  ta by symbolic n
1780: 61 6d 65 20 66 6f 72 20 74 68 65 20 75 70 63 6f  ame for the upco
1790: 6d 69 6e 67 20 63 68 65 63 6b 73 2c 20 61 6e 64  ming checks, and
17a0: 0a 20 20 20 20 23 20 67 65 6e 65 72 61 74 65 20  .    # generate 
17b0: 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 20 73 69  file revision si
17c0: 67 6e 61 74 75 72 65 73 2e 0a 0a 20 20 20 20 61  gnatures...    a
17d0: 72 72 61 79 20 73 65 74 20 62 64 61 74 61 20 7b  rray set bdata {
17e0: 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69 74  }.    foreach it
17f0: 65 6d 20 24 64 65 66 6c 69 73 74 20 7b 0a 09 23  em $deflist {..#
1800: 20 69 74 65 6d 20 3d 20 74 69 6d 65 73 74 61 6d   item = timestam
1810: 70 20 74 61 67 20 66 69 6c 65 20 72 65 76 69 73  p tag file revis
1820: 69 6f 6e 0a 09 66 6f 72 65 61 63 68 20 7b 5f 5f  ion..foreach {__
1830: 20 74 61 67 20 66 69 6c 65 20 72 65 76 7d 20 24   tag file rev} $
1840: 69 74 65 6d 20 62 72 65 61 6b 0a 09 6c 61 70 70  item break..lapp
1850: 65 6e 64 20 62 64 61 74 61 28 24 74 61 67 29 20  end bdata($tag) 
1860: 24 66 69 6c 65 20 24 72 65 76 0a 20 20 20 20 7d  $file $rev.    }
1870: 0a 0a 20 20 20 20 23 70 75 74 73 20 5f 5f 5f 5f  ..    #puts ____
1880: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1890: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
18a0: 5f 5f 5f 5f 5f 5f 5f 0a 20 20 20 20 23 70 61 72  _______.    #par
18b0: 72 61 79 20 62 64 61 74 61 0a 0a 20 20 20 20 72  ray bdata..    r
18c0: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  eturn.}..proc ::
18d0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61  vc::cvs::ws::bra
18e0: 6e 63 68 3a 3a 54 69 6d 65 52 65 6c 65 76 61 6e  nch::TimeRelevan
18f0: 74 20 7b 64 61 74 65 7d 20 7b 0a 20 20 20 20 76  t {date} {.    v
1900: 61 72 69 61 62 6c 65 20 62 72 61 0a 0a 20 20 20  ariable bra..   
1910: 20 23 20 52 65 74 72 69 65 76 65 20 74 68 65 20   # Retrieve the 
1920: 62 72 61 6e 63 68 20 64 61 74 61 20 77 68 69 63  branch data whic
1930: 68 20 64 65 66 69 6e 69 74 65 6c 79 20 63 6f 6d  h definitely com
1940: 65 73 20 62 65 66 6f 72 65 20 28 69 6e 20 74 69  es before (in ti
1950: 6d 65 29 0a 20 20 20 20 23 20 74 68 65 20 63 61  me).    # the ca
1960: 6e 64 69 64 61 74 65 20 63 73 65 74 2e 20 4f 6e  ndidate cset. On
1970: 6c 79 20 74 68 69 73 20 73 65 74 20 69 73 20 72  ly this set is r
1980: 65 6c 65 76 61 6e 74 20 74 6f 20 66 75 72 74 68  elevant to furth
1990: 65 72 20 63 68 65 63 6b 73 0a 20 20 20 20 23 20  er checks.    # 
19a0: 61 6e 64 20 66 69 6c 74 65 72 73 2e 0a 0a 20 20  and filters...  
19b0: 20 20 73 65 74 20 72 65 73 20 7b 7d 0a 20 20 20    set res {}.   
19c0: 20 66 6f 72 65 61 63 68 20 69 74 65 6d 20 24 62   foreach item $b
19d0: 72 61 20 7b 0a 09 23 20 69 74 65 6d 20 3d 20 74  ra {..# item = t
19e0: 69 6d 65 73 74 61 6d 70 20 74 61 67 20 66 69 6c  imestamp tag fil
19f0: 65 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 20 20  e revision..#   
1a00: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 31       0         1
1a10: 20 20 20 32 20 20 20 20 33 0a 09 69 66 20 7b 5b     2    3..if {[
1a20: 70 61 63 6b 61 67 65 20 76 63 6f 6d 70 61 72 65  package vcompare
1a30: 20 5b 6c 69 6e 64 65 78 20 24 69 74 65 6d 20 30   [lindex $item 0
1a40: 5d 20 24 64 61 74 65 5d 20 3e 20 30 7d 20 63 6f  ] $date] > 0} co
1a50: 6e 74 69 6e 75 65 0a 09 6c 61 70 70 65 6e 64 20  ntinue..lappend 
1a60: 72 65 73 20 24 69 74 65 6d 0a 20 20 20 20 7d 0a  res $item.    }.
1a70: 0a 20 20 20 20 23 70 75 74 73 20 5f 5f 5f 5f 5f  .    #puts _____
1a80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1a90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
1aa0: 5f 5f 5f 5f 5f 5f 0a 20 20 20 20 23 70 75 74 73  ______.    #puts
1ab0: 20 5b 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 2d 69   [join [lsort -i
1ac0: 6e 64 65 78 20 30 20 5b 6c 73 6f 72 74 20 2d 69  ndex 0 [lsort -i
1ad0: 6e 64 65 78 20 31 20 24 72 65 73 5d 5d 20 5c 6e  ndex 1 $res]] \n
1ae0: 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65  ].    return $re
1af0: 73 0a 7d 0a 0a 0a 6e 61 6d 65 73 70 61 63 65 20  s.}...namespace 
1b00: 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  eval ::vc::cvs::
1b10: 77 73 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20  ws::branch {.   
1b20: 20 76 61 72 69 61 62 6c 65 20 62 72 61 20 7b 7d   variable bra {}
1b30: 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
1b40: 65 78 70 6f 72 74 20 64 65 66 20 66 69 6e 64 20  export def find 
1b50: 73 75 63 63 65 73 73 6f 72 20 72 6f 6f 74 53 75  successor rootSu
1b60: 63 63 65 73 73 6f 72 20 72 65 76 72 6f 6f 74 20  ccessor revroot 
1b70: 68 61 73 0a 7d 0a 0a 70 61 63 6b 61 67 65 20 70  has.}..package p
1b80: 72 6f 76 69 64 65 20 76 63 3a 3a 63 76 73 3a 3a  rovide vc::cvs::
1b90: 77 73 3a 3a 62 72 61 6e 63 68 20 31 2e 30 0a 72  ws::branch 1.0.r
1ba0: 65 74 75 72 6e 0a 0a 0a 0a 0a 20 20 20 20 23 20  eturn.....    # 
1bb0: 51 75 65 72 69 65 73 20 2e 2e 2e 20 0a 20 20 20  Queries ... .   
1bc0: 20 23 20 2d 20 47 65 74 20 73 65 74 20 6f 66 20   # - Get set of 
1bd0: 66 69 6c 65 73 20 61 6e 64 20 72 65 76 73 20 66  files and revs f
1be0: 6f 72 20 62 72 61 6e 63 68 20 42 20 77 68 69 63  or branch B whic
1bf0: 68 20 63 61 6e 20 62 65 20 69 6e 20 69 74 20 62  h can be in it b
1c00: 79 20 74 68 65 20 74 69 6d 65 20 54 0a 20 20 20  y the time T.   
1c10: 20 23 20 2d 20 43 68 65 63 6b 20 69 66 20 61 20   # - Check if a 
1c20: 66 69 6c 65 20 72 65 66 65 72 65 6e 63 65 64 20  file referenced 
1c30: 61 2f 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  a/m instruction 
1c40: 69 73 20 69 6e 20 61 20 73 65 74 20 6f 66 20 66  is in a set of f
1c50: 69 6c 65 73 0a 20 20 20 20 23 20 20 20 61 6e 64  iles.    #   and
1c60: 20 72 65 76 69 73 69 6f 6e 2c 20 69 64 65 6e 74   revision, ident
1c70: 69 63 61 6c 20 6f 72 20 70 72 6f 70 65 72 20 73  ical or proper s
1c80: 75 63 65 73 73 6f 72 2e 0a 20 20 20 20 23 20 3d  ucessor..    # =
1c90: 3e 20 43 6f 6d 62 69 6e 61 74 69 6f 6e 0a 20 20  > Combination.  
1ca0: 20 20 23 20 20 20 20 43 61 6e 20 62 72 61 6e 63    #    Can branc
1cb0: 68 20 42 20 6d 61 74 63 68 20 74 68 65 20 63 73  h B match the cs
1cc0: 65 74 20 66 69 6c 65 20 61 2f 6d 20 61 74 20 74  et file a/m at t
1cd0: 69 6d 65 20 54 20 3f 0a 20 20 20 20 23 20 3d 3e  ime T ?.    # =>
1ce0: 20 46 75 6c 6c 20 63 6f 6d 62 69 6e 61 74 69 6f   Full combinatio
1cf0: 6e 0a 20 20 20 20 23 20 20 20 20 47 69 76 65 20  n.    #    Give 
1d00: 6d 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 62  me the list of b
1d10: 72 61 6e 63 68 65 73 20 77 68 69 63 68 20 63 61  ranches which ca
1d20: 6e 20 6d 61 74 63 68 20 74 68 65 20 63 73 65 74  n match the cset
1d30: 20 66 69 6c 65 20 61 2f 6d 0a 20 20 20 20 23 20   file a/m.    # 
1d40: 20 20 20 61 74 20 74 69 6d 65 20 54 2e 0a 0a 20     at time T... 
1d50: 20 20 20 23 20 42 72 61 6e 63 68 20 44 42 20 6f     # Branch DB o
1d60: 72 67 61 6e 69 7a 61 74 69 6f 6e 20 3d 3e 20 28  rganization => (
1d70: 54 61 67 20 2d 3e 20 28 54 69 6d 65 20 2d 3e 20  Tag -> (Time -> 
1d80: 28 46 69 6c 65 20 2d 3e 20 52 65 76 29 29 29 0a  (File -> Rev))).
1d90: 20 20 20 20 23 20 54 68 65 20 66 75 6c 6c 20 63      # The full c
1da0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 61 63 74 75 61  ombination actua
1db0: 6c 6c 79 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  lly does not nee
1dc0: 64 20 61 20 63 6f 6d 70 6c 65 78 20 73 74 72 75  d a complex stru
1dd0: 63 74 75 72 65 2e 0a 20 20 20 20 23 20 57 65 20  cture..    # We 
1de0: 63 61 6e 20 73 69 6d 70 6c 79 20 73 63 61 6e 20  can simply scan 
1df0: 61 20 70 6c 61 69 6e 20 6c 69 73 74 20 6f 66 20  a plain list of 
1e00: 62 72 61 6e 63 68 20 64 61 74 61 2e 0a 20 20 20  branch data..   
1e10: 20 23 20 54 68 65 20 6f 6e 6c 79 20 61 6c 74 65   # The only alte
1e20: 72 6e 61 74 69 76 65 20 69 73 20 61 6e 20 69 6e  rnative is an in
1e30: 76 65 72 74 65 64 20 69 6e 64 65 78 2e 0a 20 20  verted index..  
1e40: 20 20 23 20 54 69 6d 65 20 2d 3e 20 28 28 46 69    # Time -> ((Fi
1e50: 6c 65 20 2d 3e 20 52 65 76 29 20 2d 3e 20 54 61  le -> Rev) -> Ta
1e60: 67 29 2e 20 44 69 66 66 69 63 75 6c 74 20 74 6f  g). Difficult to
1e70: 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 23 20   process..    # 
1e80: 4c 69 6e 65 61 72 20 73 63 61 6e 3a 0a 20 20 20  Linear scan:.   
1e90: 20 23 20 2d 20 54 69 6d 65 20 61 66 74 65 72 20   # - Time after 
1ea0: 54 20 20 20 3d 3e 20 64 72 6f 70 0a 20 20 20 20  T   => drop.    
1eb0: 23 20 2d 20 46 69 6c 65 20 21 69 6e 20 61 2f 6d  # - File !in a/m
1ec0: 20 20 20 3d 3e 20 64 72 6f 70 0a 20 20 20 20 23     => drop.    #
1ed0: 20 2d 20 56 65 72 73 69 6f 6e 20 21 6d 61 74 63   - Version !matc
1ee0: 68 20 3d 3e 20 64 72 6f 70 0a 20 20 20 20 23 20  h => drop.    # 
1ef0: 2d 2d 20 43 6f 6c 6c 65 63 74 20 74 61 67 0a 20  -- Collect tag. 
1f00: 20 20 20 23 20 54 68 65 6e 20 6c 73 6f 72 74 20     # Then lsort 
1f10: 2d 75 6e 69 71 75 65 20 66 6f 72 20 6f 75 72 20  -unique for our 
1f20: 72 65 73 75 6c 74 2e 0a 20 20 20 20 23 20 4e 4f  result..    # NO
1f30: 20 2d 20 54 68 65 20 66 69 6c 65 20 63 68 65 63   - The file chec
1f40: 6b 20 69 73 20 69 6e 76 65 72 74 65 64 20 2d 20  k is inverted - 
1f50: 41 6c 6c 20 66 69 6c 65 73 20 68 61 76 65 20 74  All files have t
1f60: 6f 20 62 65 20 69 6e 20 61 2f 6d 20 66 6f 72 20  o be in a/m for 
1f70: 74 68 65 20 62 61 73 65 2c 20 6e 6f 74 20 61 2f  the base, not a/
1f80: 6d 20 69 6e 20 66 69 6c 65 73 0a 20 20 20 20 23  m in files.    #
1f90: 20 3d 3d 20 2d 20 54 68 69 73 20 61 6c 73 6f 20   == - This also 
1fa0: 62 72 65 61 6b 73 20 74 68 65 20 69 73 73 75 65  breaks the issue
1fb0: 20 66 6f 72 20 73 61 6d 65 2d 62 72 61 6e 63 68   for same-branch
1fc0: 20 64 65 74 65 63 74 69 6f 6e 20 2d 0a 20 20 20   detection -.   
1fd0: 20 23 20 20 20 20 66 75 74 75 72 65 20 63 73 65   #    future cse
1fe0: 74 73 20 69 6e 20 74 68 65 20 62 72 61 6e 63 68  ts in the branch
1ff0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 61   do not have tha
2000: 74 20 70 72 6f 70 65 72 74 79 2e 0a 0a 20 20 20  t property...   
2010: 20 70 75 74 73 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   puts __________
2020: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
2030: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
2040: 5f 0a 20 20 20 20 23 20 53 68 6f 77 20 6f 6e 6c  _.    # Show onl
2050: 79 20 62 72 61 6e 63 68 20 64 61 74 61 20 77 68  y branch data wh
2060: 69 63 68 20 64 65 66 69 6e 69 74 65 6c 79 20 63  ich definitely c
2070: 6f 6d 65 73 20 62 65 66 6f 72 65 20 74 68 65 0a  omes before the.
2080: 20 20 20 20 23 20 63 61 6e 64 69 64 61 74 65 20      # candidate 
2090: 63 73 65 74 0a 0a 20 20 20 20 61 72 72 61 79 20  cset..    array 
20a0: 73 65 74 20 6e 20 5b 63 6f 6e 63 61 74 20 24 63  set n [concat $c
20b0: 73 28 61 64 64 65 64 29 20 24 63 73 28 63 68 61  s(added) $cs(cha
20c0: 6e 67 65 64 29 5d 0a 20 20 20 20 73 65 74 20 78  nged)].    set x
20d0: 78 20 7b 7d 0a 20 20 20 20 73 65 74 20 62 62 20  x {}.    set bb 
20e0: 7b 7d 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68  {}.    ::foreach
20f0: 20 78 20 24 62 72 61 20 7b 0a 09 3a 3a 66 6f 72   x $bra {..::for
2100: 65 61 63 68 20 7b 74 73 20 74 61 67 20 66 20 72  each {ts tag f r
2110: 7d 20 24 78 20 62 72 65 61 6b 0a 09 69 66 20 7b  } $x break..if {
2120: 5b 70 61 63 6b 61 67 65 20 76 63 6f 6d 70 61 72  [package vcompar
2130: 65 20 24 74 73 20 24 63 73 28 64 61 74 65 29 5d  e $ts $cs(date)]
2140: 20 3e 20 30 7d 20 63 6f 6e 74 69 6e 75 65 0a 09   > 0} continue..
2150: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
2160: 73 20 6e 28 24 66 29 5d 7d 20 63 6f 6e 74 69 6e  s n($f)]} contin
2170: 75 65 0a 09 69 66 20 7b 0a 09 20 20 20 20 28 5b  ue..if {..    ([
2180: 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24  llength [split $
2190: 6e 28 24 66 29 20 2e 5d 5d 20 21 3d 20 5b 6c 6c  n($f) .]] != [ll
21a0: 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72 20  ength [split $r 
21b0: 2e 5d 5d 29 20 7c 7c 0a 09 20 20 20 20 28 5b 6c  .]]) ||..    ([l
21c0: 72 61 6e 67 65 20 5b 73 70 6c 69 74 20 24 6e 28  range [split $n(
21d0: 24 66 29 20 2e 5d 20 30 20 65 6e 64 2d 32 5d 20  $f) .] 0 end-2] 
21e0: 6e 65 20 5b 6c 72 61 6e 67 65 20 5b 73 70 6c 69  ne [lrange [spli
21f0: 74 20 24 72 20 2e 5d 20 30 20 65 6e 64 2d 32 5d  t $r .] 0 end-2]
2200: 29 20 7c 7c 0a 09 20 20 20 20 28 5b 70 61 63 6b  ) ||..    ([pack
2210: 61 67 65 20 76 63 6f 6d 70 61 72 65 20 24 6e 28  age vcompare $n(
2220: 24 66 29 20 24 72 5d 20 3c 20 30 29 0a 09 7d 20  $f) $r] < 0)..} 
2230: 63 6f 6e 74 69 6e 75 65 0a 09 6c 61 70 70 65 6e  continue..lappen
2240: 64 20 78 78 20 24 78 0a 09 6c 61 70 70 65 6e 64  d xx $x..lappend
2250: 20 62 62 20 24 74 61 67 0a 20 20 20 20 7d 0a 20   bb $tag.    }. 
2260: 20 20 20 70 75 74 73 20 5b 6a 6f 69 6e 20 5b 6c     puts [join [l
2270: 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 5b 6c  sort -index 0 [l
2280: 73 6f 72 74 20 2d 69 6e 64 65 78 20 31 20 24 78  sort -index 1 $x
2290: 78 5d 5d 20 5c 6e 5d 0a 20 20 20 20 70 75 74 73  x]] \n].    puts
22a0: 20 5b 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 2d 75   [join [lsort -u
22b0: 6e 69 71 75 65 20 24 62 62 5d 20 5c 6e 5d 0a 0a  nique $bb] \n]..
22c0: 65 78 69 74 0a 0a 0a                             exit...