Hex Artifact Content
Not logged in

Artifact d837793c993226d30d8c8b46e945ba77c8e47da9:

File tools/cvs2fossil/lib/misc.tcl part of check-in [38b967dcf5] - Merge aku's CVS import changes into the main line. Fix a small bug in diff.c. by drh on 2007-11-17 00:29:42. Also file tools/cvs2fossil/lib/misc.tcl part of check-in [94c39d6375] - Completed pass 6, wrote the code performing the breaking of cycles. Done by analysing each triple of changesets in the cycle at the file dependency level to see which revisions can be sorted apart. Added some additional utility routines. Extended the changeset class with the accessors required by the cycle breaker. by aku on 2007-11-14 05:11:56.

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 55 74 69  ########..## Uti
0200: 6c 69 74 69 65 73 20 66 6f 72 20 76 61 72 69 6f  lities for vario
0210: 75 73 20 74 68 69 6e 67 73 3a 20 74 65 78 74 20  us things: text 
0220: 66 6f 72 6d 61 74 74 69 6e 67 2c 20 6d 61 78 2c  formatting, max,
0230: 20 2e 2e 2e 0a 0a 23 20 23 20 23 23 20 23 23 23   .....# # ## ###
0240: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
0250: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
0260: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0270: 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d 65  ###.## Requireme
0280: 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65 71  nts..package req
0290: 75 69 72 65 20 54 63 6c 20 38 2e 34 20 3b 20 23  uire Tcl 8.4 ; #
02a0: 20 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d   Required runtim
02b0: 65 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  e..# # ## ### ##
02c0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
02d0: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
02e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02f0: 0a 23 23 20 0a 0a 6e 61 6d 65 73 70 61 63 65 20  .## ..namespace 
0300: 65 76 61 6c 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  eval ::vc::tools
0310: 3a 3a 6d 69 73 63 20 7b 0a 20 20 20 20 23 20 23  ::misc {.    # #
0320: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
0330: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0340: 23 23 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c  ####.    ## Publ
0350: 69 63 20 41 50 49 2c 20 4d 65 74 68 6f 64 73 0a  ic API, Methods.
0360: 0a 20 20 20 20 23 20 43 68 6f 6f 73 65 20 73 69  .    # Choose si
0370: 6e 67 75 6c 61 72 20 76 73 20 70 6c 75 72 61 6c  ngular vs plural
0380: 20 66 6f 72 6d 73 20 6f 66 20 61 20 77 6f 72 64   forms of a word
0390: 20 62 61 73 65 64 20 6f 6e 20 61 20 6e 75 6d 62   based on a numb
03a0: 65 72 2e 0a 0a 20 20 20 20 70 72 6f 63 20 73 70  er...    proc sp
03b0: 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 7b 70 6c   {n singular {pl
03c0: 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 09 69 66 20  ural {}}} {..if 
03d0: 7b 24 6e 20 3d 3d 20 31 7d 20 7b 72 65 74 75 72  {$n == 1} {retur
03e0: 6e 20 24 73 69 6e 67 75 6c 61 72 7d 0a 09 69 66  n $singular}..if
03f0: 20 7b 24 70 6c 75 72 61 6c 20 65 71 20 22 22 7d   {$plural eq ""}
0400: 20 7b 73 65 74 20 70 6c 75 72 61 6c 20 24 7b 73   {set plural ${s
0410: 69 6e 67 75 6c 61 72 7d 73 7d 0a 09 72 65 74 75  ingular}s}..retu
0420: 72 6e 20 24 70 6c 75 72 61 6c 0a 20 20 20 20 7d  rn $plural.    }
0430: 0a 0a 20 20 20 20 23 20 41 73 20 61 62 6f 76 65  ..    # As above
0440: 2c 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65  , with the numbe
0450: 72 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  r automatically 
0460: 70 75 74 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20  put in front of 
0470: 74 68 65 0a 20 20 20 20 23 20 73 74 72 69 6e 67  the.    # string
0480: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 6e 73 70 20  ...    proc nsp 
0490: 7b 6e 20 73 69 6e 67 75 6c 61 72 20 7b 70 6c 75  {n singular {plu
04a0: 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 09 72 65 74 75  ral {}}} {..retu
04b0: 72 6e 20 22 24 6e 20 5b 73 70 20 24 6e 20 24 73  rn "$n [sp $n $s
04c0: 69 6e 67 75 6c 61 72 20 24 70 6c 75 72 61 6c 5d  ingular $plural]
04d0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 46  ".    }..    # F
04e0: 69 6e 64 20 6d 61 78 69 6d 75 6d 2f 6d 69 6e 69  ind maximum/mini
04f0: 6d 75 6d 20 69 6e 20 61 20 6c 69 73 74 2e 0a 0a  mum in a list...
0500: 20 20 20 20 70 72 6f 63 20 6d 61 78 20 7b 6c 69      proc max {li
0510: 73 74 7d 20 7b 0a 09 73 65 74 20 6d 61 78 20 2d  st} {..set max -
0520: 31 0a 09 66 6f 72 65 61 63 68 20 65 20 24 6c 69  1..foreach e $li
0530: 73 74 20 7b 0a 09 20 20 20 20 69 66 20 7b 24 65  st {..    if {$e
0540: 20 3c 20 24 6d 61 78 7d 20 63 6f 6e 74 69 6e 75   < $max} continu
0550: 65 0a 09 20 20 20 20 73 65 74 20 6d 61 78 20 24  e..    set max $
0560: 65 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 61  e..}..return $ma
0570: 78 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  x.    }..    pro
0580: 63 20 6d 69 6e 20 7b 6c 69 73 74 7d 20 7b 0a 09  c min {list} {..
0590: 73 65 74 20 6d 69 6e 20 7b 7d 0a 09 66 6f 72 65  set min {}..fore
05a0: 61 63 68 20 65 20 24 6c 69 73 74 20 7b 0a 09 20  ach e $list {.. 
05b0: 20 20 20 69 66 20 7b 24 6d 69 6e 20 3d 3d 20 7b     if {$min == {
05c0: 7d 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 24  }} {...set min $
05d0: 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20  e..    } elseif 
05e0: 7b 24 65 20 3e 20 24 6d 69 6e 7d 20 63 6f 6e 74  {$e > $min} cont
05f0: 69 6e 75 65 0a 09 20 20 20 20 73 65 74 20 6d 69  inue..    set mi
0600: 6e 20 24 65 0a 09 7d 0a 09 72 65 74 75 72 6e 20  n $e..}..return 
0610: 24 6d 69 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $min.    }..    
0620: 70 72 6f 63 20 6d 61 78 32 20 7b 61 20 62 7d 20  proc max2 {a b} 
0630: 7b 0a 09 69 66 20 7b 24 61 20 3e 20 24 62 7d 20  {..if {$a > $b} 
0640: 20 7b 20 72 65 74 75 72 6e 20 24 61 20 7d 0a 09   { return $a }..
0650: 72 65 74 75 72 6e 20 24 62 0a 20 20 20 20 7d 0a  return $b.    }.
0660: 0a 20 20 20 20 70 72 6f 63 20 6d 69 6e 32 20 7b  .    proc min2 {
0670: 61 20 62 7d 20 7b 0a 09 69 66 20 7b 24 61 20 3c  a b} {..if {$a <
0680: 20 24 62 7d 20 20 7b 20 72 65 74 75 72 6e 20 24   $b}  { return $
0690: 61 20 7d 0a 09 72 65 74 75 72 6e 20 24 62 0a 20  a }..return $b. 
06a0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 6c     }..    proc l
06b0: 64 65 6c 65 74 65 20 7b 6c 76 20 69 74 65 6d 7d  delete {lv item}
06c0: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 6c 76 20   {..upvar 1 $lv 
06d0: 6c 69 73 74 0a 09 73 65 74 20 70 6f 73 20 5b 6c  list..set pos [l
06e0: 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6c  search -exact $l
06f0: 69 73 74 20 24 69 74 65 6d 5d 0a 09 69 66 20 7b  ist $item]..if {
0700: 24 70 6f 73 20 3c 20 30 7d 20 72 65 74 75 72 6e  $pos < 0} return
0710: 0a 09 73 65 74 20 6c 69 73 74 20 5b 6c 72 65 70  ..set list [lrep
0720: 6c 61 63 65 20 24 6c 69 73 74 20 24 70 6f 73 20  lace $list $pos 
0730: 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20  $pos]..return.  
0740: 20 20 7d 0a 0a 20 20 20 20 23 20 44 65 6c 65 74    }..    # Delet
0750: 65 20 69 74 65 6d 20 66 72 6f 6d 20 6c 69 73 74  e item from list
0760: 20 62 79 20 6e 61 6d 65 0a 0a 20 20 20 20 70 72   by name..    pr
0770: 6f 63 20 73 74 72 69 70 74 72 61 69 6c 69 6e 67  oc striptrailing
0780: 73 6c 61 73 68 20 7b 70 61 74 68 7d 20 7b 0a 09  slash {path} {..
0790: 23 20 73 70 6c 69 74 20 61 6e 64 20 72 65 6a 6f  # split and rejo
07a0: 69 6e 20 67 65 74 73 20 72 69 64 20 6f 66 20 61  in gets rid of a
07b0: 20 74 72 61 6c 69 6e 67 20 2f 20 63 68 61 72 61   traling / chara
07c0: 63 74 65 72 2e 0a 09 72 65 74 75 72 6e 20 5b 65  cter...return [e
07d0: 76 61 6c 20 5b 6c 69 6e 73 65 72 74 20 5b 66 69  val [linsert [fi
07e0: 6c 65 20 73 70 6c 69 74 20 24 70 61 74 68 5d 20  le split $path] 
07f0: 30 20 66 69 6c 65 20 6a 6f 69 6e 5d 5d 0a 20 20  0 file join]].  
0800: 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20    }..    # # ## 
0810: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
0820: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
0830: 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76  .}..namespace ev
0840: 61 6c 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  al ::vc::tools::
0850: 6d 69 73 63 20 7b 0a 20 20 20 20 6e 61 6d 65 73  misc {.    names
0860: 70 61 63 65 20 65 78 70 6f 72 74 20 73 70 20 6e  pace export sp n
0870: 73 70 20 6d 61 78 20 6d 69 6e 20 6d 61 78 32 20  sp max min max2 
0880: 6d 69 6e 32 20 6c 64 65 6c 65 74 65 20 73 74 72  min2 ldelete str
0890: 69 70 74 72 61 69 6c 69 6e 67 73 6c 61 73 68 0a  iptrailingslash.
08a0: 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..# -----------
08b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08f0: 2d 2d 0a 23 20 52 65 61 64 79 0a 0a 70 61 63 6b  --.# Ready..pack
0900: 61 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a  age provide vc::
0910: 74 6f 6f 6c 73 3a 3a 6d 69 73 63 20 31 2e 30 0a  tools::misc 1.0.
0920: 72 65 74 75 72 6e 0a                             return.