Hex Artifact Content
Not logged in

Artifact e89af18f22368490e391524a5821c8febaf68078:

File tools/lib/cvs.tcl part of check-in [8469631cc9] - Extended import app with switch to stop execution just before a specific changeset, to aid in debugging problems. by aku on 2007-09-08 03:48:40.

0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 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 0a  ---------------.
0050: 23 20 52 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e  # Repository man
0060: 61 67 65 6d 65 6e 74 20 28 43 56 53 29 0a 0a 23  agement (CVS)..#
0070: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
00c0: 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70   Requirements..p
00d0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54  ackage require T
00e0: 63 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20 72  cl 8.4.package r
00f0: 65 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20  equire fileutil 
0100: 20 3b 20 23 20 54 63 6c 6c 69 62 20 28 63 61 74   ; # Tcllib (cat
0110: 29 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ).package requir
0120: 65 20 72 63 73 70 61 72 73 65 72 20 3b 20 23 20  e rcsparser ; # 
0130: 48 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 43 53  Handling the RCS
0140: 20 61 72 63 68 69 76 65 20 66 69 6c 65 73 2e 0a   archive files..
0150: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0160: 73 74 72 75 63 74 3a 3a 74 72 65 65 0a 0a 6e 61  struct::tree..na
0170: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63  mespace eval ::c
0180: 76 73 20 7b 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  vs {}..# -------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01d0: 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 49 0a 0a 23 20  ------.# API..# 
01e0: 44 65 66 69 6e 65 20 72 65 70 6f 73 69 74 6f 72  Define repositor
01f0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0a 0a 70 72  y directory...pr
0200: 6f 63 20 3a 3a 63 76 73 3a 3a 61 74 20 7b 70 61  oc ::cvs::at {pa
0210: 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62  th} {.    variab
0220: 6c 65 20 62 61 73 65 20 5b 66 69 6c 65 20 6e 6f  le base [file no
0230: 72 6d 61 6c 69 7a 65 20 24 70 61 74 68 5d 0a 20  rmalize $path]. 
0240: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d     return.}..nam
0250: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 76  espace eval ::cv
0260: 73 20 7b 0a 20 20 20 20 23 20 54 6f 70 6c 65 76  s {.    # Toplev
0270: 65 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69  el repository di
0280: 72 65 63 74 6f 72 79 0a 20 20 20 20 76 61 72 69  rectory.    vari
0290: 61 62 6c 65 20 62 61 73 65 20 7b 7d 0a 7d 0a 0a  able base {}.}..
02a0: 23 20 44 65 66 69 6e 65 20 6c 6f 67 67 69 6e 67  # Define logging
02b0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
02c0: 64 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 66  d..proc ::cvs::f
02d0: 65 65 64 62 61 63 6b 20 7b 6c 6f 67 63 6d 64 7d  eedback {logcmd}
02e0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
02f0: 6c 63 20 24 6c 6f 67 63 6d 64 0a 20 20 20 20 3a  lc $logcmd.    :
0300: 3a 72 63 73 70 61 72 73 65 72 3a 3a 66 65 65 64  :rcsparser::feed
0310: 62 61 63 6b 20 24 6c 6f 67 63 6d 64 0a 20 20 20  back $logcmd.   
0320: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 53 63 61   return.}..# Sca
0330: 6e 20 72 65 70 6f 73 69 74 6f 72 79 2c 20 63 6f  n repository, co
0340: 6c 6c 65 63 74 20 61 72 63 68 69 76 65 73 2c 20  llect archives, 
0350: 70 61 72 73 65 20 74 68 65 6d 2c 20 61 6e 64 20  parse them, and 
0360: 63 6f 6c 6c 65 63 74 20 72 65 76 69 73 69 6f 6e  collect revision
0370: 0a 23 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28  .# information (
0380: 66 69 6c 65 2c 20 72 65 76 69 73 69 6f 6e 20 2d  file, revision -
0390: 3e 20 64 61 74 65 2c 20 61 75 74 68 6f 72 2c 20  > date, author, 
03a0: 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 29 0a  commit message).
03b0: 0a 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 73 63 61  .proc ::cvs::sca
03c0: 6e 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  n {} {.    varia
03d0: 62 6c 65 20 62 61 73 65 0a 20 20 20 20 76 61 72  ble base.    var
03e0: 69 61 62 6c 65 20 6e 70 61 74 68 73 0a 20 20 20  iable npaths.   
03f0: 20 76 61 72 69 61 62 6c 65 20 72 70 61 74 68 73   variable rpaths
0400: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 69  .    variable ti
0410: 6d 65 6c 69 6e 65 0a 0a 20 20 20 20 4c 6f 67 20  meline..    Log 
0420: 69 6e 66 6f 20 22 53 63 61 6e 6e 69 6e 67 20 43  info "Scanning C
0430: 56 53 20 74 72 65 65 20 24 62 61 73 65 22 0a 0a  VS tree $base"..
0440: 20 20 20 20 73 65 74 20 6e 20 30 0a 20 20 20 20      set n 0.    
0450: 66 6f 72 65 61 63 68 20 72 63 73 20 5b 66 69 6c  foreach rcs [fil
0460: 65 75 74 69 6c 3a 3a 66 69 6e 64 42 79 50 61 74  eutil::findByPat
0470: 74 65 72 6e 20 24 62 61 73 65 20 2d 67 6c 6f 62  tern $base -glob
0480: 20 2a 2c 76 5d 20 7b 0a 09 73 65 74 20 72 63 73   *,v] {..set rcs
0490: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 73 74 72 69   [fileutil::stri
04a0: 70 50 61 74 68 20 24 62 61 73 65 20 24 72 63 73  pPath $base $rcs
04b0: 5d 0a 09 23 20 4e 6f 77 20 72 63 73 20 69 73 20  ]..# Now rcs is 
04c0: 72 65 6c 61 74 69 76 65 20 74 6f 20 62 61 73 65  relative to base
04d0: 0a 0a 09 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20  ...Log info "   
04e0: 20 50 61 72 73 69 6e 67 20 61 72 63 68 69 76 65   Parsing archive
04f0: 20 24 72 63 73 22 0a 0a 09 69 66 20 7b 5b 73 74   $rcs"...if {[st
0500: 72 69 6e 67 20 6d 61 74 63 68 20 43 56 53 52 4f  ring match CVSRO
0510: 4f 54 2a 20 24 72 63 73 5d 7d 20 7b 0a 09 20 20  OT* $rcs]} {..  
0520: 20 20 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 20    Log info "    
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20               => 
0540: 49 67 6e 6f 72 69 6e 67 20 61 64 6d 69 6e 20 66  Ignoring admin f
0550: 69 6c 65 22 0a 09 20 20 20 20 63 6f 6e 74 69 6e  ile"..    contin
0560: 75 65 0a 09 7d 0a 0a 09 23 20 44 65 72 69 76 65  ue..}...# Derive
0570: 20 74 68 65 20 72 65 67 75 6c 61 72 20 70 61 74   the regular pat
0580: 68 20 66 72 6f 6d 20 74 68 65 20 72 63 73 20 70  h from the rcs p
0590: 61 74 68 2e 20 4d 65 61 6e 69 6e 67 3a 20 43 68  ath. Meaning: Ch
05a0: 6f 70 20 6f 66 0a 09 23 20 74 68 65 20 22 2c 76  op of..# the ",v
05b0: 22 20 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65  " suffix, and re
05c0: 6d 6f 76 65 20 61 20 70 6f 73 73 69 62 6c 65 20  move a possible 
05d0: 22 41 74 74 69 63 22 2e 0a 09 73 65 74 20 66 20  "Attic"...set f 
05e0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72  [string range $r
05f0: 63 73 20 30 20 65 6e 64 2d 32 5d 0a 09 69 66 20  cs 0 end-2]..if 
0600: 7b 22 41 74 74 69 63 22 20 65 71 20 5b 6c 69 6e  {"Attic" eq [lin
0610: 64 65 78 20 5b 66 69 6c 65 20 73 70 6c 69 74 20  dex [file split 
0620: 24 72 63 73 5d 20 65 6e 64 2d 31 5d 7d 20 7b 0a  $rcs] end-1]} {.
0630: 09 20 20 20 20 73 65 74 20 66 20 5b 66 69 6c 65  .    set f [file
0640: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e   join [file dirn
0650: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  ame [file dirnam
0660: 65 20 24 66 5d 5d 20 5b 66 69 6c 65 20 74 61 69  e $f]] [file tai
0670: 6c 20 24 66 5d 5d 0a 09 20 20 20 20 69 66 20 7b  l $f]]..    if {
0680: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 62 61  [file exists $ba
0690: 73 65 2f 24 66 2c 76 5d 7d 20 7b 0a 09 09 23 20  se/$f,v]} {...# 
06a0: 57 65 20 68 61 76 65 20 61 20 72 65 67 75 6c 61  We have a regula
06b0: 72 20 61 72 63 68 69 76 65 20 61 6e 64 20 61 6e  r archive and an
06c0: 20 41 74 74 69 63 20 61 72 63 68 69 76 65 0a 09   Attic archive..
06d0: 09 23 20 72 65 66 65 72 69 6e 67 20 74 6f 20 74  .# refering to t
06e0: 68 65 20 73 61 6d 65 20 75 73 65 72 20 76 69 73  he same user vis
06f0: 69 62 6c 65 20 66 69 6c 65 2e 20 49 67 6e 6f 72  ible file. Ignor
0700: 65 20 74 68 65 0a 09 09 23 20 66 69 6c 65 20 69  e the...# file i
0710: 6e 20 74 68 65 20 41 74 74 69 63 2e 0a 09 09 4c  n the Attic....L
0720: 6f 67 20 69 6e 66 6f 20 22 20 20 20 20 20 20 20  og info "       
0730: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 49 67 6e            => Ign
0740: 6f 72 69 6e 67 20 61 74 74 69 63 20 66 6f 72 20  oring attic for 
0750: 72 65 67 75 6c 61 72 20 61 72 63 68 69 76 65 22  regular archive"
0760: 0a 0a 09 09 23 20 54 4f 44 4f 2f 43 48 45 43 4b  ....# TODO/CHECK
0770: 2e 20 4d 79 20 6d 65 74 68 6f 64 20 6f 66 20 63  . My method of c
0780: 6f 27 69 6e 67 20 65 78 61 63 74 20 66 69 6c 65  o'ing exact file
0790: 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 23 20 70   revisions...# p
07a0: 65 72 20 74 68 65 20 69 6e 66 6f 20 69 6e 20 74  er the info in t
07b0: 68 65 20 63 6f 6c 6c 65 63 74 65 64 20 63 73 65  he collected cse
07c0: 74 73 20 68 61 73 20 74 68 65 20 66 6c 61 77 0a  ts has the flaw.
07d0: 09 09 23 20 74 68 61 74 20 49 20 6d 61 79 20 68  ..# that I may h
07e0: 61 76 65 20 74 6f 20 6b 6e 6f 77 20 65 78 61 63  ave to know exac
07f0: 74 6c 79 20 77 68 65 6e 20 77 68 61 74 20 61 72  tly when what ar
0800: 63 68 69 76 65 0a 09 09 23 20 66 69 6c 65 20 74  chive...# file t
0810: 6f 20 75 73 65 2c 20 73 65 65 20 61 62 6f 76 65  o use, see above
0820: 2e 20 49 74 20 6d 69 67 68 74 20 62 65 20 62 65  . It might be be
0830: 74 74 65 72 20 74 6f 20 75 73 65 0a 09 09 23 20  tter to use...# 
0840: 74 68 65 20 69 6e 66 6f 20 6f 6e 6c 79 20 74 6f  the info only to
0850: 20 67 61 74 68 65 72 20 77 68 65 6e 20 63 73 65   gather when cse
0860: 74 73 20 62 65 67 69 6e 20 61 6e 64 20 65 6e 64  ts begin and end
0870: 2c 0a 09 09 23 20 61 6e 64 20 74 68 65 6e 20 74  ,...# and then t
0880: 6f 20 63 6f 20 63 6f 6d 70 6c 65 74 65 20 73 6c  o co complete sl
0890: 69 63 65 73 20 70 65 72 20 65 78 61 63 74 20 74  ices per exact t
08a0: 69 6d 65 73 74 61 6d 70 0a 09 09 23 20 28 2d 44  imestamp...# (-D
08b0: 29 20 69 6e 73 74 65 61 64 20 6f 66 20 66 69 6c  ) instead of fil
08c0: 65 20 72 65 76 69 73 69 6f 6e 73 20 28 2d 72 29  e revisions (-r)
08d0: 2e 20 54 68 65 20 66 6c 61 77 20 69 6e 0a 09 09  . The flaw in...
08e0: 23 20 74 68 61 74 20 69 73 20 74 68 61 74 20 63  # that is that c
08f0: 73 65 74 73 20 63 61 6e 20 6f 63 63 75 72 20 69  sets can occur i
0900: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e  n the same secon
0910: 64 0a 09 09 23 20 28 74 72 66 2c 20 6d 65 6d 63  d...# (trf, memc
0920: 68 61 6e 20 2d 20 63 68 65 63 6b 20 66 6f 72 20  han - check for 
0930: 65 78 61 6d 70 6c 65 73 29 2e 20 46 6f 72 20 74  examples). For t
0940: 68 61 74 20 65 78 61 63 74 0a 09 09 23 20 63 68  hat exact...# ch
0950: 65 63 6b 6f 75 74 20 6d 61 79 20 62 65 20 6e 65  eckout may be ne
0960: 65 64 65 64 20 74 6f 20 72 65 63 72 65 61 74 65  eded to recreate
0970: 20 65 78 61 63 74 20 73 65 71 75 65 6e 63 65 20   exact sequence 
0980: 6f 66 0a 09 09 23 20 63 68 61 6e 67 65 73 2e 20  of...# changes. 
0990: 47 72 72 2e 20 53 69 78 20 6f 66 20 6f 6e 65 20  Grr. Six of one 
09a0: 2e 2e 2e 0a 0a 09 09 63 6f 6e 74 69 6e 75 65 0a  .......continue.
09b0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 47 65  .    }..}...# Ge
09c0: 74 20 74 68 65 20 6d 65 74 61 20 64 61 74 61 20  t the meta data 
09d0: 77 65 20 6e 65 65 64 20 28 72 65 76 69 73 69 6f  we need (revisio
09e0: 6e 73 2c 20 74 69 6d 65 6c 69 6e 65 2c 20 6d 65  ns, timeline, me
09f0: 73 73 61 67 65 73 29 2e 0a 09 73 65 74 20 6d 65  ssages)...set me
0a00: 74 61 20 5b 3a 3a 72 63 73 70 61 72 73 65 72 3a  ta [::rcsparser:
0a10: 3a 70 72 6f 63 65 73 73 20 24 62 61 73 65 2f 24  :process $base/$
0a20: 72 63 73 5d 0a 0a 09 4c 6f 67 20 69 6e 66 6f 20  rcs]...Log info 
0a30: 22 20 20 20 20 20 20 20 20 20 3d 3e 20 24 66 22  "         => $f"
0a40: 0a 0a 09 73 65 74 20 6e 70 61 74 68 73 28 24 72  ...set npaths($r
0a50: 63 73 29 20 24 66 0a 09 73 65 74 20 72 70 61 74  cs) $f..set rpat
0a60: 68 73 28 24 66 29 20 24 72 63 73 0a 0a 09 61 72  hs($f) $rcs...ar
0a70: 72 61 79 20 73 65 74 20 70 20 24 6d 65 74 61 0a  ray set p $meta.
0a80: 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 74  ..foreach {rev t
0a90: 73 7d 20 24 70 28 64 61 74 65 29 20 7b 5f 20 61  s} $p(date) {_ a
0aa0: 7d 20 24 70 28 61 75 74 68 6f 72 29 20 7b 5f 20  } $p(author) {_ 
0ab0: 63 6d 7d 20 24 70 28 63 6f 6d 6d 69 74 29 20 7b  cm} $p(commit) {
0ac0: 5f 20 73 74 7d 20 24 70 28 73 74 61 74 65 29 20  _ st} $p(state) 
0ad0: 7b 0a 09 20 20 20 20 73 65 74 20 6f 70 20 5b 65  {..    set op [e
0ae0: 78 70 72 20 7b 28 24 72 65 76 20 65 71 20 22 31  xpr {($rev eq "1
0af0: 2e 31 22 29 20 3f 20 22 41 22 20 3a 20 22 4d 22  .1") ? "A" : "M"
0b00: 7d 5d 0a 09 20 20 20 20 69 66 20 7b 24 73 74 20  }]..    if {$st 
0b10: 65 71 20 22 64 65 61 64 22 7d 20 7b 73 65 74 20  eq "dead"} {set 
0b20: 6f 70 20 22 52 22 7d 0a 0a 09 20 20 20 20 23 20  op "R"}...    # 
0b30: 41 20 64 65 61 64 2d 66 69 72 73 74 20 72 65 76  A dead-first rev
0b40: 69 73 69 6f 6e 20 69 73 20 72 65 76 20 31 2e 31  ision is rev 1.1
0b50: 20 77 69 74 68 20 6f 70 20 52 2e 20 46 6f 72 20   with op R. For 
0b60: 61 6e 0a 09 20 20 20 20 23 20 65 78 61 6d 70 6c  an..    # exampl
0b70: 65 20 73 65 65 20 74 68 65 20 66 69 6c 65 20 6d  e see the file m
0b80: 65 6d 63 68 61 6e 2f 44 45 50 45 4e 44 45 4e 43  emchan/DEPENDENC
0b90: 49 45 53 2e 20 53 75 63 68 20 61 20 66 69 6c 65  IES. Such a file
0ba0: 0a 09 20 20 20 20 23 20 73 65 65 6d 73 20 74 6f  ..    # seems to
0bb0: 20 65 78 69 73 74 20 6f 6e 6c 79 21 20 6f 6e 20   exist only! on 
0bc0: 69 74 73 20 62 72 61 6e 63 68 2e 20 54 68 65 20  its branch. The 
0bd0: 62 72 61 6e 63 68 65 73 0a 09 20 20 20 20 23 20  branches..    # 
0be0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73  information is s
0bf0: 65 74 20 6f 6e 20 74 68 65 20 72 65 76 69 73 69  et on the revisi
0c00: 6f 6e 20 28 65 78 74 65 6e 64 20 72 63 73 70 61  on (extend rcspa
0c10: 72 73 65 72 21 29 2c 0a 09 20 20 20 20 23 20 73  rser!),..    # s
0c20: 79 6d 62 6f 6c 73 20 68 61 73 20 61 20 74 61 67  ymbols has a tag
0c30: 2c 20 72 65 66 65 72 69 6e 67 20 74 6f 20 61 20  , refering to a 
0c40: 62 72 61 6e 63 68 2c 20 70 6f 73 73 69 62 6c 79  branch, possibly
0c50: 20 6d 61 67 69 63 2e 0a 0a 09 20 20 20 20 69 66   magic....    if
0c60: 20 7b 28 24 72 65 76 20 65 71 20 22 31 2e 31 22   {($rev eq "1.1"
0c70: 29 20 26 26 20 28 24 6f 70 20 65 71 20 22 52 22  ) && ($op eq "R"
0c80: 29 7d 20 7b 0a 09 09 4c 6f 67 20 69 6e 66 6f 20  )} {...Log info 
0c90: 22 20 20 20 20 20 20 20 20 20 3d 3e 20 44 65 61  "         => Dea
0ca0: 64 20 66 69 72 73 74 22 0a 09 20 20 20 20 7d 0a  d first"..    }.
0cb0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74 69  ..    lappend ti
0cc0: 6d 65 6c 69 6e 65 28 24 74 73 29 20 5b 6c 69 73  meline($ts) [lis
0cd0: 74 20 24 6f 70 20 24 74 73 20 24 61 20 24 72 65  t $op $ts $a $re
0ce0: 76 20 24 66 20 24 63 6d 5d 0a 09 7d 0a 0a 09 23  v $f $cm]..}...#
0cf0: 75 6e 73 65 74 20 70 28 63 6f 6d 6d 69 74 29 0a  unset p(commit).
0d00: 09 23 70 61 72 72 61 79 20 70 0a 0a 09 69 6e 63  .#parray p...inc
0d10: 72 20 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 4c  r n.    }..    L
0d20: 6f 67 20 69 6e 66 6f 20 22 50 72 6f 63 65 73 73  og info "Process
0d30: 65 64 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e  ed $n [expr {($n
0d40: 20 3d 3d 20 31 29 20 3f 20 22 66 69 6c 65 22 20   == 1) ? "file" 
0d50: 3a 20 22 66 69 6c 65 73 22 7d 5d 22 0a 20 20 20  : "files"}]".   
0d60: 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73   return.}..names
0d70: 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 76 73 20  pace eval ::cvs 
0d80: 7b 0a 20 20 20 20 23 20 50 61 74 68 20 6d 61 70  {.    # Path map
0d90: 70 69 6e 67 73 2e 20 6e 70 61 74 68 73 3a 20 72  pings. npaths: r
0da0: 63 73 20 66 69 6c 65 20 20 2d 3e 20 75 73 65 72  cs file  -> user
0db0: 20 66 69 6c 65 0a 20 20 20 20 23 20 20 20 20 20   file.    #     
0dc0: 20 20 20 20 20 20 20 20 20 20 20 72 70 61 74 68             rpath
0dd0: 73 3a 20 75 73 65 72 20 66 69 6c 65 20 2d 3e 20  s: user file -> 
0de0: 72 63 73 20 66 69 6c 65 2c 20 64 65 61 64 2d 73  rcs file, dead-s
0df0: 74 61 74 75 73 0a 0a 20 20 20 20 76 61 72 69 61  tatus..    varia
0e00: 62 6c 65 20 6e 70 61 74 68 73 20 20 20 3b 20 61  ble npaths   ; a
0e10: 72 72 61 79 20 73 65 74 20 6e 70 61 74 68 73 20  rray set npaths 
0e20: 20 20 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c    {}.    variabl
0e30: 65 20 72 70 61 74 68 73 20 20 20 3b 20 61 72 72  e rpaths   ; arr
0e40: 61 79 20 73 65 74 20 72 70 61 74 68 73 20 20 20  ay set rpaths   
0e50: 7b 7d 0a 0a 20 20 20 20 23 20 54 69 6d 65 6c 69  {}..    # Timeli
0e60: 6e 65 3a 20 74 73 74 61 6d 70 20 2d 3e 20 28 6f  ne: tstamp -> (o
0e70: 70 2c 20 74 73 74 61 6d 70 2c 20 61 75 74 68 6f  p, tstamp, autho
0e80: 72 2c 20 72 65 76 69 73 69 6f 6e 2c 20 66 69 6c  r, revision, fil
0e90: 65 2c 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67  e, commit messag
0ea0: 65 29 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65  e)..    variable
0eb0: 20 74 69 6d 65 6c 69 6e 65 20 3b 20 61 72 72 61   timeline ; arra
0ec0: 79 20 73 65 74 20 74 69 6d 65 6c 69 6e 65 20 7b  y set timeline {
0ed0: 7d 0a 7d 0a 0a 23 20 47 72 6f 75 70 20 73 69 6e  }.}..# Group sin
0ee0: 67 6c 65 20 63 68 61 6e 67 65 73 20 69 6e 74 6f  gle changes into
0ef0: 20 63 68 61 6e 67 65 73 65 74 73 0a 0a 70 72 6f   changesets..pro
0f00: 63 20 3a 3a 63 76 73 3a 3a 63 73 65 74 73 20 7b  c ::cvs::csets {
0f10: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65  } {.    variable
0f20: 20 74 69 6d 65 6c 69 6e 65 0a 20 20 20 20 76 61   timeline.    va
0f30: 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20  riable csets.   
0f40: 20 76 61 72 69 61 62 6c 65 20 6e 63 73 0a 20 20   variable ncs.  
0f50: 20 20 76 61 72 69 61 62 6c 65 20 63 6d 61 70 0a    variable cmap.
0f60: 0a 20 20 20 20 61 72 72 61 79 20 75 6e 73 65 74  .    array unset
0f70: 20 63 73 65 74 73 20 2a 20 3b 20 61 72 72 61 79   csets * ; array
0f80: 20 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 20 20   set csets {}.  
0f90: 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 63 6d    array unset cm
0fa0: 61 70 20 20 2a 20 3b 20 61 72 72 61 79 20 73 65  ap  * ; array se
0fb0: 74 20 63 6d 61 70 20 20 7b 7d 0a 20 20 20 20 73  t cmap  {}.    s
0fc0: 65 74 20 6e 63 73 20 30 0a 0a 20 20 20 20 4c 6f  et ncs 0..    Lo
0fd0: 67 20 69 6e 66 6f 20 22 50 72 6f 63 65 73 73 69  g info "Processi
0fe0: 6e 67 20 74 69 6d 65 6c 69 6e 65 22 0a 0a 20 20  ng timeline"..  
0ff0: 20 20 73 65 74 20 6e 20 30 0a 20 20 20 20 43 53    set n 0.    CS
1000: 43 6c 65 61 72 0a 20 20 20 20 66 6f 72 65 61 63  Clear.    foreac
1010: 68 20 74 73 20 5b 6c 73 6f 72 74 20 2d 64 69 63  h ts [lsort -dic
1020: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74  t [array names t
1030: 69 6d 65 6c 69 6e 65 5d 5d 20 7b 0a 0a 09 23 20  imeline]] {...# 
1040: 6f 70 20 74 73 74 61 6d 70 20 61 75 74 68 6f 72  op tstamp author
1050: 20 72 65 76 69 73 69 6f 6e 20 66 69 6c 65 20 63   revision file c
1060: 6f 6d 6d 69 74 0a 09 23 20 30 20 20 31 20 20 20  ommit..# 0  1   
1070: 20 20 20 32 20 20 20 20 20 20 33 20 20 20 20 20     2      3     
1080: 20 20 20 34 20 20 20 20 35 2f 65 6e 64 0a 09 23     4    5/end..#
1090: 20 62 20 20 20 20 20 20 20 20 20 63 20 20 20 20   b         c    
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b0: 61 0a 0a 09 73 65 74 20 65 6e 74 72 69 65 73 20  a...set entries 
10c0: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 32 20  [lsort -index 2 
10d0: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20  [lsort -index 0 
10e0: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 65 6e  [lsort -index en
10f0: 64 20 24 74 69 6d 65 6c 69 6e 65 28 24 74 73 29  d $timeline($ts)
1100: 5d 5d 5d 0a 09 23 70 75 74 73 20 5b 6a 6f 69 6e  ]]]..#puts [join
1110: 20 24 65 6e 74 72 69 65 73 20 5c 6e 5d 0a 0a 09   $entries \n]...
1120: 66 6f 72 65 61 63 68 20 65 6e 74 72 79 20 20 24  foreach entry  $
1130: 65 6e 74 72 69 65 73 20 7b 0a 09 20 20 20 20 69  entries {..    i
1140: 66 20 7b 21 5b 43 53 4e 6f 6e 65 5d 20 26 26 20  f {![CSNone] && 
1150: 5b 43 53 4e 65 77 20 24 65 6e 74 72 79 5d 7d 20  [CSNew $entry]} 
1160: 7b 0a 09 09 43 53 53 61 76 65 0a 09 09 43 53 43  {...CSSave...CSC
1170: 6c 65 61 72 0a 09 09 23 70 75 74 73 20 3d 3d 5c  lear...#puts ==\
1180: 6e 24 72 65 61 73 6f 6e 0a 09 20 20 20 20 7d 0a  n$reason..    }.
1190: 09 20 20 20 20 43 53 41 64 64 20 24 65 6e 74 72  .    CSAdd $entr
11a0: 79 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d  y..    incr n..}
11b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 4c 6f 67 20  .    }..    Log 
11c0: 69 6e 66 6f 20 22 50 72 6f 63 65 73 73 65 64 20  info "Processed 
11d0: 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 20 3d 3d  $n [expr {($n ==
11e0: 20 31 29 20 3f 20 22 65 6e 74 72 79 22 20 3a 20   1) ? "entry" : 
11f0: 22 65 6e 74 72 69 65 73 22 7d 5d 22 0a 20 20 20  "entries"}]".   
1200: 20 73 65 74 20 6e 20 5b 61 72 72 61 79 20 73 69   set n [array si
1210: 7a 65 20 63 73 65 74 73 5d 0a 20 20 20 20 4c 6f  ze csets].    Lo
1220: 67 20 69 6e 66 6f 20 22 46 6f 75 6e 64 20 20 20  g info "Found   
1230: 20 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 20    $n [expr {($n 
1240: 3d 3d 20 31 29 20 3f 20 22 63 68 61 6e 67 65 73  == 1) ? "changes
1250: 65 74 22 20 3a 20 22 63 68 61 6e 67 65 73 65 74  et" : "changeset
1260: 73 22 7d 5d 22 0a 20 20 20 20 72 65 74 75 72 6e  s"}]".    return
1270: 0a 7d 0a 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65  .}...namespace e
1280: 76 61 6c 20 3a 3a 63 76 73 20 7b 0a 20 20 20 20  val ::cvs {.    
1290: 23 20 43 68 61 6e 67 65 73 65 74 20 64 61 74 61  # Changeset data
12a0: 3a 0a 20 20 20 20 23 20 6e 63 73 3a 20 20 20 43  :.    # ncs:   C
12b0: 6f 75 6e 74 65 72 2d 62 61 73 65 64 20 69 64 20  ounter-based id 
12c0: 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 20 20 23  generation.    #
12d0: 20 63 73 65 74 73 3a 20 69 64 20 2d 3e 20 28 75   csets: id -> (u
12e0: 73 65 72 20 63 6f 6d 6d 69 74 20 73 74 61 72 74  ser commit start
12f0: 20 65 6e 64 20 64 65 70 74 68 20 28 66 69 6c 65   end depth (file
1300: 20 2d 3e 20 28 6f 70 20 72 65 76 29 29 29 0a 0a   -> (op rev)))..
1310: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 63 73      variable ncs
1320: 20 20 20 20 20 20 3b 20 73 65 74 20 20 20 20 20        ; set     
1330: 20 20 6e 63 73 20 20 20 30 20 20 3b 20 23 20 43    ncs   0  ; # C
1340: 6f 75 6e 74 65 72 20 66 6f 72 20 63 68 61 6e 67  ounter for chang
1350: 65 73 65 74 73 0a 20 20 20 20 76 61 72 69 61 62  esets.    variab
1360: 6c 65 20 63 73 65 74 73 20 20 20 20 3b 20 61 72  le csets    ; ar
1370: 72 61 79 20 73 65 74 20 63 73 65 74 73 20 7b 7d  ray set csets {}
1380: 20 3b 20 23 20 43 68 61 6e 67 65 73 65 74 20 64   ; # Changeset d
1390: 61 74 61 0a 7d 0a 0a 23 20 42 75 69 6c 64 69 6e  ata.}..# Buildin
13a0: 67 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 74  g the revision t
13b0: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 63 68 61  ree from the cha
13c0: 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69 6d 69 74  ngesets..# Limit
13d0: 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e 74 6c 79  ation: Currently
13e0: 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63 73 65 74   only trunk cset
13f0: 73 20 69 73 20 68 61 6e 64 6c 65 64 2e 0a 23 20  s is handled..# 
1400: 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44 65 61 64  Limitation: Dead
1410: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 20 72   files are not r
1420: 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20 6e 6f 20  emoved, i.e. no 
1430: 27 52 27 20 61 63 74 69 6f 6e 73 20 72 69 67 68  'R' actions righ
1440: 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20 3a 3a 63  t now...proc ::c
1450: 76 73 3a 3a 72 74 72 65 65 20 7b 7d 20 7b 0a 20  vs::rtree {} {. 
1460: 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74     variable cset
1470: 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 72  s.    variable r
1480: 74 72 65 65 20 7b 7d 0a 20 20 20 20 76 61 72 69  tree {}.    vari
1490: 61 62 6c 65 20 6e 74 72 75 6e 6b 20 30 0a 0a 20  able ntrunk 0.. 
14a0: 20 20 20 4c 6f 67 20 69 6e 66 6f 20 22 45 78 74     Log info "Ext
14b0: 72 61 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e  racting the trun
14c0: 6b 22 0a 0a 20 20 20 20 73 65 74 20 72 74 72 65  k"..    set rtre
14d0: 65 20 5b 73 74 72 75 63 74 3a 3a 74 72 65 65 20  e [struct::tree 
14e0: 3a 3a 63 76 73 3a 3a 52 54 5d 0a 20 20 20 20 24  ::cvs::RT].    $
14f0: 72 74 72 65 65 20 72 65 6e 61 6d 65 20 72 6f 6f  rtree rename roo
1500: 74 20 30 20 3b 20 23 20 52 6f 6f 74 20 69 73 20  t 0 ; # Root is 
1510: 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74 2c  first changeset,
1520: 20 61 6c 77 61 79 73 2e 0a 20 20 20 20 73 65 74   always..    set
1530: 20 74 72 75 6e 6b 20 30 0a 20 20 20 20 73 65 74   trunk 0.    set
1540: 20 6e 74 72 75 6e 6b 20 31 20 3b 20 23 20 52 6f   ntrunk 1 ; # Ro
1550: 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 74 72 75  ot is on the tru
1560: 6e 6b 2e 0a 20 20 20 20 73 65 74 20 62 20 20 20  nk..    set b   
1570: 20 20 20 30 20 3b 20 23 20 4e 6f 20 62 72 61 6e     0 ; # No bran
1580: 63 68 20 63 73 65 74 73 20 66 6f 75 6e 64 20 79  ch csets found y
1590: 65 74 2e 0a 0a 20 20 20 20 23 20 45 78 74 72 61  et...    # Extra
15a0: 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e 6b 20  cting the trunk 
15b0: 69 73 20 65 61 73 79 2c 20 73 69 6d 70 6c 79 20  is easy, simply 
15c0: 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68  by looking at th
15d0: 65 20 69 6e 76 6f 6c 76 65 64 0a 20 20 20 20 23  e involved.    #
15e0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73   version numbers
15f0: 2e 20 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20  . ..    foreach 
1600: 63 20 5b 6c 72 61 6e 67 65 20 5b 6c 73 6f 72 74  c [lrange [lsort
1610: 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79   -integer [array
1620: 20 6e 61 6d 65 73 20 63 73 65 74 73 5d 5d 20 31   names csets]] 1
1630: 20 65 6e 64 5d 20 7b 0a 09 66 6f 72 65 61 63 68   end] {..foreach
1640: 20 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 7d   {u cm s e rd f}
1650: 20 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61   $csets($c) brea
1660: 6b 0a 0a 09 23 20 49 67 6e 6f 72 65 20 62 72 61  k...# Ignore bra
1670: 6e 63 68 20 63 68 61 6e 67 65 73 2c 20 6a 75 73  nch changes, jus
1680: 74 20 63 6f 75 6e 74 20 74 68 65 6d 20 66 6f 72  t count them for
1690: 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73 2e   the statistics.
16a0: 0a 09 69 66 20 7b 24 72 64 20 21 3d 20 32 7d 20  ..if {$rd != 2} 
16b0: 7b 0a 09 20 20 20 20 69 6e 63 72 20 62 0a 09 20  {..    incr b.. 
16c0: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09 7d 0a 0a     continue..}..
16d0: 09 23 20 54 72 75 6e 6b 20 72 65 76 69 73 69 6f  .# Trunk revisio
16e0: 6e 2c 20 63 6f 6e 6e 65 63 74 20 74 6f 2c 20 61  n, connect to, a
16f0: 6e 64 20 75 70 64 61 74 65 20 74 68 65 20 68 65  nd update the he
1700: 61 64 2e 0a 09 24 72 74 72 65 65 20 69 6e 73 65  ad...$rtree inse
1710: 72 74 20 24 74 72 75 6e 6b 20 65 6e 64 20 24 63  rt $trunk end $c
1720: 0a 09 73 65 74 20 74 72 75 6e 6b 20 24 63 0a 09  ..set trunk $c..
1730: 69 6e 63 72 20 6e 74 72 75 6e 6b 0a 20 20 20 20  incr ntrunk.    
1740: 7d 0a 0a 20 20 20 20 4c 6f 67 20 69 6e 66 6f 20  }..    Log info 
1750: 22 50 72 6f 63 65 73 73 65 64 20 24 6e 74 72 75  "Processed $ntru
1760: 6e 6b 20 74 72 75 6e 6b 20 20 5b 65 78 70 72 20  nk trunk  [expr 
1770: 7b 28 24 6e 74 72 75 6e 6b 20 3d 3d 20 31 29 20  {($ntrunk == 1) 
1780: 3f 20 22 63 68 61 6e 67 65 73 65 74 22 20 3a 20  ? "changeset" : 
1790: 22 63 68 61 6e 67 65 73 65 74 73 22 7d 5d 22 0a  "changesets"}]".
17a0: 20 20 20 20 4c 6f 67 20 69 6e 66 6f 20 22 49 67      Log info "Ig
17b0: 6e 6f 72 65 64 20 20 20 24 62 20 62 72 61 6e 63  nored   $b branc
17c0: 68 20 5b 65 78 70 72 20 7b 28 24 62 20 3d 3d 20  h [expr {($b == 
17d0: 31 29 20 3f 20 22 63 68 61 6e 67 65 73 65 74 22  1) ? "changeset"
17e0: 20 3a 20 22 63 68 61 6e 67 65 73 65 74 73 22 7d   : "changesets"}
17f0: 5d 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a  ]".    return.}.
1800: 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
1810: 3a 3a 63 76 73 20 7b 0a 20 20 20 20 23 20 54 72  ::cvs {.    # Tr
1820: 65 65 20 68 6f 6c 64 69 6e 67 20 74 72 75 6e 6b  ee holding trunk
1830: 20 61 6e 64 20 62 72 61 6e 63 68 20 69 6e 66 6f   and branch info
1840: 72 6d 61 74 69 6f 6e 20 28 73 74 72 75 63 74 3a  rmation (struct:
1850: 3a 74 72 65 65 29 2e 0a 20 20 20 20 23 20 4e 6f  :tree)..    # No
1860: 64 65 20 6e 61 6d 65 73 20 61 72 65 20 63 73 65  de names are cse
1870: 74 20 69 64 27 73 2e 0a 0a 20 20 20 20 76 61 72  t id's...    var
1880: 69 61 62 6c 65 20 72 74 72 65 65 20 7b 7d 0a 20  iable rtree {}. 
1890: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 74 72 75     variable ntru
18a0: 6e 6b 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63  nk 0.}..proc ::c
18b0: 76 73 3a 3a 77 6f 72 6b 73 70 61 63 65 20 7b 7d  vs::workspace {}
18c0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
18d0: 63 77 64 20 5b 70 77 64 5d 0a 20 20 20 20 76 61  cwd [pwd].    va
18e0: 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65  riable workspace
18f0: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 6d 70   [fileutil::temp
1900: 66 69 6c 65 20 69 6d 70 6f 72 74 46 5f 63 76 73  file importF_cvs
1910: 5f 77 73 5f 5d 0a 20 20 20 20 66 69 6c 65 20 64  _ws_].    file d
1920: 65 6c 65 74 65 20 24 77 6f 72 6b 73 70 61 63 65  elete $workspace
1930: 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20  .    file mkdir 
1940: 20 24 77 6f 72 6b 73 70 61 63 65 0a 0a 20 20 20   $workspace..   
1950: 20 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 20 57   Log info "    W
1960: 6f 72 6b 73 70 61 63 65 3a 20 24 77 6f 72 6b 73  orkspace: $works
1970: 70 61 63 65 22 0a 0a 20 20 20 20 63 64 20 20 20  pace"..    cd   
1980: 20 20 24 77 6f 72 6b 73 70 61 63 65 20 3b 20 23    $workspace ; #
1990: 20 43 68 65 63 6b 6f 75 74 73 20 67 6f 20 68 65   Checkouts go he
19a0: 72 65 2e 0a 20 20 20 20 72 65 74 75 72 6e 20 24  re..    return $
19b0: 77 6f 72 6b 73 70 61 63 65 0a 7d 0a 0a 70 72 6f  workspace.}..pro
19c0: 63 20 3a 3a 63 76 73 3a 3a 77 73 69 67 6e 6f 72  c ::cvs::wsignor
19d0: 65 20 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 23  e {path} {.    #
19e0: 20 49 67 6e 6f 72 65 20 43 56 53 20 61 64 6d 69   Ignore CVS admi
19f0: 6e 20 66 69 6c 65 73 2e 0a 20 20 20 20 69 66 20  n files..    if 
1a00: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a  {[string match *
1a10: 2f 43 56 53 2f 2a 20 24 70 61 74 68 5d 7d 20 7b  /CVS/* $path]} {
1a20: 72 65 74 75 72 6e 20 31 7d 0a 20 20 20 20 72 65  return 1}.    re
1a30: 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a  turn 0.}..proc :
1a40: 3a 63 76 73 3a 3a 77 73 63 6c 65 61 72 20 7b 7d  :cvs::wsclear {}
1a50: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
1a60: 63 77 64 0a 20 20 20 20 76 61 72 69 61 62 6c 65  cwd.    variable
1a70: 20 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 63   workspace.    c
1a80: 64 20 24 63 77 64 0a 20 20 20 20 66 69 6c 65 20  d $cwd.    file 
1a90: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 77  delete -force $w
1aa0: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 72 65 74  orkspace.    ret
1ab0: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76  urn.}..proc ::cv
1ac0: 73 3a 3a 77 73 73 65 74 75 70 20 7b 63 7d 20 7b  s::wssetup {c} {
1ad0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 73  .    variable cs
1ae0: 65 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ets.    variable
1af0: 20 63 76 73 0a 20 20 20 20 76 61 72 69 61 62 6c   cvs.    variabl
1b00: 65 20 62 61 73 65 0a 0a 20 20 20 20 23 20 70 77  e base..    # pw
1b10: 64 20 3d 20 77 6f 72 6b 73 70 61 63 65 0a 0a 20  d = workspace.. 
1b20: 20 20 20 66 6f 72 65 61 63 68 20 7b 75 20 63 6d     foreach {u cm
1b30: 20 73 20 65 20 72 64 20 66 73 7d 20 24 63 73 65   s e rd fs} $cse
1b40: 74 73 28 24 63 29 20 62 72 65 61 6b 0a 0a 20 20  ts($c) break..  
1b50: 20 20 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 20    Log info "    
1b60: 20 20 20 20 40 20 20 24 73 22 0a 0a 20 20 20 20      @  $s"..    
1b70: 66 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c 69 74  foreach l [split
1b80: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 63   [string trim $c
1b90: 6d 5d 20 5c 6e 5d 20 7b 0a 09 4c 6f 67 20 69 6e  m] \n] {..Log in
1ba0: 66 6f 20 22 20 20 20 20 20 20 20 20 7c 20 20 24  fo "        |  $
1bb0: 6c 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f  l".    }..    fo
1bc0: 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 24 66 73  reach {f or} $fs
1bd0: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 6f 70 20   {..foreach {op 
1be0: 72 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 4c 6f  r} $or break..Lo
1bf0: 67 20 69 6e 66 6f 20 22 20 20 20 20 20 20 20 20  g info "        
1c00: 2d 2d 20 24 6f 70 20 24 66 20 24 72 22 0a 0a 09  -- $op $f $r"...
1c10: 69 66 20 7b 24 6f 70 20 65 71 20 22 52 22 7d 20  if {$op eq "R"} 
1c20: 7b 0a 09 20 20 20 20 23 20 52 65 6d 6f 76 65 20  {..    # Remove 
1c30: 66 69 6c 65 20 66 72 6f 6d 20 77 6f 72 6b 73 70  file from worksp
1c40: 61 63 65 2e 20 50 72 75 6e 65 20 65 6d 70 74 79  ace. Prune empty
1c50: 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0a 09 20   directories... 
1c60: 20 20 20 23 0a 09 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
1c70: 3a 20 41 20 64 65 61 64 2d 66 69 72 73 74 20 66  : A dead-first f
1c80: 69 6c 65 20 28 72 65 76 20 31 2e 31 20 64 65 61  ile (rev 1.1 dea
1c90: 64 29 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 61  d) will never ha
1ca0: 76 65 0a 09 20 20 20 20 23 20 65 78 69 73 74 65  ve..    # existe
1cb0: 64 2e 0a 09 20 20 20 20 23 0a 09 20 20 20 20 23  d...    #..    #
1cc0: 20 4e 4f 54 45 3a 20 4c 6f 67 69 63 61 6c 6c 79   NOTE: Logically
1cd0: 20 65 6d 70 74 79 20 64 69 72 65 63 74 6f 72 69   empty directori
1ce0: 65 73 20 73 74 69 6c 6c 20 70 68 79 73 69 63 61  es still physica
1cf0: 6c 6c 79 0a 09 20 20 20 20 23 20 63 6f 6e 74 61  lly..    # conta
1d00: 69 6e 20 74 68 65 20 43 56 53 20 61 64 6d 69 6e  in the CVS admin
1d10: 20 64 69 72 65 63 74 6f 72 79 2c 20 68 65 6e 63   directory, henc
1d20: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20  e the check for 
1d30: 3d 3d 0a 09 20 20 20 20 23 20 31 2c 20 6e 6f 74  ==..    # 1, not
1d40: 20 3d 3d 20 30 2e 20 54 68 65 72 65 20 6d 69 67   == 0. There mig
1d50: 68 74 20 61 6c 73 6f 20 62 65 20 68 69 64 64 65  ht also be hidde
1d60: 6e 20 66 69 6c 65 73 2c 20 77 65 20 63 6f 75 6e  n files, we coun
1d70: 74 0a 09 20 20 20 20 23 20 74 68 65 6d 20 61 73  t..    # them as
1d80: 20 77 65 6c 6c 2e 20 41 6c 77 61 79 73 20 68 69   well. Always hi
1d90: 64 64 65 6e 20 61 72 65 20 2e 20 61 6e 64 20 2e  dden are . and .
1da0: 2e 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f  . and they do no
1db0: 74 0a 09 20 20 20 20 23 20 63 6f 75 6e 74 20 61  t..    # count a
1dc0: 73 20 75 73 65 72 20 66 69 6c 65 2e 0a 0a 09 20  s user file.... 
1dd0: 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 24     file delete $
1de0: 66 0a 09 20 20 20 20 73 65 74 20 66 64 20 5b 66  f..    set fd [f
1df0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 5d 0a  ile dirname $f].
1e00: 09 20 20 20 20 69 66 20 7b 0a 09 09 28 5b 6c 6c  .    if {...([ll
1e10: 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e 6f 63  ength [glob -noc
1e20: 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 74 6f  omplain -directo
1e30: 72 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ry              
1e40: 24 66 64 20 2a 5d 5d 20 3d 3d 20 31 29 20 26 26  $fd *]] == 1) &&
1e50: 0a 09 09 28 5b 6c 6c 65 6e 67 74 68 20 5b 67 6c  ...([llength [gl
1e60: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d  ob -nocomplain -
1e70: 64 69 72 65 63 74 6f 72 79 20 2d 74 79 70 65 20  directory -type 
1e80: 68 69 64 64 65 6e 20 24 66 64 20 2a 5d 5d 20 3d  hidden $fd *]] =
1e90: 3d 20 32 29 0a 09 20 20 20 20 7d 20 7b 0a 09 09  = 2)..    } {...
1ea0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
1eb0: 63 65 20 24 66 64 0a 09 20 20 20 20 7d 0a 09 7d  ce $fd..    }..}
1ec0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 23 20 41   else {..    # A
1ed0: 64 64 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64  dded or modified
1ee0: 2c 20 70 75 74 20 74 68 65 20 72 65 71 75 65 73  , put the reques
1ef0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ted version of t
1f00: 68 65 20 66 69 6c 65 0a 09 20 20 20 20 23 20 69  he file..    # i
1f10: 6e 74 6f 20 74 68 65 20 77 6f 72 6b 73 70 61 63  nto the workspac
1f20: 65 2e 0a 0a 09 20 20 20 20 69 66 20 7b 5b 63 61  e....    if {[ca
1f30: 74 63 68 20 7b 0a 09 09 65 78 65 63 20 24 63 76  tch {...exec $cv
1f40: 73 20 2d 64 20 24 62 61 73 65 20 63 6f 20 2d 72  s -d $base co -r
1f50: 20 24 72 20 24 66 0a 09 20 20 20 20 7d 20 6d 73   $r $f..    } ms
1f60: 67 5d 7d 20 7b 0a 09 09 69 66 20 7b 5b 73 74 72  g]} {...if {[str
1f70: 69 6e 67 20 6d 61 74 63 68 20 7b 2a 69 6e 76 61  ing match {*inva
1f80: 6c 69 64 20 63 68 61 6e 67 65 20 74 65 78 74 2a  lid change text*
1f90: 7d 20 24 6d 73 67 5d 7d 20 7b 0a 09 09 20 20 20  } $msg]} {...   
1fa0: 20 23 20 54 68 65 20 61 72 63 68 69 76 65 20 6f   # The archive o
1fb0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f  f the file is co
1fc0: 72 72 75 70 74 65 64 20 61 6e 64 20 74 68 65 0a  rrupted and the.
1fd0: 09 09 20 20 20 20 23 20 63 68 6f 73 65 6e 20 76  ..    # chosen v
1fe0: 65 72 73 69 6f 6e 20 6e 6f 74 20 61 63 63 65 73  ersion not acces
1ff0: 73 69 62 6c 65 20 64 75 65 20 74 6f 20 74 68 61  sible due to tha
2000: 74 2e 20 57 65 0a 09 09 20 20 20 20 23 20 72 65  t. We...    # re
2010: 70 6f 72 74 20 74 68 65 20 70 72 6f 62 6c 65 6d  port the problem
2020: 2c 20 62 75 74 20 6f 74 68 65 72 77 69 73 65 20  , but otherwise 
2030: 69 67 6e 6f 72 65 20 69 74 2e 20 41 73 0a 09 09  ignore it. As...
2040: 20 20 20 20 23 20 61 20 63 6f 6e 73 65 71 75 65      # a conseque
2050: 6e 63 65 20 74 68 65 20 66 6f 73 73 69 6c 20 72  nce the fossil r
2060: 65 70 6f 73 69 74 6f 72 79 20 77 69 6c 6c 20 6e  epository will n
2070: 6f 74 0a 09 09 20 20 20 20 23 20 63 6f 6e 74 61  ot...    # conta
2080: 69 6e 20 74 68 65 20 66 75 6c 6c 20 68 69 73 74  in the full hist
2090: 6f 72 79 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  ory of the named
20a0: 20 66 69 6c 65 2e 20 42 79 0a 09 09 20 20 20 20   file. By...    
20b0: 23 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 70  # ignoring the p
20c0: 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77 65 76 65  roblem we howeve
20d0: 72 20 67 65 74 20 61 73 20 6d 75 63 68 20 61 73  r get as much as
20e0: 0a 09 09 20 20 20 20 23 20 69 73 20 70 6f 73 73  ...    # is poss
20f0: 69 62 6c 65 2e 0a 0a 09 09 20 20 20 20 4c 6f 67  ible.....    Log
2100: 20 69 6e 66 6f 20 22 20 20 20 20 20 20 20 20 45   info "        E
2110: 45 20 43 6f 72 72 75 70 74 65 64 20 61 72 63 68  E Corrupted arch
2120: 69 76 65 20 66 69 6c 65 2e 20 49 6e 61 63 63 65  ive file. Inacce
2130: 73 73 69 62 6c 65 20 72 65 76 69 73 69 6f 6e 2e  ssible revision.
2140: 22 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65  "...    continue
2150: 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20 2d 63  ...}...return -c
2160: 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67 0a 09  ode error $msg..
2170: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a      }..}.    }..
2180: 20 20 20 20 23 20 50 72 6f 76 69 64 65 20 6d 65      # Provide me
2190: 74 61 64 61 74 61 20 61 62 6f 75 74 20 74 68 65  tadata about the
21a0: 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 20 62   changeset the b
21b0: 61 63 6b 65 6e 64 20 6d 61 79 20 77 69 73 68 20  ackend may wish 
21c0: 74 6f 20 68 61 76 65 0a 20 20 20 20 72 65 74 75  to have.    retu
21d0: 72 6e 20 5b 6c 69 73 74 20 24 75 20 24 63 6d 20  rn [list $u $cm 
21e0: 24 73 5d 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65  $s].}..namespace
21f0: 20 65 76 61 6c 20 3a 3a 63 76 73 20 7b 0a 20 20   eval ::cvs {.  
2200: 20 20 23 20 43 56 53 20 61 70 70 6c 69 63 61 74    # CVS applicat
2210: 69 6f 6e 0a 20 20 20 20 23 20 57 6f 72 6b 73 70  ion.    # Worksp
2220: 61 63 65 20 77 68 65 72 65 20 63 68 65 63 6b 6f  ace where checko
2230: 75 74 73 20 68 61 70 70 65 6e 0a 20 20 20 20 23  uts happen.    #
2240: 20 43 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   Current working
2250: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 67 6f   directory to go
2260: 20 62 61 63 6b 20 74 6f 20 61 66 74 65 72 20 74   back to after t
2270: 68 65 20 69 6d 70 6f 72 74 2e 0a 0a 20 20 20 20  he import...    
2280: 76 61 72 69 61 62 6c 65 20 63 76 73 20 20 20 20  variable cvs    
2290: 20 20 20 5b 61 75 74 6f 5f 65 78 65 63 6f 6b 20     [auto_execok 
22a0: 63 76 73 5d 0a 20 20 20 20 76 61 72 69 61 62 6c  cvs].    variabl
22b0: 65 20 77 6f 72 6b 73 70 61 63 65 20 7b 7d 0a 20  e workspace {}. 
22c0: 20 20 20 76 61 72 69 61 62 6c 65 20 63 77 64 20     variable cwd 
22d0: 20 20 20 20 20 20 7b 7d 0a 7d 0a 0a 70 72 6f 63        {}.}..proc
22e0: 20 3a 3a 63 76 73 3a 3a 66 6f 72 65 61 63 68 5f   ::cvs::foreach_
22f0: 63 73 65 74 20 7b 63 76 20 6e 6f 64 65 20 73 63  cset {cv node sc
2300: 72 69 70 74 7d 20 7b 0a 20 20 20 20 75 70 76 61  ript} {.    upva
2310: 72 20 31 20 24 63 76 20 63 0a 20 20 20 20 76 61  r 1 $cv c.    va
2320: 72 69 61 62 6c 65 20 72 74 72 65 65 0a 0a 20 20  riable rtree..  
2330: 20 20 73 65 74 20 63 20 24 6e 6f 64 65 0a 20 20    set c $node.  
2340: 20 20 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 73    while {1} {..s
2350: 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b  et code [catch {
2360: 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70  uplevel 1 $scrip
2370: 74 7d 20 72 65 73 5d 0a 0a 09 23 20 30 20 2d 20  t} res]...# 0 - 
2380: 6f 6b 2c 20 31 20 2d 20 65 72 72 6f 72 2c 20 32  ok, 1 - error, 2
2390: 20 2d 20 72 65 74 75 72 6e 2c 20 33 20 2d 20 62   - return, 3 - b
23a0: 72 65 61 6b 2c 20 34 20 2d 20 63 6f 6e 74 69 6e  reak, 4 - contin
23b0: 75 65 0a 09 73 77 69 74 63 68 20 2d 2d 20 24 63  ue..switch -- $c
23c0: 6f 64 65 20 7b 0a 09 20 20 20 20 30 20 7b 7d 0a  ode {..    0 {}.
23d0: 09 20 20 20 20 31 20 7b 20 72 65 74 75 72 6e 20  .    1 { return 
23e0: 2d 65 72 72 6f 72 63 6f 64 65 20 24 3a 3a 65 72  -errorcode $::er
23f0: 72 6f 72 63 6f 64 65 20 2d 63 6f 64 65 20 65 72  rorcode -code er
2400: 72 6f 72 20 24 72 65 73 20 7d 0a 09 20 20 20 20  ror $res }..    
2410: 32 20 7b 7d 0a 09 20 20 20 20 33 20 7b 20 72 65  2 {}..    3 { re
2420: 74 75 72 6e 20 7d 0a 09 20 20 20 20 34 20 7b 7d  turn }..    4 {}
2430: 0a 09 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a  ..    default {.
2440: 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 24  ..return -code $
2450: 63 6f 64 65 20 24 72 65 73 75 6c 74 0a 09 20 20  code $result..  
2460: 20 20 7d 0a 09 7d 0a 0a 09 23 20 53 74 6f 70 20    }..}...# Stop 
2470: 6f 6e 20 72 65 61 63 68 69 6e 67 20 74 68 65 20  on reaching the 
2480: 68 65 61 64 2e 0a 09 69 66 20 7b 21 5b 6c 6c 65  head...if {![lle
2490: 6e 67 74 68 20 5b 24 72 74 72 65 65 20 63 68 69  ngth [$rtree chi
24a0: 6c 64 72 65 6e 20 24 63 5d 5d 7d 20 62 72 65 61  ldren $c]]} brea
24b0: 6b 0a 0a 09 23 70 75 74 73 20 3c 5b 24 72 74 72  k...#puts <[$rtr
24c0: 65 65 20 63 68 69 6c 64 72 65 6e 20 24 63 5d 3e  ee children $c]>
24d0: 0a 0a 09 23 20 47 6f 20 74 6f 20 6e 65 78 74 20  ...# Go to next 
24e0: 63 68 69 6c 64 20 69 6e 20 74 72 75 6e 6b 20 28  child in trunk (
24f0: 6c 65 66 74 6d 6f 73 74 29 2e 0a 09 73 65 74 20  leftmost)...set 
2500: 63 20 5b 6c 69 6e 64 65 78 20 5b 24 72 74 72 65  c [lindex [$rtre
2510: 65 20 63 68 69 6c 64 72 65 6e 20 24 63 5d 20 30  e children $c] 0
2520: 5d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ].    }.    retu
2530: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73  rn.}..proc ::cvs
2540: 3a 3a 72 6f 6f 74 20 7b 7d 20 7b 0a 20 20 20 20  ::root {} {.    
2550: 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63  return 0.}..proc
2560: 20 3a 3a 63 76 73 3a 3a 6e 74 72 75 6e 6b 20 7b   ::cvs::ntrunk {
2570: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65  } {.    variable
2580: 20 6e 74 72 75 6e 6b 0a 20 20 20 20 72 65 74 75   ntrunk.    retu
2590: 72 6e 20 20 24 6e 74 72 75 6e 6b 0a 7d 0a 0a 70  rn  $ntrunk.}..p
25a0: 72 6f 63 20 3a 3a 63 76 73 3a 3a 75 75 69 64 20  roc ::cvs::uuid 
25b0: 7b 63 20 75 75 69 64 7d 20 7b 0a 20 20 20 20 76  {c uuid} {.    v
25c0: 61 72 69 61 62 6c 65 20 72 74 72 65 65 0a 20 20  ariable rtree.  
25d0: 20 20 24 72 74 72 65 65 20 73 65 74 20 24 63 20    $rtree set $c 
25e0: 75 75 69 64 20 24 75 75 69 64 0a 20 20 20 20 72  uuid $uuid.    r
25f0: 65 74 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d  eturn.}..# -----
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 65 72  --------.# Inter
2650: 6e 61 6c 20 68 65 6c 70 65 72 20 63 6f 6d 6d 61  nal helper comma
2660: 6e 64 73 3a 20 43 68 61 6e 67 65 73 65 74 20 69  nds: Changeset i
2670: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 20 63 6f  nspection and co
2680: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 0a 70 72 6f  nstruction...pro
2690: 63 20 3a 3a 63 76 73 3a 3a 43 53 43 6c 65 61 72  c ::cvs::CSClear
26a0: 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20   {} {.    upvar 
26b0: 31 20 73 74 61 72 74 20 73 74 61 72 74 20 65 6e  1 start start en
26c0: 64 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72  d end cm cm user
26d0: 20 75 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65   user files file
26e0: 73 20 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20  s lastd lastd.. 
26f0: 20 20 20 73 65 74 20 73 74 61 72 74 20 7b 7d 0a     set start {}.
2700: 20 20 20 20 73 65 74 20 65 6e 64 20 20 20 7b 7d      set end   {}
2710: 0a 20 20 20 20 73 65 74 20 63 6d 20 20 20 20 7b  .    set cm    {
2720: 7d 0a 20 20 20 20 73 65 74 20 75 73 65 72 20 20  }.    set user  
2730: 7b 7d 0a 20 20 20 20 73 65 74 20 6c 61 73 74 64  {}.    set lastd
2740: 20 7b 7d 0a 20 20 20 20 61 72 72 61 79 20 75 6e   {}.    array un
2750: 73 65 74 20 66 69 6c 65 73 20 2a 0a 20 20 20 20  set files *.    
2760: 61 72 72 61 79 20 73 65 74 20 66 69 6c 65 73 20  array set files 
2770: 7b 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a  {}.    return.}.
2780: 0a 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 43 53 4e  .proc ::cvs::CSN
2790: 6f 6e 65 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76  one {} {.    upv
27a0: 61 72 20 31 20 73 74 61 72 74 20 73 74 61 72 74  ar 1 start start
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70  .    return [exp
27c0: 72 20 7b 24 73 74 61 72 74 20 65 71 20 22 22 7d  r {$start eq ""}
27d0: 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a  ].}..proc ::cvs:
27e0: 3a 43 53 4e 65 77 20 7b 65 6e 74 72 79 7d 20 7b  :CSNew {entry} {
27f0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61  .    upvar 1 sta
2800: 72 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64  rt start end end
2810: 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72   cm cm user user
2820: 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73   files files las
2830: 74 64 20 6c 61 73 74 64 20 72 65 61 73 6f 6e 20  td lastd reason 
2840: 72 65 61 73 6f 6e 0a 0a 20 20 20 20 23 70 75 74  reason..    #put
2850: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64  s -nonewline std
2860: 6f 75 74 20 2e 20 3b 20 66 6c 75 73 68 20 73 74  out . ; flush st
2870: 64 6f 75 74 0a 0a 20 20 20 20 66 6f 72 65 61 63  dout..    foreac
2880: 68 20 7b 6f 70 20 74 73 20 61 20 72 65 76 20 66  h {op ts a rev f
2890: 20 65 63 6d 7d 20 24 65 6e 74 72 79 20 62 72 65   ecm} $entry bre
28a0: 61 6b 0a 0a 20 20 20 20 23 20 55 73 65 72 20 63  ak..    # User c
28b0: 68 61 6e 67 65 0a 20 20 20 20 69 66 20 7b 24 61  hange.    if {$a
28c0: 20 6e 65 20 24 75 73 65 72 7d 20 7b 73 65 74 20   ne $user} {set 
28d0: 72 65 61 73 6f 6e 20 75 73 65 72 20 3b 20 72 65  reason user ; re
28e0: 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 46  turn 1}..    # F
28f0: 69 6c 65 20 61 6c 72 65 61 64 79 20 69 6e 20 63  ile already in c
2900: 75 72 72 65 6e 74 20 63 73 65 74 0a 20 20 20 20  urrent cset.    
2910: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
2920: 20 66 69 6c 65 73 28 24 66 29 5d 7d 20 7b 73 65   files($f)]} {se
2930: 74 20 72 65 61 73 6f 6e 20 66 69 6c 65 20 3b 20  t reason file ; 
2940: 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23  return 1}..    #
2950: 20 43 75 72 72 65 6e 74 20 63 73 65 74 20 74 72   Current cset tr
2960: 75 6e 6b 2f 62 72 61 6e 63 68 20 64 69 66 66 65  unk/branch diffe
2970: 72 65 6e 74 20 66 72 6f 6d 20 65 6e 74 72 79 2e  rent from entry.
2980: 0a 20 20 20 20 73 65 74 20 64 65 70 74 68 20 5b  .    set depth [
2990: 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24  llength [split $
29a0: 72 65 76 20 2e 5d 5d 0a 20 20 20 20 69 66 20 7b  rev .]].    if {
29b0: 28 24 6c 61 73 74 64 20 3d 3d 20 32 29 20 21 3d  ($lastd == 2) !=
29c0: 20 28 24 64 65 70 74 68 20 3d 3d 20 32 29 7d 20   ($depth == 2)} 
29d0: 7b 73 65 74 20 72 65 61 73 6f 6e 20 64 65 70 74  {set reason dept
29e0: 68 2f 24 6c 61 73 74 64 2f 24 64 65 70 74 68 2f  h/$lastd/$depth/
29f0: 28 24 72 65 76 29 2f 24 66 20 3b 20 72 65 74 75  ($rev)/$f ; retu
2a00: 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 6f 6d  rn 1}..    # Com
2a10: 6d 69 74 20 6d 65 73 73 61 67 65 20 63 68 61 6e  mit message chan
2a20: 67 65 64 0a 20 20 20 20 69 66 20 7b 24 63 6d 20  ged.    if {$cm 
2a30: 6e 65 20 24 65 63 6d 7d 20 7b 73 65 74 20 72 65  ne $ecm} {set re
2a40: 61 73 6f 6e 20 63 6d 73 67 5c 20 3c 3c 24 65 63  ason cmsg\ <<$ec
2a50: 6d 3e 3e 20 3b 20 72 65 74 75 72 6e 20 31 7d 0a  m>> ; return 1}.
2a60: 0a 20 20 20 20 23 20 45 76 65 72 79 74 68 69 6e  .    # Everythin
2a70: 67 20 69 73 20 67 6f 6f 64 2c 20 73 74 69 6c 6c  g is good, still
2a80: 20 74 68 65 20 73 61 6d 65 20 63 73 65 74 0a 20   the same cset. 
2a90: 20 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70     return 0.}..p
2aa0: 72 6f 63 20 3a 3a 63 76 73 3a 3a 43 53 53 61 76  roc ::cvs::CSSav
2ab0: 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  e {} {.    varia
2ac0: 62 6c 65 20 63 6d 61 70 0a 20 20 20 20 76 61 72  ble cmap.    var
2ad0: 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 20  iable csets.    
2ae0: 76 61 72 69 61 62 6c 65 20 6e 63 73 0a 20 20 20  variable ncs.   
2af0: 20 75 70 76 61 72 20 31 20 73 74 61 72 74 20 73   upvar 1 start s
2b00: 74 61 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20  tart end end cm 
2b10: 63 6d 20 75 73 65 72 20 75 73 65 72 20 66 69 6c  cm user user fil
2b20: 65 73 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c  es files lastd l
2b30: 61 73 74 64 0a 0a 20 20 20 20 73 65 74 20 63 73  astd..    set cs
2b40: 65 74 73 28 24 6e 63 73 29 20 5b 6c 69 73 74 20  ets($ncs) [list 
2b50: 24 75 73 65 72 20 24 63 6d 20 24 73 74 61 72 74  $user $cm $start
2b60: 20 24 65 6e 64 20 24 6c 61 73 74 64 20 5b 61 72   $end $lastd [ar
2b70: 72 61 79 20 67 65 74 20 66 69 6c 65 73 5d 5d 0a  ray get files]].
2b80: 0a 20 20 20 20 23 20 52 65 63 6f 72 64 20 77 68  .    # Record wh
2b90: 69 63 68 20 72 65 76 69 73 69 6f 6e 73 20 6f 66  ich revisions of
2ba0: 20 61 20 66 69 6c 65 20 61 72 65 20 69 6e 20 77   a file are in w
2bb0: 68 61 74 20 63 73 65 74 73 0a 20 20 20 20 66 6f  hat csets.    fo
2bc0: 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 5b 61 72  reach {f or} [ar
2bd0: 72 61 79 20 67 65 74 20 66 69 6c 65 73 5d 20 7b  ray get files] {
2be0: 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 72 65 76  ..foreach {_ rev
2bf0: 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 73 65 74  } $or break..set
2c00: 20 63 6d 61 70 28 5b 6c 69 73 74 20 24 66 20 24   cmap([list $f $
2c10: 72 65 76 5d 29 20 24 6e 63 73 0a 20 20 20 20 7d  rev]) $ncs.    }
2c20: 0a 0a 20 20 20 20 23 43 53 44 75 6d 70 20 24 6e  ..    #CSDump $n
2c30: 63 73 0a 0a 20 20 20 20 69 6e 63 72 20 6e 63 73  cs..    incr ncs
2c40: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  .    return.}..p
2c50: 72 6f 63 20 3a 3a 63 76 73 3a 3a 43 53 41 64 64  roc ::cvs::CSAdd
2c60: 20 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 20 20 75   {entry} {.    u
2c70: 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74 61  pvar 1 start sta
2c80: 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d  rt end end cm cm
2c90: 20 75 73 65 72 20 75 73 65 72 20 66 69 6c 65 73   user user files
2ca0: 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c 61 73   files lastd las
2cb0: 74 64 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20  td..    foreach 
2cc0: 7b 6f 70 20 74 73 20 61 20 72 65 76 20 66 20 65  {op ts a rev f e
2cd0: 63 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 61 6b  cm} $entry break
2ce0: 0a 0a 20 20 20 20 69 66 20 7b 24 73 74 61 72 74  ..    if {$start
2cf0: 20 65 71 20 22 22 7d 20 7b 73 65 74 20 73 74 61   eq ""} {set sta
2d00: 72 74 20 24 74 73 7d 0a 20 20 20 20 73 65 74 20  rt $ts}.    set 
2d10: 65 6e 64 20 20 20 20 20 20 20 24 74 73 0a 20 20  end       $ts.  
2d20: 20 20 73 65 74 20 63 6d 20 20 20 20 20 20 20 20    set cm        
2d30: 24 65 63 6d 0a 20 20 20 20 73 65 74 20 75 73 65  $ecm.    set use
2d40: 72 20 20 20 20 20 20 24 61 0a 20 20 20 20 73 65  r      $a.    se
2d50: 74 20 66 69 6c 65 73 28 24 66 29 20 5b 6c 69 73  t files($f) [lis
2d60: 74 20 24 6f 70 20 24 72 65 76 5d 0a 20 20 20 20  t $op $rev].    
2d70: 73 65 74 20 6c 61 73 74 64 20 20 20 20 20 5b 6c  set lastd     [l
2d80: 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72  length [split $r
2d90: 65 76 20 2e 5d 5d 0a 20 20 20 20 72 65 74 75 72  ev .]].    retur
2da0: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a  n.}..proc ::cvs:
2db0: 3a 43 53 44 75 6d 70 20 7b 63 7d 20 7b 0a 20 20  :CSDump {c} {.  
2dc0: 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 73    variable csets
2dd0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 75 20  .    foreach {u 
2de0: 63 6d 20 73 20 65 20 72 64 20 66 7d 20 24 63 73  cm s e rd f} $cs
2df0: 65 74 73 28 24 63 29 20 62 72 65 61 6b 0a 0a 20  ets($c) break.. 
2e00: 20 20 20 70 75 74 73 20 22 24 75 20 24 73 22 3b     puts "$u $s";
2e10: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 2e 7d   regsub -all {.}
2e20: 20 24 75 20 7b 20 7d 20 62 0a 20 20 20 20 70 75   $u { } b.    pu
2e30: 74 73 20 22 24 62 20 24 65 22 0a 20 20 20 20 66  ts "$b $e".    f
2e40: 6f 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 24 66  oreach {f or} $f
2e50: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 6f 20 72   {..foreach {o r
2e60: 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 70 75 74  } $or break..put
2e70: 73 20 22 24 62 20 24 6f 20 24 66 20 24 72 22 0a  s "$b $o $f $r".
2e80: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2e90: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..# ----------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 0a 23 20 49 6e 74 65 72 6e 61 6c 20 68  ---.# Internal h
2ef0: 65 6c 70 65 72 20 63 6f 6d 6d 61 6e 64 73 0a 0a  elper commands..
2f00: 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 4c 6f 67 20  proc ::cvs::Log 
2f10: 7b 6c 65 76 65 6c 20 74 65 78 74 7d 20 7b 0a 20  {level text} {. 
2f20: 20 20 20 76 61 72 69 61 62 6c 65 20 6c 63 0a 20     variable lc. 
2f30: 20 20 20 75 70 6c 65 76 65 6c 20 23 30 20 5b 6c     uplevel #0 [l
2f40: 69 6e 73 65 72 74 20 24 6c 63 20 65 6e 64 20 24  insert $lc end $
2f50: 6c 65 76 65 6c 20 24 74 65 78 74 5d 0a 20 20 20  level $text].   
2f60: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20   return.}..proc 
2f70: 3a 3a 63 76 73 3a 3a 4e 6f 70 20 7b 61 72 67 73  ::cvs::Nop {args
2f80: 7d 20 7b 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20  } {}..namespace 
2f90: 65 76 61 6c 20 3a 3a 63 76 73 20 7b 0a 20 20 20  eval ::cvs {.   
2fa0: 20 23 20 4c 6f 67 67 69 6e 67 20 63 61 6c 6c 62   # Logging callb
2fb0: 61 63 6b 2e 20 4e 6f 20 6c 6f 67 67 69 6e 67 20  ack. No logging 
2fc0: 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20  by default..    
2fd0: 76 61 72 69 61 62 6c 65 20 6c 63 20 3a 3a 63 76  variable lc ::cv
2fe0: 73 3a 3a 4e 6f 70 0a 7d 0a 0a 23 20 2d 2d 2d 2d  s::Nop.}..# ----
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64  ---------.# Read
3040: 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69  y..package provi
3050: 64 65 20 63 76 73 20 31 2e 30 0a 72 65 74 75 72  de cvs 1.0.retur
3060: 6e 0a                                            n.