Hex Artifact Content
Not logged in

Artifact 8e70daebc024cb0f10b01b64f668618eff07802b:

File tools/import-cvs.tcl part of check-in [f166b0a63c] - Added first code regarding import from cvs, processing a CVSROOT/history file. Looks good, except that the history I have is incomplete, truncated at the beginning. Extended my notes with results from this experiment, thinking about a possible different method. by aku on 2007-08-31 04:57:33.

0000: 23 21 2f 62 69 6e 2f 73 68 0a 23 20 2d 2a 2d 20  #!/bin/sh.# -*- 
0010: 74 63 6c 20 2d 2a 2d 20 5c 0a 65 78 65 63 20 74  tcl -*- \.exec t
0020: 63 6c 73 68 20 22 24 30 22 20 24 7b 31 2b 22 24  clsh "$0" ${1+"$
0030: 40 22 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  @"}..# ---------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0080: 2d 2d 2d 2d 0a 23 20 4d 61 6b 65 20 70 72 69 76  ----.# Make priv
0090: 61 74 65 20 70 61 63 6b 61 67 65 73 20 61 63 63  ate packages acc
00a0: 65 73 73 69 62 6c 65 2e 0a 0a 6c 61 70 70 65 6e  essible...lappen
00b0: 64 20 61 75 74 6f 5f 70 61 74 68 20 5b 66 69 6c  d auto_path [fil
00c0: 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72  e join [file dir
00d0: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70  name [info scrip
00e0: 74 5d 5d 20 6c 69 62 5d 0a 70 61 63 6b 61 67 65  t]] lib].package
00f0: 20 72 65 71 75 69 72 65 20 72 63 73 70 61 72 73   require rcspars
0100: 65 72 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69  er.package requi
0110: 72 65 20 66 69 6c 65 75 74 69 6c 0a 0a 23 20 2d  re fileutil..# -
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52  ------------.# R
0170: 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e 61 67 65  epository manage
0180: 6d 65 6e 74 20 28 43 56 53 29 0a 0a 6e 61 6d 65  ment (CVS)..name
0190: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 76 73  space eval ::cvs
01a0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
01b0: 62 61 73 65 20 20 20 3b 20 73 65 74 20 20 20 20  base   ; set    
01c0: 20 20 20 62 61 73 65 20 20 20 7b 7d 20 3b 20 23     base   {} ; #
01d0: 20 52 65 70 6f 73 69 74 6f 72 79 20 74 6f 70 6c   Repository topl
01e0: 65 76 65 6c 20 64 69 72 65 63 74 6f 72 79 2e 0a  evel directory..
01f0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 70 61      variable npa
0200: 74 68 73 20 3b 20 61 72 72 61 79 20 73 65 74 20  ths ; array set 
0210: 6e 70 61 74 68 73 20 7b 7d 20 3b 20 23 20 70 61  npaths {} ; # pa
0220: 74 68 20 2d 3e 20 61 63 74 75 61 6c 20 70 61 74  th -> actual pat
0230: 68 20 6d 61 70 70 69 6e 67 2e 0a 20 20 20 20 76  h mapping..    v
0240: 61 72 69 61 62 6c 65 20 72 70 61 74 68 73 20 3b  ariable rpaths ;
0250: 20 61 72 72 61 79 20 73 65 74 20 72 70 61 74 68   array set rpath
0260: 73 20 7b 7d 20 3b 20 23 20 70 61 74 68 20 2d 3e  s {} ; # path ->
0270: 20 72 63 73 20 66 69 6c 65 20 6d 61 70 70 69 6e   rcs file mappin
0280: 67 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  g..    variable 
0290: 63 6d 73 67 20 20 20 3b 20 61 72 72 61 79 20 73  cmsg   ; array s
02a0: 65 74 20 63 6d 73 67 20 20 20 7b 7d 20 3b 20 23  et cmsg   {} ; #
02b0: 20 43 61 63 68 65 20 6f 66 20 63 6f 6d 6d 69 74   Cache of commit
02c0: 20 6d 65 73 73 61 67 65 73 2e 0a 7d 0a 0a 70 72   messages..}..pr
02d0: 6f 63 20 3a 3a 63 76 73 3a 3a 68 65 78 74 69 6d  oc ::cvs::hextim
02e0: 65 20 7b 68 65 78 7d 20 7b 0a 20 20 20 20 73 65  e {hex} {.    se
02f0: 74 20 74 20 30 0a 20 20 20 20 66 6f 72 65 61 63  t t 0.    foreac
0300: 68 20 64 20 5b 73 74 72 69 6e 67 20 6d 61 70 20  h d [string map 
0310: 7b 0a 09 61 20 31 30 20 62 20 31 31 20 63 20 31  {..a 10 b 11 c 1
0320: 32 20 64 20 31 33 20 65 20 31 34 20 66 20 31 35  2 d 13 e 14 f 15
0330: 0a 09 41 20 31 30 20 42 20 31 31 20 43 20 31 32  ..A 10 B 11 C 12
0340: 20 44 20 31 33 20 45 20 31 34 20 46 20 31 35 0a   D 13 E 14 F 15.
0350: 20 20 20 20 7d 20 5b 73 70 6c 69 74 20 24 68 65      } [split $he
0360: 78 20 7b 7d 5d 5d 20 7b 0a 09 73 65 74 20 74 20  x {}]] {..set t 
0370: 5b 65 78 70 72 20 7b 28 24 74 20 3c 3c 20 34 29  [expr {($t << 4)
0380: 20 2b 20 24 64 7d 5d 3b 23 68 6f 72 6e 65 72 0a   + $d}];#horner.
0390: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
03a0: 20 24 74 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76   $t.}..proc ::cv
03b0: 73 3a 3a 61 74 20 7b 70 61 74 68 7d 20 7b 0a 20  s::at {path} {. 
03c0: 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 65     variable base
03d0: 20 24 70 61 74 68 0a 20 20 20 20 72 65 74 75 72   $path.    retur
03e0: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a  n.}..proc ::cvs:
03f0: 3a 63 6d 73 67 20 7b 70 61 74 68 20 72 65 76 7d  :cmsg {path rev}
0400: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
0410: 63 6d 73 67 0a 20 20 20 20 73 65 74 20 6b 65 79  cmsg.    set key
0420: 20 5b 6c 69 73 74 20 24 70 61 74 68 20 24 72 65   [list $path $re
0430: 76 5d 0a 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e  v]..    if {![in
0440: 66 6f 20 65 78 69 73 74 73 20 63 6d 73 67 28 24  fo exists cmsg($
0450: 6b 65 79 29 5d 7d 20 7b 0a 09 73 65 74 20 72 63  key)]} {..set rc
0460: 73 20 5b 63 76 73 3a 3a 72 63 73 66 69 6c 65 20  s [cvs::rcsfile 
0470: 24 70 61 74 68 5d 0a 0a 09 23 70 75 74 73 20 73  $path]...#puts s
0480: 74 64 65 72 72 20 22 73 63 61 6e 20 24 70 61 74  tderr "scan $pat
0490: 68 20 3d 3e 20 24 72 63 73 22 0a 0a 09 61 72 72  h => $rcs"...arr
04a0: 61 79 20 73 65 74 20 70 20 5b 3a 3a 72 63 73 70  ay set p [::rcsp
04b0: 61 72 73 65 72 3a 3a 70 72 6f 63 65 73 73 20 24  arser::process $
04c0: 72 63 73 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b  rcs]...foreach {
04d0: 72 20 6d 73 67 7d 20 24 70 28 63 6f 6d 6d 69 74  r msg} $p(commit
04e0: 29 20 7b 0a 09 20 20 20 20 73 65 74 20 63 6d 73  ) {..    set cms
04f0: 67 28 5b 6c 69 73 74 20 24 70 61 74 68 20 24 72  g([list $path $r
0500: 5d 29 20 24 6d 73 67 0a 09 7d 0a 0a 09 69 66 20  ]) $msg..}...if 
0510: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63  {![info exists c
0520: 6d 73 67 28 24 6b 65 79 29 5d 7d 20 7b 0a 09 20  msg($key)]} {.. 
0530: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20     return -code 
0540: 65 72 72 6f 72 20 22 42 6f 67 75 73 20 72 65 76  error "Bogus rev
0550: 69 73 69 6f 6e 20 24 72 65 76 20 6f 66 20 66 69  ision $rev of fi
0560: 6c 65 20 24 70 61 74 68 22 0a 09 7d 0a 20 20 20  le $path"..}.   
0570: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 24   }..    return $
0580: 63 6d 73 67 28 24 6b 65 79 29 0a 7d 0a 0a 70 72  cmsg($key).}..pr
0590: 6f 63 20 3a 3a 63 76 73 3a 3a 6e 6f 72 6d 20 7b  oc ::cvs::norm {
05a0: 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69  path} {.    vari
05b0: 61 62 6c 65 20 6e 70 61 74 68 73 0a 20 20 20 20  able npaths.    
05c0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
05d0: 73 20 6e 70 61 74 68 73 28 24 70 61 74 68 29 5d  s npaths($path)]
05e0: 7d 20 7b 0a 09 73 65 74 20 6e 70 61 74 68 73 28  } {..set npaths(
05f0: 24 70 61 74 68 29 20 5b 4e 6f 72 6d 46 69 6c 65  $path) [NormFile
0600: 20 24 70 61 74 68 5d 0a 20 20 20 20 7d 0a 20 20   $path].    }.  
0610: 20 20 72 65 74 75 72 6e 20 24 6e 70 61 74 68 73    return $npaths
0620: 28 24 70 61 74 68 29 0a 7d 0a 0a 70 72 6f 63 20  ($path).}..proc 
0630: 3a 3a 63 76 73 3a 3a 4e 6f 72 6d 46 69 6c 65 20  ::cvs::NormFile 
0640: 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72  {path} {.    var
0650: 69 61 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20  iable base..    
0660: 73 65 74 20 66 20 24 62 61 73 65 2f 24 70 61 74  set f $base/$pat
0670: 68 2c 76 0a 20 20 20 20 69 66 20 7b 5b 3a 3a 66  h,v.    if {[::f
0680: 69 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d 20  ile exists $f]} 
0690: 7b 72 65 74 75 72 6e 20 24 70 61 74 68 7d 0a 0a  {return $path}..
06a0: 20 20 20 20 73 65 74 20 68 64 20 5b 3a 3a 66 69      set hd [::fi
06b0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 70 61 74 68  le dirname $path
06c0: 5d 0a 20 20 20 20 73 65 74 20 74 6c 20 5b 3a 3a  ].    set tl [::
06d0: 66 69 6c 65 20 74 61 69 6c 20 20 20 20 24 70 61  file tail    $pa
06e0: 74 68 5d 0a 0a 20 20 20 20 73 65 74 20 66 20 24  th]..    set f $
06f0: 62 61 73 65 2f 24 68 64 2f 41 74 74 69 63 2f 24  base/$hd/Attic/$
0700: 74 6c 2c 76 0a 20 20 20 20 69 66 20 7b 5b 3a 3a  tl,v.    if {[::
0710: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d  file exists $f]}
0720: 20 7b 72 65 74 75 72 6e 20 24 70 61 74 68 7d 0a   {return $path}.
0730: 0a 20 20 20 20 23 20 42 61 64 2e 20 54 68 65 20  .    # Bad. The 
0740: 64 69 72 20 63 61 6e 20 62 65 20 74 72 75 6e 63  dir can be trunc
0750: 61 74 65 64 2c 20 69 2e 65 2e 20 69 74 20 6d 61  ated, i.e. it ma
0760: 79 20 6e 6f 74 20 62 65 20 61 6e 20 65 78 61 63  y not be an exac
0770: 74 0a 20 20 20 20 23 20 73 75 62 64 69 72 65 63  t.    # subdirec
0780: 74 6f 72 79 20 6f 66 20 62 61 73 65 2c 20 62 75  tory of base, bu
0790: 74 20 64 65 65 70 65 72 20 69 6e 73 69 64 65 2c  t deeper inside,
07a0: 20 77 69 74 68 20 70 61 72 65 6e 74 73 20 62 65   with parents be
07b0: 74 77 65 65 6e 20 69 74 0a 20 20 20 20 23 20 61  tween it.    # a
07c0: 6e 64 20 62 61 73 65 20 6c 65 66 74 20 6f 75 74  nd base left out
07d0: 2e 20 45 78 61 6d 70 6c 65 20 28 66 72 6f 6d 20  . Example (from 
07e0: 74 68 65 20 74 63 6c 6c 69 62 20 68 69 73 74 6f  the tcllib histo
07f0: 72 79 20 66 69 6c 65 29 3a 0a 20 20 20 20 23 0a  ry file):.    #.
0800: 20 20 20 20 23 20 4d 33 66 31 64 31 32 34 35 7c      # M3f1d1245|
0810: 61 66 61 75 70 65 6c 6c 7c 3c 72 65 6d 6f 74 65  afaupell|<remote
0820: 3e 7c 69 70 65 6e 74 72 79 7c 31 2e 32 7c 43 68  >|ipentry|1.2|Ch
0830: 61 6e 67 65 4c 6f 67 0a 20 20 20 20 23 20 54 68  angeLog.    # Th
0840: 65 20 63 6f 72 72 65 63 74 20 70 61 74 68 20 69  e correct path i
0850: 73 20 27 74 6b 6c 69 62 2f 6d 6f 64 75 6c 65 73  s 'tklib/modules
0860: 2f 69 70 65 6e 74 72 79 27 2e 0a 20 20 20 20 23  /ipentry'..    #
0870: 20 54 68 69 73 20 77 65 20 68 61 76 65 20 74 6f   This we have to
0880: 20 72 65 73 6f 6c 76 65 20 74 6f 6f 2e 0a 0a 20   resolve too... 
0890: 20 20 20 23 20 6e 6f 72 6d 61 6c 69 7a 65 20 64     # normalize d
08a0: 61 6e 63 65 20 2d 20 6f 6c 64 20 66 69 6c 65 75  ance - old fileu
08b0: 74 69 6c 2c 20 6d 6f 64 65 72 6e 20 66 69 6c 65  til, modern file
08c0: 75 74 69 6c 20 28 63 76 73 20 68 65 61 64 29 20  util (cvs head) 
08d0: 64 6f 65 73 6e 27 74 20 64 6f 20 74 68 61 74 2e  doesn't do that.
08e0: 0a 20 20 20 20 73 65 74 20 62 78 20 5b 66 69 6c  .    set bx [fil
08f0: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 62 61 73  e normalize $bas
0900: 65 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63  e].    foreach c
0910: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 66 69 6e 64   [fileutil::find
0920: 42 79 50 61 74 74 65 72 6e 20 24 62 78 20 2d 67  ByPattern $bx -g
0930: 6c 6f 62 20 24 68 64 5d 20 7b 0a 09 73 65 74 20  lob $hd] {..set 
0940: 63 78 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 73 74  cx [fileutil::st
0950: 72 69 70 50 61 74 68 20 24 62 78 20 24 63 5d 0a  ripPath $bx $c].
0960: 09 73 65 74 20 63 20 20 24 62 61 73 65 2f 24 63  .set c  $base/$c
0970: 78 0a 0a 09 73 65 74 20 66 20 24 63 2f 24 74 6c  x...set f $c/$tl
0980: 2c 76 0a 09 69 66 20 7b 5b 3a 3a 66 69 6c 65 20  ,v..if {[::file 
0990: 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 74  exists $f]} {ret
09a0: 75 72 6e 20 24 63 78 2f 24 74 6c 7d 0a 09 73 65  urn $cx/$tl}..se
09b0: 74 20 66 20 24 63 2f 41 74 74 69 63 2f 24 74 6c  t f $c/Attic/$tl
09c0: 2c 76 0a 09 69 66 20 7b 5b 3a 3a 66 69 6c 65 20  ,v..if {[::file 
09d0: 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 74  exists $f]} {ret
09e0: 75 72 6e 20 24 63 78 2f 24 74 6c 7d 0a 20 20 20  urn $cx/$tl}.   
09f0: 20 7d 0a 0a 20 20 20 20 70 75 74 73 20 73 74 64   }..    puts std
0a00: 65 72 72 20 3c 24 66 3e 0a 20 20 20 20 72 65 74  err <$f>.    ret
0a10: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20  urn -code error 
0a20: 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f 63 61 74  "Unable to locat
0a30: 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 66 6f  e actual file fo
0a40: 72 20 24 70 61 74 68 22 0a 7d 0a 0a 70 72 6f 63  r $path".}..proc
0a50: 20 3a 3a 63 76 73 3a 3a 72 63 73 66 69 6c 65 20   ::cvs::rcsfile 
0a60: 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72  {path} {.    var
0a70: 69 61 62 6c 65 20 72 70 61 74 68 73 0a 20 20 20  iable rpaths.   
0a80: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73   if {![info exis
0a90: 74 73 20 72 70 61 74 68 73 28 24 70 61 74 68 29  ts rpaths($path)
0aa0: 5d 7d 20 7b 0a 09 73 65 74 20 72 70 61 74 68 73  ]} {..set rpaths
0ab0: 28 24 70 61 74 68 29 20 5b 52 63 73 46 69 6c 65  ($path) [RcsFile
0ac0: 20 24 70 61 74 68 5d 0a 20 20 20 20 7d 0a 20 20   $path].    }.  
0ad0: 20 20 72 65 74 75 72 6e 20 24 72 70 61 74 68 73    return $rpaths
0ae0: 28 24 70 61 74 68 29 0a 7d 0a 0a 70 72 6f 63 20  ($path).}..proc 
0af0: 3a 3a 63 76 73 3a 3a 52 63 73 46 69 6c 65 20 7b  ::cvs::RcsFile {
0b00: 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69  path} {.    vari
0b10: 61 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20 73  able base..    s
0b20: 65 74 20 66 20 24 62 61 73 65 2f 24 70 61 74 68  et f $base/$path
0b30: 2c 76 0a 20 20 20 20 69 66 20 7b 5b 3a 3a 66 69  ,v.    if {[::fi
0b40: 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d 20 7b  le exists $f]} {
0b50: 72 65 74 75 72 6e 20 24 66 7d 0a 0a 20 20 20 20  return $f}..    
0b60: 73 65 74 20 68 64 20 5b 3a 3a 66 69 6c 65 20 64  set hd [::file d
0b70: 69 72 6e 61 6d 65 20 24 70 61 74 68 5d 0a 20 20  irname $path].  
0b80: 20 20 73 65 74 20 74 6c 20 5b 3a 3a 66 69 6c 65    set tl [::file
0b90: 20 74 61 69 6c 20 20 20 20 24 70 61 74 68 5d 0a   tail    $path].
0ba0: 0a 20 20 20 20 73 65 74 20 66 20 24 62 61 73 65  .    set f $base
0bb0: 2f 24 68 64 2f 41 74 74 69 63 2f 24 74 6c 2c 76  /$hd/Attic/$tl,v
0bc0: 0a 20 20 20 20 69 66 20 7b 5b 3a 3a 66 69 6c 65  .    if {[::file
0bd0: 20 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65   exists $f]} {re
0be0: 74 75 72 6e 20 24 66 7d 0a 0a 20 20 20 20 23 20  turn $f}..    # 
0bf0: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  We do not have t
0c00: 72 75 6e 63 61 74 65 64 20 64 69 72 65 63 74 6f  runcated directo
0c10: 72 69 65 73 20 68 65 72 65 2c 20 61 73 73 75 6d  ries here, assum
0c20: 69 6e 67 20 74 68 61 74 20 6f 6e 6c 79 0a 20 20  ing that only.  
0c30: 20 20 23 20 6e 6f 72 6d 20 70 61 74 68 73 20 61    # norm paths a
0c40: 72 65 20 66 65 64 20 69 6e 74 6f 20 74 68 69 73  re fed into this
0c50: 20 63 6f 6d 6d 61 6e 64 2e 0a 0a 20 20 20 20 69   command...    i
0c60: 66 20 30 20 7b 0a 09 23 20 42 61 64 2e 20 54 68  f 0 {..# Bad. Th
0c70: 65 20 64 69 72 20 63 61 6e 20 62 65 20 74 72 75  e dir can be tru
0c80: 6e 63 61 74 65 64 2c 20 69 2e 65 2e 20 69 74 20  ncated, i.e. it 
0c90: 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 65 78  may not be an ex
0ca0: 61 63 74 0a 09 23 20 73 75 62 64 69 72 65 63 74  act..# subdirect
0cb0: 6f 72 79 20 6f 66 20 62 61 73 65 2c 20 62 75 74  ory of base, but
0cc0: 20 64 65 65 70 65 72 20 69 6e 73 69 64 65 2c 20   deeper inside, 
0cd0: 77 69 74 68 20 70 61 72 65 6e 74 73 0a 09 23 20  with parents..# 
0ce0: 62 65 74 77 65 65 6e 20 69 74 20 61 6e 64 20 62  between it and b
0cf0: 61 73 65 20 6c 65 66 74 20 6f 75 74 2e 20 45 78  ase left out. Ex
0d00: 61 6d 70 6c 65 20 28 66 72 6f 6d 20 74 68 65 20  ample (from the 
0d10: 74 63 6c 6c 69 62 0a 09 23 20 68 69 73 74 6f 72  tcllib..# histor
0d20: 79 20 66 69 6c 65 29 3a 0a 09 23 0a 09 23 20 4d  y file):..#..# M
0d30: 33 66 31 64 31 32 34 35 7c 61 66 61 75 70 65 6c  3f1d1245|afaupel
0d40: 6c 7c 3c 72 65 6d 6f 74 65 3e 7c 69 70 65 6e 74  l|<remote>|ipent
0d50: 72 79 7c 31 2e 32 7c 43 68 61 6e 67 65 4c 6f 67  ry|1.2|ChangeLog
0d60: 20 54 68 65 0a 09 23 20 63 6f 72 72 65 63 74 20   The..# correct 
0d70: 70 61 74 68 20 69 73 20 27 74 6b 6c 69 62 2f 6d  path is 'tklib/m
0d80: 6f 64 75 6c 65 73 2f 69 70 65 6e 74 72 79 27 2e  odules/ipentry'.
0d90: 20 20 54 68 69 73 20 77 65 20 68 61 76 65 20 74    This we have t
0da0: 6f 0a 09 23 20 72 65 73 6f 6c 76 65 20 74 6f 6f  o..# resolve too
0db0: 2e 0a 0a 09 23 20 6e 6f 72 6d 61 6c 69 7a 65 20  ....# normalize 
0dc0: 64 61 6e 63 65 20 2d 20 6f 6c 64 20 66 69 6c 65  dance - old file
0dd0: 75 74 69 6c 2c 20 6d 6f 64 65 72 6e 20 66 69 6c  util, modern fil
0de0: 65 75 74 69 6c 20 28 63 76 73 20 68 65 61 64 29  eutil (cvs head)
0df0: 0a 09 23 20 64 6f 65 73 6e 27 74 20 64 6f 20 74  ..# doesn't do t
0e00: 68 61 74 2e 0a 09 73 65 74 20 62 78 20 5b 66 69  hat...set bx [fi
0e10: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 62 61  le normalize $ba
0e20: 73 65 5d 0a 09 66 6f 72 65 61 63 68 20 63 20 5b  se]..foreach c [
0e30: 66 69 6c 65 75 74 69 6c 3a 3a 66 69 6e 64 42 79  fileutil::findBy
0e40: 50 61 74 74 65 72 6e 20 24 62 78 20 2d 67 6c 6f  Pattern $bx -glo
0e50: 62 20 24 68 64 5d 20 7b 0a 09 20 20 20 20 73 65  b $hd] {..    se
0e60: 74 20 63 20 24 62 61 73 65 2f 5b 66 69 6c 65 75  t c $base/[fileu
0e70: 74 69 6c 3a 3a 73 74 72 69 70 50 61 74 68 20 24  til::stripPath $
0e80: 62 78 20 24 63 5d 0a 0a 09 20 20 20 20 73 65 74  bx $c]...    set
0e90: 20 66 20 24 63 2f 24 74 6c 2c 76 0a 09 20 20 20   f $c/$tl,v..   
0ea0: 20 69 66 20 7b 5b 3a 3a 66 69 6c 65 20 65 78 69   if {[::file exi
0eb0: 73 74 73 20 24 66 5d 7d 20 7b 72 65 74 75 72 6e  sts $f]} {return
0ec0: 20 24 66 7d 0a 09 20 20 20 20 73 65 74 20 66 20   $f}..    set f 
0ed0: 24 63 2f 41 74 74 69 63 2f 24 74 6c 2c 76 0a 09  $c/Attic/$tl,v..
0ee0: 20 20 20 20 69 66 20 7b 5b 3a 3a 66 69 6c 65 20      if {[::file 
0ef0: 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 74  exists $f]} {ret
0f00: 75 72 6e 20 24 66 7d 0a 09 7d 0a 20 20 20 20 7d  urn $f}..}.    }
0f10: 0a 0a 20 20 20 20 70 75 74 73 20 73 74 64 65 72  ..    puts stder
0f20: 72 20 3c 24 66 3e 0a 20 20 20 20 72 65 74 75 72  r <$f>.    retur
0f30: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 55  n -code error "U
0f40: 6e 61 62 6c 65 20 74 6f 20 6c 6f 63 61 74 65 20  nable to locate 
0f50: 72 63 73 20 66 69 6c 65 20 66 6f 72 20 24 70 61  rcs file for $pa
0f60: 74 68 22 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76  th".}..proc ::cv
0f70: 73 3a 3a 68 69 73 74 6f 72 79 20 7b 7d 20 7b 0a  s::history {} {.
0f80: 20 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 73      variable bas
0f90: 65 0a 20 20 20 20 72 65 74 75 72 6e 20 24 62 61  e.    return $ba
0fa0: 73 65 2f 43 56 53 52 4f 4f 54 2f 68 69 73 74 6f  se/CVSROOT/histo
0fb0: 72 79 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d  ry.}..# --------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  -----..# -------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1050: 2d 2d 2d 2d 2d 2d 0a 0a 63 76 73 3a 3a 61 74 20  ------..cvs::at 
1060: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d  [lindex $argv 0]
1070: 0a 0a 23 70 75 74 73 20 5b 3a 3a 63 76 73 3a 3a  ..#puts [::cvs::
1080: 6e 6f 72 6d 20 69 70 65 6e 74 72 79 2f 43 68 61  norm ipentry/Cha
1090: 6e 67 65 4c 6f 67 5d 0a 23 65 78 69 74 0a 0a 23  ngeLog].#exit..#
10a0: 63 68 61 6e 67 65 73 65 74 20 73 74 61 74 65 0a  changeset state.
10b0: 67 6c 6f 62 61 6c 20 63 73 20 63 73 66 0a 61 72  global cs csf.ar
10c0: 72 61 79 20 73 65 74 20 63 73 20 7b 0a 20 20 20  ray set cs {.   
10d0: 20 73 74 61 72 74 20 7b 7d 20 65 6e 64 20 7b 7d   start {} end {}
10e0: 20 63 6d 20 7b 7d 0a 20 20 20 20 75 73 72 20 20   cm {}.    usr  
10f0: 20 7b 7d 20 64 74 20 20 7b 7d 0a 7d 0a 61 72 72   {} dt  {}.}.arr
1100: 61 79 20 73 65 74 20 63 73 66 20 7b 7d 0a 0a 70  ay set csf {}..p
1110: 72 6f 63 20 72 68 20 7b 7d 20 7b 0a 20 20 20 20  roc rh {} {.    
1120: 67 6c 6f 62 61 6c 20 61 72 67 76 20 63 73 20 63  global argv cs c
1130: 73 66 20 72 65 70 6f 0a 0a 20 20 20 20 73 65 74  sf repo..    set
1140: 20 66 20 5b 6f 70 65 6e 20 5b 63 76 73 3a 3a 68   f [open [cvs::h
1150: 69 73 74 6f 72 79 5d 20 72 5d 0a 0a 20 20 20 20  istory] r]..    
1160: 77 68 69 6c 65 20 7b 5b 67 65 74 73 20 24 66 20  while {[gets $f 
1170: 6c 69 6e 65 5d 20 3e 3d 20 30 7d 20 7b 0a 09 23  line] >= 0} {..#
1180: 20 44 65 63 6f 64 65 20 6c 69 6e 65 0a 09 66 6f   Decode line..fo
1190: 72 65 61 63 68 20 7b 6f 70 20 75 73 72 20 5f 20  reach {op usr _ 
11a0: 64 69 72 20 72 65 76 20 66 69 6c 65 7d 20 5b 73  dir rev file} [s
11b0: 70 6c 69 74 20 5b 73 74 72 69 6e 67 20 74 72 69  plit [string tri
11c0: 6d 20 24 6c 69 6e 65 5d 20 7c 5d 20 62 72 65 61  m $line] |] brea
11d0: 6b 0a 09 73 65 74 20 74 73 20 5b 63 76 73 3a 3a  k..set ts [cvs::
11e0: 68 65 78 74 69 6d 65 20 5b 73 74 72 69 6e 67 20  hextime [string 
11f0: 72 61 6e 67 65 20 24 6f 70 20 31 20 65 6e 64 5d  range $op 1 end]
1200: 5d 0a 09 73 65 74 20 6f 70 20 5b 73 74 72 69 6e  ]..set op [strin
1210: 67 20 69 6e 64 65 78 20 24 6f 70 20 30 5d 0a 0a  g index $op 0]..
1220: 09 23 20 46 69 6c 74 65 72 20 6f 75 74 20 69 72  .# Filter out ir
1230: 72 65 6c 65 76 61 6e 74 20 70 61 72 74 73 0a 09  relevant parts..
1240: 69 66 20 7b 24 6f 70 20 65 71 20 22 4f 22 7d 20  if {$op eq "O"} 
1250: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 63 68 65  continue ; # che
1260: 63 6b 6f 75 74 0a 09 69 66 20 7b 24 6f 70 20 65  ckout..if {$op e
1270: 71 20 22 46 22 7d 20 63 6f 6e 74 69 6e 75 65 20  q "F"} continue 
1280: 3b 20 23 20 72 65 6c 65 61 73 65 0a 09 69 66 20  ; # release..if 
1290: 7b 24 6f 70 20 65 71 20 22 54 22 7d 20 63 6f 6e  {$op eq "T"} con
12a0: 74 69 6e 75 65 20 3b 20 23 20 72 74 61 67 0a 09  tinue ; # rtag..
12b0: 69 66 20 7b 24 6f 70 20 65 71 20 22 57 22 7d 20  if {$op eq "W"} 
12c0: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 64 65 6c  continue ; # del
12d0: 65 74 65 20 6f 6e 20 75 70 64 61 74 65 0a 09 69  ete on update..i
12e0: 66 20 7b 24 6f 70 20 65 71 20 22 55 22 7d 20 63  f {$op eq "U"} c
12f0: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 75 70 64 61  ontinue ; # upda
1300: 74 65 0a 09 69 66 20 7b 24 6f 70 20 65 71 20 22  te..if {$op eq "
1310: 50 22 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23  P"} continue ; #
1320: 20 75 70 64 61 74 65 20 62 79 20 70 61 74 63 68   update by patch
1330: 0a 09 23 69 66 20 7b 24 6f 70 20 65 71 20 22 47  ..#if {$op eq "G
1340: 22 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20  "} continue ; # 
1350: 6d 65 72 67 65 20 6f 6e 20 75 70 64 61 74 65 20  merge on update 
1360: 2d 20 46 55 54 55 52 45 20 2d 20 69 64 65 6e 74  - FUTURE - ident
1370: 69 66 69 65 73 20 6d 65 72 67 65 70 6f 69 6e 74  ifies mergepoint
1380: 73 2e 0a 09 69 66 20 7b 24 6f 70 20 65 71 20 22  s...if {$op eq "
1390: 43 22 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23  C"} continue ; #
13a0: 20 63 6f 6e 66 6c 69 63 74 20 6f 6e 20 75 70 64   conflict on upd
13b0: 61 74 65 20 2d 20 73 2e 61 2e 0a 09 69 66 20 7b  ate - s.a...if {
13c0: 24 6f 70 20 65 71 20 22 45 22 7d 20 63 6f 6e 74  $op eq "E"} cont
13d0: 69 6e 75 65 20 3b 20 23 20 65 78 70 6f 72 74 0a  inue ; # export.
13e0: 09 23 20 6c 65 66 74 20 74 79 70 65 73 0a 09 23  .# left types..#
13f0: 20 4d 3a 20 63 6f 6d 6d 69 74 0a 09 23 20 41 3a   M: commit..# A:
1400: 20 61 64 64 69 74 69 6f 6e 0a 09 23 20 52 3a 20   addition..# R: 
1410: 72 65 6d 6f 76 61 6c 0a 0a 09 73 65 74 20 64 66  removal...set df
1420: 20 24 64 69 72 2f 24 66 69 6c 65 0a 09 69 66 20   $dir/$file..if 
1430: 7b 5b 6e 65 77 63 73 20 24 6f 70 20 24 75 73 72  {[newcs $op $usr
1440: 20 24 74 73 20 24 72 65 76 20 64 66 20 63 61 75   $ts $rev df cau
1450: 73 65 5d 7d 20 7b 0a 0a 09 20 20 20 20 23 20 4e  se]} {...    # N
1460: 4f 54 45 20 31 3a 20 43 68 61 6e 67 65 53 65 74  OTE 1: ChangeSet
1470: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 43 56 53  s containing CVS
1480: 52 4f 4f 54 20 3d 3e 20 72 65 6d 6f 76 65 20 73  ROOT => remove s
1490: 75 63 68 20 66 69 6c 65 73 2e 0a 09 20 20 20 20  uch files...    
14a0: 23 20 4e 4f 54 45 20 32 3a 20 45 6d 70 74 79 20  # NOTE 2: Empty 
14b0: 63 68 61 6e 67 65 73 65 74 73 2c 20 69 67 6e 6f  changesets, igno
14c0: 72 65 2e 0a 0a 09 20 20 20 20 23 63 6f 6d 6d 69  re....    #commi
14d0: 74 0a 09 20 20 20 20 63 73 73 74 61 74 73 0a 0a  t..    csstats..
14e0: 09 20 20 20 20 69 66 20 7b 24 63 61 75 73 65 20  .    if {$cause 
14f0: 65 71 20 22 63 6d 73 67 22 7d 20 7b 0a 73 65 74  eq "cmsg"} {.set
1500: 20 6d 73 67 0a 09 20 20 20 20 7d 20 65 6c 73 65   msg..    } else
1510: 20 7b 0a 73 65 74 20 6d 73 67 20 22 22 0a 09 20   {.set msg "".. 
1520: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 7b 24     }...    if {$
1530: 63 73 28 65 6e 64 29 20 6e 65 20 22 22 7d 20 7b  cs(end) ne ""} {
1540: 0a 09 09 70 75 74 73 20 3d 3d 3d 3d 3d 3d 3d 3d  ...puts ========
1550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1560: 3d 3d 3d 3d 3d 2f 24 63 61 75 73 65 5c 20 64 65  =====/$cause\ de
1570: 6c 74 61 5c 20 5b 65 78 70 72 20 7b 24 74 73 20  lta\ [expr {$ts 
1580: 2d 20 24 63 73 28 65 6e 64 29 7d 5d 0a 09 20 20  - $cs(end)}]..  
1590: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70 75 74    } else {...put
15a0: 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  s ==============
15b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 2f  ===============/
15c0: 24 63 61 75 73 65 0a 09 20 20 20 20 7d 0a 09 20  $cause..    }.. 
15d0: 20 20 20 63 73 63 6c 65 61 72 0a 09 7d 0a 0a 09     csclear..}...
15e0: 23 20 4e 6f 74 65 3a 20 6e 65 77 63 73 20 6e 6f  # Note: newcs no
15f0: 72 6d 61 6c 69 7a 65 73 20 64 66 2c 20 69 6e 20  rmalizes df, in 
1600: 63 61 73 65 20 74 68 65 20 6c 6f 67 20 69 6e 66  case the log inf
1610: 6f 72 6d 61 74 69 6f 6e 20 69 73 0a 09 23 20 62  ormation is..# b
1620: 6f 67 75 73 2e 20 53 6f 20 74 68 65 20 64 66 20  ogus. So the df 
1630: 68 65 72 65 20 6d 61 79 20 62 65 20 64 69 66 66  here may be diff
1640: 65 72 65 6e 74 20 66 72 6f 6d 20 62 65 66 6f 72  erent from befor
1650: 65 20 6e 65 77 63 73 0a 09 63 73 61 64 64 20 24  e newcs..csadd $
1660: 6f 70 20 24 75 73 72 20 24 74 73 20 24 72 65 76  op $usr $ts $rev
1670: 20 24 64 66 0a 09 23 20 61 70 70 6c 79 20 6d 6f   $df..# apply mo
1680: 64 69 66 69 63 61 74 69 6f 6e 20 74 6f 20 77 6f  dification to wo
1690: 72 6b 73 70 61 63 65 0a 20 20 20 20 7d 0a 7d 0a  rkspace.    }.}.
16a0: 0a 70 72 6f 63 20 6e 65 77 63 73 20 7b 6f 70 20  .proc newcs {op 
16b0: 75 73 72 20 74 73 20 72 65 76 20 64 66 76 20 72  usr ts rev dfv r
16c0: 76 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20  v} {.    global 
16d0: 63 73 20 63 73 66 0a 20 20 20 20 75 70 76 61 72  cs csf.    upvar
16e0: 20 31 20 24 72 76 20 72 65 61 73 6f 6e 20 24 64   1 $rv reason $d
16f0: 66 76 20 64 66 0a 0a 20 20 20 20 23 20 4c 6f 67  fv df..    # Log
1700: 69 63 20 74 6f 20 64 65 74 65 63 74 20 77 68 65  ic to detect whe
1710: 6e 20 61 20 6e 65 77 20 63 68 61 6e 67 65 20 73  n a new change s
1720: 65 74 20 62 65 67 69 6e 73 2e 20 41 20 6e 65 77  et begins. A new
1730: 20 63 68 61 6e 67 65 20 73 65 74 73 0a 20 20 20   change sets.   
1740: 20 23 20 68 61 73 20 73 74 61 72 74 65 64 20 77   # has started w
1750: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
1760: 65 6e 74 72 79 20 77 68 65 6e 20 74 68 65 20 65  entry when the e
1770: 6e 74 72 79 0a 20 20 20 20 23 0a 20 20 20 20 23  ntry.    #.    #
1780: 20 31 2e 20 69 73 20 66 6f 72 20 61 20 64 69 66   1. is for a dif
1790: 66 65 72 65 6e 74 20 75 73 65 72 20 74 68 61 6e  ferent user than
17a0: 20 74 68 65 20 6c 61 73 74 2e 0a 20 20 20 20 23   the last..    #
17b0: 20 32 2e 20 74 72 69 65 73 20 74 6f 20 61 64 64   2. tries to add
17c0: 20 61 20 66 69 6c 65 20 74 6f 20 74 68 65 20 63   a file to the c
17d0: 68 61 6e 67 65 73 65 74 20 77 68 69 63 68 20 69  hangeset which i
17e0: 73 20 61 6c 72 65 61 64 79 20 70 61 72 74 20 6f  s already part o
17f0: 66 20 69 74 2e 0a 20 20 20 20 23 20 33 2e 69 73  f it..    # 3.is
1800: 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 2c 20 61   on the trunk, a
1810: 6e 64 20 74 68 65 20 6c 61 73 74 20 6f 6e 20 61  nd the last on a
1820: 20 62 72 61 6e 63 68 2c 20 6f 72 20 76 69 63 65   branch, or vice
1830: 20 76 65 72 73 61 2e 0a 20 20 20 20 23 20 34 2e   versa..    # 4.
1840: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1850: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65  ry has a differe
1860: 6e 74 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67  nt commit messag
1870: 65 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 2e  e than the last.
1880: 0a 0a 20 20 20 20 73 65 74 20 64 66 20 5b 63 76  ..    set df [cv
1890: 73 3a 3a 6e 6f 72 6d 20 24 64 66 5d 0a 0a 20 20  s::norm $df]..  
18a0: 20 20 23 20 55 73 65 72 20 63 68 61 6e 67 65 64    # User changed
18b0: 0a 20 20 20 20 69 66 20 7b 24 75 73 72 20 6e 65  .    if {$usr ne
18c0: 20 24 63 73 28 75 73 72 29 7d 20 7b 0a 09 73 65   $cs(usr)} {..se
18d0: 74 20 72 65 61 73 6f 6e 20 75 73 65 72 0a 09 72  t reason user..r
18e0: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20  eturn 1.    }.. 
18f0: 20 20 20 23 20 46 69 6c 65 20 69 73 20 61 6c 72     # File is alr
1900: 65 61 64 79 20 69 6e 20 74 68 65 20 63 68 61 6e  eady in the chan
1910: 67 65 73 65 74 0a 20 20 20 20 69 66 20 7b 5b 69  geset.    if {[i
1920: 6e 66 6f 20 65 78 69 73 74 73 20 63 73 66 28 24  nfo exists csf($
1930: 64 66 29 5d 7d 20 7b 0a 09 73 65 74 20 72 65 61  df)]} {..set rea
1940: 73 6f 6e 20 66 69 6c 65 0a 09 72 65 74 75 72 6e  son file..return
1950: 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20   1.    }..    # 
1960: 6c 61 73 74 2f 63 75 72 72 65 6e 74 20 61 72 65  last/current are
1970: 20 64 69 66 66 65 72 65 6e 74 20 72 65 67 61 72   different regar
1980: 64 69 6e 67 20 74 72 75 6e 6b 2f 62 72 61 6e 63  ding trunk/branc
1990: 68 0a 20 20 20 20 73 65 74 20 64 65 70 74 68 20  h.    set depth 
19a0: 5b 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20  [llength [split 
19b0: 24 72 65 76 20 2e 5d 5d 0a 20 20 20 20 69 66 20  $rev .]].    if 
19c0: 7b 28 24 63 73 28 6c 61 73 74 64 29 20 3d 3d 20  {($cs(lastd) == 
19d0: 32 29 20 21 3d 20 28 24 64 65 70 74 68 20 3d 3d  2) != ($depth ==
19e0: 20 32 29 7d 20 7b 0a 09 73 65 74 20 72 65 61 73   2)} {..set reas
19f0: 6f 6e 20 62 72 61 6e 63 68 0a 09 72 65 74 75 72  on branch..retur
1a00: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  n 1.    }..    #
1a10: 20 43 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 20   Commit message 
1a20: 63 68 61 6e 67 65 64 0a 20 20 20 20 69 66 20 7b  changed.    if {
1a30: 5b 63 76 73 3a 3a 63 6d 73 67 20 24 63 73 28 6c  [cvs::cmsg $cs(l
1a40: 61 73 74 66 29 20 24 63 73 28 6c 61 73 74 72 29  astf) $cs(lastr)
1a50: 5d 20 6e 65 20 5b 63 76 73 3a 3a 63 6d 73 67 20  ] ne [cvs::cmsg 
1a60: 24 64 66 20 24 72 65 76 5d 7d 20 7b 0a 09 73 65  $df $rev]} {..se
1a70: 74 20 72 65 61 73 6f 6e 20 63 6d 73 67 0a 09 72  t reason cmsg..r
1a80: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20  eturn 1.    }.. 
1a90: 20 20 20 23 20 53 61 6d 65 20 63 68 61 6e 67 65     # Same change
1aa0: 73 65 74 0a 20 20 20 20 72 65 74 75 72 6e 20 30  set.    return 0
1ab0: 0a 7d 0a 0a 70 72 6f 63 20 63 73 63 6c 65 61 72  .}..proc csclear
1ac0: 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c   {} {.    global
1ad0: 20 63 73 20 63 73 66 0a 20 20 20 20 61 72 72 61   cs csf.    arra
1ae0: 79 20 73 65 74 20 63 73 20 7b 73 74 61 72 74 20  y set cs {start 
1af0: 7b 7d 20 75 73 72 20 7b 7d 20 65 6e 64 20 7b 7d  {} usr {} end {}
1b00: 20 64 74 20 7b 7d 7d 0a 20 20 20 20 61 72 72 61   dt {}}.    arra
1b10: 79 20 75 6e 73 65 74 20 63 73 66 20 2a 0a 20 20  y unset csf *.  
1b20: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
1b30: 20 63 73 61 64 64 20 7b 6f 70 20 75 73 72 20 74   csadd {op usr t
1b40: 73 20 72 65 76 20 64 66 7d 20 7b 0a 20 20 20 20  s rev df} {.    
1b50: 67 6c 6f 62 61 6c 20 63 73 20 63 73 66 0a 0a 20  global cs csf.. 
1b60: 20 20 20 69 66 20 7b 24 63 73 28 75 73 72 29 20     if {$cs(usr) 
1b70: 65 71 20 22 22 7d 20 7b 73 65 74 20 63 73 28 75  eq ""} {set cs(u
1b80: 73 72 29 20 24 75 73 72 7d 0a 20 20 20 20 69 66  sr) $usr}.    if
1b90: 20 7b 24 63 73 28 73 74 61 72 74 29 20 65 71 20   {$cs(start) eq 
1ba0: 22 22 7d 20 7b 0a 09 73 65 74 20 63 73 28 73 74  ""} {..set cs(st
1bb0: 61 72 74 29 20 24 74 73 0a 20 20 20 20 7d 20 65  art) $ts.    } e
1bc0: 6c 73 65 20 7b 0a 09 6c 61 70 70 65 6e 64 20 63  lse {..lappend c
1bd0: 73 28 64 74 29 20 5b 65 78 70 72 20 7b 24 74 73  s(dt) [expr {$ts
1be0: 20 2d 20 24 63 73 28 65 6e 64 29 7d 5d 0a 20 20   - $cs(end)}].  
1bf0: 20 20 7d 0a 20 20 20 20 73 65 74 20 63 73 28 65    }.    set cs(e
1c00: 6e 64 29 20 24 74 73 0a 0a 20 20 20 20 73 65 74  nd) $ts..    set
1c10: 20 63 73 66 28 24 64 66 29 20 5b 6c 69 73 74 20   csf($df) [list 
1c20: 24 6f 70 20 24 72 65 76 5d 0a 20 20 20 20 73 65  $op $rev].    se
1c30: 74 20 63 73 28 6c 61 73 74 66 29 20 24 64 66 0a  t cs(lastf) $df.
1c40: 20 20 20 20 73 65 74 20 63 73 28 6c 61 73 74 72      set cs(lastr
1c50: 29 20 24 72 65 76 0a 20 20 20 20 73 65 74 20 63  ) $rev.    set c
1c60: 73 28 6c 61 73 74 64 29 20 5b 6c 6c 65 6e 67 74  s(lastd) [llengt
1c70: 68 20 5b 73 70 6c 69 74 20 24 72 65 76 20 2e 5d  h [split $rev .]
1c80: 5d 0a 0a 20 20 20 20 70 75 74 73 20 5b 6c 69 73  ]..    puts [lis
1c90: 74 20 24 6f 70 20 5b 63 6c 6f 63 6b 20 66 6f 72  t $op [clock for
1ca0: 6d 61 74 20 24 74 73 5d 20 24 75 73 72 20 24 72  mat $ts] $usr $r
1cb0: 65 76 20 24 64 66 5d 0a 20 20 20 20 72 65 74 75  ev $df].    retu
1cc0: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 63 73 73 74 61  rn.}..proc cssta
1cd0: 74 73 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62  ts {} {.    glob
1ce0: 61 6c 20 63 73 20 63 73 66 0a 0a 20 20 20 20 69  al cs csf..    i
1cf0: 66 20 7b 24 63 73 28 73 74 61 72 74 29 20 65 71  f {$cs(start) eq
1d00: 20 22 22 7d 20 72 65 74 75 72 6e 0a 0a 20 20 20   ""} return..   
1d10: 20 70 75 74 73 20 22 66 69 6c 65 73 3a 20 5b 61   puts "files: [a
1d20: 72 72 61 79 20 73 69 7a 65 20 63 73 66 5d 22 0a  rray size csf]".
1d30: 20 20 20 20 70 75 74 73 20 22 64 65 6c 74 61 3a      puts "delta:
1d40: 20 24 63 73 28 64 74 29 22 0a 20 20 20 20 70 75   $cs(dt)".    pu
1d50: 74 73 20 22 72 61 6e 67 65 3a 20 5b 65 78 70 72  ts "range: [expr
1d60: 20 7b 24 63 73 28 65 6e 64 29 20 2d 20 24 63 73   {$cs(end) - $cs
1d70: 28 73 74 61 72 74 29 7d 5d 20 73 65 63 6f 6e 64  (start)}] second
1d80: 73 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a  s".    return.}.
1d90: 0a 72 68 0a 0a 65 78 69 74 0a 0a 3d 3d 3d 3d 3d  .rh..exit..=====
1da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1dc0: 3d 3d 3d 3d 0a 6e 65 77 20 66 6f 73 73 69 6c 0a  ====.new fossil.
1dd0: 6e 65 77 20 66 6f 73 73 69 6c 20 77 6f 72 6b 73  new fossil works
1de0: 70 61 63 65 0a 0a 6f 70 65 6e 20 68 69 73 74 6f  pace..open histo
1df0: 72 79 0a 0a 66 6f 72 65 61 63 68 20 6c 69 6e 65  ry..foreach line
1e00: 20 7b 0a 20 20 20 20 69 67 6e 6f 72 65 20 75 6e   {.    ignore un
1e10: 77 61 6e 74 65 64 20 6c 69 6e 65 73 0a 0a 20 20  wanted lines..  
1e20: 20 20 61 63 63 75 6d 75 6c 61 74 65 20 63 68 61    accumulate cha
1e30: 6e 67 65 73 65 74 73 20 64 61 74 61 0a 20 20 20  ngesets data.   
1e40: 20 6e 65 77 20 63 68 61 6e 67 65 2d 73 65 74 20   new change-set 
1e50: 3d 3e 20 63 6f 6d 6d 69 74 20 61 6e 64 20 63 6f  => commit and co
1e60: 6e 74 69 6e 75 65 0a 0a 20 20 20 20 63 75 72 72  ntinue..    curr
1e70: 65 6e 74 20 62 72 61 6e 63 68 20 61 6e 64 20 62  ent branch and b
1e80: 72 61 6e 63 68 20 6f 66 20 6e 65 77 20 63 68 61  ranch of new cha
1e90: 6e 67 65 20 64 69 66 66 65 72 65 6e 74 20 3f 0a  nge different ?.
1ea0: 20 20 20 20 3d 3e 20 6d 6f 76 65 20 66 6f 73 73      => move foss
1eb0: 69 6c 20 77 6f 72 6b 73 70 61 63 65 20 74 6f 20  il workspace to 
1ec0: 70 72 6f 70 65 72 20 72 65 76 69 73 69 6f 6e 2e  proper revision.
1ed0: 0a 0a 20 20 20 20 61 70 70 6c 79 20 63 68 61 6e  ..    apply chan
1ee0: 67 65 20 74 6f 20 77 6f 72 6b 73 70 61 63 65 0a  ge to workspace.
1ef0: 20 20 20 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a      uncommitted.
1f00: 7d 0a 0a 69 66 20 75 6e 63 6f 6d 6d 69 74 74 65  }..if uncommitte
1f10: 64 20 3d 3e 20 63 6f 6d 6d 69 74 0a 64 65 6c 65  d => commit.dele
1f20: 74 65 20 77 6f 72 6b 73 70 61 63 65 0a 63 6f 70  te workspace.cop
1f30: 79 20 66 6f 73 73 69 6c 20 72 65 70 6f 20 74 6f  y fossil repo to
1f40: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 3d 3d 3d   destination.===
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f70: 3d 3d 3d 3d 3d 3d 0a 0a 4e 6f 74 20 64 65 61 6c  ======..Not deal
1f80: 74 20 77 69 74 68 20 69 6e 20 6f 75 74 6c 69 6e  t with in outlin
1f90: 65 3a 20 62 72 61 6e 63 68 65 73 2c 20 74 61 67  e: branches, tag
1fa0: 73 2c 20 6d 65 72 67 69 6e 67 0a 0a 3d 3d 3d 3d  s, merging..====
1fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1fd0: 3d 3d 3d 3d 3d 0a 0a 63 6f 6d 70 6c 65 78 69 74  =====..complexit
1fe0: 69 65 73 0a 2d 20 61 70 70 6c 79 20 74 6f 20 77  ies.- apply to w
1ff0: 6f 72 6b 73 70 61 63 65 0a 20 20 2d 20 72 65 6d  orkspace.  - rem
2000: 6f 76 65 20 73 69 6d 70 6c 65 2c 20 64 69 72 65  ove simple, dire
2010: 63 74 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 20  ct translation. 
2020: 20 2d 20 61 64 64 20 3d 3e 20 72 65 71 75 69 72   - add => requir
2030: 65 73 20 65 78 74 72 61 63 74 69 6f 6e 20 6f 66  es extraction of
2040: 20 69 6e 64 69 63 61 74 65 64 20 72 65 76 69 73   indicated revis
2050: 69 6f 6e 20 66 72 6f 6d 20 2c 76 0a 20 20 2d 20  ion from ,v.  - 
2060: 6d 6f 64 69 66 79 20 3d 3e 20 73 65 65 20 61 62  modify => see ab
2070: 6f 76 65 20 28 77 69 74 68 6f 75 74 20 61 64 64  ove (without add
2080: 20 66 6f 6c 6c 6f 77 69 6e 67 29 0a 0a 2d 20 2c   following)..- ,
2090: 76 20 66 69 6c 65 20 3d 3e 20 43 61 6e 20 62 65  v file => Can be
20a0: 20 74 68 65 20 65 69 74 68 65 72 20 64 69 72 2f   the either dir/
20b0: 66 69 6c 65 2c 76 2c 20 6f 72 20 64 69 72 2f 41  file,v, or dir/A
20c0: 74 74 69 63 2f 66 69 6c 65 2c 76 0a 20 20 42 6f  ttic/file,v.  Bo
20d0: 74 68 20 3f 20 50 72 69 6f 72 69 74 79 20 3f 0a  th ? Priority ?.
20e0: 0a 2d 20 48 6f 77 20 74 6f 20 64 65 74 65 63 74  .- How to detect
20f0: 20 63 68 61 6e 67 65 73 20 6f 6e 20 62 72 61 6e   changes on bran
2100: 63 68 65 73 20 3f 0a 0a 2d 20 48 61 76 65 20 74  ches ?..- Have t
2110: 6f 20 6b 65 65 70 20 6b 6e 6f 77 6c 65 64 67 65  o keep knowledge
2120: 20 6f 66 20 77 68 69 63 68 20 62 72 61 6e 63 68   of which branch
2130: 65 73 20 77 65 6e 74 20 74 68 65 72 65 2e 0a 20  es went there.. 
2140: 3d 3e 20 73 61 76 65 20 63 68 61 6e 67 65 2d 73  => save change-s
2150: 65 74 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c  ets information,
2160: 20 2b 20 75 75 69 64 20 69 6e 20 66 6f 73 73 69   + uuid in fossi
2170: 6c 0a 20 3d 3e 20 6e 65 65 64 20 6f 6e 6c 79 20  l. => need only 
2180: 74 68 65 20 6c 65 61 76 65 73 20 6f 66 20 65 61  the leaves of ea
2190: 63 68 20 62 72 61 6e 63 68 2c 20 61 6e 64 20 6f  ch branch, and o
21a0: 66 20 62 72 61 6e 63 68 20 70 6f 69 6e 74 73 2e  f branch points.
21b0: 0a 20 3d 3e 20 62 65 74 74 65 72 20 6b 65 65 70  . => better keep
21c0: 20 61 6c 6c 20 75 6e 74 69 6c 20 63 6f 6d 70 6c   all until compl
21d0: 65 74 65 2e 0a 20 3d 3e 20 75 75 69 64 20 63 61  ete.. => uuid ca
21e0: 6e 20 62 65 20 67 6f 74 74 65 6e 20 66 72 6f 6d  n be gotten from
21f0: 20 27 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 27   'manifest.uuid'
2200: 20 69 6e 20 77 6f 72 6b 73 70 61 63 65 2e 0a 2d   in workspace..-
2210: 20 6b 65 65 70 20 74 61 67 20 69 6e 66 6f 72 6d   keep tag inform
2220: 61 74 69 6f 6e 20 3f 20 28 73 79 6d 62 6f 6c 69  ation ? (symboli
2230: 63 73 29 0a 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  cs)..===========
2240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
2260: 43 56 53 52 4f 4f 54 3d 4f 52 49 47 49 4e 0a 0a  CVSROOT=ORIGIN..
2270: 63 76 73 20 2d 64 20 4f 52 49 47 49 4e 20 63 68  cvs -d ORIGIN ch
2280: 65 63 6b 6f 75 74 20 2d 72 20 52 45 56 20 46 49  eckout -r REV FI
2290: 4c 45 0a 45 78 74 72 61 63 74 20 73 70 65 63 69  LE.Extract speci
22a0: 66 69 63 20 72 65 76 69 73 69 6f 6e 20 6f 66 20  fic revision of 
22b0: 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 2e  a specific file.
22c0: 0a 2d 71 2c 20 2d 51 20 71 75 69 65 74 6e 65 73  .-q, -Q quietnes
22d0: 73 0a                                            s.