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.