Hex Artifact Content
Not logged in

Artifact 6cf3effa0a442578d78d6cf4f22c1ee154b66e39:


0000: 5c 20 6e 65 74 32 6f 20 64 69 73 74 72 69 62 75  \ net2o distribu
0010: 74 65 64 20 76 65 72 73 69 6f 6e 20 63 6f 6e 74  ted version cont
0020: 72 6f 6c 20 73 79 73 74 65 6d 0a 0a 5c 20 43 6f  rol system..\ Co
0030: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 31 36  pyright (C) 2016
0040: 2d 32 30 31 39 20 20 20 42 65 72 6e 64 20 50 61  -2019   Bernd Pa
0050: 79 73 61 6e 0a 0a 5c 20 54 68 69 73 20 70 72 6f  ysan..\ This pro
0060: 67 72 61 6d 20 69 73 20 66 72 65 65 20 73 6f 66  gram is free sof
0070: 74 77 61 72 65 3a 20 79 6f 75 20 63 61 6e 20 72  tware: you can r
0080: 65 64 69 73 74 72 69 62 75 74 65 20 69 74 20 61  edistribute it a
0090: 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 5c 20 69  nd/or modify.\ i
00a0: 74 20 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d  t under the term
00b0: 73 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66  s of the GNU Aff
00c0: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ero General Publ
00d0: 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75  ic License as pu
00e0: 62 6c 69 73 68 65 64 20 62 79 0a 5c 20 74 68 65  blished by.\ the
00f0: 20 46 72 65 65 20 53 6f 66 74 77 61 72 65 20 46   Free Software F
0100: 6f 75 6e 64 61 74 69 6f 6e 2c 20 65 69 74 68 65  oundation, eithe
0110: 72 20 76 65 72 73 69 6f 6e 20 33 20 6f 66 20 74  r version 3 of t
0120: 68 65 20 4c 69 63 65 6e 73 65 2c 20 6f 72 0a 5c  he License, or.\
0130: 20 28 61 74 20 79 6f 75 72 20 6f 70 74 69 6f 6e   (at your option
0140: 29 20 61 6e 79 20 6c 61 74 65 72 20 76 65 72 73  ) any later vers
0150: 69 6f 6e 2e 0a 0a 5c 20 54 68 69 73 20 70 72 6f  ion...\ This pro
0160: 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62 75  gram is distribu
0170: 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20  ted in the hope 
0180: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
0190: 75 73 65 66 75 6c 2c 0a 5c 20 62 75 74 20 57 49  useful,.\ but WI
01a0: 54 48 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e  THOUT ANY WARRAN
01b0: 54 59 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e  TY; without even
01c0: 20 74 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72   the implied war
01d0: 72 61 6e 74 79 20 6f 66 0a 5c 20 4d 45 52 43 48  ranty of.\ MERCH
01e0: 41 4e 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49  ANTABILITY or FI
01f0: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54  TNESS FOR A PART
0200: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20  ICULAR PURPOSE. 
0210: 20 53 65 65 20 74 68 65 0a 5c 20 47 4e 55 20 41   See the.\ GNU A
0220: 66 66 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75  ffero General Pu
0230: 62 6c 69 63 20 4c 69 63 65 6e 73 65 20 66 6f 72  blic License for
0240: 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 0a   more details...
0250: 5c 20 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76  \ You should hav
0260: 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f 70  e received a cop
0270: 79 20 6f 66 20 74 68 65 20 47 4e 55 20 41 66 66  y of the GNU Aff
0280: 65 72 6f 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  ero General Publ
0290: 69 63 20 4c 69 63 65 6e 73 65 0a 5c 20 61 6c 6f  ic License.\ alo
02a0: 6e 67 20 77 69 74 68 20 74 68 69 73 20 70 72 6f  ng with this pro
02b0: 67 72 61 6d 2e 20 20 49 66 20 6e 6f 74 2c 20 73  gram.  If not, s
02c0: 65 65 20 3c 68 74 74 70 3a 2f 2f 77 77 77 2e 67  ee <http://www.g
02d0: 6e 75 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f  nu.org/licenses/
02e0: 3e 2e 0a 0a 56 61 72 69 61 62 6c 65 20 64 76 63  >...Variable dvc
02f0: 73 2d 6f 62 6a 65 63 74 73 20 5c 20 68 61 73 68  s-objects \ hash
0300: 20 6f 66 20 6f 62 6a 65 63 74 73 0a 0a 56 61 72   of objects..Var
0310: 69 61 62 6c 65 20 64 76 63 73 2d 74 61 62 6c 65  iable dvcs-table
0320: 0a 0a 76 6f 63 61 62 75 6c 61 72 79 20 70 72 6f  ..vocabulary pro
0330: 6a 65 63 74 0a 0a 63 6d 64 2d 63 6c 61 73 73 20  ject..cmd-class 
0340: 63 6c 61 73 73 0a 20 20 20 20 73 63 6f 70 65 3a  class.    scope:
0350: 20 64 76 63 73 0a 20 20 20 20 66 69 65 6c 64 3a   dvcs.    field:
0360: 20 69 6e 2d 66 69 6c 65 73 24 0a 20 20 20 20 66   in-files$.    f
0370: 69 65 6c 64 3a 20 70 61 74 63 68 24 0a 20 20 20  ield: patch$.   
0380: 20 66 69 65 6c 64 3a 20 6f 75 74 2d 66 69 6c 65   field: out-file
0390: 73 24 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 72  s$..    method r
03a0: 65 61 64 0a 20 20 20 20 6d 65 74 68 6f 64 20 72  ead.    method r
03b0: 6d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 6d 64  m.    method rmd
03c0: 69 72 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 61  ir.    method pa
03d0: 74 63 68 0a 20 20 20 20 6d 65 74 68 6f 64 20 77  tch.    method w
03e0: 72 69 74 65 0a 20 20 20 20 6d 65 74 68 6f 64 20  rite.    method 
03f0: 75 6e 7a 69 70 0a 20 20 20 20 6d 65 74 68 6f 64  unzip.    method
0400: 20 72 65 66 0a 20 20 20 20 0a 20 20 20 20 7d 73   ref.    .    }s
0410: 63 6f 70 65 0a 65 6e 64 2d 63 6c 61 73 73 20 64  cope.end-class d
0420: 76 63 73 2d 61 62 73 74 72 61 63 74 0a 0a 64 76  vcs-abstract..dv
0430: 63 73 2d 61 62 73 74 72 61 63 74 20 63 6c 61 73  cs-abstract clas
0440: 73 0a 20 20 20 20 73 63 6f 70 65 7b 20 64 76 63  s.    scope{ dvc
0450: 73 0a 20 20 20 20 66 69 65 6c 64 3a 20 72 65 66  s.    field: ref
0460: 73 5b 5d 0a 20 20 20 20 7d 73 63 6f 70 65 0a 65  s[].    }scope.e
0470: 6e 64 2d 63 6c 61 73 73 20 64 76 63 73 2d 72 65  nd-class dvcs-re
0480: 66 73 0a 0a 64 76 63 73 2d 61 62 73 74 72 61 63  fs..dvcs-abstrac
0490: 74 20 63 6c 61 73 73 0a 20 20 20 20 73 63 6f 70  t class.    scop
04a0: 65 7b 20 64 76 63 73 0a 20 20 20 20 66 69 65 6c  e{ dvcs.    fiel
04b0: 64 3a 20 63 6f 6d 6d 69 74 73 20 20 20 20 5c 20  d: commits    \ 
04c0: 6d 73 67 20 63 6c 61 73 73 20 66 6f 72 20 63 6f  msg class for co
04d0: 6d 6d 69 74 73 0a 20 20 20 20 66 69 65 6c 64 3a  mmits.    field:
04e0: 20 73 65 61 72 63 68 73 20 20 20 20 5c 20 6d 73   searchs    \ ms
04f0: 67 20 63 6c 61 73 73 20 66 6f 72 20 73 65 61 72  g class for sear
0500: 63 68 73 0a 20 20 20 20 66 69 65 6c 64 3a 20 69  chs.    field: i
0510: 64 24 20 20 20 20 20 20 20 20 5c 20 63 6f 6d 6d  d$        \ comm
0520: 69 74 20 69 64 0a 20 20 20 20 66 69 65 6c 64 3a  it id.    field:
0530: 20 62 72 61 6e 63 68 24 0a 20 20 20 20 66 69 65   branch$.    fie
0540: 6c 64 3a 20 6d 65 73 73 61 67 65 24 20 20 20 5c  ld: message$   \
0550: 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 0a   commit message.
0560: 20 20 20 20 66 69 65 6c 64 3a 20 66 69 6c 65 72      field: filer
0570: 65 66 5b 5d 20 20 5c 20 66 69 6c 65 20 72 65 66  ef[]  \ file ref
0580: 73 0a 20 20 20 20 66 69 65 6c 64 3a 20 66 69 6c  s.    field: fil
0590: 65 73 23 20 20 20 20 20 5c 20 73 6e 61 70 73 68  es#     \ snapsh
05a0: 6f 74 20 63 6f 6e 66 69 67 0a 20 20 20 20 66 69  ot config.    fi
05b0: 65 6c 64 3a 20 6f 6c 64 66 69 6c 65 73 23 20 20  eld: oldfiles#  
05c0: 5c 20 6f 6c 64 20 73 74 61 74 65 20 74 6f 20 63  \ old state to c
05d0: 6f 6d 70 61 72 65 20 74 6f 0a 20 20 20 20 66 69  ompare to.    fi
05e0: 65 6c 64 3a 20 6f 75 74 2d 66 69 6c 65 6f 66 66  eld: out-fileoff
05f0: 0a 20 20 20 20 66 69 65 6c 64 3a 20 66 69 6c 65  .    field: file
0600: 65 6e 74 72 79 24 0a 20 20 20 20 66 69 65 6c 64  entry$.    field
0610: 3a 20 6f 6c 64 69 64 24 0a 20 20 20 20 66 69 65  : oldid$.    fie
0620: 6c 64 3a 20 68 61 73 68 24 0a 20 20 20 20 66 69  ld: hash$.    fi
0630: 65 6c 64 3a 20 74 79 70 65 0a 20 20 20 20 66 69  eld: type.    fi
0640: 65 6c 64 3a 20 72 6d 64 69 72 73 5b 5d 20 20 20  eld: rmdirs[]   
0650: 5c 20 73 6f 72 74 65 64 20 61 72 72 61 79 20 6f  \ sorted array o
0660: 66 20 64 69 72 73 20 74 6f 20 62 65 20 64 65 6c  f dirs to be del
0670: 65 74 65 0a 20 20 20 20 66 69 65 6c 64 3a 20 6f  ete.    field: o
0680: 75 74 66 69 6c 65 73 5b 5d 20 5c 20 73 6f 72 74  utfiles[] \ sort
0690: 65 64 20 61 72 72 61 79 20 6f 66 20 66 69 6c 65  ed array of file
06a0: 73 20 74 6f 20 77 72 69 74 65 20 6f 75 74 0a 0a  s to write out..
06b0: 20 20 20 20 7d 73 63 6f 70 65 0a 20 20 20 20 0a      }scope.    .
06c0: 20 20 20 20 73 63 6f 70 65 7b 20 70 72 6f 6a 65      scope{ proje
06d0: 63 74 20 5c 20 70 65 72 2d 70 72 6f 6a 65 63 74  ct \ per-project
06e0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 76   configuration v
06f0: 61 6c 75 65 73 0a 0a 20 20 20 20 66 69 65 6c 64  alues..    field
0700: 3a 20 63 68 61 69 6e 24 0a 20 20 20 20 66 69 65  : chain$.    fie
0710: 6c 64 3a 20 72 65 76 69 73 69 6f 6e 24 0a 20 20  ld: revision$.  
0720: 20 20 66 69 65 6c 64 3a 20 62 72 61 6e 63 68 24    field: branch$
0730: 0a 20 20 20 20 66 69 65 6c 64 3a 20 70 72 6f 6a  .    field: proj
0740: 65 63 74 24 0a 0a 20 20 20 20 7d 73 63 6f 70 65  ect$..    }scope
0750: 0a 0a 65 6e 64 2d 63 6c 61 73 73 20 64 76 63 73  ..end-class dvcs
0760: 2d 63 6c 61 73 73 0a 0a 73 63 6f 70 65 7b 20 64  -class..scope{ d
0770: 76 63 73 0a 0a 62 65 67 69 6e 2d 73 74 72 75 63  vcs..begin-struc
0780: 74 75 72 65 20 66 69 6c 65 68 61 73 68 0a 20 20  ture filehash.  
0790: 20 20 36 34 66 69 65 6c 64 3a 20 74 69 6d 65 73    64field: times
07a0: 74 61 6d 70 0a 20 20 20 20 77 66 69 65 6c 64 3a  tamp.    wfield:
07b0: 20 70 65 72 6d 0a 20 20 20 20 30 20 2b 66 69 65   perm.    0 +fie
07c0: 6c 64 20 6e 61 6d 65 0a 65 6e 64 2d 73 74 72 75  ld name.end-stru
07d0: 63 74 75 72 65 0a 0a 7d 73 63 6f 70 65 0a 0a 6d  cture..}scope..m
07e0: 73 67 2d 63 6c 61 73 73 20 63 6c 61 73 73 0a 20  sg-class class. 
07f0: 20 20 20 66 69 65 6c 64 3a 20 69 64 3e 70 61 74     field: id>pat
0800: 63 68 23 20 20 5c 20 63 6f 6e 76 65 72 74 20 61  ch#  \ convert a
0810: 6e 20 49 44 20 74 6f 20 61 20 70 61 74 63 68 2b  n ID to a patch+
0820: 72 65 66 65 72 65 6e 63 65 20 6c 69 73 74 0a 20  reference list. 
0830: 20 20 20 66 69 65 6c 64 3a 20 69 64 3e 73 6e 61     field: id>sna
0840: 70 23 20 20 20 5c 20 63 6f 6e 76 65 72 74 20 61  p#   \ convert a
0850: 6e 20 49 44 20 74 6f 20 61 20 73 6e 61 70 73 68  n ID to a snapsh
0860: 6f 74 20 28 73 74 61 72 74 69 6e 67 20 70 6f 69  ot (starting poi
0870: 6e 74 29 0a 20 20 20 20 66 69 65 6c 64 3a 20 69  nt).    field: i
0880: 64 24 0a 20 20 20 20 66 69 65 6c 64 3a 20 72 65  d$.    field: re
0890: 24 0a 20 20 20 20 66 69 65 6c 64 3a 20 6f 62 6a  $.    field: obj
08a0: 65 63 74 24 0a 65 6e 64 2d 63 6c 61 73 73 20 63  ect$.end-class c
08b0: 6f 6d 6d 69 74 2d 63 6c 61 73 73 0a 0a 6d 73 67  ommit-class..msg
08c0: 2d 63 6c 61 73 73 20 63 6c 61 73 73 0a 20 20 20  -class class.   
08d0: 20 73 63 6f 70 65 3a 20 6d 61 74 63 68 0a 20 20   scope: match.  
08e0: 20 20 66 69 65 6c 64 3a 20 74 61 67 24 0a 20 20    field: tag$.  
08f0: 20 20 66 69 65 6c 64 3a 20 66 6c 61 67 0a 20 20    field: flag.  
0900: 20 20 66 69 65 6c 64 3a 20 69 64 24 0a 20 20 20    field: id$.   
0910: 20 7d 73 63 6f 70 65 0a 65 6e 64 2d 63 6c 61 73   }scope.end-clas
0920: 73 20 73 65 61 72 63 68 2d 63 6c 61 73 73 0a 0a  s search-class..
0930: 6d 73 67 2d 63 6c 61 73 73 20 63 6c 61 73 73 0a  msg-class class.
0940: 20 20 20 20 73 63 6f 70 65 3a 20 64 76 63 73 2d      scope: dvcs-
0950: 6c 6f 67 0a 20 20 20 20 66 69 65 6c 64 3a 20 73  log.    field: s
0960: 69 67 24 0a 20 20 20 20 66 69 65 6c 64 3a 20 74  ig$.    field: t
0970: 61 67 24 0a 20 20 20 20 66 69 65 6c 64 3a 20 69  ag$.    field: i
0980: 64 24 0a 20 20 20 20 66 69 65 6c 64 3a 20 61 63  d$.    field: ac
0990: 74 69 6f 6e 24 0a 20 20 20 20 66 69 65 6c 64 3a  tion$.    field:
09a0: 20 74 65 78 74 24 0a 20 20 20 20 66 69 65 6c 64   text$.    field
09b0: 3a 20 63 68 61 69 6e 24 0a 20 20 20 20 66 69 65  : chain$.    fie
09c0: 6c 64 3a 20 75 72 6c 73 5b 5d 0a 20 20 20 20 7d  ld: urls[].    }
09d0: 73 63 6f 70 65 0a 65 6e 64 2d 63 6c 61 73 73 20  scope.end-class 
09e0: 64 76 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 0a 0a  dvcs-log-class..
09f0: 3a 20 2f 6e 61 6d 65 20 28 20 61 64 64 72 20 75  : /name ( addr u
0a00: 20 2d 2d 20 61 64 64 72 27 20 75 27 20 29 0a 20   -- addr' u' ). 
0a10: 20 20 20 5b 20 68 61 73 68 23 31 32 38 20 64 76     [ hash#128 dv
0a20: 63 73 3a 6e 61 6d 65 20 5d 4c 20 2f 73 74 72 69  cs:name ]L /stri
0a30: 6e 67 20 3b 0a 3a 20 66 6e 2d 73 70 6c 69 74 20  ng ;.: fn-split 
0a40: 28 20 68 61 73 68 2b 74 73 2b 70 65 72 6d 2b 66  ( hash+ts+perm+f
0a50: 6e 20 75 20 2d 2d 20 68 61 73 68 2b 74 73 2b 70  n u -- hash+ts+p
0a60: 65 72 6d 20 75 31 20 66 6e 61 6d 65 20 75 32 20  erm u1 fname u2 
0a70: 29 0a 20 20 20 20 5b 20 68 61 73 68 23 31 32 38  ).    [ hash#128
0a80: 20 64 76 63 73 3a 6e 61 6d 65 20 5d 4c 20 3e 72   dvcs:name ]L >r
0a90: 20 32 64 75 70 20 72 40 20 75 6d 69 6e 20 32 73   2dup r@ umin 2s
0aa0: 77 61 70 20 72 3e 20 2f 73 74 72 69 6e 67 20 3b  wap r> /string ;
0ab0: 0a 0a 3a 20 2e 6d 6f 64 65 20 28 20 75 20 2d 2d  ..: .mode ( u --
0ac0: 20 29 0a 20 20 20 20 64 75 70 20 53 5f 49 46 4d   ).    dup S_IFM
0ad0: 54 20 61 6e 64 20 31 32 20 72 73 68 69 66 74 20  T and 12 rshift 
0ae0: 22 30 70 63 33 64 35 62 37 66 72 6c 42 73 44 45  "0pc3d5b7frlBsDE
0af0: 46 22 20 64 72 6f 70 20 2b 20 63 40 20 65 6d 69  F" drop + c@ emi
0b00: 74 20 73 70 61 63 65 0a 20 20 20 20 53 5f 49 46  t space.    S_IF
0b10: 4d 54 20 69 6e 76 65 72 74 20 61 6e 64 20 5b 27  MT invert and ['
0b20: 5d 20 2e 20 38 20 62 61 73 65 2d 65 78 65 63 75  ] . 8 base-execu
0b30: 74 65 20 3b 0a 0a 3a 20 2e 66 69 6c 65 2b 68 61  te ;..: .file+ha
0b40: 73 68 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29  sh ( addr u -- )
0b50: 0a 20 20 20 20 6f 76 65 72 20 68 61 73 68 23 31  .    over hash#1
0b60: 32 38 20 38 35 74 79 70 65 20 73 70 61 63 65 20  28 85type space 
0b70: 20 68 61 73 68 23 31 32 38 20 2f 73 74 72 69 6e   hash#128 /strin
0b80: 67 0a 20 20 20 20 6f 76 65 72 20 64 76 63 73 3a  g.    over dvcs:
0b90: 74 69 6d 65 73 74 61 6d 70 20 6c 65 2d 36 34 40  timestamp le-64@
0ba0: 20 2e 74 69 63 6b 73 20 73 70 61 63 65 0a 20 20   .ticks space.  
0bb0: 20 20 6f 76 65 72 20 64 76 63 73 3a 70 65 72 6d    over dvcs:perm
0bc0: 20 6c 65 2d 75 77 40 20 2e 6d 6f 64 65 0a 20 20   le-uw@ .mode.  
0bd0: 20 20 30 20 64 76 63 73 3a 6e 61 6d 65 20 2f 73    0 dvcs:name /s
0be0: 74 72 69 6e 67 20 74 79 70 65 20 63 72 20 3b 0a  tring type cr ;.
0bf0: 0a 3a 20 2b 66 69 6c 65 65 6e 74 72 79 20 28 20  .: +fileentry ( 
0c00: 61 64 64 72 20 75 20 6f 3a 64 76 63 73 20 2d 2d  addr u o:dvcs --
0c10: 20 29 0a 20 20 20 20 5c 47 20 61 64 64 20 61 20   ).    \G add a 
0c20: 66 69 6c 65 20 65 6e 74 72 79 20 61 6e 64 20 72  file entry and r
0c30: 65 70 6c 61 63 65 20 73 61 6d 65 20 66 69 6c 65  eplace same file
0c40: 20 69 66 20 69 74 20 61 6c 72 65 61 64 79 20 65   if it already e
0c50: 78 69 73 74 73 0a 20 20 20 20 64 76 63 73 28 20  xists.    dvcs( 
0c60: 2e 22 20 2b 66 3a 20 22 20 32 64 75 70 20 2e 66  ." +f: " 2dup .f
0c70: 69 6c 65 2b 68 61 73 68 20 29 20 66 6e 2d 73 70  ile+hash ) fn-sp
0c80: 6c 69 74 20 64 76 63 73 3a 66 69 6c 65 73 23 20  lit dvcs:files# 
0c90: 23 21 20 3b 0a 3a 20 2d 66 69 6c 65 65 6e 74 72  #! ;.: -fileentr
0ca0: 79 20 28 20 61 64 64 72 20 75 20 6f 3a 64 76 63  y ( addr u o:dvc
0cb0: 73 20 2d 2d 20 29 0a 20 20 20 20 64 76 63 73 28  s -- ).    dvcs(
0cc0: 20 2e 22 20 2d 66 3a 20 22 20 32 64 75 70 20 2e   ." -f: " 2dup .
0cd0: 66 69 6c 65 2b 68 61 73 68 20 29 20 2f 6e 61 6d  file+hash ) /nam
0ce0: 65 20 64 76 63 73 3a 66 69 6c 65 73 23 20 23 66  e dvcs:files# #f
0cf0: 72 65 65 20 3b 0a 0a 3a 20 63 72 65 61 74 65 2d  ree ;..: create-
0d00: 73 79 6d 6c 69 6e 6b 2d 66 20 28 20 61 64 64 72  symlink-f ( addr
0d10: 64 65 73 74 20 75 64 65 73 74 20 61 64 64 72 6c  dest udest addrl
0d20: 69 6e 6b 20 75 6c 69 6e 6b 20 70 65 72 6d 20 2d  ink ulink perm -
0d30: 2d 20 29 20 7b 20 70 65 72 6d 20 7d 0a 20 20 20  - ) { perm }.   
0d40: 20 5c 47 20 63 72 65 61 74 65 20 73 79 6d 6c 69   \G create symli
0d50: 6e 6b 20 61 6e 64 20 6f 76 65 72 77 72 69 74 65  nk and overwrite
0d60: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 0a 20   existing file. 
0d70: 20 20 20 32 6f 76 65 72 20 32 6f 76 65 72 20 73     2over 2over s
0d80: 79 6d 6c 69 6e 6b 20 64 75 70 20 2d 31 20 3d 20  ymlink dup -1 = 
0d90: 49 46 0a 09 65 72 72 6e 6f 20 45 45 58 49 53 54  IF..errno EEXIST
0da0: 20 3d 20 49 46 20 20 64 72 6f 70 0a 09 20 20 20   = IF  drop..   
0db0: 20 32 64 75 70 20 64 65 6c 65 74 65 2d 66 69 6c   2dup delete-fil
0dc0: 65 20 74 68 72 6f 77 20 32 6f 76 65 72 20 32 6f  e throw 2over 2o
0dd0: 76 65 72 20 73 79 6d 6c 69 6e 6b 0a 09 54 48 45  ver symlink..THE
0de0: 4e 0a 20 20 20 20 54 48 45 4e 20 20 3f 69 6f 72  N.    THEN  ?ior
0df0: 20 32 64 72 6f 70 20 32 64 72 6f 70 20 3b 0a 0a   2drop 2drop ;..
0e00: 3a 20 63 72 65 61 74 65 2d 66 69 6c 65 2d 66 20  : create-file-f 
0e10: 28 20 61 64 64 72 20 75 20 61 64 64 72 66 69 6c  ( addr u addrfil
0e20: 65 20 75 66 69 6c 65 20 70 65 72 6d 20 2d 2d 20  e ufile perm -- 
0e30: 29 20 7b 20 70 65 72 6d 20 7d 0a 20 20 20 20 72  ) { perm }.    r
0e40: 2f 77 20 63 72 65 61 74 65 2d 66 69 6c 65 20 74  /w create-file t
0e50: 68 72 6f 77 20 3e 72 0a 20 20 20 20 64 76 63 73  hrow >r.    dvcs
0e60: 28 20 2e 22 20 77 72 69 74 65 20 22 20 64 75 70  ( ." write " dup
0e70: 20 2e 20 2e 22 20 62 79 74 65 73 22 20 63 72 20   . ." bytes" cr 
0e80: 29 0a 20 20 20 20 72 40 20 77 72 69 74 65 2d 66  ).    r@ write-f
0e90: 69 6c 65 20 74 68 72 6f 77 0a 20 20 20 20 72 40  ile throw.    r@
0ea0: 20 66 69 6c 65 6e 6f 20 70 65 72 6d 20 66 63 68   fileno perm fch
0eb0: 6d 6f 64 20 3f 69 6f 72 0a 20 20 20 20 72 3e 20  mod ?ior.    r> 
0ec0: 63 6c 6f 73 65 2d 66 69 6c 65 20 74 68 72 6f 77  close-file throw
0ed0: 20 3b 0a 0a 3a 20 63 72 65 61 74 65 2d 64 69 72   ;..: create-dir
0ee0: 2d 66 20 28 20 61 64 64 72 20 30 20 61 64 64 72  -f ( addr 0 addr
0ef0: 64 69 72 20 75 64 69 72 20 70 65 72 6d 20 2d 2d  dir udir perm --
0f00: 20 29 20 7b 20 70 65 72 6d 20 7d 0a 20 20 20 20   ) { perm }.    
0f10: 32 64 75 70 20 64 65 6c 65 74 65 2d 66 69 6c 65  2dup delete-file
0f20: 20 64 72 6f 70 20 5c 20 74 72 79 20 64 65 6c 65   drop \ try dele
0f30: 74 69 6e 67 20 69 74 20 61 73 20 66 69 6c 65 0a  ting it as file.
0f40: 20 20 20 20 32 64 75 70 20 70 65 72 6d 20 6d 6b      2dup perm mk
0f50: 64 69 72 2d 70 61 72 65 6e 74 73 0a 20 20 20 20  dir-parents.    
0f60: 64 75 70 20 66 69 6c 65 2d 65 78 69 73 74 23 20  dup file-exist# 
0f70: 3d 20 49 46 20 20 64 72 6f 70 20 20 45 4c 53 45  = IF  drop  ELSE
0f80: 20 20 74 68 72 6f 77 20 20 54 48 45 4e 0a 20 20    throw  THEN.  
0f90: 20 20 70 65 72 6d 20 63 68 6d 6f 64 20 3f 69 6f    perm chmod ?io
0fa0: 72 0a 20 20 20 20 32 64 72 6f 70 20 3b 0a 0a 53  r.    2drop ;..S
0fb0: 5f 49 46 4d 54 20 24 31 30 30 30 20 69 6e 76 65  _IFMT $1000 inve
0fc0: 72 74 20 61 6e 64 20 43 6f 6e 73 74 61 6e 74 20  rt and Constant 
0fd0: 53 5f 49 46 4d 54 3f 0a 0a 3a 20 64 76 63 73 2d  S_IFMT?..: dvcs-
0fe0: 6f 75 74 66 69 6c 65 2d 6e 61 6d 65 20 28 20 68  outfile-name ( h
0ff0: 61 73 68 2b 70 65 72 6d 2d 61 64 64 72 20 75 31  ash+perm-addr u1
1000: 20 66 6e 61 6d 65 20 75 32 20 2d 2d 20 29 0a 20   fname u2 -- ). 
1010: 20 20 20 32 3e 72 20 32 64 75 70 20 6b 65 79 7c     2>r 2dup key|
1020: 20 64 76 63 73 2d 6f 62 6a 65 63 74 73 20 23 40   dvcs-objects #@
1030: 20 32 73 77 61 70 20 68 61 73 68 23 31 32 38 20   2swap hash#128 
1040: 2f 73 74 72 69 6e 67 0a 20 20 20 20 64 72 6f 70  /string.    drop
1050: 20 64 76 63 73 3a 70 65 72 6d 20 6c 65 2d 75 77   dvcs:perm le-uw
1060: 40 20 7b 20 70 65 72 6d 20 7d 20 32 72 3e 0a 20  @ { perm } 2r>. 
1070: 20 20 20 70 65 72 6d 20 53 5f 49 46 4d 54 3f 20     perm S_IFMT? 
1080: 61 6e 64 20 20 63 61 73 65 0a 09 53 5f 49 46 4c  and  case..S_IFL
1090: 4e 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  NK              
10a0: 6f 66 20 20 70 65 72 6d 20 63 72 65 61 74 65 2d  of  perm create-
10b0: 73 79 6d 6c 69 6e 6b 2d 66 20 20 65 6e 64 6f 66  symlink-f  endof
10c0: 0a 09 53 5f 49 46 52 45 47 20 20 20 20 20 20 20  ..S_IFREG       
10d0: 20 20 20 20 20 20 20 6f 66 20 20 70 65 72 6d 20         of  perm 
10e0: 63 72 65 61 74 65 2d 66 69 6c 65 2d 66 20 20 20  create-file-f   
10f0: 20 20 65 6e 64 6f 66 0a 09 53 5f 49 46 44 49 52    endof..S_IFDIR
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66                of
1110: 20 20 70 65 72 6d 20 63 72 65 61 74 65 2d 64 69    perm create-di
1120: 72 2d 66 20 20 20 20 20 20 65 6e 64 6f 66 20 20  r-f      endof  
1130: 5c 20 6e 6f 20 63 6f 6e 74 65 6e 74 20 69 6e 20  \ no content in 
1140: 64 69 72 65 63 74 6f 72 79 0a 09 64 76 63 73 28  directory..dvcs(
1150: 20 2e 22 20 75 6e 68 61 6e 64 6c 65 64 20 74 79   ." unhandled ty
1160: 70 65 20 22 20 68 65 78 2e 20 74 79 70 65 20 73  pe " hex. type s
1170: 70 61 63 65 20 68 65 78 2e 20 64 72 6f 70 20 63  pace hex. drop c
1180: 72 20 30 20 29 65 6c 73 65 28 0a 09 32 64 72 6f  r 0 )else(..2dro
1190: 70 20 32 64 72 6f 70 20 29 20 5c 20 75 6e 68 61  p 2drop ) \ unha
11a0: 6e 64 6c 65 64 20 74 79 70 65 73 0a 20 20 20 20  ndled types.    
11b0: 65 6e 64 63 61 73 65 20 3b 0a 0a 5c 20 65 6e 63  endcase ;..\ enc
11c0: 72 79 70 74 65 64 20 68 61 73 68 20 73 74 75 66  rypted hash stuf
11d0: 66 2c 20 75 73 69 6e 67 20 73 69 67 6e 61 74 75  f, using signatu
11e0: 72 65 20 73 65 63 72 65 74 20 61 73 20 50 53 4b  re secret as PSK
11f0: 0a 0a 5c 20 70 72 6f 62 61 62 6c 79 20 6e 65 65  ..\ probably nee
1200: 64 73 20 70 61 64 64 69 6e 67 2e 2e 2e 0a 0a 3a  ds padding.....:
1210: 20 77 72 69 74 65 2d 65 6e 63 2d 68 61 73 68 65   write-enc-hashe
1220: 64 20 28 20 61 64 64 72 31 20 75 31 20 2d 2d 20  d ( addr1 u1 -- 
1230: 61 64 64 72 68 61 73 68 38 35 20 75 32 20 29 0a  addrhash85 u2 ).
1240: 20 20 20 20 24 6d 61 6b 65 20 7b 20 77 5e 20 65      $make { w^ e
1250: 6e 63 2d 70 61 64 24 20 7d 20 65 6e 63 2d 70 61  nc-pad$ } enc-pa
1260: 64 24 20 24 40 0a 20 20 20 20 6b 65 79 65 64 2d  d$ $@.    keyed-
1270: 68 61 73 68 2d 6f 75 74 20 68 61 73 68 23 31 32  hash-out hash#12
1280: 38 20 5b 27 5d 20 38 35 74 79 70 65 20 24 74 6d  8 ['] 85type $tm
1290: 70 20 32 3e 72 0a 20 20 20 20 65 6e 63 68 61 73  p 2>r.    enchas
12a0: 68 20 20 32 3e 72 0a 20 20 20 20 32 64 75 70 20  h  2>r.    2dup 
12b0: 63 3a 65 6e 63 72 79 70 74 0a 20 20 20 20 3f 2e  c:encrypt.    ?.
12c0: 6e 65 74 32 6f 2f 6f 62 6a 65 63 74 73 20 20 32  net2o/objects  2
12d0: 72 3e 20 68 61 73 68 3e 66 69 6c 65 6e 61 6d 65  r> hash>filename
12e0: 20 20 73 70 69 74 2d 66 69 6c 65 0a 20 20 20 20    spit-file.    
12f0: 65 6e 63 2d 70 61 64 24 20 24 66 72 65 65 20 32  enc-pad$ $free 2
1300: 72 3e 20 3b 0a 0a 3a 20 65 6e 63 68 61 73 68 3e  r> ;..: enchash>
1310: 66 69 6c 65 6e 61 6d 65 20 28 20 68 61 73 68 31  filename ( hash1
1320: 20 75 31 20 2d 2d 20 66 69 6c 65 6e 61 6d 65 20   u1 -- filename 
1330: 75 32 20 29 0a 20 20 20 20 6b 65 79 65 64 2d 68  u2 ).    keyed-h
1340: 61 73 68 2d 6f 75 74 20 68 61 73 68 23 31 32 38  ash-out hash#128
1350: 20 73 6d 6f 76 65 0a 20 20 20 20 65 6e 63 68 61   smove.    encha
1360: 73 68 20 68 61 73 68 3e 66 69 6c 65 6e 61 6d 65  sh hash>filename
1370: 20 3b 0a 0a 56 61 72 69 61 62 6c 65 20 70 61 74   ;..Variable pat
1380: 63 68 2d 69 6e 24 0a 0a 3a 20 72 65 61 64 2d 65  ch-in$..: read-e
1390: 6e 63 2d 68 61 73 68 65 64 20 28 20 68 61 73 68  nc-hashed ( hash
13a0: 31 20 75 31 20 2d 2d 20 29 0a 20 20 20 20 5c 20  1 u1 -- ).    \ 
13b0: 32 64 75 70 20 38 35 74 79 70 65 20 73 70 61 63  2dup 85type spac
13c0: 65 0a 20 20 20 20 32 64 75 70 20 65 6e 63 68 61  e.    2dup encha
13d0: 73 68 3e 66 69 6c 65 6e 61 6d 65 20 70 61 74 63  sh>filename patc
13e0: 68 2d 69 6e 24 20 24 73 6c 75 72 70 2d 66 69 6c  h-in$ $slurp-fil
13f0: 65 0a 20 20 20 20 70 61 74 63 68 2d 69 6e 24 20  e.    patch-in$ 
1400: 24 40 20 63 3a 64 65 63 72 79 70 74 0a 20 20 20  $@ c:decrypt.   
1410: 20 70 61 74 63 68 2d 69 6e 24 20 24 40 20 3e 66   patch-in$ $@ >f
1420: 69 6c 65 2d 68 61 73 68 20 5c 20 32 64 75 70 20  ile-hash \ 2dup 
1430: 38 35 74 79 70 65 20 63 72 0a 20 20 20 20 73 74  85type cr.    st
1440: 72 3d 20 30 3d 20 21 21 77 72 6f 6e 67 2d 68 61  r= 0= !!wrong-ha
1450: 73 68 21 21 20 3b 0a 0a 3a 20 3f 72 65 61 64 2d  sh!! ;..: ?read-
1460: 65 6e 63 2d 68 61 73 68 65 64 20 28 20 68 61 73  enc-hashed ( has
1470: 68 31 20 75 31 20 2d 2d 20 61 64 64 72 20 75 20  h1 u1 -- addr u 
1480: 29 0a 20 20 20 20 32 64 75 70 20 64 76 63 73 2d  ).    2dup dvcs-
1490: 6f 62 6a 65 63 74 73 20 23 40 20 32 64 75 70 20  objects #@ 2dup 
14a0: 64 30 3d 20 49 46 0a 09 32 64 72 6f 70 20 32 64  d0= IF..2drop 2d
14b0: 75 70 20 72 65 61 64 2d 65 6e 63 2d 68 61 73 68  up read-enc-hash
14c0: 65 64 0a 09 70 61 74 63 68 2d 69 6e 24 20 24 40  ed..patch-in$ $@
14d0: 20 32 73 77 61 70 20 64 76 63 73 2d 6f 62 6a 65   2swap dvcs-obje
14e0: 63 74 73 20 23 21 0a 20 20 20 20 45 4c 53 45 0a  cts #!.    ELSE.
14f0: 09 32 64 72 6f 70 20 32 64 72 6f 70 0a 20 20 20  .2drop 2drop.   
1500: 20 54 48 45 4e 20 20 6c 61 73 74 23 20 63 65 6c   THEN  last# cel
1510: 6c 2b 20 24 40 20 3b 0a 0a 5c 20 69 6e 2d 6d 65  l+ $@ ;..\ in-me
1520: 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 68 2b 63  mory file hash+c
1530: 6f 6e 74 65 6e 74 73 20 64 61 74 61 62 61 73 65  ontents database
1540: 0a 0a 3a 20 64 76 63 73 2d 6f 75 74 66 69 6c 65  ..: dvcs-outfile
1550: 2d 68 61 73 68 20 28 20 62 61 64 64 72 20 75 31  -hash ( baddr u1
1560: 20 66 68 61 73 68 20 75 32 20 2d 2d 20 29 0a 20   fhash u2 -- ). 
1570: 20 20 20 68 61 73 68 23 31 32 38 20 75 6d 69 6e     hash#128 umin
1580: 20 64 76 63 73 2d 6f 62 6a 65 63 74 73 20 23 21   dvcs-objects #!
1590: 20 3b 0a 0a 3a 20 3f 66 69 6c 65 65 6e 74 72 79   ;..: ?fileentry
15a0: 2d 68 61 73 68 20 28 20 2d 2d 20 29 0a 20 20 20  -hash ( -- ).   
15b0: 20 64 76 63 73 3a 66 69 6c 65 65 6e 74 72 79 24   dvcs:fileentry$
15c0: 20 24 40 20 68 61 73 68 23 31 32 38 20 75 6d 69   $@ hash#128 umi
15d0: 6e 0a 20 20 20 20 32 64 75 70 20 64 76 63 73 2d  n.    2dup dvcs-
15e0: 6f 62 6a 65 63 74 73 20 23 40 20 64 30 3c 3e 20  objects #@ d0<> 
15f0: 49 46 20 20 32 64 72 6f 70 20 20 45 58 49 54 20  IF  2drop  EXIT 
1600: 20 54 48 45 4e 0a 20 20 20 20 72 65 61 64 2d 65   THEN.    read-e
1610: 6e 63 2d 68 61 73 68 65 64 0a 20 20 20 20 70 61  nc-hashed.    pa
1620: 74 63 68 2d 69 6e 24 20 24 40 20 64 76 63 73 3a  tch-in$ $@ dvcs:
1630: 66 69 6c 65 65 6e 74 72 79 24 20 24 40 20 64 76  fileentry$ $@ dv
1640: 63 73 2d 6f 75 74 66 69 6c 65 2d 68 61 73 68 20  cs-outfile-hash 
1650: 3b 0a 0a 3a 20 64 76 63 73 2d 69 6e 2d 68 61 73  ;..: dvcs-in-has
1660: 68 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  h ( addr u -- ).
1670: 20 20 20 20 64 76 63 73 28 20 2e 22 20 2b 72 65      dvcs( ." +re
1680: 61 64 3a 20 22 20 32 64 75 70 20 38 35 74 79 70  ad: " 2dup 85typ
1690: 65 20 63 72 20 29 0a 20 20 20 20 64 76 63 73 2d  e cr ).    dvcs-
16a0: 6f 62 6a 65 63 74 73 20 23 40 20 6f 76 65 72 20  objects #@ over 
16b0: 30 3d 20 21 21 64 76 63 73 2d 68 61 73 68 21 21  0= !!dvcs-hash!!
16c0: 0a 20 20 20 20 64 76 63 73 3a 69 6e 2d 66 69 6c  .    dvcs:in-fil
16d0: 65 73 24 20 24 2b 21 20 3b 0a 0a 3a 20 66 69 6c  es$ $+! ;..: fil
16e0: 65 6c 69 73 74 2d 70 72 69 6e 74 20 28 20 66 69  elist-print ( fi
16f0: 6c 65 6c 69 73 74 20 2d 2d 20 29 0a 20 20 20 20  lelist -- ).    
1700: 5b 3a 20 3e 72 20 72 40 20 63 65 6c 6c 2b 20 24  [: >r r@ cell+ $
1710: 40 20 38 35 74 79 70 65 20 73 70 61 63 65 20 72  @ 85type space r
1720: 3e 20 24 40 20 74 79 70 65 20 63 72 20 3b 5d 20  > $@ type cr ;] 
1730: 23 6d 61 70 20 3b 0a 3a 20 66 69 6c 65 6c 69 73  #map ;.: filelis
1740: 74 2d 6f 75 74 20 28 20 6f 3a 64 76 63 73 20 2d  t-out ( o:dvcs -
1750: 2d 20 29 0a 20 20 20 20 22 2e 6e 32 6f 2f 66 69  - ).    ".n2o/fi
1760: 6c 65 73 22 20 5b 3a 20 3e 72 20 64 76 63 73 3a  les" [: >r dvcs:
1770: 66 69 6c 65 73 23 20 5b 27 5d 20 66 69 6c 65 6c  files# ['] filel
1780: 69 73 74 2d 70 72 69 6e 74 20 72 3e 20 6f 75 74  ist-print r> out
1790: 66 69 6c 65 2d 65 78 65 63 75 74 65 20 3b 5d 0a  file-execute ;].
17a0: 20 20 20 20 6e 65 77 2d 66 69 6c 65 20 3b 0a 0a      new-file ;..
17b0: 3a 20 66 69 6c 65 6c 69 73 74 2d 6c 6f 6f 70 20  : filelist-loop 
17c0: 28 20 2d 2d 20 29 0a 20 20 20 20 42 45 47 49 4e  ( -- ).    BEGIN
17d0: 20 20 72 65 66 69 6c 6c 20 20 57 48 49 4c 45 0a    refill  WHILE.
17e0: 09 20 20 20 20 73 6f 75 72 63 65 20 62 6c 20 24  .    source bl $
17f0: 73 70 6c 69 74 20 32 3e 72 20 62 61 73 65 38 35  split 2>r base85
1800: 3e 24 20 32 72 3e 20 64 76 63 73 3a 66 69 6c 65  >$ 2r> dvcs:file
1810: 73 23 20 23 21 0a 20 20 20 20 52 45 50 45 41 54  s# #!.    REPEAT
1820: 20 3b 0a 3a 20 66 69 6c 65 6c 69 73 74 2d 69 6e   ;.: filelist-in
1830: 20 28 20 61 64 64 72 20 75 20 6f 3a 64 76 63 73   ( addr u o:dvcs
1840: 20 2d 2d 20 29 0a 20 20 20 20 72 2f 6f 20 6f 70   -- ).    r/o op
1850: 65 6e 2d 66 69 6c 65 20 74 68 72 6f 77 20 5b 27  en-file throw ['
1860: 5d 20 66 69 6c 65 6c 69 73 74 2d 6c 6f 6f 70 20  ] filelist-loop 
1870: 65 78 65 63 75 74 65 2d 70 61 72 73 69 6e 67 2d  execute-parsing-
1880: 66 69 6c 65 20 3b 0a 0a 73 63 6f 70 65 7b 20 6e  file ;..scope{ n
1890: 65 74 32 6f 2d 62 61 73 65 0a 0a 5c 67 20 0a 5c  et2o-base..\g .\
18a0: 67 20 23 23 23 20 44 56 43 53 20 70 61 74 63 68  g ### DVCS patch
18b0: 20 63 6f 6d 6d 61 6e 64 73 20 23 23 23 0a 5c 67   commands ###.\g
18c0: 20 0a 5c 67 20 44 56 43 53 20 6d 65 74 61 64 61   .\g DVCS metada
18d0: 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ta is stored in 
18e0: 6d 65 73 73 61 67 65 73 2c 20 63 6f 6e 74 61 69  messages, contai
18f0: 6e 69 6e 67 20 6d 65 73 73 61 67 65 20 74 65 78  ning message tex
1900: 74 2c 20 72 65 66 73 0a 5c 67 20 61 6e 64 20 70  t, refs.\g and p
1910: 61 74 63 68 73 65 74 20 6f 62 6a 65 63 74 73 2e  atchset objects.
1920: 20 50 61 74 63 68 73 65 74 20 6f 62 6a 65 63 74   Patchset object
1930: 73 20 61 72 65 20 63 6f 6e 73 74 72 75 63 74 65  s are constructe
1940: 64 20 69 6e 20 61 20 77 61 79 0a 5c 67 20 74 68  d in a way.\g th
1950: 61 74 20 6d 61 6b 65 73 20 69 64 65 6e 74 69 63  at makes identic
1960: 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  al transactions 
1970: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 68 61  have the same ha
1980: 73 68 2e 0a 5c 67 20 0a 0a 72 65 70 6c 79 2d 74  sh..\g ..reply-t
1990: 61 62 6c 65 20 24 40 20 69 6e 68 65 72 69 74 2d  able $@ inherit-
19a0: 74 61 62 6c 65 20 64 76 63 73 2d 74 61 62 6c 65  table dvcs-table
19b0: 0a 0a 6e 65 74 32 6f 27 20 65 6d 69 74 20 6e 65  ..net2o' emit ne
19c0: 74 32 6f 3a 20 64 76 63 73 2d 72 65 61 64 20 28  t2o: dvcs-read (
19d0: 20 24 3a 68 61 73 68 20 2d 2d 20 29 20 5c 67 20   $:hash -- ) \g 
19e0: 72 65 61 64 20 69 6e 20 61 6e 20 6f 62 6a 65 63  read in an objec
19f0: 74 0a 20 20 20 20 31 20 21 21 3e 3d 6f 72 64 65  t.    1 !!>=orde
1a00: 72 3f 20 24 3e 20 64 76 63 73 3a 72 65 61 64 20  r? $> dvcs:read 
1a10: 3b 0a 2b 6e 65 74 32 6f 3a 20 64 76 63 73 2d 72  ;.+net2o: dvcs-r
1a20: 6d 20 28 20 24 3a 68 61 73 68 2b 6e 61 6d 65 20  m ( $:hash+name 
1a30: 2d 2d 20 29 20 5c 67 20 64 65 6c 65 74 65 20 66  -- ) \g delete f
1a40: 69 6c 65 0a 20 20 20 20 32 20 21 21 3e 3d 6f 72  ile.    2 !!>=or
1a50: 64 65 72 3f 20 24 3e 20 64 76 63 73 3a 72 6d 20  der? $> dvcs:rm 
1a60: 3b 0a 2b 6e 65 74 32 6f 3a 20 64 76 63 73 2d 72  ;.+net2o: dvcs-r
1a70: 6d 64 69 72 20 28 20 24 3a 6e 61 6d 65 20 2d 2d  mdir ( $:name --
1a80: 20 29 20 5c 67 20 64 65 6c 65 74 65 20 64 69 72   ) \g delete dir
1a90: 65 63 74 6f 72 79 0a 20 20 20 20 34 20 21 21 3e  ectory.    4 !!>
1aa0: 3d 6f 72 64 65 72 3f 20 24 3e 20 64 76 63 73 3a  =order? $> dvcs:
1ab0: 72 6d 64 69 72 20 3b 0a 2b 6e 65 74 32 6f 3a 20  rmdir ;.+net2o: 
1ac0: 64 76 63 73 2d 70 61 74 63 68 20 28 20 24 3a 64  dvcs-patch ( $:d
1ad0: 69 66 66 20 6c 65 6e 20 2d 2d 20 29 20 5c 67 20  iff len -- ) \g 
1ae0: 61 70 70 6c 79 20 70 61 74 63 68 2c 20 6c 65 6e  apply patch, len
1af0: 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
1b00: 74 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 38  the result.    8
1b10: 20 21 21 3e 6f 72 64 65 72 3f 20 24 3e 20 64 76   !!>order? $> dv
1b20: 63 73 3a 70 61 74 63 68 20 3b 0a 2b 6e 65 74 32  cs:patch ;.+net2
1b30: 6f 3a 20 64 76 63 73 2d 77 72 69 74 65 20 28 20  o: dvcs-write ( 
1b40: 24 3a 70 65 72 6d 2b 6e 61 6d 65 20 73 69 7a 65  $:perm+name size
1b50: 20 2d 2d 20 29 20 5c 67 20 77 72 69 74 65 20 6f   -- ) \g write o
1b60: 75 74 20 66 69 6c 65 0a 20 20 20 20 24 31 30 20  ut file.    $10 
1b70: 21 21 3e 3d 6f 72 64 65 72 3f 20 24 3e 20 64 76  !!>=order? $> dv
1b80: 63 73 3a 77 72 69 74 65 20 3b 0a 2b 6e 65 74 32  cs:write ;.+net2
1b90: 6f 3a 20 64 76 63 73 2d 75 6e 7a 69 70 20 28 20  o: dvcs-unzip ( 
1ba0: 24 3a 64 69 66 66 67 7a 20 73 69 7a 65 20 61 6c  $:diffgz size al
1bb0: 67 6f 20 2d 2d 20 24 3a 64 69 66 66 20 29 20 5c  go -- $:diff ) \
1bc0: 67 20 75 6e 7a 69 70 20 61 6e 20 6f 62 6a 65 63  g unzip an objec
1bd0: 74 0a 20 20 20 20 31 20 21 21 3e 3d 6f 72 64 65  t.    1 !!>=orde
1be0: 72 3f 20 36 34 3e 6e 20 24 3e 20 64 76 63 73 3a  r? 64>n $> dvcs:
1bf0: 75 6e 7a 69 70 20 3b 0a 2b 6e 65 74 32 6f 3a 20  unzip ;.+net2o: 
1c00: 64 76 63 73 2d 72 65 66 20 28 20 24 3a 68 61 73  dvcs-ref ( $:has
1c10: 68 2b 70 65 72 6d 2b 6e 61 6d 65 20 2d 2d 20 29  h+perm+name -- )
1c20: 20 5c 67 20 65 78 74 65 72 6e 61 6c 20 68 61 73   \g external has
1c30: 68 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  h reference.    
1c40: 24 31 30 20 21 21 3e 3d 6f 72 64 65 72 3f 20 24  $10 !!>=order? $
1c50: 3e 20 64 76 63 73 3a 72 65 66 20 3b 0a 0a 7d 73  > dvcs:ref ;..}s
1c60: 63 6f 70 65 0a 0a 64 76 63 73 2d 74 61 62 6c 65  cope..dvcs-table
1c70: 20 24 73 61 76 65 0a 0a 27 20 64 76 63 73 2d 69   $save..' dvcs-i
1c80: 6e 2d 68 61 73 68 20 28 20 61 64 64 72 20 75 20  n-hash ( addr u 
1c90: 2d 2d 20 29 20 64 76 63 73 2d 63 6c 61 73 73 20  -- ) dvcs-class 
1ca0: 69 73 20 64 76 63 73 3a 72 65 61 64 0a 3a 6e 6f  is dvcs:read.:no
1cb0: 6e 61 6d 65 20 28 20 61 64 64 72 20 75 20 2d 2d  name ( addr u --
1cc0: 20 29 0a 20 20 20 20 32 64 75 70 20 68 61 73 68   ).    2dup hash
1cd0: 23 31 32 38 20 2f 73 74 72 69 6e 67 20 3f 73 61  #128 /string ?sa
1ce0: 6e 65 2d 66 69 6c 65 0a 20 20 20 20 64 76 63 73  ne-file.    dvcs
1cf0: 28 20 2e 22 20 2d 66 3a 20 22 20 32 64 75 70 20  ( ." -f: " 2dup 
1d00: 66 6f 72 74 68 3a 74 79 70 65 20 66 6f 72 74 68  forth:type forth
1d10: 3a 63 72 20 29 20 64 76 63 73 3a 66 69 6c 65 73  :cr ) dvcs:files
1d20: 23 20 23 66 72 65 65 0a 20 20 20 20 68 61 73 68  # #free.    hash
1d30: 23 31 32 38 20 75 6d 69 6e 20 64 76 63 73 2d 69  #128 umin dvcs-i
1d40: 6e 2d 68 61 73 68 20 3b 20 64 76 63 73 2d 63 6c  n-hash ; dvcs-cl
1d50: 61 73 73 20 69 73 20 64 76 63 73 3a 72 6d 0a 3a  ass is dvcs:rm.:
1d60: 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72 20 75 20  noname ( addr u 
1d70: 2d 2d 20 29 0a 20 20 20 20 32 64 75 70 20 32 20  -- ).    2dup 2 
1d80: 2f 73 74 72 69 6e 67 20 3f 73 61 6e 65 2d 66 69  /string ?sane-fi
1d90: 6c 65 20 32 64 72 6f 70 0a 20 20 20 20 64 76 63  le 2drop.    dvc
1da0: 73 28 20 2e 22 20 2d 66 3a 20 22 20 32 64 75 70  s( ." -f: " 2dup
1db0: 20 66 6f 72 74 68 3a 74 79 70 65 20 66 6f 72 74   forth:type fort
1dc0: 68 3a 63 72 20 29 20 64 76 63 73 3a 66 69 6c 65  h:cr ) dvcs:file
1dd0: 73 23 20 23 66 72 65 65 0a 3b 20 64 76 63 73 2d  s# #free.; dvcs-
1de0: 63 6c 61 73 73 20 69 73 20 64 76 63 73 3a 72 6d  class is dvcs:rm
1df0: 64 69 72 0a 3a 6e 6f 6e 61 6d 65 20 28 20 36 34  dir.:noname ( 64
1e00: 6c 65 6e 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  len addr u -- ).
1e10: 20 20 20 20 64 76 63 73 3a 70 61 74 63 68 24 20      dvcs:patch$ 
1e20: 24 21 20 64 76 63 73 28 20 2e 22 20 2d 70 61 74  $! dvcs( ." -pat
1e30: 63 68 3a 20 22 20 36 34 64 75 70 20 75 36 34 2e  ch: " 64dup u64.
1e40: 20 29 0a 20 20 20 20 64 76 63 73 3a 6f 75 74 2d   ).    dvcs:out-
1e50: 66 69 6c 65 6f 66 66 20 6f 66 66 0a 20 20 20 20  fileoff off.    
1e60: 36 34 64 75 70 20 63 6f 6e 66 69 67 3a 70 61 74  64dup config:pat
1e70: 63 68 6c 69 6d 69 74 26 20 32 40 20 64 3e 36 34  chlimit& 2@ d>64
1e80: 20 36 34 75 3e 20 21 21 70 61 74 63 68 2d 6c 69   64u> !!patch-li
1e90: 6d 69 74 21 21 0a 20 20 20 20 64 76 63 73 3a 70  mit!!.    dvcs:p
1ea0: 61 74 63 68 24 20 62 70 61 74 63 68 24 6c 65 6e  atch$ bpatch$len
1eb0: 20 36 34 3c 3e 20 21 21 70 61 74 63 68 2d 73 69   64<> !!patch-si
1ec0: 7a 65 21 21 20 5c 20 73 61 6e 69 74 79 20 63 68  ze!! \ sanity ch
1ed0: 65 63 6b 21 0a 20 20 20 20 64 76 63 73 66 69 6c  eck!.    dvcsfil
1ee0: 65 73 28 20 2e 22 20 3d 3d 3d 3d 3d 20 69 6e 20  es( ." ===== in 
1ef0: 66 69 6c 65 73 20 3d 3d 3d 3d 3d 22 20 63 72 20  files =====" cr 
1f00: 64 76 63 73 3a 69 6e 2d 66 69 6c 65 73 24 20 24  dvcs:in-files$ $
1f10: 2e 20 63 72 20 29 0a 20 20 20 20 64 76 63 73 28  . cr ).    dvcs(
1f20: 20 2e 22 20 3d 3d 3d 3d 3d 20 64 69 66 66 20 3d   ." ===== diff =
1f30: 3d 3d 3d 3d 22 20 63 72 0a 20 20 20 20 64 76 63  ====" cr.    dvc
1f40: 73 3a 69 6e 2d 66 69 6c 65 73 24 20 64 76 63 73  s:in-files$ dvcs
1f50: 3a 70 61 74 63 68 24 20 63 6f 6c 6f 72 2d 62 70  :patch$ color-bp
1f60: 61 74 63 68 24 32 20 29 0a 20 20 20 20 64 76 63  atch$2 ).    dvc
1f70: 73 3a 6f 75 74 2d 66 69 6c 65 73 24 20 24 66 72  s:out-files$ $fr
1f80: 65 65 0a 20 20 20 20 64 76 63 73 3a 69 6e 2d 66  ee.    dvcs:in-f
1f90: 69 6c 65 73 24 20 64 76 63 73 3a 70 61 74 63 68  iles$ dvcs:patch
1fa0: 24 20 5b 27 5d 20 62 70 61 74 63 68 24 32 20 64  $ ['] bpatch$2 d
1fb0: 76 63 73 3a 6f 75 74 2d 66 69 6c 65 73 24 20 24  vcs:out-files$ $
1fc0: 65 78 65 63 0a 20 20 20 20 64 76 63 73 66 69 6c  exec.    dvcsfil
1fd0: 65 73 28 20 2e 22 20 3d 3d 3d 3d 3d 20 22 20 64  es( ." ===== " d
1fe0: 76 63 73 3a 6f 75 74 2d 66 69 6c 65 73 24 20 24  vcs:out-files$ $
1ff0: 40 6c 65 6e 20 75 2e 20 2e 22 20 20 3d 3d 3d 3d  @len u. ."  ====
2000: 3d 22 20 63 72 0a 20 20 20 20 64 76 63 73 3a 6f  =" cr.    dvcs:o
2010: 75 74 2d 66 69 6c 65 73 24 20 24 2e 20 2e 22 20  ut-files$ $. ." 
2020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2030: 3d 3d 3d 3d 3d 3d 3d 3d 22 20 63 72 20 29 0a 3b  ========" cr ).;
2040: 20 64 76 63 73 2d 63 6c 61 73 73 20 69 73 20 64   dvcs-class is d
2050: 76 63 73 3a 70 61 74 63 68 0a 3a 6e 6f 6e 61 6d  vcs:patch.:nonam
2060: 65 20 28 20 36 34 73 69 7a 65 20 61 64 64 72 20  e ( 64size addr 
2070: 75 20 2d 2d 20 29 0a 20 20 20 20 32 64 75 70 20  u -- ).    2dup 
2080: 32 20 2f 73 74 72 69 6e 67 20 3f 73 61 6e 65 2d  2 /string ?sane-
2090: 66 69 6c 65 20 32 64 72 6f 70 0a 20 20 20 20 32  file 2drop.    2
20a0: 3e 72 20 64 76 63 73 28 20 2e 22 20 2d 77 72 69  >r dvcs( ." -wri
20b0: 74 65 3a 20 22 20 36 34 64 75 70 20 75 36 34 2e  te: " 64dup u64.
20c0: 20 63 72 20 29 0a 20 20 20 20 36 34 3e 6e 20 7b   cr ).    64>n {
20d0: 20 66 73 69 7a 65 20 7d 0a 20 20 20 20 64 76 63   fsize }.    dvc
20e0: 73 3a 6f 75 74 2d 66 69 6c 65 73 24 20 24 40 20  s:out-files$ $@ 
20f0: 64 76 63 73 3a 6f 75 74 2d 66 69 6c 65 6f 66 66  dvcs:out-fileoff
2100: 20 40 20 73 61 66 65 2f 73 74 72 69 6e 67 20 66   @ safe/string f
2110: 73 69 7a 65 20 75 6d 69 6e 0a 20 20 20 20 32 64  size umin.    2d
2120: 75 70 20 3e 66 69 6c 65 2d 68 61 73 68 20 32 72  up >file-hash 2r
2130: 3e 20 32 73 77 61 70 20 20 64 76 63 73 3a 66 69  > 2swap  dvcs:fi
2140: 6c 65 65 6e 74 72 79 24 20 24 66 72 65 65 0a 20  leentry$ $free. 
2150: 20 20 20 5b 3a 20 66 6f 72 74 68 3a 74 79 70 65     [: forth:type
2160: 20 74 69 63 6b 73 20 7b 20 36 34 5e 20 74 73 20   ticks { 64^ ts 
2170: 7d 20 74 73 20 31 20 36 34 73 20 66 6f 72 74 68  } ts 1 64s forth
2180: 3a 74 79 70 65 20 66 6f 72 74 68 3a 74 79 70 65  :type forth:type
2190: 20 3b 5d 0a 20 20 20 20 64 76 63 73 3a 66 69 6c   ;].    dvcs:fil
21a0: 65 65 6e 74 72 79 24 20 24 65 78 65 63 20 64 76  eentry$ $exec dv
21b0: 63 73 3a 66 69 6c 65 65 6e 74 72 79 24 20 24 40  cs:fileentry$ $@
21c0: 0a 20 20 20 20 32 64 75 70 20 2b 66 69 6c 65 65  .    2dup +filee
21d0: 6e 74 72 79 20 20 64 76 63 73 2d 6f 75 74 66 69  ntry  dvcs-outfi
21e0: 6c 65 2d 68 61 73 68 0a 20 20 20 20 66 73 69 7a  le-hash.    fsiz
21f0: 65 20 64 76 63 73 3a 6f 75 74 2d 66 69 6c 65 6f  e dvcs:out-fileo
2200: 66 66 20 2b 21 20 3b 20 64 76 63 73 2d 63 6c 61  ff +! ; dvcs-cla
2210: 73 73 20 69 73 20 64 76 63 73 3a 77 72 69 74 65  ss is dvcs:write
2220: 0a 27 20 21 21 46 49 58 4d 45 21 21 20 28 20 36  .' !!FIXME!! ( 6
2230: 34 73 69 7a 65 20 61 6c 67 6f 20 61 64 64 72 20  4size algo addr 
2240: 75 20 2d 2d 2d 20 29 20 64 76 63 73 2d 63 6c 61  u --- ) dvcs-cla
2250: 73 73 20 69 73 20 64 76 63 73 3a 75 6e 7a 69 70  ss is dvcs:unzip
2260: 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72 20  .:noname ( addr 
2270: 75 20 2d 2d 20 29 20 5c 20 68 61 73 68 2b 70 65  u -- ) \ hash+pe
2280: 72 6d 2b 6e 61 6d 65 0a 20 20 20 20 30 20 70 61  rm+name.    0 pa
2290: 74 63 68 2d 69 6e 24 20 21 40 20 3e 72 0a 20 20  tch-in$ !@ >r.  
22a0: 20 20 64 76 63 73 3a 66 69 6c 65 65 6e 74 72 79    dvcs:fileentry
22b0: 24 20 24 66 72 65 65 0a 20 20 20 20 5b 3a 20 6f  $ $free.    [: o
22c0: 76 65 72 20 68 61 73 68 23 31 32 38 20 66 6f 72  ver hash#128 for
22d0: 74 68 3a 74 79 70 65 20 74 69 63 6b 73 20 7b 20  th:type ticks { 
22e0: 36 34 5e 20 74 73 20 7d 20 74 73 20 31 20 36 34  64^ ts } ts 1 64
22f0: 73 20 66 6f 72 74 68 3a 74 79 70 65 0a 09 68 61  s forth:type..ha
2300: 73 68 23 31 32 38 20 2f 73 74 72 69 6e 67 20 66  sh#128 /string f
2310: 6f 72 74 68 3a 74 79 70 65 20 3b 5d 20 64 76 63  orth:type ;] dvc
2320: 73 3a 66 69 6c 65 65 6e 74 72 79 24 20 24 65 78  s:fileentry$ $ex
2330: 65 63 0a 20 20 20 20 64 76 63 73 3a 66 69 6c 65  ec.    dvcs:file
2340: 65 6e 74 72 79 24 20 24 40 20 2b 66 69 6c 65 65  entry$ $@ +filee
2350: 6e 74 72 79 0a 20 20 20 20 3f 66 69 6c 65 65 6e  ntry.    ?fileen
2360: 74 72 79 2d 68 61 73 68 0a 20 20 20 20 70 61 74  try-hash.    pat
2370: 63 68 2d 69 6e 24 20 24 66 72 65 65 20 20 72 3e  ch-in$ $free  r>
2380: 20 70 61 74 63 68 2d 69 6e 24 20 21 0a 3b 20 64   patch-in$ !.; d
2390: 76 63 73 2d 63 6c 61 73 73 20 69 73 20 64 76 63  vcs-class is dvc
23a0: 73 3a 72 65 66 0a 0a 5c 20 44 56 43 53 20 72 65  s:ref..\ DVCS re
23b0: 66 73 20 61 72 65 20 73 63 61 6e 6e 65 64 20 66  fs are scanned f
23c0: 6f 72 20 69 6e 20 70 61 74 63 68 73 65 74 73 2c  or in patchsets,
23d0: 20 61 6e 64 20 74 68 65 6e 20 66 65 74 63 68 65   and then fetche
23e0: 64 0a 0a 27 20 32 64 72 6f 70 20 64 76 63 73 2d  d..' 2drop dvcs-
23f0: 72 65 66 73 20 69 73 20 64 76 63 73 3a 72 65 61  refs is dvcs:rea
2400: 64 0a 27 20 32 64 72 6f 70 20 64 76 63 73 2d 72  d.' 2drop dvcs-r
2410: 65 66 73 20 69 73 20 64 76 63 73 3a 72 6d 0a 27  efs is dvcs:rm.'
2420: 20 32 64 72 6f 70 20 64 76 63 73 2d 72 65 66 73   2drop dvcs-refs
2430: 20 69 73 20 64 76 63 73 3a 72 6d 64 69 72 0a 3a   is dvcs:rmdir.:
2440: 6e 6f 6e 61 6d 65 20 32 64 72 6f 70 20 36 34 64  noname 2drop 64d
2450: 72 6f 70 20 3b 20 64 75 70 20 64 76 63 73 2d 72  rop ; dup dvcs-r
2460: 65 66 73 20 69 73 20 64 76 63 73 3a 70 61 74 63  efs is dvcs:patc
2470: 68 0a 64 76 63 73 2d 72 65 66 73 20 69 73 20 64  h.dvcs-refs is d
2480: 76 63 73 3a 77 72 69 74 65 0a 3a 6e 6f 6e 61 6d  vcs:write.:nonam
2490: 65 20 32 64 72 6f 70 20 64 72 6f 70 20 36 34 64  e 2drop drop 64d
24a0: 72 6f 70 20 3b 20 64 76 63 73 2d 72 65 66 73 20  rop ; dvcs-refs 
24b0: 69 73 20 64 76 63 73 3a 75 6e 7a 69 70 0a 3a 6e  is dvcs:unzip.:n
24c0: 6f 6e 61 6d 65 20 28 20 61 64 64 72 20 75 20 2d  oname ( addr u -
24d0: 2d 20 29 0a 20 20 20 20 68 61 73 68 23 31 32 38  - ).    hash#128
24e0: 20 75 6d 69 6e 20 32 64 75 70 20 64 76 63 73 2d   umin 2dup dvcs-
24f0: 6f 62 6a 65 63 74 73 20 23 40 20 64 30 3c 3e 20  objects #@ d0<> 
2500: 49 46 20 20 32 64 72 6f 70 20 20 45 58 49 54 20  IF  2drop  EXIT 
2510: 20 54 48 45 4e 0a 20 20 20 20 32 64 75 70 20 65   THEN.    2dup e
2520: 6e 63 68 61 73 68 3e 66 69 6c 65 6e 61 6d 65 20  nchash>filename 
2530: 66 69 6c 65 2d 73 74 61 74 75 73 20 6e 69 70 20  file-status nip 
2540: 6e 6f 2d 66 69 6c 65 23 20 3c 3e 20 49 46 20 20  no-file# <> IF  
2550: 32 64 72 6f 70 20 20 45 58 49 54 20 20 54 48 45  2drop  EXIT  THE
2560: 4e 0a 20 20 20 20 64 76 63 73 3a 72 65 66 73 5b  N.    dvcs:refs[
2570: 5d 20 24 2b 5b 5d 21 20 3b 20 64 76 63 73 2d 72  ] $+[]! ; dvcs-r
2580: 65 66 73 20 69 73 20 64 76 63 73 3a 72 65 66 0a  efs is dvcs:ref.
2590: 0a 73 63 6f 70 65 7b 20 64 76 63 73 0a 3a 20 6e  .scope{ dvcs.: n
25a0: 65 77 2d 64 76 63 73 20 28 20 2d 2d 20 6f 20 29  ew-dvcs ( -- o )
25b0: 0a 20 20 20 20 64 76 63 73 2d 63 6c 61 73 73 20  .    dvcs-class 
25c0: 6e 65 77 20 3e 6f 20 20 64 76 63 73 2d 74 61 62  new >o  dvcs-tab
25d0: 6c 65 20 40 20 74 6f 6b 65 6e 2d 74 61 62 6c 65  le @ token-table
25e0: 20 21 0a 20 20 20 20 63 6f 6d 6d 69 74 2d 63 6c   !.    commit-cl
25f0: 61 73 73 20 6e 65 77 20 3e 6f 20 20 6d 73 67 2d  ass new >o  msg-
2600: 74 61 62 6c 65 20 40 20 74 6f 6b 65 6e 2d 74 61  table @ token-ta
2610: 62 6c 65 20 21 20 20 6f 20 6f 3e 20 20 64 76 63  ble !  o o>  dvc
2620: 73 3a 63 6f 6d 6d 69 74 73 20 21 0a 20 20 20 20  s:commits !.    
2630: 73 65 61 72 63 68 2d 63 6c 61 73 73 20 6e 65 77  search-class new
2640: 20 3e 6f 20 20 6d 73 67 2d 74 61 62 6c 65 20 40   >o  msg-table @
2650: 20 74 6f 6b 65 6e 2d 74 61 62 6c 65 20 21 20 20   token-table !  
2660: 6f 20 6f 3e 20 20 64 76 63 73 3a 73 65 61 72 63  o o>  dvcs:searc
2670: 68 73 20 21 0a 20 20 20 20 6f 20 6f 3e 20 3b 0a  hs !.    o o> ;.
2680: 3a 20 6e 65 77 2d 64 76 63 73 2d 72 65 66 73 20  : new-dvcs-refs 
2690: 28 20 2d 2d 20 6f 20 29 0a 20 20 20 20 64 76 63  ( -- o ).    dvc
26a0: 73 2d 72 65 66 73 20 6e 65 77 20 3e 6f 20 20 64  s-refs new >o  d
26b0: 76 63 73 2d 74 61 62 6c 65 20 40 20 74 6f 6b 65  vcs-table @ toke
26c0: 6e 2d 74 61 62 6c 65 20 21 20 20 6f 20 6f 3e 20  n-table !  o o> 
26d0: 3b 0a 3a 20 63 6c 65 61 6e 2d 64 65 6c 74 61 20  ;.: clean-delta 
26e0: 28 20 6f 3a 64 76 63 73 20 2d 2d 20 29 0a 20 20  ( o:dvcs -- ).  
26f0: 20 20 69 6e 2d 66 69 6c 65 73 24 20 24 66 72 65    in-files$ $fre
2700: 65 20 6f 75 74 2d 66 69 6c 65 73 24 20 24 66 72  e out-files$ $fr
2710: 65 65 20 70 61 74 63 68 24 20 24 66 72 65 65 20  ee patch$ $free 
2720: 3b 0a 3a 20 64 69 73 70 6f 73 65 2d 63 6f 6d 6d  ;.: dispose-comm
2730: 69 74 20 28 20 6f 3a 63 6f 6d 6d 69 74 20 2d 2d  it ( o:commit --
2740: 20 29 0a 20 20 20 20 69 64 24 20 24 66 72 65 65   ).    id$ $free
2750: 20 20 72 65 24 20 24 66 72 65 65 20 20 6f 62 6a    re$ $free  obj
2760: 65 63 74 24 20 24 66 72 65 65 20 20 64 69 73 70  ect$ $free  disp
2770: 6f 73 65 20 3b 0a 3a 20 64 69 73 70 6f 73 65 2d  ose ;.: dispose-
2780: 73 65 61 72 63 68 20 28 20 6f 3a 63 6f 6d 6d 69  search ( o:commi
2790: 74 20 2d 2d 20 29 0a 20 20 20 20 6d 61 74 63 68  t -- ).    match
27a0: 3a 69 64 24 20 24 66 72 65 65 20 20 6d 61 74 63  :id$ $free  matc
27b0: 68 3a 74 61 67 24 20 24 66 72 65 65 20 20 64 69  h:tag$ $free  di
27c0: 73 70 6f 73 65 20 3b 0a 3a 20 64 69 73 70 6f 73  spose ;.: dispos
27d0: 65 2d 64 76 63 73 2d 72 65 66 73 20 28 20 6f 3a  e-dvcs-refs ( o:
27e0: 64 76 63 73 20 2d 2d 20 29 0a 20 20 20 20 64 76  dvcs -- ).    dv
27f0: 63 73 3a 72 65 66 73 5b 5d 20 24 5b 5d 66 72 65  cs:refs[] $[]fre
2800: 65 20 64 69 73 70 6f 73 65 20 3b 0a 3a 20 64 69  e dispose ;.: di
2810: 73 70 6f 73 65 2d 64 76 63 73 20 28 20 6f 3a 64  spose-dvcs ( o:d
2820: 76 63 73 20 2d 2d 20 29 0a 20 20 20 20 64 76 63  vcs -- ).    dvc
2830: 73 3a 62 72 61 6e 63 68 24 20 24 66 72 65 65 20  s:branch$ $free 
2840: 20 64 76 63 73 3a 6d 65 73 73 61 67 65 24 20 24   dvcs:message$ $
2850: 66 72 65 65 20 20 64 76 63 73 3a 66 69 6c 65 72  free  dvcs:filer
2860: 65 66 5b 5d 20 24 5b 5d 66 72 65 65 0a 20 20 20  ef[] $[]free.   
2870: 20 64 76 63 73 3a 66 69 6c 65 73 23 20 23 66 72   dvcs:files# #fr
2880: 65 65 73 20 20 64 76 63 73 3a 6f 6c 64 66 69 6c  ees  dvcs:oldfil
2890: 65 73 23 20 23 66 72 65 65 73 0a 20 20 20 20 64  es# #frees.    d
28a0: 76 63 73 3a 72 6d 64 69 72 73 5b 5d 20 24 5b 5d  vcs:rmdirs[] $[]
28b0: 6f 66 66 20 20 64 76 63 73 3a 6f 75 74 66 69 6c  off  dvcs:outfil
28c0: 65 73 5b 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20  es[] $[]off.    
28d0: 63 6c 65 61 6e 2d 64 65 6c 74 61 20 20 64 76 63  clean-delta  dvc
28e0: 73 3a 66 69 6c 65 65 6e 74 72 79 24 20 24 66 72  s:fileentry$ $fr
28f0: 65 65 0a 20 20 20 20 64 76 63 73 3a 68 61 73 68  ee.    dvcs:hash
2900: 24 20 24 66 72 65 65 0a 20 20 20 20 64 76 63 73  $ $free.    dvcs
2910: 3a 69 64 24 20 24 66 72 65 65 20 20 64 76 63 73  :id$ $free  dvcs
2920: 3a 6f 6c 64 69 64 24 20 24 66 72 65 65 0a 20 20  :oldid$ $free.  
2930: 20 20 70 72 6f 6a 65 63 74 3a 72 65 76 69 73 69    project:revisi
2940: 6f 6e 24 20 24 66 72 65 65 20 20 20 70 72 6f 6a  on$ $free   proj
2950: 65 63 74 3a 63 68 61 69 6e 24 20 24 66 72 65 65  ect:chain$ $free
2960: 0a 20 20 20 20 70 72 6f 6a 65 63 74 3a 62 72 61  .    project:bra
2970: 6e 63 68 24 20 24 66 72 65 65 20 20 70 72 6f 6a  nch$ $free  proj
2980: 65 63 74 3a 70 72 6f 6a 65 63 74 24 20 24 66 72  ect:project$ $fr
2990: 65 65 0a 20 20 20 20 64 76 63 73 3a 63 6f 6d 6d  ee.    dvcs:comm
29a0: 69 74 73 20 40 20 2e 64 76 63 73 3a 64 69 73 70  its @ .dvcs:disp
29b0: 6f 73 65 2d 63 6f 6d 6d 69 74 0a 20 20 20 20 64  ose-commit.    d
29c0: 76 63 73 3a 73 65 61 72 63 68 73 20 40 20 2e 64  vcs:searchs @ .d
29d0: 76 63 73 3a 64 69 73 70 6f 73 65 2d 73 65 61 72  vcs:dispose-sear
29e0: 63 68 0a 20 20 20 20 64 69 73 70 6f 73 65 20 3b  ch.    dispose ;
29f0: 0a 7d 73 63 6f 70 65 0a 0a 56 61 72 69 61 62 6c  .}scope..Variabl
2a00: 65 20 6e 65 77 2d 66 69 6c 65 73 5b 5d 0a 56 61  e new-files[].Va
2a10: 72 69 61 62 6c 65 20 72 65 66 2d 66 69 6c 65 73  riable ref-files
2a20: 5b 5d 0a 56 61 72 69 61 62 6c 65 20 64 65 6c 2d  [].Variable del-
2a30: 66 69 6c 65 73 5b 5d 0a 56 61 72 69 61 62 6c 65  files[].Variable
2a40: 20 6f 6c 64 2d 66 69 6c 65 73 5b 5d 0a 56 61 72   old-files[].Var
2a50: 69 61 62 6c 65 20 6e 65 77 2d 66 69 6c 65 24 0a  iable new-file$.
2a60: 56 61 72 69 61 62 6c 65 20 62 72 61 6e 63 68 65  Variable branche
2a70: 73 5b 5d 0a 0a 3a 20 63 6c 65 61 6e 2d 75 70 20  s[]..: clean-up 
2a80: 28 20 2d 2d 20 29 0a 20 20 20 20 6e 65 77 2d 66  ( -- ).    new-f
2a90: 69 6c 65 73 5b 5d 20 24 5b 5d 6f 66 66 20 20 72  iles[] $[]off  r
2aa0: 65 66 2d 66 69 6c 65 73 5b 5d 20 24 5b 5d 6f 66  ef-files[] $[]of
2ab0: 66 0a 20 20 20 20 64 65 6c 2d 66 69 6c 65 73 5b  f.    del-files[
2ac0: 5d 20 24 5b 5d 6f 66 66 20 20 6f 6c 64 2d 66 69  ] $[]off  old-fi
2ad0: 6c 65 73 5b 5d 20 24 5b 5d 6f 66 66 0a 20 20 20  les[] $[]off.   
2ae0: 20 62 72 61 6e 63 68 65 73 5b 5d 20 20 24 5b 5d   branches[]  $[]
2af0: 6f 66 66 20 20 6e 65 77 2d 66 69 6c 65 24 20 24  off  new-file$ $
2b00: 66 72 65 65 20 3b 0a 0a 55 73 65 72 20 74 6d 70  free ;..User tmp
2b10: 31 24 0a 3a 20 24 74 6d 70 31 20 28 20 78 74 20  1$.: $tmp1 ( xt 
2b20: 2d 2d 20 29 20 74 6d 70 31 24 20 24 66 72 65 65  -- ) tmp1$ $free
2b30: 20 20 74 6d 70 31 24 20 24 65 78 65 63 20 20 74    tmp1$ $exec  t
2b40: 6d 70 31 24 20 24 40 20 3b 0a 0a 3a 20 6d 6f 64  mp1$ $@ ;..: mod
2b50: 65 40 20 28 20 2d 2d 20 6d 6f 64 65 20 29 0a 20  e@ ( -- mode ). 
2b60: 20 20 20 73 74 61 74 62 75 66 20 73 74 5f 6d 6f     statbuf st_mo
2b70: 64 65 20 5b 20 73 69 7a 65 6f 66 20 73 74 5f 6d  de [ sizeof st_m
2b80: 6f 64 65 20 32 20 3d 20 5d 20 5b 49 46 5d 20 77  ode 2 = ] [IF] w
2b90: 40 20 5b 45 4c 53 45 5d 20 6c 40 20 5b 54 48 45  @ [ELSE] l@ [THE
2ba0: 4e 5d 20 3b 0a 3a 20 6d 6f 64 65 21 20 28 20 2d  N] ;.: mode! ( -
2bb0: 2d 20 6d 6f 64 65 20 29 0a 20 20 20 20 73 74 61  - mode ).    sta
2bc0: 74 62 75 66 20 73 74 5f 6d 6f 64 65 20 5b 20 73  tbuf st_mode [ s
2bd0: 69 7a 65 6f 66 20 73 74 5f 6d 6f 64 65 20 32 20  izeof st_mode 2 
2be0: 3d 20 5d 20 5b 49 46 5d 20 77 21 20 5b 45 4c 53  = ] [IF] w! [ELS
2bf0: 45 5d 20 6c 21 20 5b 54 48 45 4e 5d 20 3b 0a 0a  E] l! [THEN] ;..
2c00: 24 31 30 30 30 20 43 6f 6e 73 74 61 6e 74 20 70  $1000 Constant p
2c10: 61 74 68 2d 6d 61 78 23 0a 0a 44 65 66 65 72 20  ath-max#..Defer 
2c20: 78 73 74 61 74 20 27 20 6c 73 74 61 74 20 69 73  xstat ' lstat is
2c30: 20 78 73 74 61 74 0a 44 65 66 65 72 20 78 66 69   xstat.Defer xfi
2c40: 6c 65 73 5b 5d 20 27 20 6e 65 77 2d 66 69 6c 65  les[] ' new-file
2c50: 73 5b 5d 20 69 73 20 78 66 69 6c 65 73 5b 5d 0a  s[] is xfiles[].
2c60: 44 65 66 65 72 20 68 61 73 68 2d 69 6d 70 6f 72  Defer hash-impor
2c70: 74 20 27 20 6e 6f 6f 70 20 69 73 20 68 61 73 68  t ' noop is hash
2c80: 2d 69 6d 70 6f 72 74 0a 0a 3a 20 72 65 66 2d 68  -import..: ref-h
2c90: 61 73 68 2d 69 6d 70 6f 72 74 20 28 20 68 61 73  ash-import ( has
2ca0: 68 20 75 20 2d 2d 20 68 61 73 68 20 75 20 29 0a  h u -- hash u ).
2cb0: 20 20 20 20 32 3e 72 20 6e 65 77 2d 66 69 6c 65      2>r new-file
2cc0: 24 20 24 40 20 77 72 69 74 65 2d 65 6e 63 2d 68  $ $@ write-enc-h
2cd0: 61 73 68 65 64 20 32 64 72 6f 70 20 32 72 3e 20  ashed 2drop 2r> 
2ce0: 3b 0a 0a 3a 20 68 61 73 68 73 74 61 74 2d 72 65  ;..: hashstat-re
2cf0: 73 74 20 28 20 61 64 64 72 20 75 20 2d 2d 20 61  st ( addr u -- a
2d00: 64 64 72 27 20 75 27 20 29 0a 20 20 20 20 5b 3a  ddr' u' ).    [:
2d10: 20 6d 6f 64 65 40 20 7b 20 7c 20 77 5e 20 70 65   mode@ { | w^ pe
2d20: 72 6d 20 7d 20 70 65 72 6d 20 6c 65 2d 77 21 0a  rm } perm le-w!.
2d30: 09 73 74 61 74 62 75 66 20 73 74 5f 6d 74 69 6d  .statbuf st_mtim
2d40: 65 20 6e 74 69 6d 65 40 20 64 3e 36 34 20 36 34  e ntime@ d>64 64
2d50: 23 30 20 7b 20 36 34 5e 20 74 69 6d 65 73 74 61  #0 { 64^ timesta
2d60: 6d 70 20 7d 20 74 69 6d 65 73 74 61 6d 70 20 6c  mp } timestamp l
2d70: 65 2d 36 34 21 0a 09 70 65 72 6d 20 6c 65 2d 75  e-64!..perm le-u
2d80: 77 40 20 53 5f 49 46 4d 54 3f 20 61 6e 64 20 20  w@ S_IFMT? and  
2d90: 63 61 73 65 0a 09 20 20 20 20 53 5f 49 46 4c 4e  case..    S_IFLN
2da0: 4b 20 6f 66 20 20 70 61 74 68 2d 6d 61 78 23 20  K of  path-max# 
2db0: 6e 65 77 2d 66 69 6c 65 24 20 24 21 6c 65 6e 20  new-file$ $!len 
2dc0: 5c 20 70 61 74 68 6d 61 78 3a 20 34 6b 0a 09 09  \ pathmax: 4k...
2dd0: 32 64 75 70 20 6e 65 77 2d 66 69 6c 65 24 20 24  2dup new-file$ $
2de0: 40 20 72 65 61 64 6c 69 6e 6b 0a 09 09 64 75 70  @ readlink...dup
2df0: 20 3f 69 6f 72 20 6e 65 77 2d 66 69 6c 65 24 20   ?ior new-file$ 
2e00: 24 21 6c 65 6e 20 20 65 6e 64 6f 66 0a 09 20 20  $!len  endof..  
2e10: 20 20 53 5f 49 46 52 45 47 20 6f 66 20 20 32 64    S_IFREG of  2d
2e20: 75 70 20 6e 65 77 2d 66 69 6c 65 24 20 24 73 6c  up new-file$ $sl
2e30: 75 72 70 2d 66 69 6c 65 20 20 65 6e 64 6f 66 0a  urp-file  endof.
2e40: 09 20 20 20 20 30 20 6e 65 77 2d 66 69 6c 65 24  .    0 new-file$
2e50: 20 24 21 6c 65 6e 0a 09 65 6e 64 63 61 73 65 0a   $!len..endcase.
2e60: 09 6e 65 77 2d 66 69 6c 65 24 20 24 40 20 3e 66  .new-file$ $@ >f
2e70: 69 6c 65 2d 68 61 73 68 20 32 64 75 70 20 74 79  ile-hash 2dup ty
2e80: 70 65 20 68 61 73 68 2d 69 6d 70 6f 72 74 0a 09  pe hash-import..
2e90: 6e 65 77 2d 66 69 6c 65 24 20 24 40 20 32 73 77  new-file$ $@ 2sw
2ea0: 61 70 20 64 76 63 73 2d 6f 62 6a 65 63 74 73 20  ap dvcs-objects 
2eb0: 23 21 0a 09 74 69 6d 65 73 74 61 6d 70 20 31 20  #!..timestamp 1 
2ec0: 36 34 73 20 74 79 70 65 20 20 70 65 72 6d 20 32  64s type  perm 2
2ed0: 20 74 79 70 65 20 74 79 70 65 0a 20 20 20 20 3b   type type.    ;
2ee0: 5d 20 24 74 6d 70 31 20 3b 0a 0a 3a 20 66 69 6c  ] $tmp1 ;..: fil
2ef0: 65 2d 68 61 73 68 73 74 61 74 20 28 20 61 64 64  e-hashstat ( add
2f00: 72 20 75 20 2d 2d 20 61 64 64 72 27 20 75 27 20  r u -- addr' u' 
2f10: 29 0a 20 20 20 20 32 64 75 70 20 73 74 61 74 62  ).    2dup statb
2f20: 75 66 20 78 73 74 61 74 20 3f 69 6f 72 20 20 68  uf xstat ?ior  h
2f30: 61 73 68 73 74 61 74 2d 72 65 73 74 20 3b 0a 0a  ashstat-rest ;..
2f40: 3a 20 24 69 6e 73 5b 5d 66 20 28 20 61 64 64 72  : $ins[]f ( addr
2f50: 20 75 20 61 72 72 61 79 20 2d 2d 20 29 20 5b 20   u array -- ) [ 
2f60: 68 61 73 68 23 31 32 38 20 64 76 63 73 3a 6e 61  hash#128 dvcs:na
2f70: 6d 65 20 5d 4c 20 24 69 6e 73 5b 5d 2f 20 64 72  me ]L $ins[]/ dr
2f80: 6f 70 20 3b 0a 0a 3a 20 6e 65 77 2d 66 69 6c 65  op ;..: new-file
2f90: 73 2d 6c 6f 6f 70 20 28 20 2d 2d 20 29 0a 20 20  s-loop ( -- ).  
2fa0: 20 20 42 45 47 49 4e 20 20 72 65 66 69 6c 6c 20    BEGIN  refill 
2fb0: 20 57 48 49 4c 45 20 20 5c 20 73 6f 75 72 63 65   WHILE  \ source
2fc0: 20 74 79 70 65 20 63 72 0a 09 20 20 20 20 73 6f   type cr..    so
2fd0: 75 72 63 65 20 66 69 6c 65 2d 68 61 73 68 73 74  urce file-hashst
2fe0: 61 74 20 78 66 69 6c 65 73 5b 5d 20 24 69 6e 73  at xfiles[] $ins
2ff0: 5b 5d 66 20 20 52 45 50 45 41 54 20 3b 0a 3a 20  []f  REPEAT ;.: 
3000: 6e 65 77 2d 66 69 6c 65 73 2d 69 6e 20 28 20 61  new-files-in ( a
3010: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 72  ddr u -- ).    r
3020: 2f 6f 20 6f 70 65 6e 2d 66 69 6c 65 20 64 75 70  /o open-file dup
3030: 20 6e 6f 2d 66 69 6c 65 23 20 3d 20 49 46 20 20   no-file# = IF  
3040: 32 64 72 6f 70 20 20 45 58 49 54 20 20 54 48 45  2drop  EXIT  THE
3050: 4e 20 20 74 68 72 6f 77 0a 20 20 20 20 5b 27 5d  N  throw.    [']
3060: 20 6e 65 77 2d 66 69 6c 65 73 2d 6c 6f 6f 70 20   new-files-loop 
3070: 65 78 65 63 75 74 65 2d 70 61 72 73 69 6e 67 2d  execute-parsing-
3080: 66 69 6c 65 20 3b 0a 3a 20 64 6f 2d 72 65 66 73  file ;.: do-refs
3090: 20 28 20 78 74 20 2d 2d 20 29 0a 20 20 20 20 5b   ( xt -- ).    [
30a0: 3a 20 73 74 61 74 20 6d 6f 64 65 40 20 24 31 30  : stat mode@ $10
30b0: 30 30 20 6f 72 20 6d 6f 64 65 21 20 3b 5d 20 69  00 or mode! ;] i
30c0: 73 20 78 73 74 61 74 0a 20 20 20 20 5b 27 5d 20  s xstat.    ['] 
30d0: 72 65 66 2d 66 69 6c 65 73 5b 5d 20 69 73 20 78  ref-files[] is x
30e0: 66 69 6c 65 73 5b 5d 0a 20 20 20 20 5b 27 5d 20  files[].    ['] 
30f0: 72 65 66 2d 68 61 73 68 2d 69 6d 70 6f 72 74 20  ref-hash-import 
3100: 69 73 20 68 61 73 68 2d 69 6d 70 6f 72 74 0a 20  is hash-import. 
3110: 20 20 20 63 61 74 63 68 0a 20 20 20 20 5b 27 5d     catch.    [']
3120: 20 6c 73 74 61 74 20 69 73 20 78 73 74 61 74 0a   lstat is xstat.
3130: 20 20 20 20 5b 27 5d 20 6e 65 77 2d 66 69 6c 65      ['] new-file
3140: 73 5b 5d 20 69 73 20 78 66 69 6c 65 73 5b 5d 0a  s[] is xfiles[].
3150: 20 20 20 20 5b 27 5d 20 6e 6f 6f 70 20 69 73 20      ['] noop is 
3160: 68 61 73 68 2d 69 6d 70 6f 72 74 0a 20 20 20 20  hash-import.    
3170: 74 68 72 6f 77 20 3b 0a 3a 20 72 65 66 2d 68 61  throw ;.: ref-ha
3180: 73 68 73 74 61 74 20 28 20 61 64 64 72 20 75 20  shstat ( addr u 
3190: 2d 2d 20 61 64 64 72 27 20 75 27 20 29 0a 20 20  -- addr' u' ).  
31a0: 20 20 5b 27 5d 20 66 69 6c 65 2d 68 61 73 68 73    ['] file-hashs
31b0: 74 61 74 20 64 6f 2d 72 65 66 73 20 3b 0a 3a 20  tat do-refs ;.: 
31c0: 72 65 66 2d 66 69 6c 65 73 2d 69 6e 20 28 20 61  ref-files-in ( a
31d0: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 5b  ddr u -- ).    [
31e0: 27 5d 20 6e 65 77 2d 66 69 6c 65 73 2d 69 6e 20  '] new-files-in 
31f0: 64 6f 2d 72 65 66 73 20 3b 0a 0a 3a 20 63 6f 6e  do-refs ;..: con
3200: 66 69 67 3e 64 76 63 73 20 28 20 6f 3a 64 76 63  fig>dvcs ( o:dvc
3210: 73 20 2d 2d 20 29 0a 20 20 20 20 22 7e 2b 2f 2e  s -- ).    "~+/.
3220: 6e 32 6f 2f 63 6f 6e 66 69 67 22 20 5b 27 5d 20  n2o/config" ['] 
3230: 70 72 6f 6a 65 63 74 20 3e 62 6f 64 79 20 72 65  project >body re
3240: 61 64 2d 63 6f 6e 66 69 67 0a 20 20 20 20 70 72  ad-config.    pr
3250: 6f 6a 65 63 74 3a 72 65 76 69 73 69 6f 6e 24 20  oject:revision$ 
3260: 24 40 20 62 61 73 65 38 35 3e 24 20 64 76 63 73  $@ base85>$ dvcs
3270: 3a 6f 6c 64 69 64 24 20 24 21 20 3b 0a 3a 20 66  :oldid$ $! ;.: f
3280: 69 6c 65 73 3e 64 76 63 73 20 28 20 6f 3a 64 76  iles>dvcs ( o:dv
3290: 63 73 20 2d 2d 20 29 0a 20 20 20 20 22 7e 2b 2f  cs -- ).    "~+/
32a0: 2e 6e 32 6f 2f 66 69 6c 65 73 22 20 66 69 6c 65  .n2o/files" file
32b0: 6c 69 73 74 2d 69 6e 20 3b 0a 3a 20 6e 65 77 3e  list-in ;.: new>
32c0: 64 76 63 73 20 28 20 6f 3a 64 76 63 73 20 2d 2d  dvcs ( o:dvcs --
32d0: 20 29 0a 20 20 20 20 22 7e 2b 2f 2e 6e 32 6f 2f   ).    "~+/.n2o/
32e0: 72 65 66 66 69 6c 65 73 22 20 72 65 66 2d 66 69  reffiles" ref-fi
32f0: 6c 65 73 2d 69 6e 0a 20 20 20 20 22 7e 2b 2f 2e  les-in.    "~+/.
3300: 6e 32 6f 2f 6e 65 77 66 69 6c 65 73 22 20 6e 65  n2o/newfiles" ne
3310: 77 2d 66 69 6c 65 73 2d 69 6e 20 3b 0a 3a 20 6d  w-files-in ;.: m
3320: 6f 64 65 3c 3e 20 28 20 6d 6f 64 65 31 20 6d 6f  ode<> ( mode1 mo
3330: 64 65 32 20 2d 2d 20 66 6c 61 67 20 29 0a 20 20  de2 -- flag ).  
3340: 20 20 6f 76 65 72 20 53 5f 49 46 4d 54 20 69 6e    over S_IFMT in
3350: 76 65 72 74 20 61 6e 64 20 6f 76 65 72 20 53 5f  vert and over S_
3360: 49 46 4d 54 20 69 6e 76 65 72 74 20 61 6e 64 20  IFMT invert and 
3370: 3c 3e 20 3e 72 0a 20 20 20 20 53 5f 49 46 4d 54  <> >r.    S_IFMT
3380: 20 61 6e 64 20 73 77 61 70 20 53 5f 49 46 4d 54   and swap S_IFMT
3390: 20 61 6e 64 20 64 75 70 20 24 31 30 30 30 20 61   and dup $1000 a
33a0: 6e 64 20 49 46 0a 09 24 2d 32 30 30 30 20 61 6e  nd IF..$-2000 an
33b0: 64 20 73 77 61 70 20 64 75 70 20 53 5f 49 46 4c  d swap dup S_IFL
33c0: 4e 4b 20 3d 20 49 46 20 20 64 72 6f 70 20 53 5f  NK = IF  drop S_
33d0: 49 46 52 45 47 20 20 54 48 45 4e 0a 20 20 20 20  IFREG  THEN.    
33e0: 54 48 45 4e 20 20 3c 3e 20 72 3e 20 6f 72 20 3b  THEN  <> r> or ;
33f0: 0a 3a 20 64 76 63 73 3f 6d 6f 64 69 66 69 65 64  .: dvcs?modified
3400: 20 28 20 6f 3a 64 76 63 73 20 2d 2d 20 29 0a 20   ( o:dvcs -- ). 
3410: 20 20 20 64 76 63 73 3a 66 69 6c 65 73 23 20 5b     dvcs:files# [
3420: 3a 20 3e 72 0a 09 72 40 20 63 65 6c 6c 2b 20 24  : >r..r@ cell+ $
3430: 40 20 64 72 6f 70 20 68 61 73 68 23 31 32 38 20  @ drop hash#128 
3440: 2b 20 64 76 63 73 3a 70 65 72 6d 20 6c 65 2d 75  + dvcs:perm le-u
3450: 77 40 20 7b 20 70 65 72 6d 20 7d 0a 09 72 40 20  w@ { perm }..r@ 
3460: 24 40 20 73 74 61 74 62 75 66 20 70 65 72 6d 20  $@ statbuf perm 
3470: 24 31 30 30 30 20 61 6e 64 20 49 46 20 20 73 74  $1000 and IF  st
3480: 61 74 20 20 45 4c 53 45 20 20 6c 73 74 61 74 20  at  ELSE  lstat 
3490: 20 54 48 45 4e 0a 09 30 3c 20 49 46 20 20 65 72   THEN..0< IF  er
34a0: 72 6e 6f 20 45 4e 4f 45 4e 54 20 3d 20 49 46 0a  rno ENOENT = IF.
34b0: 09 09 72 3e 20 5b 3a 20 64 75 70 20 63 65 6c 6c  ..r> [: dup cell
34c0: 2b 20 24 2e 20 24 2e 20 3b 5d 20 24 74 6d 70 31  + $. $. ;] $tmp1
34d0: 20 64 65 6c 2d 66 69 6c 65 73 5b 5d 20 24 69 6e   del-files[] $in
34e0: 73 5b 5d 66 0a 09 09 45 58 49 54 20 20 54 48 45  s[]f...EXIT  THE
34f0: 4e 20 20 2d 31 20 3f 69 6f 72 20 20 54 48 45 4e  N  -1 ?ior  THEN
3500: 0a 09 72 40 20 63 65 6c 6c 2b 20 24 40 20 64 72  ..r@ cell+ $@ dr
3510: 6f 70 20 68 61 73 68 23 31 32 38 20 2b 20 64 76  op hash#128 + dv
3520: 63 73 3a 74 69 6d 65 73 74 61 6d 70 20 6c 65 2d  cs:timestamp le-
3530: 36 34 40 0a 09 73 74 61 74 62 75 66 20 73 74 5f  64@..statbuf st_
3540: 6d 74 69 6d 65 20 6e 74 69 6d 65 40 20 64 3e 36  mtime ntime@ d>6
3550: 34 20 36 34 3c 3e 0a 09 70 65 72 6d 20 6d 6f 64  4 64<>..perm mod
3560: 65 40 20 6d 6f 64 65 3c 3e 20 6f 72 20 20 49 46  e@ mode<> or  IF
3570: 0a 09 20 20 20 20 72 40 20 24 40 20 68 61 73 68  ..    r@ $@ hash
3580: 73 74 61 74 2d 72 65 73 74 20 32 64 75 70 20 66  stat-rest 2dup f
3590: 6e 2d 73 70 6c 69 74 20 64 76 63 73 3a 66 69 6c  n-split dvcs:fil
35a0: 65 73 23 20 23 40 0a 09 20 20 20 20 68 61 73 68  es# #@..    hash
35b0: 23 31 32 38 20 75 6d 69 6e 20 32 73 77 61 70 20  #128 umin 2swap 
35c0: 68 61 73 68 23 31 32 38 20 75 6d 69 6e 0a 09 20  hash#128 umin.. 
35d0: 20 20 20 73 74 72 3d 0a 09 20 20 20 20 49 46 20     str=..    IF 
35e0: 20 32 64 72 6f 70 0a 09 20 20 20 20 45 4c 53 45   2drop..    ELSE
35f0: 20 20 6e 65 77 2d 66 69 6c 65 73 5b 5d 20 24 69    new-files[] $i
3600: 6e 73 5b 5d 66 0a 09 09 72 40 20 5b 3a 20 64 75  ns[]f...r@ [: du
3610: 70 20 63 65 6c 6c 2b 20 24 2e 20 24 2e 20 3b 5d  p cell+ $. $. ;]
3620: 20 24 74 6d 70 31 20 6f 6c 64 2d 66 69 6c 65 73   $tmp1 old-files
3630: 5b 5d 20 24 69 6e 73 5b 5d 66 0a 09 20 20 20 20  [] $ins[]f..    
3640: 54 48 45 4e 0a 09 54 48 45 4e 20 20 72 64 72 6f  THEN..THEN  rdro
3650: 70 0a 20 20 20 20 3b 5d 20 23 6d 61 70 20 64 76  p.    ;] #map dv
3660: 63 73 28 0a 20 20 20 20 2e 22 20 2d 2d 2d 20 6f  cs(.    ." --- o
3670: 6c 64 20 66 69 6c 65 73 3a 22 20 63 72 20 6f 6c  ld files:" cr ol
3680: 64 2d 66 69 6c 65 73 5b 5d 20 5b 27 5d 20 2e 66  d-files[] ['] .f
3690: 69 6c 65 2b 68 61 73 68 20 24 5b 5d 6d 61 70 0a  ile+hash $[]map.
36a0: 20 20 20 20 2e 22 20 2b 2b 2b 20 6e 65 77 20 66      ." +++ new f
36b0: 69 6c 65 73 3a 22 20 63 72 20 6e 65 77 2d 66 69  iles:" cr new-fi
36c0: 6c 65 73 5b 5d 20 5b 27 5d 20 2e 66 69 6c 65 2b  les[] ['] .file+
36d0: 68 61 73 68 20 24 5b 5d 6d 61 70 0a 20 20 20 20  hash $[]map.    
36e0: 2e 22 20 2b 2b 2b 20 72 65 66 20 66 69 6c 65 73  ." +++ ref files
36f0: 3a 22 20 63 72 20 72 65 66 2d 66 69 6c 65 73 5b  :" cr ref-files[
3700: 5d 20 5b 27 5d 20 2e 66 69 6c 65 2b 68 61 73 68  ] ['] .file+hash
3710: 20 24 5b 5d 6d 61 70 0a 20 20 20 20 2e 22 20 3d   $[]map.    ." =
3720: 3d 3d 22 20 63 72 0a 20 20 20 20 29 20 3b 0a 0a  ==" cr.    ) ;..
3730: 3a 20 64 76 63 73 2b 69 6e 20 28 20 68 61 73 68  : dvcs+in ( hash
3740: 20 75 20 2d 2d 20 29 0a 20 20 20 20 64 76 63 73   u -- ).    dvcs
3750: 28 20 2e 22 20 72 65 61 64 20 69 6e 3a 20 22 20  ( ." read in: " 
3760: 32 64 75 70 20 38 35 74 79 70 65 20 66 6f 72 74  2dup 85type fort
3770: 68 3a 63 72 20 29 0a 20 20 20 20 68 61 73 68 23  h:cr ).    hash#
3780: 31 32 38 20 75 6d 69 6e 20 64 76 63 73 2d 6f 62  128 umin dvcs-ob
3790: 6a 65 63 74 73 20 23 40 20 6f 76 65 72 20 30 3d  jects #@ over 0=
37a0: 20 21 21 77 72 6f 6e 67 2d 68 61 73 68 21 21 0a   !!wrong-hash!!.
37b0: 20 20 20 20 64 76 63 73 3a 69 6e 2d 66 69 6c 65      dvcs:in-file
37c0: 73 24 20 24 2b 21 20 3b 0a 3a 20 64 76 63 73 2b  s$ $+! ;.: dvcs+
37d0: 6f 75 74 20 28 20 68 61 73 68 20 75 20 2d 2d 20  out ( hash u -- 
37e0: 29 0a 20 20 20 20 68 61 73 68 23 31 32 38 20 75  ).    hash#128 u
37f0: 6d 69 6e 20 64 76 63 73 2d 6f 62 6a 65 63 74 73  min dvcs-objects
3800: 20 23 40 20 6f 76 65 72 20 30 3d 20 21 21 77 72   #@ over 0= !!wr
3810: 6f 6e 67 2d 68 61 73 68 21 21 0a 20 20 20 20 64  ong-hash!!.    d
3820: 76 63 73 3a 6f 75 74 2d 66 69 6c 65 73 24 20 24  vcs:out-files$ $
3830: 2b 21 20 3b 0a 0a 3a 20 66 69 6c 65 2d 6c 73 69  +! ;..: file-lsi
3840: 7a 65 40 20 28 20 61 64 64 72 20 75 20 2d 2d 20  ze@ ( addr u -- 
3850: 36 34 73 69 7a 65 20 29 0a 20 20 20 20 73 74 61  64size ).    sta
3860: 74 62 75 66 20 6c 73 74 61 74 20 3f 69 6f 72 20  tbuf lstat ?ior 
3870: 73 74 61 74 62 75 66 20 73 74 5f 73 69 7a 65 20  statbuf st_size 
3880: 36 34 40 0a 20 20 20 20 6d 6f 64 65 40 20 53 5f  64@.    mode@ S_
3890: 49 46 4d 54 3f 20 61 6e 64 20 53 5f 49 46 44 49  IFMT? and S_IFDI
38a0: 52 20 3c 3e 20 6e 3e 36 34 20 36 34 61 6e 64 20  R <> n>64 64and 
38b0: 3b 0a 3a 20 66 69 6c 65 2d 73 69 7a 65 40 20 28  ;.: file-size@ (
38c0: 20 61 64 64 72 20 75 20 2d 2d 20 36 34 73 69 7a   addr u -- 64siz
38d0: 65 20 29 0a 20 20 20 20 73 74 61 74 62 75 66 20  e ).    statbuf 
38e0: 73 74 61 74 20 3f 69 6f 72 20 73 74 61 74 62 75  stat ?ior statbu
38f0: 66 20 73 74 5f 73 69 7a 65 20 36 34 40 0a 20 20  f st_size 64@.  
3900: 20 20 6d 6f 64 65 40 20 53 5f 49 46 4d 54 3f 20    mode@ S_IFMT? 
3910: 61 6e 64 20 53 5f 49 46 44 49 52 20 3c 3e 20 6e  and S_IFDIR <> n
3920: 3e 36 34 20 36 34 61 6e 64 20 3b 0a 0a 61 6c 73  >64 64and ;..als
3930: 6f 20 6e 65 74 32 6f 2d 62 61 73 65 0a 0a 3a 20  o net2o-base..: 
3940: 72 65 61 64 2d 6f 6c 64 2d 66 73 20 28 20 2d 2d  read-old-fs ( --
3950: 20 29 20 64 76 63 73 3a 69 6e 2d 66 69 6c 65 73   ) dvcs:in-files
3960: 24 20 24 66 72 65 65 0a 20 20 20 20 6f 6c 64 2d  $ $free.    old-
3970: 66 69 6c 65 73 5b 5d 20 5b 3a 20 68 61 73 68 23  files[] [: hash#
3980: 31 32 38 20 75 6d 69 6e 20 32 64 75 70 20 24 2c  128 umin 2dup $,
3990: 20 64 76 63 73 2d 72 65 61 64 20 64 76 63 73 2b   dvcs-read dvcs+
39a0: 69 6e 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b 0a 3a  in ;] $[]map ;.:
39b0: 20 72 65 61 64 2d 64 65 6c 2d 66 73 20 28 20 2d   read-del-fs ( -
39c0: 2d 20 29 0a 20 20 20 20 64 65 6c 2d 66 69 6c 65  - ).    del-file
39d0: 73 5b 5d 20 5b 3a 20 6f 76 65 72 20 68 61 73 68  s[] [: over hash
39e0: 23 31 32 38 20 64 76 63 73 3a 70 65 72 6d 20 2b  #128 dvcs:perm +
39f0: 20 6c 65 2d 75 77 40 0a 09 53 5f 49 46 4d 54 3f   le-uw@..S_IFMT?
3a00: 20 61 6e 64 20 53 5f 49 46 44 49 52 20 3d 20 20   and S_IFDIR =  
3a10: 49 46 20 20 2f 6e 61 6d 65 20 24 2c 20 64 76 63  IF  /name $, dvc
3a20: 73 2d 72 6d 64 69 72 0a 09 45 4c 53 45 20 32 64  s-rmdir..ELSE 2d
3a30: 75 70 20 5b 3a 20 6f 76 65 72 20 68 61 73 68 23  up [: over hash#
3a40: 31 32 38 20 66 6f 72 74 68 3a 74 79 70 65 20 2f  128 forth:type /
3a50: 6e 61 6d 65 20 66 6f 72 74 68 3a 74 79 70 65 20  name forth:type 
3a60: 3b 5d 20 24 74 6d 70 31 20 24 2c 0a 09 20 20 20  ;] $tmp1 $,..   
3a70: 20 64 76 63 73 2d 72 6d 20 68 61 73 68 23 31 32   dvcs-rm hash#12
3a80: 38 20 75 6d 69 6e 20 64 76 63 73 2b 69 6e 20 20  8 umin dvcs+in  
3a90: 54 48 45 4e 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b  THEN ;] $[]map ;
3aa0: 0a 3a 20 72 65 61 64 2d 6e 65 77 2d 66 73 20 28  .: read-new-fs (
3ab0: 20 2d 2d 20 29 0a 20 20 20 20 6e 65 77 2d 66 69   -- ).    new-fi
3ac0: 6c 65 73 5b 5d 20 5b 27 5d 20 64 76 63 73 2b 6f  les[] ['] dvcs+o
3ad0: 75 74 20 24 5b 5d 6d 61 70 20 3b 0a 3a 20 64 76  ut $[]map ;.: dv
3ae0: 63 73 2b 68 61 73 68 20 28 20 61 64 64 72 20 75  cs+hash ( addr u
3af0: 20 2d 2d 20 29 20 32 64 72 6f 70 20 3b 20 5c 20   -- ) 2drop ; \ 
3b00: 21 21 53 54 55 42 21 21 0a 3a 20 72 65 61 64 2d  !!STUB!!.: read-
3b10: 72 65 66 2d 66 73 20 28 20 2d 2d 20 29 0a 20 20  ref-fs ( -- ).  
3b20: 20 20 72 65 66 2d 66 69 6c 65 73 5b 5d 20 5b 27    ref-files[] ['
3b30: 5d 20 64 76 63 73 2b 68 61 73 68 20 24 5b 5d 6d  ] dvcs+hash $[]m
3b40: 61 70 20 3b 0a 3a 20 77 72 69 74 65 2d 6e 65 77  ap ;.: write-new
3b50: 2d 66 73 20 28 20 2d 2d 20 29 0a 20 20 20 20 6e  -fs ( -- ).    n
3b60: 65 77 2d 66 69 6c 65 73 5b 5d 20 5b 3a 20 32 64  ew-files[] [: 2d
3b70: 75 70 20 68 61 73 68 23 31 32 38 20 64 76 63 73  up hash#128 dvcs
3b80: 3a 70 65 72 6d 20 2f 73 74 72 69 6e 67 20 24 2c  :perm /string $,
3b90: 0a 09 2f 6e 61 6d 65 20 66 69 6c 65 2d 6c 73 69  ../name file-lsi
3ba0: 7a 65 40 20 6c 69 74 2c 20 64 76 63 73 2d 77 72  ze@ lit, dvcs-wr
3bb0: 69 74 65 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b 0a  ite ;] $[]map ;.
3bc0: 3a 20 77 72 69 74 65 2d 72 65 66 2d 66 73 20 28  : write-ref-fs (
3bd0: 20 2d 2d 20 29 0a 20 20 20 20 72 65 66 2d 66 69   -- ).    ref-fi
3be0: 6c 65 73 5b 5d 20 5b 3a 0a 09 5b 3a 20 6f 76 65  les[] [:..[: ove
3bf0: 72 20 68 61 73 68 23 31 32 38 20 66 6f 72 74 68  r hash#128 forth
3c00: 3a 74 79 70 65 0a 09 20 20 20 20 68 61 73 68 23  :type..    hash#
3c10: 31 32 38 20 64 76 63 73 3a 70 65 72 6d 20 2f 73  128 dvcs:perm /s
3c20: 74 72 69 6e 67 20 66 6f 72 74 68 3a 74 79 70 65  tring forth:type
3c30: 20 3b 5d 20 24 74 6d 70 20 24 2c 0a 09 64 76 63   ;] $tmp $,..dvc
3c40: 73 2d 72 65 66 20 3b 5d 20 24 5b 5d 6d 61 70 20  s-ref ;] $[]map 
3c50: 3b 0a 3a 20 63 6f 6d 70 75 74 65 2d 70 61 74 63  ;.: compute-patc
3c60: 68 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 76 63  h ( -- ).    dvc
3c70: 73 66 69 6c 65 73 28 20 2e 22 20 3d 3d 3d 3d 3d  sfiles( ." =====
3c80: 20 69 6e 2d 66 69 6c 65 73 24 20 3d 3d 3d 3d 22   in-files$ ===="
3c90: 20 66 6f 72 74 68 3a 63 72 20 64 76 63 73 3a 69   forth:cr dvcs:i
3ca0: 6e 2d 66 69 6c 65 73 24 20 24 2e 0a 20 20 20 20  n-files$ $..    
3cb0: 2e 22 20 3d 3d 3d 3d 3d 20 6f 75 74 2d 66 69 6c  ." ===== out-fil
3cc0: 65 73 24 20 3d 3d 3d 3d 3d 22 20 66 6f 72 74 68  es$ =====" forth
3cd0: 3a 63 72 20 64 76 63 73 3a 6f 75 74 2d 66 69 6c  :cr dvcs:out-fil
3ce0: 65 73 24 20 24 2e 20 29 0a 20 20 20 20 64 76 63  es$ $. ).    dvc
3cf0: 73 3a 69 6e 2d 66 69 6c 65 73 24 20 64 76 63 73  s:in-files$ dvcs
3d00: 3a 6f 75 74 2d 66 69 6c 65 73 24 20 5b 27 5d 20  :out-files$ ['] 
3d10: 62 64 65 6c 74 61 24 32 20 64 76 63 73 3a 70 61  bdelta$2 dvcs:pa
3d20: 74 63 68 24 20 24 65 78 65 63 0a 20 20 20 20 64  tch$ $exec.    d
3d30: 76 63 73 3a 70 61 74 63 68 24 20 24 40 20 24 2c  vcs:patch$ $@ $,
3d40: 20 64 76 63 73 3a 6f 75 74 2d 66 69 6c 65 73 24   dvcs:out-files$
3d50: 20 24 40 6c 65 6e 20 75 6c 69 74 2c 20 64 76 63   $@len ulit, dvc
3d60: 73 2d 70 61 74 63 68 20 3b 0a 0a 3a 20 63 6f 6d  s-patch ;..: com
3d70: 70 75 74 65 2d 64 69 66 66 20 28 20 2d 2d 20 29  pute-diff ( -- )
3d80: 0a 20 20 20 20 72 65 61 64 2d 6f 6c 64 2d 66 73  .    read-old-fs
3d90: 20 20 72 65 61 64 2d 64 65 6c 2d 66 73 20 20 72    read-del-fs  r
3da0: 65 61 64 2d 6e 65 77 2d 66 73 20 20 72 65 61 64  ead-new-fs  read
3db0: 2d 72 65 66 2d 66 73 0a 20 20 20 20 63 6f 6d 70  -ref-fs.    comp
3dc0: 75 74 65 2d 70 61 74 63 68 20 20 77 72 69 74 65  ute-patch  write
3dd0: 2d 6e 65 77 2d 66 73 20 77 72 69 74 65 2d 72 65  -new-fs write-re
3de0: 66 2d 66 73 20 3b 0a 0a 56 61 72 69 61 62 6c 65  f-fs ;..Variable
3df0: 20 69 64 2d 66 69 6c 65 73 5b 5d 0a 0a 3a 20 64   id-files[]..: d
3e00: 76 63 73 2d 67 65 6e 2d 69 64 20 28 20 2d 2d 20  vcs-gen-id ( -- 
3e10: 61 64 64 72 20 75 20 29 0a 20 20 20 20 69 64 2d  addr u ).    id-
3e20: 66 69 6c 65 73 5b 5d 20 24 5b 5d 6f 66 66 0a 20  files[] $[]off. 
3e30: 20 20 20 64 76 63 73 3a 66 69 6c 65 73 23 20 5b     dvcs:files# [
3e40: 3a 20 64 75 70 20 63 65 6c 6c 2b 20 24 40 20 32  : dup cell+ $@ 2
3e50: 3e 72 20 24 40 20 32 72 3e 20 5b 3a 20 66 6f 72  >r $@ 2r> [: for
3e60: 74 68 3a 74 79 70 65 20 66 6f 72 74 68 3a 74 79  th:type forth:ty
3e70: 70 65 20 3b 5d 20 24 74 6d 70 0a 09 69 64 2d 66  pe ;] $tmp..id-f
3e80: 69 6c 65 73 5b 5d 20 24 69 6e 73 5b 5d 20 64 72  iles[] $ins[] dr
3e90: 6f 70 20 3b 5d 20 23 6d 61 70 20 5c 20 73 6f 72  op ;] #map \ sor
3ea0: 74 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20 20  t filenames.    
3eb0: 5b 3a 20 20 69 64 2d 66 69 6c 65 73 5b 5d 20 5b  [:  id-files[] [
3ec0: 3a 20 64 72 6f 70 20 68 61 73 68 23 31 32 38 20  : drop hash#128 
3ed0: 24 2c 20 64 76 63 73 2d 72 65 61 64 20 3b 5d 20  $, dvcs-read ;] 
3ee0: 24 5b 5d 6d 61 70 0a 09 69 64 2d 66 69 6c 65 73  $[]map..id-files
3ef0: 5b 5d 20 5b 3a 20 68 61 73 68 23 31 32 38 20 2f  [] [: hash#128 /
3f00: 73 74 72 69 6e 67 0a 09 20 20 20 20 30 20 64 76  string..    0 dv
3f10: 63 73 3a 70 65 72 6d 20 2f 73 74 72 69 6e 67 20  cs:perm /string 
3f20: 32 64 75 70 20 24 2c 0a 09 20 20 20 20 32 20 2f  2dup $,..    2 /
3f30: 73 74 72 69 6e 67 20 66 69 6c 65 2d 6c 73 69 7a  string file-lsiz
3f40: 65 40 20 6c 69 74 2c 20 64 76 63 73 2d 77 72 69  e@ lit, dvcs-wri
3f50: 74 65 0a 09 3b 5d 20 24 5b 5d 6d 61 70 20 3b 5d  te..;] $[]map ;]
3f60: 20 67 65 6e 2d 63 6d 64 24 0a 20 20 20 20 64 75   gen-cmd$.    du
3f70: 70 20 49 46 20 20 3e 66 69 6c 65 2d 68 61 73 68  p IF  >file-hash
3f80: 20 20 54 48 45 4e 20 3b 0a 0a 70 72 65 76 69 6f    THEN ;..previo
3f90: 75 73 0a 0a 3a 20 38 35 24 21 20 28 20 61 64 64  us..: 85$! ( add
3fa0: 72 20 75 20 24 61 64 64 72 20 2d 2d 20 29 0a 20  r u $addr -- ). 
3fb0: 20 20 20 5b 27 5d 20 38 35 74 79 70 65 20 73 77     ['] 85type sw
3fc0: 61 70 20 24 73 65 74 20 3b 0a 0a 3a 20 73 61 76  ap $set ;..: sav
3fd0: 65 2d 70 72 6f 6a 65 63 74 20 28 20 2d 2d 20 29  e-project ( -- )
3fe0: 0a 20 20 20 20 64 76 63 73 28 20 2e 22 20 73 61  .    dvcs( ." sa
3ff0: 76 69 6e 67 20 27 22 20 64 76 63 73 3a 69 64 24  ving '" dvcs:id$
4000: 20 24 40 20 38 35 74 79 70 65 20 63 72 20 29 0a   $@ 85type cr ).
4010: 20 20 20 20 64 76 63 73 3a 69 64 24 20 24 40 20      dvcs:id$ $@ 
4020: 70 72 6f 6a 65 63 74 3a 72 65 76 69 73 69 6f 6e  project:revision
4030: 24 20 38 35 24 21 0a 20 20 20 20 22 7e 2b 2f 2e  $ 85$!.    "~+/.
4040: 6e 32 6f 2f 63 6f 6e 66 69 67 22 20 5b 27 5d 20  n2o/config" ['] 
4050: 70 72 6f 6a 65 63 74 20 3e 62 6f 64 79 20 77 72  project >body wr
4060: 69 74 65 2d 63 6f 6e 66 69 67 20 3b 0a 0a 5c 20  ite-config ;..\ 
4070: 69 6e 69 74 20 70 72 6f 6a 65 63 74 0a 0a 3a 20  init project..: 
4080: 64 76 63 73 2d 69 6e 69 74 20 28 20 70 72 6f 6a  dvcs-init ( proj
4090: 65 63 74 20 75 20 2d 2d 20 29 0a 20 20 20 20 22  ect u -- ).    "
40a0: 2e 6e 32 6f 22 20 24 31 46 46 20 69 6e 69 74 2d  .n2o" $1FF init-
40b0: 64 69 72 20 64 72 6f 70 0a 20 20 20 20 22 2e 6e  dir drop.    ".n
40c0: 32 6f 2f 66 69 6c 65 73 22 20 74 6f 75 63 68 0a  2o/files" touch.
40d0: 20 20 20 20 64 76 63 73 3a 6e 65 77 2d 64 76 63      dvcs:new-dvc
40e0: 73 20 3e 6f 0a 20 20 20 20 27 23 27 20 24 73 70  s >o.    '#' $sp
40f0: 6c 69 74 20 20 64 75 70 20 30 3d 20 49 46 20 20  lit  dup 0= IF  
4100: 32 64 72 6f 70 20 22 6d 61 73 74 65 72 22 20 20  2drop "master"  
4110: 45 4c 53 45 20 20 32 73 77 61 70 20 20 54 48 45  ELSE  2swap  THE
4120: 4e 0a 20 20 20 20 70 72 6f 6a 65 63 74 3a 62 72  N.    project:br
4130: 61 6e 63 68 24 20 24 21 20 20 70 72 6f 6a 65 63  anch$ $!  projec
4140: 74 3a 70 72 6f 6a 65 63 74 24 20 24 21 0a 20 20  t:project$ $!.  
4150: 20 20 73 61 76 65 2d 70 72 6f 6a 65 63 74 20 20    save-project  
4160: 64 76 63 73 3a 64 69 73 70 6f 73 65 2d 64 76 63  dvcs:dispose-dvc
4170: 73 20 6f 3e 20 3b 0a 0a 5c 20 61 70 70 65 6e 64  s o> ;..\ append
4180: 20 61 20 6c 69 6e 65 0a 0a 3a 20 61 70 70 65 6e   a line..: appen
4190: 64 2d 6c 69 6e 65 20 28 20 61 64 64 72 20 75 20  d-line ( addr u 
41a0: 66 69 6c 65 20 75 20 2d 2d 20 29 0a 20 20 20 20  file u -- ).    
41b0: 32 64 75 70 20 77 2f 6f 20 6f 70 65 6e 2d 66 69  2dup w/o open-fi
41c0: 6c 65 20 64 75 70 20 6e 6f 2d 66 69 6c 65 23 20  le dup no-file# 
41d0: 3d 20 49 46 0a 09 32 64 72 6f 70 20 77 2f 6f 20  = IF..2drop w/o 
41e0: 63 72 65 61 74 65 2d 66 69 6c 65 20 74 68 72 6f  create-file thro
41f0: 77 20 20 45 4c 53 45 20 20 74 68 72 6f 77 20 6e  w  ELSE  throw n
4200: 69 70 20 6e 69 70 20 20 54 48 45 4e 0a 20 20 20  ip nip  THEN.   
4210: 20 3e 72 20 72 40 20 66 69 6c 65 2d 73 69 7a 65   >r r@ file-size
4220: 20 74 68 72 6f 77 20 72 40 20 72 65 70 6f 73 69   throw r@ reposi
4230: 74 69 6f 6e 2d 66 69 6c 65 20 74 68 72 6f 77 0a  tion-file throw.
4240: 20 20 20 20 72 40 20 77 72 69 74 65 2d 6c 69 6e      r@ write-lin
4250: 65 20 74 68 72 6f 77 20 72 3e 20 63 6c 6f 73 65  e throw r> close
4260: 2d 66 69 6c 65 20 74 68 72 6f 77 20 3b 0a 0a 5c  -file throw ;..\
4270: 20 70 61 74 63 68 20 73 74 75 66 66 0a 0a 5c 20   patch stuff..\ 
4280: 72 65 61 64 20 69 6e 20 62 72 61 6e 63 68 65 73  read in branches
4290: 2c 20 6e 65 77 20 76 65 72 73 69 6f 6e 0a 0a 3a  , new version..:
42a0: 20 68 61 73 68 2b 74 79 70 65 20 28 20 61 64 64   hash+type ( add
42b0: 72 20 75 20 74 79 70 65 20 61 64 64 72 31 20 2d  r u type addr1 -
42c0: 2d 20 29 20 3e 72 20 72 40 20 24 66 72 65 65 0a  - ) >r r@ $free.
42d0: 20 20 20 20 5b 3a 20 7b 20 77 5e 20 78 20 7d 20      [: { w^ x } 
42e0: 74 79 70 65 20 78 20 63 65 6c 6c 20 74 79 70 65  type x cell type
42f0: 20 3b 5d 20 72 3e 20 24 65 78 65 63 20 3b 0a 0a   ;] r> $exec ;..
4300: 27 20 32 64 72 6f 70 20 63 6f 6d 6d 69 74 2d 63  ' 2drop commit-c
4310: 6c 61 73 73 20 69 73 20 6d 73 67 3a 74 61 67 0a  lass is msg:tag.
4320: 27 20 32 64 72 6f 70 20 63 6f 6d 6d 69 74 2d 63  ' 2drop commit-c
4330: 6c 61 73 73 20 69 73 20 6d 73 67 3a 73 74 61 72  lass is msg:star
4340: 74 0a 27 20 32 64 72 6f 70 20 63 6f 6d 6d 69 74  t.' 2drop commit
4350: 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 63 6f  -class is msg:co
4360: 6f 72 64 0a 27 20 32 64 72 6f 70 20 63 6f 6d 6d  ord.' 2drop comm
4370: 69 74 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a  it-class is msg:
4380: 73 69 67 6e 61 6c 0a 27 20 32 64 72 6f 70 20 63  signal.' 2drop c
4390: 6f 6d 6d 69 74 2d 63 6c 61 73 73 20 69 73 20 6d  ommit-class is m
43a0: 73 67 3a 74 65 78 74 0a 27 20 32 64 72 6f 70 20  sg:text.' 2drop 
43b0: 63 6f 6d 6d 69 74 2d 63 6c 61 73 73 20 69 73 20  commit-class is 
43c0: 6d 73 67 3a 75 72 6c 0a 27 20 32 64 72 6f 70 20  msg:url.' 2drop 
43d0: 63 6f 6d 6d 69 74 2d 63 6c 61 73 73 20 69 73 20  commit-class is 
43e0: 6d 73 67 3a 61 63 74 69 6f 6e 0a 27 20 32 64 72  msg:action.' 2dr
43f0: 6f 70 20 63 6f 6d 6d 69 74 2d 63 6c 61 73 73 20  op commit-class 
4400: 69 73 20 6d 73 67 3a 63 68 61 69 6e 0a 27 20 64  is msg:chain.' d
4410: 72 6f 70 20 20 63 6f 6d 6d 69 74 2d 63 6c 61 73  rop  commit-clas
4420: 73 20 69 73 20 6d 73 67 3a 6c 69 6b 65 0a 27 20  s is msg:like.' 
4430: 6e 6f 6f 70 20 20 63 6f 6d 6d 69 74 2d 63 6c 61  noop  commit-cla
4440: 73 73 20 69 73 20 6d 73 67 3a 65 6e 64 0a 27 20  ss is msg:end.' 
4450: 64 72 6f 70 20 20 63 6f 6d 6d 69 74 2d 63 6c 61  drop  commit-cla
4460: 73 73 20 69 73 20 6d 73 67 3a 72 65 64 69 73 70  ss is msg:redisp
4470: 6c 61 79 0a 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61  lay..:noname ( a
4480: 64 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 72  ddr u -- ).    r
4490: 65 24 20 24 2b 21 20 3b 20 63 6f 6d 6d 69 74 2d  e$ $+! ; commit-
44a0: 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 72 65 0a  class is msg:re.
44b0: 3a 6e 6f 6e 61 6d 65 20 28 20 61 64 64 72 20 75  :noname ( addr u
44c0: 20 2d 2d 20 29 0a 20 20 20 20 69 64 24 20 24 21   -- ).    id$ $!
44d0: 20 72 65 24 20 24 66 72 65 65 20 3b 20 63 6f 6d   re$ $free ; com
44e0: 6d 69 74 2d 63 6c 61 73 73 20 69 73 20 6d 73 67  mit-class is msg
44f0: 3a 69 64 0a 3a 6e 6f 6e 61 6d 65 20 28 20 61 64  :id.:noname ( ad
4500: 64 72 20 75 20 74 79 70 65 20 2d 2d 20 29 0a 20  dr u type -- ). 
4510: 20 20 20 6f 62 6a 65 63 74 24 20 68 61 73 68 2b     object$ hash+
4520: 74 79 70 65 0a 20 20 20 20 6f 62 6a 65 63 74 24  type.    object$
4530: 20 24 40 20 6b 65 79 7c 20 69 64 24 20 24 40 0a   $@ key| id$ $@.
4540: 20 20 20 20 69 64 3e 70 61 74 63 68 23 20 69 64      id>patch# id
4550: 3e 73 6e 61 70 23 20 72 65 24 20 24 40 6c 65 6e  >snap# re$ $@len
4560: 20 73 65 6c 65 63 74 20 23 21 0a 20 20 20 20 72   select #!.    r
4570: 65 24 20 24 40 6c 65 6e 20 49 46 0a 09 72 65 24  e$ $@len IF..re$
4580: 20 24 40 20 6c 61 73 74 23 20 63 65 6c 6c 2b 20   $@ last# cell+ 
4590: 24 2b 21 0a 20 20 20 20 54 48 45 4e 20 3b 20 63  $+!.    THEN ; c
45a0: 6f 6d 6d 69 74 2d 63 6c 61 73 73 20 69 73 20 6d  ommit-class is m
45b0: 73 67 3a 6f 62 6a 65 63 74 0a 0a 5c 20 73 65 61  sg:object..\ sea
45c0: 72 63 68 20 66 6f 72 20 61 20 73 70 65 63 69 66  rch for a specif
45d0: 69 63 20 69 64 0a 0a 27 20 32 64 72 6f 70 20 73  ic id..' 2drop s
45e0: 65 61 72 63 68 2d 63 6c 61 73 73 20 69 73 20 6d  earch-class is m
45f0: 73 67 3a 73 74 61 72 74 0a 27 20 32 64 72 6f 70  sg:start.' 2drop
4600: 20 73 65 61 72 63 68 2d 63 6c 61 73 73 20 69 73   search-class is
4610: 20 6d 73 67 3a 63 6f 6f 72 64 0a 27 20 32 64 72   msg:coord.' 2dr
4620: 6f 70 20 73 65 61 72 63 68 2d 63 6c 61 73 73 20  op search-class 
4630: 69 73 20 6d 73 67 3a 73 69 67 6e 61 6c 0a 27 20  is msg:signal.' 
4640: 32 64 72 6f 70 20 73 65 61 72 63 68 2d 63 6c 61  2drop search-cla
4650: 73 73 20 69 73 20 6d 73 67 3a 74 65 78 74 0a 27  ss is msg:text.'
4660: 20 32 64 72 6f 70 20 73 65 61 72 63 68 2d 63 6c   2drop search-cl
4670: 61 73 73 20 69 73 20 6d 73 67 3a 61 63 74 69 6f  ass is msg:actio
4680: 6e 0a 27 20 32 64 72 6f 70 20 73 65 61 72 63 68  n.' 2drop search
4690: 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 63 68  -class is msg:ch
46a0: 61 69 6e 0a 27 20 32 64 72 6f 70 20 73 65 61 72  ain.' 2drop sear
46b0: 63 68 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a  ch-class is msg:
46c0: 72 65 0a 27 20 32 64 72 6f 70 20 73 65 61 72 63  re.' 2drop searc
46d0: 68 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 75  h-class is msg:u
46e0: 72 6c 0a 27 20 6e 6f 6f 70 20 20 73 65 61 72 63  rl.' noop  searc
46f0: 68 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 65  h-class is msg:e
4700: 6e 64 0a 27 20 64 72 6f 70 20 20 73 65 61 72 63  nd.' drop  searc
4710: 68 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 6c  h-class is msg:l
4720: 69 6b 65 0a 27 20 64 72 6f 70 20 20 73 65 61 72  ike.' drop  sear
4730: 63 68 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a  ch-class is msg:
4740: 72 65 64 69 73 70 6c 61 79 0a 0a 3a 20 33 64 72  redisplay..: 3dr
4750: 6f 70 20 20 32 64 72 6f 70 20 64 72 6f 70 20 3b  op  2drop drop ;
4760: 0a 0a 3a 6e 6f 6e 61 6d 65 20 6d 61 74 63 68 3a  ..:noname match:
4770: 74 61 67 24 20 24 40 20 73 74 72 3d 20 6d 61 74  tag$ $@ str= mat
4780: 63 68 3a 66 6c 61 67 20 21 20 3b 20 73 65 61 72  ch:flag ! ; sear
4790: 63 68 2d 63 6c 61 73 73 20 69 73 20 6d 73 67 3a  ch-class is msg:
47a0: 74 61 67 0a 3a 6e 6f 6e 61 6d 65 20 6d 61 74 63  tag.:noname matc
47b0: 68 3a 66 6c 61 67 20 40 20 49 46 20 20 6d 61 74  h:flag @ IF  mat
47c0: 63 68 3a 69 64 24 20 24 21 20 20 45 4c 53 45 20  ch:id$ $!  ELSE 
47d0: 20 32 64 72 6f 70 20 20 54 48 45 4e 20 3b 20 73   2drop  THEN ; s
47e0: 65 61 72 63 68 2d 63 6c 61 73 73 20 69 73 20 6d  earch-class is m
47f0: 73 67 3a 69 64 0a 27 20 33 64 72 6f 70 20 73 65  sg:id.' 3drop se
4800: 61 72 63 68 2d 63 6c 61 73 73 20 69 73 20 6d 73  arch-class is ms
4810: 67 3a 6f 62 6a 65 63 74 0a 0a 27 20 32 64 72 6f  g:object..' 2dro
4820: 70 20 64 76 63 73 2d 6c 6f 67 2d 63 6c 61 73 73  p dvcs-log-class
4830: 20 69 73 20 6d 73 67 3a 72 65 0a 27 20 32 64 72   is msg:re.' 2dr
4840: 6f 70 20 64 76 63 73 2d 6c 6f 67 2d 63 6c 61 73  op dvcs-log-clas
4850: 73 20 69 73 20 6d 73 67 3a 63 6f 6f 72 64 0a 27  s is msg:coord.'
4860: 20 33 64 72 6f 70 20 64 76 63 73 2d 6c 6f 67 2d   3drop dvcs-log-
4870: 63 6c 61 73 73 20 69 73 20 6d 73 67 3a 6f 62 6a  class is msg:obj
4880: 65 63 74 0a 27 20 6e 6f 6f 70 20 20 64 76 63 73  ect.' noop  dvcs
4890: 2d 6c 6f 67 2d 63 6c 61 73 73 20 69 73 20 6d 73  -log-class is ms
48a0: 67 3a 65 6e 64 0a 3a 6e 6f 6e 61 6d 65 20 64 76  g:end.:noname dv
48b0: 63 73 2d 6c 6f 67 3a 73 69 67 24 20 20 20 20 24  cs-log:sig$    $
48c0: 21 20 3b 20 64 76 63 73 2d 6c 6f 67 2d 63 6c 61  ! ; dvcs-log-cla
48d0: 73 73 20 69 73 20 6d 73 67 3a 73 74 61 72 74 0a  ss is msg:start.
48e0: 3a 6e 6f 6e 61 6d 65 20 64 76 63 73 2d 6c 6f 67  :noname dvcs-log
48f0: 3a 74 61 67 24 20 20 20 20 24 21 20 3b 20 64 76  :tag$    $! ; dv
4900: 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 69 73 20  cs-log-class is 
4910: 6d 73 67 3a 74 61 67 0a 3a 6e 6f 6e 61 6d 65 20  msg:tag.:noname 
4920: 64 76 63 73 2d 6c 6f 67 3a 69 64 24 20 20 20 20  dvcs-log:id$    
4930: 20 24 21 20 3b 20 64 76 63 73 2d 6c 6f 67 2d 63   $! ; dvcs-log-c
4940: 6c 61 73 73 20 69 73 20 6d 73 67 3a 69 64 0a 3a  lass is msg:id.:
4950: 6e 6f 6e 61 6d 65 20 64 76 63 73 2d 6c 6f 67 3a  noname dvcs-log:
4960: 74 65 78 74 24 20 20 20 24 21 20 3b 20 64 76 63  text$   $! ; dvc
4970: 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 69 73 20 6d  s-log-class is m
4980: 73 67 3a 74 65 78 74 0a 3a 6e 6f 6e 61 6d 65 20  sg:text.:noname 
4990: 64 76 63 73 2d 6c 6f 67 3a 61 63 74 69 6f 6e 24  dvcs-log:action$
49a0: 20 24 21 20 3b 20 64 76 63 73 2d 6c 6f 67 2d 63   $! ; dvcs-log-c
49b0: 6c 61 73 73 20 69 73 20 6d 73 67 3a 61 63 74 69  lass is msg:acti
49c0: 6f 6e 0a 3a 6e 6f 6e 61 6d 65 20 64 76 63 73 2d  on.:noname dvcs-
49d0: 6c 6f 67 3a 63 68 61 69 6e 24 20 20 24 21 20 3b  log:chain$  $! ;
49e0: 20 64 76 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 20   dvcs-log-class 
49f0: 69 73 20 6d 73 67 3a 63 68 61 69 6e 0a 3a 6e 6f  is msg:chain.:no
4a00: 6e 61 6d 65 20 64 76 63 73 2d 6c 6f 67 3a 75 72  name dvcs-log:ur
4a10: 6c 73 5b 5d 20 24 2b 5b 5d 21 20 3b 20 64 76 63  ls[] $+[]! ; dvc
4a20: 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 69 73 20 6d  s-log-class is m
4a30: 73 67 3a 75 72 6c 0a 27 20 64 72 6f 70 20 64 76  sg:url.' drop dv
4a40: 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 69 73 20  cs-log-class is 
4a50: 6d 73 67 3a 6c 69 6b 65 0a 27 20 64 72 6f 70 20  msg:like.' drop 
4a60: 64 76 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 69  dvcs-log-class i
4a70: 73 20 6d 73 67 3a 72 65 64 69 73 70 6c 61 79 0a  s msg:redisplay.
4a80: 0a 3a 20 63 68 61 74 3e 64 76 63 73 20 28 20 6f  .: chat>dvcs ( o
4a90: 3a 64 76 63 73 20 2d 2d 20 29 0a 20 20 20 20 70  :dvcs -- ).    p
4aa0: 72 6f 6a 65 63 74 3a 70 72 6f 6a 65 63 74 24 20  roject:project$ 
4ab0: 24 40 20 40 2f 20 32 64 72 6f 70 20 6c 6f 61 64  $@ @/ 2drop load
4ac0: 2d 6d 73 67 20 3b 0a 3a 20 2e 68 61 73 68 20 28  -msg ;.: .hash (
4ad0: 20 61 64 64 72 20 2d 2d 20 29 0a 20 20 20 20 5b   addr -- ).    [
4ae0: 3a 20 64 75 70 20 24 40 20 38 35 74 79 70 65 20  : dup $@ 85type 
4af0: 2e 22 20 20 2d 3e 20 22 20 63 65 6c 6c 2b 20 24  ."  -> " cell+ $
4b00: 40 20 38 35 74 79 70 65 20 63 72 20 3b 5d 20 23  @ 85type cr ;] #
4b10: 6d 61 70 20 3b 0a 3a 20 63 68 61 74 3e 62 72 61  map ;.: chat>bra
4b20: 6e 63 68 65 73 2d 6c 6f 6f 70 20 28 20 6f 3a 63  nches-loop ( o:c
4b30: 6f 6d 6d 69 74 20 2d 2d 20 29 0a 20 20 20 20 6c  ommit -- ).    l
4b40: 61 73 74 23 20 6d 73 67 2d 6c 6f 67 40 20 6f 76  ast# msg-log@ ov
4b50: 65 72 20 7b 20 6c 6f 67 20 7d 20 62 6f 75 6e 64  er { log } bound
4b60: 73 20 3f 44 4f 0a 09 72 65 24 20 24 66 72 65 65  s ?DO..re$ $free
4b70: 20 20 6f 62 6a 65 63 74 24 20 24 66 72 65 65 0a    object$ $free.
4b80: 09 49 20 24 40 20 5b 27 5d 20 6d 73 67 3a 64 69  .I $@ ['] msg:di
4b90: 73 70 6c 61 79 20 63 61 74 63 68 20 49 46 20 20  splay catch IF  
4ba0: 2e 22 20 69 6e 76 61 6c 69 64 20 65 6e 74 72 79  ." invalid entry
4bb0: 22 20 63 72 20 32 64 72 6f 70 20 54 48 45 4e 0a  " cr 2drop THEN.
4bc0: 20 20 20 20 63 65 6c 6c 20 2b 4c 4f 4f 50 20 20      cell +LOOP  
4bd0: 6c 6f 67 20 66 72 65 65 20 74 68 72 6f 77 0a 20  log free throw. 
4be0: 20 20 20 64 76 63 73 28 20 2e 22 20 3d 3d 3d 20     dvcs( ." === 
4bf0: 69 64 3e 70 61 74 63 68 20 3d 3d 3d 22 20 63 72  id>patch ===" cr
4c00: 20 69 64 3e 70 61 74 63 68 23 20 2e 68 61 73 68   id>patch# .hash
4c10: 0a 20 20 20 20 2e 22 20 3d 3d 3d 20 69 64 3e 73  .    ." === id>s
4c20: 6e 61 70 20 3d 3d 3d 22 20 63 72 20 69 64 3e 73  nap ===" cr id>s
4c30: 6e 61 70 23 20 2e 68 61 73 68 20 29 20 3b 0a 3a  nap# .hash ) ;.:
4c40: 20 63 68 61 74 3e 62 72 61 6e 63 68 65 73 20 28   chat>branches (
4c50: 20 6f 3a 64 76 63 73 20 2d 2d 20 29 0a 20 20 20   o:dvcs -- ).   
4c60: 20 70 72 6f 6a 65 63 74 3a 70 72 6f 6a 65 63 74   project:project
4c70: 24 20 24 40 20 40 2f 20 32 64 72 6f 70 20 3f 6d  $ $@ @/ 2drop ?m
4c80: 73 67 2d 6c 6f 67 20 20 64 76 63 73 3a 63 6f 6d  sg-log  dvcs:com
4c90: 6d 69 74 73 20 40 20 2e 63 68 61 74 3e 62 72 61  mits @ .chat>bra
4ca0: 6e 63 68 65 73 2d 6c 6f 6f 70 20 3b 0a 0a 3a 20  nches-loop ;..: 
4cb0: 3e 62 72 61 6e 63 68 65 73 20 28 20 61 64 64 72  >branches ( addr
4cc0: 20 75 20 2d 2d 20 29 0a 20 20 20 20 24 6d 61 6b   u -- ).    $mak
4cd0: 65 20 62 72 61 6e 63 68 65 73 5b 5d 20 3e 62 61  e branches[] >ba
4ce0: 63 6b 20 3b 0a 55 73 65 72 20 69 64 2d 63 68 65  ck ;.User id-che
4cf0: 63 6b 23 20 5c 20 63 68 65 63 6b 20 68 61 73 68  ck# \ check hash
4d00: 0a 3a 20 69 64 3e 62 72 61 6e 63 68 65 73 2d 6c  .: id>branches-l
4d10: 6f 6f 70 20 28 20 61 64 64 72 20 75 20 2d 2d 20  oop ( addr u -- 
4d20: 29 0a 20 20 20 20 42 45 47 49 4e 20 20 32 64 75  ).    BEGIN  2du
4d30: 70 20 69 64 2d 63 68 65 63 6b 23 20 23 40 20 64  p id-check# #@ d
4d40: 30 3c 3e 20 49 46 20 20 32 64 72 6f 70 20 20 45  0<> IF  2drop  E
4d50: 58 49 54 20 20 54 48 45 4e 0a 09 73 22 20 21 22  XIT  THEN..s" !"
4d60: 20 32 6f 76 65 72 20 69 64 2d 63 68 65 63 6b 23   2over id-check#
4d70: 20 23 21 0a 09 32 64 75 70 20 69 64 3e 73 6e 61   #!..2dup id>sna
4d80: 70 23 20 23 40 20 32 64 75 70 20 64 30 3c 3e 20  p# #@ 2dup d0<> 
4d90: 49 46 20 20 3e 62 72 61 6e 63 68 65 73 20 32 64  IF  >branches 2d
4da0: 72 6f 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a  rop  EXIT  THEN.
4db0: 09 32 64 72 6f 70 20 69 64 3e 70 61 74 63 68 23  .2drop id>patch#
4dc0: 20 23 40 20 32 64 75 70 20 64 30 3c 3e 20 57 48   #@ 2dup d0<> WH
4dd0: 49 4c 45 0a 09 20 20 20 20 32 64 75 70 20 68 61  ILE..    2dup ha
4de0: 73 68 23 31 32 38 20 75 6d 69 6e 20 3e 62 72 61  sh#128 umin >bra
4df0: 6e 63 68 65 73 0a 09 20 20 20 20 68 61 73 68 23  nches..    hash#
4e00: 31 32 38 20 73 61 66 65 2f 73 74 72 69 6e 67 20  128 safe/string 
4e10: 20 68 61 73 68 23 31 32 38 20 2d 20 32 64 75 70   hash#128 - 2dup
4e20: 20 2b 20 3e 72 0a 09 20 20 20 20 62 6f 75 6e 64   + >r..    bound
4e30: 73 20 55 2b 44 4f 20 20 49 20 68 61 73 68 23 31  s U+DO  I hash#1
4e40: 32 38 20 72 65 63 75 72 73 65 20 20 68 61 73 68  28 recurse  hash
4e50: 23 31 32 38 20 2b 4c 4f 4f 50 0a 09 20 20 20 20  #128 +LOOP..    
4e60: 72 3e 20 68 61 73 68 23 31 32 38 20 5c 20 74 61  r> hash#128 \ ta
4e70: 69 6c 20 72 65 63 75 72 73 69 6f 6e 20 6f 70 74  il recursion opt
4e80: 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 52 45  imization.    RE
4e90: 50 45 41 54 20 20 32 64 72 6f 70 20 3b 0a 3a 20  PEAT  2drop ;.: 
4ea0: 69 64 3e 62 72 61 6e 63 68 65 73 20 28 20 61 64  id>branches ( ad
4eb0: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 69 64  dr u -- ).    id
4ec0: 2d 63 68 65 63 6b 23 20 23 66 72 65 65 73 0a 20  -check# #frees. 
4ed0: 20 20 20 62 72 61 6e 63 68 65 73 5b 5d 20 24 5b     branches[] $[
4ee0: 5d 6f 66 66 20 20 64 76 63 73 3a 63 6f 6d 6d 69  ]off  dvcs:commi
4ef0: 74 73 20 40 20 2e 69 64 3e 62 72 61 6e 63 68 65  ts @ .id>branche
4f00: 73 2d 6c 6f 6f 70 0a 20 20 20 20 69 64 2d 63 68  s-loop.    id-ch
4f10: 65 63 6b 23 20 23 66 72 65 65 73 0a 20 20 20 20  eck# #frees.    
4f20: 64 76 63 73 28 20 2e 22 20 72 65 3a 22 20 63 72  dvcs( ." re:" cr
4f30: 20 62 72 61 6e 63 68 65 73 5b 5d 20 5b 3a 20 38   branches[] [: 8
4f40: 35 74 79 70 65 20 63 72 20 3b 5d 20 24 5b 5d 6d  5type cr ;] $[]m
4f50: 61 70 20 29 20 3b 0a 3a 20 62 72 61 6e 63 68 65  ap ) ;.: branche
4f60: 73 3e 64 76 63 73 20 28 20 2d 2d 20 29 0a 20 20  s>dvcs ( -- ).  
4f70: 20 20 62 72 61 6e 63 68 65 73 5b 5d 20 5b 3a 20    branches[] [: 
4f80: 64 75 70 20 49 46 0a 09 20 20 20 20 64 76 63 73  dup IF..    dvcs
4f90: 28 20 2e 22 20 72 65 61 64 20 65 6e 63 20 68 61  ( ." read enc ha
4fa0: 73 68 3a 20 22 20 32 64 75 70 20 38 35 74 79 70  sh: " 2dup 85typ
4fb0: 65 20 63 72 20 29 0a 09 20 20 20 20 3f 72 65 61  e cr )..    ?rea
4fc0: 64 2d 65 6e 63 2d 68 61 73 68 65 64 20 20 63 2d  d-enc-hashed  c-
4fd0: 73 74 61 74 65 20 6f 66 66 20 20 64 6f 2d 63 6d  state off  do-cm
4fe0: 64 2d 6c 6f 6f 70 0a 09 20 20 20 20 64 76 63 73  d-loop..    dvcs
4ff0: 3a 63 6c 65 61 6e 2d 64 65 6c 74 61 0a 09 45 4c  :clean-delta..EL
5000: 53 45 20 20 32 64 72 6f 70 20 20 54 48 45 4e 0a  SE  2drop  THEN.
5010: 20 20 20 20 3b 5d 20 24 5b 5d 6d 61 70 20 3b 0a      ;] $[]map ;.
5020: 0a 5c 20 70 75 73 68 20 6f 75 74 20 61 20 72 65  .\ push out a re
5030: 76 69 73 69 6f 6e 0a 0a 3a 20 3e 72 65 76 69 73  vision..: >revis
5040: 69 6f 6e 20 28 20 61 64 64 72 20 75 20 2d 2d 20  ion ( addr u -- 
5050: 29 0a 20 20 20 20 32 64 75 70 20 3e 66 69 6c 65  ).    2dup >file
5060: 2d 68 61 73 68 20 64 76 63 73 3a 68 61 73 68 24  -hash dvcs:hash$
5070: 20 24 21 0a 20 20 20 20 64 76 63 73 28 20 2e 22   $!.    dvcs( ."
5080: 20 3d 3d 3d 3d 3d 20 63 69 20 27 22 20 64 76 63   ===== ci '" dvc
5090: 73 3a 68 61 73 68 24 20 24 40 20 38 35 74 79 70  s:hash$ $@ 85typ
50a0: 65 20 2e 22 20 27 20 3d 3d 3d 3d 3d 22 20 63 72  e ." ' =====" cr
50b0: 20 29 0a 20 20 20 20 77 72 69 74 65 2d 65 6e 63   ).    write-enc
50c0: 2d 68 61 73 68 65 64 20 32 64 72 6f 70 20 3b 0a  -hashed 2drop ;.
50d0: 0a 3a 20 70 75 6c 6c 2d 72 65 61 64 69 6e 20 28  .: pull-readin (
50e0: 20 2d 2d 20 29 0a 20 20 20 20 63 6f 6e 66 69 67   -- ).    config
50f0: 3e 64 76 63 73 20 20 63 68 61 74 3e 64 76 63 73  >dvcs  chat>dvcs
5100: 20 20 63 68 61 74 3e 62 72 61 6e 63 68 65 73 20    chat>branches 
5110: 3b 0a 3a 20 64 76 63 73 2d 72 65 61 64 69 6e 20  ;.: dvcs-readin 
5120: 28 20 24 61 64 64 72 20 2d 2d 20 29 0a 20 20 20  ( $addr -- ).   
5130: 20 70 75 6c 6c 2d 72 65 61 64 69 6e 20 20 24 40   pull-readin  $@
5140: 20 69 64 3e 62 72 61 6e 63 68 65 73 20 20 62 72   id>branches  br
5150: 61 6e 63 68 65 73 3e 64 76 63 73 0a 20 20 20 20  anches>dvcs.    
5160: 66 69 6c 65 73 3e 64 76 63 73 20 20 6e 65 77 3e  files>dvcs  new>
5170: 64 76 63 73 20 20 64 76 63 73 3f 6d 6f 64 69 66  dvcs  dvcs?modif
5180: 69 65 64 20 3b 0a 0a 73 63 6f 70 65 7b 20 64 76  ied ;..scope{ dv
5190: 63 73 0a 3a 20 6e 65 77 2d 64 76 63 73 2d 6c 6f  cs.: new-dvcs-lo
51a0: 67 20 28 20 2d 2d 20 6f 20 29 0a 20 20 20 20 64  g ( -- o ).    d
51b0: 76 63 73 2d 6c 6f 67 2d 63 6c 61 73 73 20 6e 65  vcs-log-class ne
51c0: 77 20 3e 6f 20 6d 73 67 2d 74 61 62 6c 65 20 40  w >o msg-table @
51d0: 20 74 6f 6b 65 6e 2d 74 61 62 6c 65 20 21 20 6f   token-table ! o
51e0: 20 6f 3e 20 3b 0a 3a 20 63 6c 65 61 72 2d 6c 6f   o> ;.: clear-lo
51f0: 67 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 76 63  g ( -- ).    dvc
5200: 73 2d 6c 6f 67 3a 73 69 67 24 20 20 20 20 24 66  s-log:sig$    $f
5210: 72 65 65 20 20 64 76 63 73 2d 6c 6f 67 3a 74 61  ree  dvcs-log:ta
5220: 67 24 20 20 24 66 72 65 65 20 20 64 76 63 73 2d  g$  $free  dvcs-
5230: 6c 6f 67 3a 69 64 24 20 20 20 20 24 66 72 65 65  log:id$    $free
5240: 0a 20 20 20 20 64 76 63 73 2d 6c 6f 67 3a 61 63  .    dvcs-log:ac
5250: 74 69 6f 6e 24 20 24 66 72 65 65 20 20 64 76 63  tion$ $free  dvc
5260: 73 2d 6c 6f 67 3a 74 65 78 74 24 20 24 66 72 65  s-log:text$ $fre
5270: 65 20 20 64 76 63 73 2d 6c 6f 67 3a 63 68 61 69  e  dvcs-log:chai
5280: 6e 24 20 24 66 72 65 65 0a 20 20 20 20 64 76 63  n$ $free.    dvc
5290: 73 2d 6c 6f 67 3a 75 72 6c 73 5b 5d 20 24 5b 5d  s-log:urls[] $[]
52a0: 66 72 65 65 20 3b 0a 3a 20 64 69 73 70 6f 73 65  free ;.: dispose
52b0: 2d 64 76 63 73 2d 6c 6f 67 20 28 20 6f 3a 6c 6f  -dvcs-log ( o:lo
52c0: 67 20 2d 2d 20 29 0a 20 20 20 20 63 6c 65 61 72  g -- ).    clear
52d0: 2d 6c 6f 67 20 64 69 73 70 6f 73 65 20 3b 0a 7d  -log dispose ;.}
52e0: 73 63 6f 70 65 0a 0a 3a 20 64 69 73 70 6c 61 79  scope..: display
52f0: 2d 6c 6f 67 6e 20 28 20 61 64 64 72 20 75 20 6e  -logn ( addr u n
5300: 20 2d 2d 20 29 0a 20 20 20 20 70 72 6f 6a 65 63   -- ).    projec
5310: 74 3a 62 72 61 6e 63 68 24 20 24 40 20 7b 20 64  t:branch$ $@ { d
5320: 3a 20 62 72 61 6e 63 68 20 7d 0a 20 20 20 20 64  : branch }.    d
5330: 76 63 73 3a 6e 65 77 2d 64 76 63 73 2d 6c 6f 67  vcs:new-dvcs-log
5340: 20 3e 6f 0a 20 20 20 20 63 65 6c 6c 73 20 3e 72   >o.    cells >r
5350: 20 3f 6d 73 67 2d 6c 6f 67 20 20 6c 61 73 74 23   ?msg-log  last#
5360: 20 6d 73 67 2d 6c 6f 67 40 20 32 64 75 70 20 7b   msg-log@ 2dup {
5370: 20 6c 6f 67 20 75 20 7d 0a 20 20 20 20 64 75 70   log u }.    dup
5380: 20 72 3e 20 2d 20 30 20 6d 61 78 20 64 75 70 20   r> - 0 max dup 
5390: 3e 72 20 2f 73 74 72 69 6e 67 20 72 3e 20 63 65  >r /string r> ce
53a0: 6c 6c 2f 20 2d 72 6f 74 20 62 6f 75 6e 64 73 20  ll/ -rot bounds 
53b0: 3f 44 4f 0a 09 64 76 63 73 3a 63 6c 65 61 72 2d  ?DO..dvcs:clear-
53c0: 6c 6f 67 20 20 49 20 24 40 20 5b 27 5d 20 6d 73  log  I $@ ['] ms
53d0: 67 3a 64 69 73 70 6c 61 79 20 63 61 74 63 68 0a  g:display catch.
53e0: 09 49 46 20 20 2e 22 20 69 6e 76 61 6c 69 64 20  .IF  ." invalid 
53f0: 65 6e 74 72 79 22 20 63 72 20 32 64 72 6f 70 0a  entry" cr 2drop.
5400: 09 45 4c 53 45 0a 09 20 20 20 20 62 72 61 6e 63  .ELSE..    branc
5410: 68 20 64 76 63 73 2d 6c 6f 67 3a 74 61 67 24 20  h dvcs-log:tag$ 
5420: 24 40 20 73 74 72 3d 20 49 46 0a 09 09 64 75 70  $@ str= IF...dup
5430: 20 30 20 2e 72 20 2e 22 20 3a 20 5b 22 20 64 76   0 .r ." : [" dv
5440: 63 73 2d 6c 6f 67 3a 69 64 24 20 24 40 20 38 35  cs-log:id$ $@ 85
5450: 74 79 70 65 20 2e 22 20 5d 20 22 0a 09 09 64 76  type ." ] "...dv
5460: 63 73 2d 6c 6f 67 3a 73 69 67 24 20 24 40 20 32  cs-log:sig$ $@ 2
5470: 64 75 70 20 73 74 61 72 74 64 61 74 65 40 20 2e  dup startdate@ .
5480: 74 69 63 6b 73 0a 09 09 64 76 63 73 2d 6c 6f 67  ticks...dvcs-log
5490: 3a 63 68 61 69 6e 24 20 24 40 20 64 75 70 20 49  :chain$ $@ dup I
54a0: 46 0a 09 09 20 20 20 20 32 64 75 70 20 73 69 67  F...    2dup sig
54b0: 68 61 73 68 3f 20 49 46 20 20 3c 69 6e 66 6f 3e  hash? IF  <info>
54c0: 20 20 45 4c 53 45 20 20 3c 65 72 72 3e 20 20 54    ELSE  <err>  T
54d0: 48 45 4e 0a 09 09 20 20 20 20 2e 22 20 3c 2d 22  HEN...    ." <-"
54e0: 20 64 72 6f 70 20 6c 65 2d 36 34 40 20 2e 74 69   drop le-64@ .ti
54f0: 63 6b 73 20 20 3c 64 65 66 61 75 6c 74 3e 0a 09  cks  <default>..
5500: 09 45 4c 53 45 20 20 32 64 72 6f 70 20 20 54 48  .ELSE  2drop  TH
5510: 45 4e 20 20 73 70 61 63 65 0a 09 09 64 76 63 73  EN  space...dvcs
5520: 2d 6c 6f 67 3a 61 63 74 69 6f 6e 24 20 24 2e 20  -log:action$ $. 
5530: 2e 22 20 3a 20 22 20 64 76 63 73 2d 6c 6f 67 3a  ." : " dvcs-log:
5540: 74 65 78 74 24 20 24 2e 20 73 70 61 63 65 0a 09  text$ $. space..
5550: 09 64 76 63 73 2d 6c 6f 67 3a 75 72 6c 73 5b 5d  .dvcs-log:urls[]
5560: 20 5b 3a 20 3c 77 61 72 6e 3e 20 74 79 70 65 20   [: <warn> type 
5570: 3c 64 65 66 61 75 6c 74 3e 20 73 70 61 63 65 20  <default> space 
5580: 3b 5d 20 24 5b 5d 6d 61 70 0a 09 09 2e 6b 65 79  ;] $[]map....key
5590: 2d 69 64 3f 0a 09 09 63 72 0a 09 20 20 20 20 54  -id?...cr..    T
55a0: 48 45 4e 0a 09 54 48 45 4e 20 20 31 2b 0a 20 20  HEN..THEN  1+.  
55b0: 20 20 63 65 6c 6c 20 2b 4c 4f 4f 50 20 20 64 72    cell +LOOP  dr
55c0: 6f 70 0a 20 20 20 20 6c 6f 67 20 66 72 65 65 20  op.    log free 
55d0: 64 76 63 73 3a 64 69 73 70 6f 73 65 2d 64 76 63  dvcs:dispose-dvc
55e0: 73 2d 6c 6f 67 20 6f 3e 20 74 68 72 6f 77 20 3b  s-log o> throw ;
55f0: 0a 0a 3a 20 2e 64 76 63 73 2d 6c 6f 67 20 28 20  ..: .dvcs-log ( 
5600: 2d 2d 20 29 0a 20 20 20 20 64 76 63 73 3a 6e 65  -- ).    dvcs:ne
5610: 77 2d 64 76 63 73 20 3e 6f 20 20 63 6f 6e 66 69  w-dvcs >o  confi
5620: 67 3e 64 76 63 73 0a 20 20 20 20 70 72 6f 6a 65  g>dvcs.    proje
5630: 63 74 3a 70 72 6f 6a 65 63 74 24 20 24 40 20 40  ct:project$ $@ @
5640: 2f 20 32 64 72 6f 70 20 32 64 75 70 20 6c 6f 61  / 2drop 2dup loa
5650: 64 2d 6d 73 67 0a 20 20 20 20 63 6f 6e 66 69 67  d-msg.    config
5660: 3a 6c 6f 67 73 69 7a 65 23 20 40 20 64 69 73 70  :logsize# @ disp
5670: 6c 61 79 2d 6c 6f 67 6e 0a 20 20 20 20 64 76 63  lay-logn.    dvc
5680: 73 3a 64 69 73 70 6f 73 65 2d 64 76 63 73 20 6f  s:dispose-dvcs o
5690: 3e 20 3b 0a 0a 61 6c 73 6f 20 6e 65 74 32 6f 2d  > ;..also net2o-
56a0: 62 61 73 65 0a 74 72 75 65 20 56 61 6c 75 65 20  base.true Value 
56b0: 61 64 64 2d 6f 62 6a 65 63 74 3f 0a 0a 3a 20 28  add-object?..: (
56c0: 64 76 63 73 2d 6e 65 77 73 65 6e 74 72 79 29 20  dvcs-newsentry) 
56d0: 28 20 74 79 70 65 20 2d 2d 20 29 0a 20 20 20 20  ( type -- ).    
56e0: 64 76 63 73 3a 74 79 70 65 20 21 0a 20 20 20 20  dvcs:type !.    
56f0: 64 76 63 73 3a 68 61 73 68 24 20 24 40 6c 65 6e  dvcs:hash$ $@len
5700: 20 30 3d 20 49 46 20 20 23 30 2e 20 6c 61 73 74   0= IF  #0. last
5710: 2d 73 69 67 6e 65 64 20 32 21 20 20 45 58 49 54  -signed 2!  EXIT
5720: 20 20 54 48 45 4e 0a 20 20 20 20 6d 73 67 2d 67    THEN.    msg-g
5730: 72 6f 75 70 24 20 40 20 3e 72 0a 20 20 20 20 70  roup$ @ >r.    p
5740: 72 6f 6a 65 63 74 3a 70 72 6f 6a 65 63 74 24 20  roject:project$ 
5750: 40 20 6d 73 67 2d 67 72 6f 75 70 24 20 21 0a 20  @ msg-group$ !. 
5760: 20 20 20 6f 20 5b 3a 20 77 69 74 68 20 64 76 63     o [: with dvc
5770: 73 0a 09 70 72 6f 6a 65 63 74 3a 63 68 61 69 6e  s..project:chain
5780: 24 20 24 40 20 62 61 73 65 38 35 3e 24 0a 09 66  $ $@ base85>$..f
5790: 69 6c 65 72 65 66 5b 5d 0a 09 6d 65 73 73 61 67  ileref[]..messag
57a0: 65 24 20 20 20 24 40 0a 09 74 79 70 65 20 20 20  e$   $@..type   
57b0: 20 20 20 20 40 0a 09 68 61 73 68 24 20 20 20 20      @..hash$    
57c0: 20 20 24 40 0a 09 6f 6c 64 69 64 24 20 20 20 20    $@..oldid$    
57d0: 20 24 40 0a 09 69 64 24 20 20 20 20 20 20 20 20   $@..id$        
57e0: 24 40 0a 09 70 72 6f 6a 65 63 74 3a 62 72 61 6e  $@..project:bran
57f0: 63 68 24 20 24 40 0a 09 65 6e 64 77 69 74 68 0a  ch$ $@..endwith.
5800: 09 24 2c 20 6d 73 67 2d 74 61 67 0a 09 24 2c 20  .$, msg-tag..$, 
5810: 6d 73 67 2d 69 64 0a 09 64 75 70 20 3e 72 0a 09  msg-id..dup >r..
5820: 64 75 70 20 49 46 20 20 24 2c 20 6d 73 67 2d 72  dup IF  $, msg-r
5830: 65 20 20 20 20 20 45 4c 53 45 20 20 32 64 72 6f  e     ELSE  2dro
5840: 70 20 20 54 48 45 4e 0a 09 64 75 70 20 3e 72 20  p  THEN..dup >r 
5850: 64 75 70 20 49 46 20 20 24 2c 20 75 6c 69 74 2c  dup IF  $, ulit,
5860: 20 6d 73 67 2d 6f 62 6a 65 63 74 0a 09 45 4c 53   msg-object..ELS
5870: 45 20 20 32 64 72 6f 70 20 64 72 6f 70 20 20 54  E  2drop drop  T
5880: 48 45 4e 0a 09 72 3e 20 72 3e 20 49 46 20 20 20  HEN..r> r> IF   
5890: 49 46 20 20 22 50 61 74 63 68 73 65 74 22 20 20  IF  "Patchset"  
58a0: 45 4c 53 45 20 20 22 52 65 76 65 72 74 22 20 20  ELSE  "Revert"  
58b0: 54 48 45 4e 0a 09 45 4c 53 45 20 20 64 72 6f 70  THEN..ELSE  drop
58c0: 20 22 53 6e 61 70 73 68 6f 74 22 20 20 54 48 45   "Snapshot"  THE
58d0: 4e 20 20 24 2c 20 6d 73 67 2d 61 63 74 69 6f 6e  N  $, msg-action
58e0: 0a 09 24 2c 20 6d 73 67 2d 74 65 78 74 0a 09 64  ..$, msg-text..d
58f0: 75 70 20 5b 3a 20 5b 3a 20 2e 22 20 66 69 6c 65  up [: [: ." file
5900: 3a 22 20 66 6f 72 74 68 3a 74 79 70 65 20 3b 5d  :" forth:type ;]
5910: 20 24 74 6d 70 20 24 2c 20 6d 73 67 2d 75 72 6c   $tmp $, msg-url
5920: 20 3b 5d 20 24 5b 5d 6d 61 70 20 24 5b 5d 66 72   ;] $[]map $[]fr
5930: 65 65 0a 09 64 75 70 20 49 46 20 20 24 2c 20 6d  ee..dup IF  $, m
5940: 73 67 2d 63 68 61 69 6e 20 20 45 4c 53 45 20 20  sg-chain  ELSE  
5950: 32 64 72 6f 70 20 20 54 48 45 4e 0a 20 20 20 20  2drop  THEN.    
5960: 3b 5d 20 28 73 65 6e 64 2d 61 76 61 6c 61 6e 63  ;] (send-avalanc
5970: 68 65 29 20 49 46 20 20 2e 63 68 61 74 20 20 45  he) IF  .chat  E
5980: 4c 53 45 20 20 20 32 64 72 6f 70 20 20 54 48 45  LSE   2drop  THE
5990: 4e 0a 20 20 20 20 72 3e 20 6d 73 67 2d 67 72 6f  N.    r> msg-gro
59a0: 75 70 24 20 21 20 3b 0a 70 72 65 76 69 6f 75 73  up$ ! ;.previous
59b0: 0a 0a 3a 20 64 76 63 73 2d 73 6e 61 70 65 6e 74  ..: dvcs-snapent
59c0: 72 79 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 76  ry ( -- ).    dv
59d0: 63 73 3a 6f 6c 64 69 64 24 20 24 66 72 65 65 0a  cs:oldid$ $free.
59e0: 20 20 20 20 6d 73 67 3a 73 6e 61 70 73 68 6f 74      msg:snapshot
59f0: 23 20 28 64 76 63 73 2d 6e 65 77 73 65 6e 74 72  # (dvcs-newsentr
5a00: 79 29 20 3b 0a 3a 20 64 76 63 73 2d 6e 65 77 73  y) ;.: dvcs-news
5a10: 65 6e 74 72 79 20 28 20 2d 2d 20 29 0a 20 20 20  entry ( -- ).   
5a20: 20 6d 73 67 3a 70 61 74 63 68 23 20 6d 73 67 3a   msg:patch# msg:
5a30: 73 6e 61 70 73 68 6f 74 23 20 64 76 63 73 3a 6f  snapshot# dvcs:o
5a40: 6c 64 69 64 24 20 24 40 6c 65 6e 20 73 65 6c 65  ldid$ $@len sele
5a50: 63 74 20 28 64 76 63 73 2d 6e 65 77 73 65 6e 74  ct (dvcs-newsent
5a60: 72 79 29 20 3b 0a 0a 3a 20 3e 69 64 2d 72 65 76  ry) ;..: >id-rev
5a70: 69 73 69 6f 6e 20 28 20 61 64 64 72 20 75 20 2d  ision ( addr u -
5a80: 2d 20 29 0a 20 20 20 20 64 76 63 73 2d 67 65 6e  - ).    dvcs-gen
5a90: 2d 69 64 20 32 64 75 70 20 64 76 63 73 3a 69 64  -id 2dup dvcs:id
5aa0: 24 20 24 21 0a 20 20 20 20 64 76 63 73 3a 63 6f  $ $!.    dvcs:co
5ab0: 6d 6d 69 74 73 20 40 20 3e 6f 0a 20 20 20 20 32  mmits @ >o.    2
5ac0: 64 75 70 20 69 64 3e 70 61 74 63 68 23 20 23 40  dup id>patch# #@
5ad0: 20 64 30 3d 20 3e 72 20 69 64 3e 73 6e 61 70 23   d0= >r id>snap#
5ae0: 20 23 40 20 64 30 3d 20 72 3e 20 61 6e 64 20 6f   #@ d0= r> and o
5af0: 3e 0a 20 20 20 20 49 46 20 20 3e 72 65 76 69 73  >.    IF  >revis
5b00: 69 6f 6e 20 20 45 4c 53 45 20 20 3e 66 69 6c 65  ion  ELSE  >file
5b10: 2d 68 61 73 68 20 64 76 63 73 3a 68 61 73 68 24  -hash dvcs:hash$
5b20: 20 24 21 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 3f   $!  THEN ;..: ?
5b30: 64 65 6c 65 74 65 2d 66 69 6c 65 20 28 20 61 64  delete-file ( ad
5b40: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 64 65  dr u -- ).    de
5b50: 6c 65 74 65 2d 66 69 6c 65 20 64 75 70 20 6e 6f  lete-file dup no
5b60: 2d 66 69 6c 65 23 20 3c 3e 20 61 6e 64 20 74 68  -file# <> and th
5b70: 72 6f 77 20 3b 0a 0a 3a 20 64 76 63 73 2d 73 69  row ;..: dvcs-si
5b80: 67 24 20 28 20 2d 2d 20 29 0a 20 20 20 20 6c 61  g$ ( -- ).    la
5b90: 73 74 2d 73 69 67 6e 65 64 20 32 40 20 73 69 67  st-signed 2@ sig
5ba0: 64 61 74 65 40 20 6f 76 65 72 20 31 20 36 34 73  date@ over 1 64s
5bb0: 20 38 35 74 79 70 65 20 32 20 36 34 73 20 2f 73   85type 2 64s /s
5bc0: 74 72 69 6e 67 0a 20 20 20 20 63 3a 30 6b 65 79  tring.    c:0key
5bd0: 20 3e 68 61 73 68 20 68 61 73 68 74 6d 70 20 68   >hash hashtmp h
5be0: 61 73 68 23 31 32 38 20 38 35 74 79 70 65 20 3b  ash#128 85type ;
5bf0: 0a 20 0a 3a 20 28 64 76 63 73 2d 63 69 29 20 28  . .: (dvcs-ci) (
5c00: 20 61 64 64 72 20 75 20 6f 3a 64 76 63 73 20 2d   addr u o:dvcs -
5c10: 2d 20 29 20 64 76 63 73 3a 6d 65 73 73 61 67 65  - ) dvcs:message
5c20: 24 20 24 21 0a 20 20 20 20 64 76 63 73 3a 6f 6c  $ $!.    dvcs:ol
5c30: 64 69 64 24 20 64 76 63 73 2d 72 65 61 64 69 6e  did$ dvcs-readin
5c40: 0a 20 20 20 20 72 65 66 2d 66 69 6c 65 73 5b 5d  .    ref-files[]
5c50: 20 24 5b 5d 23 20 6e 65 77 2d 66 69 6c 65 73 5b   $[]# new-files[
5c60: 5d 20 24 5b 5d 23 20 64 65 6c 2d 66 69 6c 65 73  ] $[]# del-files
5c70: 5b 5d 20 24 5b 5d 23 20 6f 72 20 6f 72 20 30 3d  [] $[]# or or 0=
5c80: 20 49 46 0a 09 2e 22 20 4e 6f 74 68 69 6e 67 20   IF..." Nothing 
5c90: 74 6f 20 64 6f 22 20 63 72 0a 20 20 20 20 45 4c  to do" cr.    EL
5ca0: 53 45 0a 09 5b 27 5d 20 63 6f 6d 70 75 74 65 2d  SE..['] compute-
5cb0: 64 69 66 66 20 67 65 6e 2d 63 6d 64 24 0a 09 24  diff gen-cmd$..$
5cc0: 6d 61 6b 65 20 7b 20 77 5e 20 64 69 66 66 24 20  make { w^ diff$ 
5cd0: 7d 20 64 69 66 66 24 20 24 40 20 5c 20 32 64 75  } diff$ $@ \ 2du
5ce0: 70 20 6e 65 74 32 6f 3a 73 65 65 0a 09 64 76 63  p net2o:see..dvc
5cf0: 73 28 20 2e 22 20 3d 3d 3d 3d 3d 20 70 61 74 63  s( ." ===== patc
5d00: 68 20 6c 65 6e 3a 20 22 20 64 76 63 73 3a 70 61  h len: " dvcs:pa
5d10: 74 63 68 24 20 24 40 6c 65 6e 20 2e 20 2e 22 20  tch$ $@len . ." 
5d20: 3d 3d 3d 3d 3d 22 20 63 72 20 29 0a 09 64 65 6c  =====" cr )..del
5d30: 2d 66 69 6c 65 73 5b 5d 20 5b 27 5d 20 2d 66 69  -files[] ['] -fi
5d40: 6c 65 65 6e 74 72 79 20 24 5b 5d 6d 61 70 0a 09  leentry $[]map..
5d50: 6e 65 77 2d 66 69 6c 65 73 5b 5d 20 5b 27 5d 20  new-files[] ['] 
5d60: 2b 66 69 6c 65 65 6e 74 72 79 20 24 5b 5d 6d 61  +fileentry $[]ma
5d70: 70 0a 09 72 65 66 2d 66 69 6c 65 73 5b 5d 20 5b  p..ref-files[] [
5d80: 27 5d 20 2b 66 69 6c 65 65 6e 74 72 79 20 24 5b  '] +fileentry $[
5d90: 5d 6d 61 70 0a 09 3e 69 64 2d 72 65 76 69 73 69  ]map..>id-revisi
5da0: 6f 6e 20 20 6d 79 2d 6b 65 79 20 3e 72 0a 09 6d  on  my-key >r..m
5db0: 79 2d 6b 65 79 2d 64 65 66 61 75 6c 74 20 74 6f  y-key-default to
5dc0: 20 6d 79 2d 6b 65 79 20 20 64 76 63 73 2d 6e 65   my-key  dvcs-ne
5dd0: 77 73 65 6e 74 72 79 0a 09 72 3e 20 74 6f 20 6d  wsentry..r> to m
5de0: 79 2d 6b 65 79 0a 09 5b 27 5d 20 64 76 63 73 2d  y-key..['] dvcs-
5df0: 73 69 67 24 20 70 72 6f 6a 65 63 74 3a 63 68 61  sig$ project:cha
5e00: 69 6e 24 20 24 73 65 74 0a 09 73 61 76 65 2d 70  in$ $set..save-p
5e10: 72 6f 6a 65 63 74 20 20 66 69 6c 65 6c 69 73 74  roject  filelist
5e20: 2d 6f 75 74 0a 09 22 7e 2b 2f 2e 6e 32 6f 2f 6e  -out.."~+/.n2o/n
5e30: 65 77 66 69 6c 65 73 22 20 3f 64 65 6c 65 74 65  ewfiles" ?delete
5e40: 2d 66 69 6c 65 0a 09 22 7e 2b 2f 2e 6e 32 6f 2f  -file.."~+/.n2o/
5e50: 72 65 66 66 69 6c 65 73 22 20 3f 64 65 6c 65 74  reffiles" ?delet
5e60: 65 2d 66 69 6c 65 0a 09 64 69 66 66 24 20 24 66  e-file..diff$ $f
5e70: 72 65 65 0a 20 20 20 20 54 48 45 4e 20 20 63 6c  ree.    THEN  cl
5e80: 65 61 6e 2d 75 70 20 3b 0a 0a 3a 20 64 76 63 73  ean-up ;..: dvcs
5e90: 2d 63 69 20 28 20 61 64 64 72 20 75 20 2d 2d 20  -ci ( addr u -- 
5ea0: 29 20 5c 20 63 68 65 63 6b 69 6e 20 63 6f 6d 6d  ) \ checkin comm
5eb0: 61 6e 64 0a 20 20 20 20 64 76 63 73 3a 6e 65 77  and.    dvcs:new
5ec0: 2d 64 76 63 73 20 3e 6f 20 6e 6f 77 3e 6e 65 76  -dvcs >o now>nev
5ed0: 65 72 20 28 64 76 63 73 2d 63 69 29 20 20 64 76  er (dvcs-ci)  dv
5ee0: 63 73 3a 64 69 73 70 6f 73 65 2d 64 76 63 73 20  cs:dispose-dvcs 
5ef0: 6f 3e 20 3b 0a 0a 3a 20 64 76 63 73 2d 64 69 66  o> ;..: dvcs-dif
5f00: 66 20 28 20 2d 2d 20 29 0a 20 20 20 20 64 76 63  f ( -- ).    dvc
5f10: 73 3a 6e 65 77 2d 64 76 63 73 20 3e 6f 20 64 76  s:new-dvcs >o dv
5f20: 63 73 3a 6f 6c 64 69 64 24 20 64 76 63 73 2d 72  cs:oldid$ dvcs-r
5f30: 65 61 64 69 6e 0a 20 20 20 20 5b 27 5d 20 63 6f  eadin.    ['] co
5f40: 6d 70 75 74 65 2d 64 69 66 66 20 67 65 6e 2d 63  mpute-diff gen-c
5f50: 6d 64 24 20 32 64 72 6f 70 0a 20 20 20 20 64 76  md$ 2drop.    dv
5f60: 63 73 28 20 2e 22 20 3d 3d 3d 3d 3d 20 64 69 66  cs( ." ===== dif
5f70: 66 20 6c 65 6e 3a 20 22 20 64 76 63 73 3a 70 61  f len: " dvcs:pa
5f80: 74 63 68 24 20 24 40 6c 65 6e 20 2e 20 2e 22 20  tch$ $@len . ." 
5f90: 3d 3d 3d 3d 3d 22 20 63 72 20 29 0a 20 20 20 20  =====" cr ).    
5fa0: 64 76 63 73 3a 69 6e 2d 66 69 6c 65 73 24 20 64  dvcs:in-files$ d
5fb0: 76 63 73 3a 70 61 74 63 68 24 20 63 6f 6c 6f 72  vcs:patch$ color
5fc0: 2d 62 70 61 74 63 68 24 32 0a 20 20 20 20 63 6c  -bpatch$2.    cl
5fd0: 65 61 6e 2d 75 70 20 20 64 76 63 73 3a 64 69 73  ean-up  dvcs:dis
5fe0: 70 6f 73 65 2d 64 76 63 73 20 6f 3e 20 3b 0a 0a  pose-dvcs o> ;..
5ff0: 3a 20 63 69 2d 61 72 67 73 20 28 20 2d 2d 20 6d  : ci-args ( -- m
6000: 65 73 73 61 67 65 20 75 20 29 0a 20 20 20 20 3f  essage u ).    ?
6010: 6e 65 78 74 61 72 67 20 30 3d 20 49 46 20 22 75  nextarg 0= IF "u
6020: 6e 74 69 74 6c 65 64 20 63 68 65 63 6b 69 6e 22  ntitled checkin"
6030: 20 54 48 45 4e 0a 20 20 20 20 32 64 75 70 20 22   THEN.    2dup "
6040: 2d 6d 22 20 73 74 72 3d 20 49 46 20 20 3f 6e 65  -m" str= IF  ?ne
6050: 78 74 61 72 67 20 49 46 20 20 32 6e 69 70 20 20  xtarg IF  2nip  
6060: 54 48 45 4e 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  THEN  THEN ;..: 
6070: 64 76 63 73 2d 61 64 64 20 28 20 61 64 64 72 20  dvcs-add ( addr 
6080: 75 20 2d 2d 20 29 0a 20 20 20 20 32 64 75 70 20  u -- ).    2dup 
6090: 64 69 72 6e 61 6d 65 20 64 75 70 20 30 3c 3e 20  dirname dup 0<> 
60a0: 2b 20 64 75 70 20 49 46 20 20 72 65 63 75 72 73  + dup IF  recurs
60b0: 65 20 20 45 4c 53 45 20 20 32 64 72 6f 70 20 20  e  ELSE  2drop  
60c0: 54 48 45 4e 0a 20 20 20 20 32 64 75 70 20 64 76  THEN.    2dup dv
60d0: 63 73 3a 66 69 6c 65 73 23 20 23 40 20 64 72 6f  cs:files# #@ dro
60e0: 70 20 49 46 20 20 32 64 72 6f 70 20 20 45 58 49  p IF  2drop  EXI
60f0: 54 0a 20 20 20 20 45 4c 53 45 0a 09 5c 20 22 64  T.    ELSE..\ "d
6100: 75 6d 6d 79 31 32 38 64 75 6d 6d 79 31 32 38 64  ummy128dummy128d
6110: 75 6d 6d 79 31 32 38 64 75 6d 6d 79 31 32 38 22  ummy128dummy128"
6120: 20 32 6f 76 65 72 20 64 76 63 73 3a 66 69 6c 65   2over dvcs:file
6130: 73 23 20 23 21 0a 09 22 7e 2b 2f 2e 6e 32 6f 2f  s# #!.."~+/.n2o/
6140: 6e 65 77 66 69 6c 65 73 22 20 61 70 70 65 6e 64  newfiles" append
6150: 2d 6c 69 6e 65 20 20 54 48 45 4e 20 3b 0a 0a 3a  -line  THEN ;..:
6160: 20 64 76 63 73 2d 72 65 66 20 28 20 61 64 64 72   dvcs-ref ( addr
6170: 20 75 20 2d 2d 20 29 0a 20 20 20 20 32 64 75 70   u -- ).    2dup
6180: 20 64 69 72 6e 61 6d 65 20 64 75 70 20 30 3c 3e   dirname dup 0<>
6190: 20 2b 20 64 75 70 20 49 46 20 20 64 76 63 73 2d   + dup IF  dvcs-
61a0: 61 64 64 20 20 45 4c 53 45 20 20 32 64 72 6f 70  add  ELSE  2drop
61b0: 20 20 54 48 45 4e 0a 20 20 20 20 32 64 75 70 20    THEN.    2dup 
61c0: 64 76 63 73 3a 66 69 6c 65 73 23 20 23 40 20 64  dvcs:files# #@ d
61d0: 72 6f 70 20 49 46 20 20 32 64 72 6f 70 20 20 45  rop IF  2drop  E
61e0: 58 49 54 0a 20 20 20 20 45 4c 53 45 20 20 22 7e  XIT.    ELSE  "~
61f0: 2b 2f 2e 6e 32 6f 2f 72 65 66 66 69 6c 65 73 22  +/.n2o/reffiles"
6200: 20 61 70 70 65 6e 64 2d 6c 69 6e 65 20 20 54 48   append-line  TH
6210: 45 4e 20 3b 0a 0a 3a 20 64 76 63 73 2d 73 6e 61  EN ;..: dvcs-sna
6220: 70 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  p ( addr u -- ).
6230: 20 20 20 20 64 76 63 73 3a 6e 65 77 2d 64 76 63      dvcs:new-dvc
6240: 73 20 3e 6f 20 20 64 76 63 73 3a 6d 65 73 73 61  s >o  dvcs:messa
6250: 67 65 24 20 24 21 0a 20 20 20 20 63 6f 6e 66 69  ge$ $!.    confi
6260: 67 3e 64 76 63 73 20 20 66 69 6c 65 73 3e 64 76  g>dvcs  files>dv
6270: 63 73 0a 20 20 20 20 64 76 63 73 3a 66 69 6c 65  cs.    dvcs:file
6280: 73 23 20 5b 3a 0a 09 64 75 70 20 63 65 6c 6c 2b  s# [:..dup cell+
6290: 20 24 40 20 64 72 6f 70 20 68 61 73 68 23 31 32   $@ drop hash#12
62a0: 38 20 2b 20 64 76 63 73 3a 70 65 72 6d 20 6c 65  8 + dvcs:perm le
62b0: 2d 75 77 40 20 24 31 30 30 30 20 61 6e 64 0a 09  -uw@ $1000 and..
62c0: 49 46 20 20 20 20 24 40 20 20 72 65 66 2d 68 61  IF    $@  ref-ha
62d0: 73 68 73 74 61 74 20 72 65 66 2d 66 69 6c 65 73  shstat ref-files
62e0: 5b 5d 0a 09 45 4c 53 45 20 20 24 40 20 66 69 6c  []..ELSE  $@ fil
62f0: 65 2d 68 61 73 68 73 74 61 74 20 6e 65 77 2d 66  e-hashstat new-f
6300: 69 6c 65 73 5b 5d 20 20 54 48 45 4e 0a 09 24 69  iles[]  THEN..$i
6310: 6e 73 5b 5d 66 20 3b 5d 20 23 6d 61 70 0a 20 20  ns[]f ;] #map.  
6320: 20 20 5b 27 5d 20 63 6f 6d 70 75 74 65 2d 64 69    ['] compute-di
6330: 66 66 20 67 65 6e 2d 63 6d 64 24 20 3e 69 64 2d  ff gen-cmd$ >id-
6340: 72 65 76 69 73 69 6f 6e 0a 20 20 20 20 6e 6f 77  revision.    now
6350: 3e 6e 65 76 65 72 20 20 64 76 63 73 2d 73 6e 61  >never  dvcs-sna
6360: 70 65 6e 74 72 79 0a 20 20 20 20 73 61 76 65 2d  pentry.    save-
6370: 70 72 6f 6a 65 63 74 20 20 63 6c 65 61 6e 2d 75  project  clean-u
6380: 70 20 64 76 63 73 3a 64 69 73 70 6f 73 65 2d 64  p dvcs:dispose-d
6390: 76 63 73 20 6f 3e 20 3b 0a 0a 3a 20 64 65 6c 2d  vcs o> ;..: del-
63a0: 6f 6c 64 66 69 6c 65 20 28 20 68 61 73 68 2d 65  oldfile ( hash-e
63b0: 6e 74 72 79 20 2d 2d 20 29 0a 20 20 20 20 64 75  ntry -- ).    du
63c0: 70 20 63 65 6c 6c 2b 20 24 40 20 64 72 6f 70 20  p cell+ $@ drop 
63d0: 68 61 73 68 23 31 32 38 20 64 76 63 73 3a 70 65  hash#128 dvcs:pe
63e0: 72 6d 20 2b 20 6c 65 2d 75 77 40 0a 20 20 20 20  rm + le-uw@.    
63f0: 53 5f 49 46 4d 54 3f 20 61 6e 64 20 53 5f 49 46  S_IFMT? and S_IF
6400: 44 49 52 20 3d 20 49 46 0a 09 24 40 20 64 76 63  DIR = IF..$@ dvc
6410: 73 28 20 2e 22 20 72 64 20 22 20 32 64 75 70 20  s( ." rd " 2dup 
6420: 74 79 70 65 20 63 72 20 29 20 64 76 63 73 3a 72  type cr ) dvcs:r
6430: 6d 64 69 72 73 5b 5d 20 24 69 6e 73 5b 5d 20 64  mdirs[] $ins[] d
6440: 72 6f 70 0a 20 20 20 20 45 4c 53 45 20 20 64 75  rop.    ELSE  du
6450: 70 20 24 40 20 64 76 63 73 28 20 2e 22 20 72 6d  p $@ dvcs( ." rm
6460: 20 22 20 32 64 75 70 20 74 79 70 65 20 63 72 20   " 2dup type cr 
6470: 29 0a 09 64 65 6c 65 74 65 2d 66 69 6c 65 20 64  )..delete-file d
6480: 75 70 20 30 3c 20 49 46 0a 09 20 20 20 20 3c 77  up 0< IF..    <w
6490: 61 72 6e 3e 20 3e 72 20 2e 22 20 63 61 6e 27 74  arn> >r ." can't
64a0: 20 64 65 6c 65 74 65 20 66 69 6c 65 20 22 20 24   delete file " $
64b0: 2e 20 2e 22 20 3a 20 22 0a 09 20 20 20 20 72 3e  . ." : "..    r>
64c0: 20 65 72 72 6f 72 24 20 74 79 70 65 20 3c 64 65   error$ type <de
64d0: 66 61 75 6c 74 3e 20 63 72 0a 09 45 4c 53 45 20  fault> cr..ELSE 
64e0: 20 32 64 72 6f 70 20 20 54 48 45 4e 0a 20 20 20   2drop  THEN.   
64f0: 20 54 48 45 4e 20 3b 0a 0a 3a 20 6e 65 77 2d 3e   THEN ;..: new->
6500: 6f 6c 64 20 28 20 2d 2d 20 29 20 64 76 63 73 28  old ( -- ) dvcs(
6510: 20 2e 22 20 3d 3d 3d 20 72 65 6d 6f 76 65 20 6f   ." === remove o
6520: 6c 64 20 66 69 6c 65 73 20 3d 3d 3d 22 20 63 72  ld files ===" cr
6530: 20 29 0a 20 20 20 20 64 76 63 73 3a 72 6d 64 69   ).    dvcs:rmdi
6540: 72 73 5b 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20  rs[] $[]off.    
6550: 64 76 63 73 3a 6f 6c 64 66 69 6c 65 73 23 20 5b  dvcs:oldfiles# [
6560: 3a 20 64 75 70 20 24 40 20 64 76 63 73 3a 66 69  : dup $@ dvcs:fi
6570: 6c 65 73 23 20 23 40 20 64 72 6f 70 20 30 3d 20  les# #@ drop 0= 
6580: 49 46 0a 09 20 20 20 20 64 65 6c 2d 6f 6c 64 66  IF..    del-oldf
6590: 69 6c 65 0a 09 45 4c 53 45 20 20 64 75 70 20 63  ile..ELSE  dup c
65a0: 65 6c 6c 2b 20 24 40 20 6c 61 73 74 23 20 63 65  ell+ $@ last# ce
65b0: 6c 6c 2b 20 24 40 20 73 74 72 3d 20 30 3d 20 49  ll+ $@ str= 0= I
65c0: 46 0a 09 09 64 65 6c 2d 6f 6c 64 66 69 6c 65 20  F...del-oldfile 
65d0: 20 54 48 45 4e 0a 09 54 48 45 4e 20 3b 5d 20 23   THEN..THEN ;] #
65e0: 6d 61 70 0a 20 20 20 20 64 76 63 73 3a 72 6d 64  map.    dvcs:rmd
65f0: 69 72 73 5b 5d 20 24 40 20 62 6f 75 6e 64 73 20  irs[] $@ bounds 
6600: 63 65 6c 6c 2d 20 73 77 61 70 20 63 65 6c 6c 2d  cell- swap cell-
6610: 20 55 2d 44 4f 0a 09 49 20 24 40 20 72 6d 64 69   U-DO..I $@ rmdi
6620: 72 20 30 3c 20 49 46 0a 09 20 20 20 20 65 72 72  r 0< IF..    err
6630: 6e 6f 20 73 74 72 65 72 72 6f 72 20 3c 77 61 72  no strerror <war
6640: 6e 3e 0a 09 20 20 20 20 2e 22 20 63 61 6e 27 74  n>..    ." can't
6650: 20 64 65 6c 65 74 65 20 64 69 72 65 63 74 6f 72   delete director
6660: 79 20 22 20 49 20 24 2e 20 2e 22 20 3a 20 22 20  y " I $. ." : " 
6670: 74 79 70 65 20 3c 64 65 66 61 75 6c 74 3e 20 63  type <default> c
6680: 72 0a 09 54 48 45 4e 0a 20 20 20 20 63 65 6c 6c  r..THEN.    cell
6690: 20 2d 4c 4f 4f 50 0a 20 20 20 20 64 76 63 73 3a   -LOOP.    dvcs:
66a0: 72 6d 64 69 72 73 5b 5d 20 24 5b 5d 6f 66 66 20  rmdirs[] $[]off 
66b0: 3b 0a 3a 20 6f 6c 64 2d 3e 6e 65 77 20 28 20 2d  ;.: old->new ( -
66c0: 2d 20 29 20 64 76 63 73 28 20 2e 22 20 3d 3d 3d  - ) dvcs( ." ===
66d0: 20 77 72 69 74 65 20 6f 75 74 20 6e 65 77 20 66   write out new f
66e0: 69 6c 65 73 20 3d 3d 3d 22 20 63 72 20 29 0a 20  iles ===" cr ). 
66f0: 20 20 20 64 76 63 73 3a 6f 75 74 66 69 6c 65 73     dvcs:outfiles
6700: 5b 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20 64 76  [] $[]off.    dv
6710: 63 73 3a 66 69 6c 65 73 23 20 5b 3a 20 24 40 20  cs:files# [: $@ 
6720: 64 76 63 73 3a 6f 75 74 66 69 6c 65 73 5b 5d 20  dvcs:outfiles[] 
6730: 24 69 6e 73 5b 5d 20 64 72 6f 70 20 3b 5d 20 23  $ins[] drop ;] #
6740: 6d 61 70 20 5c 20 73 6f 72 74 20 66 69 6c 65 6e  map \ sort filen
6750: 61 6d 65 73 0a 20 20 20 20 64 76 63 73 3a 6f 75  ames.    dvcs:ou
6760: 74 66 69 6c 65 73 5b 5d 20 5b 3a 20 64 76 63 73  tfiles[] [: dvcs
6770: 3a 66 69 6c 65 73 23 20 23 40 20 64 30 3c 3e 20  :files# #@ d0<> 
6780: 49 46 0a 09 20 20 20 20 6c 61 73 74 23 20 64 75  IF..    last# du
6790: 70 20 3e 72 20 24 40 20 64 76 63 73 3a 6f 6c 64  p >r $@ dvcs:old
67a0: 66 69 6c 65 73 23 20 23 40 20 6f 76 65 72 20 49  files# #@ over I
67b0: 46 0a 09 09 72 40 20 63 65 6c 6c 2b 20 24 40 20  F...r@ cell+ $@ 
67c0: 73 74 72 3d 0a 09 20 20 20 20 45 4c 53 45 20 20  str=..    ELSE  
67d0: 64 72 6f 70 0a 09 20 20 20 20 54 48 45 4e 20 20  drop..    THEN  
67e0: 30 3d 20 49 46 0a 09 09 64 76 63 73 28 20 2e 22  0= IF...dvcs( ."
67f0: 20 6f 75 74 20 22 20 72 40 20 24 2e 20 73 70 61   out " r@ $. spa
6800: 63 65 20 72 40 20 63 65 6c 6c 2b 20 24 40 20 38  ce r@ cell+ $@ 8
6810: 35 74 79 70 65 20 63 72 20 29 0a 09 09 72 40 20  5type cr )...r@ 
6820: 63 65 6c 6c 2b 20 24 40 20 72 40 20 24 40 20 64  cell+ $@ r@ $@ d
6830: 76 63 73 2d 6f 75 74 66 69 6c 65 2d 6e 61 6d 65  vcs-outfile-name
6840: 0a 09 20 20 20 20 54 48 45 4e 20 20 72 64 72 6f  ..    THEN  rdro
6850: 70 20 20 54 48 45 4e 20 3b 5d 20 24 5b 5d 6d 61  p  THEN ;] $[]ma
6860: 70 0a 20 20 20 20 64 76 63 73 3a 6f 75 74 66 69  p.    dvcs:outfi
6870: 6c 65 73 5b 5d 20 24 5b 5d 6f 66 66 20 3b 0a 0a  les[] $[]off ;..
6880: 3a 20 63 6f 2d 72 65 73 74 20 28 20 2d 2d 20 29  : co-rest ( -- )
6890: 0a 20 20 20 20 30 20 64 76 63 73 3a 66 69 6c 65  .    0 dvcs:file
68a0: 73 23 20 21 40 20 64 76 63 73 3a 6f 6c 64 66 69  s# !@ dvcs:oldfi
68b0: 6c 65 73 23 20 21 0a 20 20 20 20 62 72 61 6e 63  les# !.    branc
68c0: 68 65 73 3e 64 76 63 73 20 20 6e 65 77 2d 3e 6f  hes>dvcs  new->o
68d0: 6c 64 20 20 6f 6c 64 2d 3e 6e 65 77 0a 20 20 20  ld  old->new.   
68e0: 20 73 61 76 65 2d 70 72 6f 6a 65 63 74 20 20 66   save-project  f
68f0: 69 6c 65 6c 69 73 74 2d 6f 75 74 20 3b 0a 0a 3a  ilelist-out ;..:
6900: 20 64 76 63 73 2d 63 6f 20 28 20 61 64 64 72 20   dvcs-co ( addr 
6910: 75 20 2d 2d 20 29 20 5c 20 63 68 65 63 6b 6f 75  u -- ) \ checkou
6920: 74 20 72 65 76 69 73 69 6f 6e 0a 20 20 20 20 62  t revision.    b
6930: 61 73 65 38 35 3e 24 20 20 64 76 63 73 3a 6e 65  ase85>$  dvcs:ne
6940: 77 2d 64 76 63 73 20 3e 6f 0a 20 20 20 20 63 6f  w-dvcs >o.    co
6950: 6e 66 69 67 3e 64 76 63 73 20 20 20 64 76 63 73  nfig>dvcs   dvcs
6960: 3a 69 64 24 20 24 21 20 64 76 63 73 3a 69 64 24  :id$ $! dvcs:id$
6970: 20 20 64 76 63 73 2d 72 65 61 64 69 6e 20 20 63    dvcs-readin  c
6980: 6f 2d 72 65 73 74 0a 20 20 20 20 64 76 63 73 3a  o-rest.    dvcs:
6990: 64 69 73 70 6f 73 65 2d 64 76 63 73 20 6f 3e 20  dispose-dvcs o> 
69a0: 3b 0a 0a 3a 20 63 68 61 74 3e 73 65 61 72 63 68  ;..: chat>search
69b0: 73 2d 6c 6f 6f 70 20 28 20 6f 3a 63 6f 6d 6d 69  s-loop ( o:commi
69c0: 74 20 2d 2d 20 29 0a 20 20 20 20 6c 61 73 74 23  t -- ).    last#
69d0: 20 6d 73 67 2d 6c 6f 67 40 20 6f 76 65 72 20 7b   msg-log@ over {
69e0: 20 6c 6f 67 20 7d 20 62 6f 75 6e 64 73 20 3f 44   log } bounds ?D
69f0: 4f 0a 09 49 20 24 40 20 5b 27 5d 20 6d 73 67 3a  O..I $@ ['] msg:
6a00: 64 69 73 70 6c 61 79 20 63 61 74 63 68 20 49 46  display catch IF
6a10: 20 20 2e 22 20 69 6e 76 61 6c 69 64 20 65 6e 74    ." invalid ent
6a20: 72 79 22 20 63 72 20 32 64 72 6f 70 20 54 48 45  ry" cr 2drop THE
6a30: 4e 0a 20 20 20 20 63 65 6c 6c 20 2b 4c 4f 4f 50  N.    cell +LOOP
6a40: 20 20 6c 6f 67 20 66 72 65 65 20 74 68 72 6f 77    log free throw
6a50: 20 3b 0a 3a 20 73 65 61 72 63 68 2d 6c 61 73 74   ;.: search-last
6a60: 2d 72 65 76 20 28 20 2d 2d 20 61 64 64 72 20 75  -rev ( -- addr u
6a70: 20 29 0a 20 20 20 20 70 72 6f 6a 65 63 74 3a 70   ).    project:p
6a80: 72 6f 6a 65 63 74 24 20 24 40 20 40 2f 20 32 64  roject$ $@ @/ 2d
6a90: 72 6f 70 20 3f 6d 73 67 2d 6c 6f 67 0a 20 20 20  rop ?msg-log.   
6aa0: 20 70 72 6f 6a 65 63 74 3a 62 72 61 6e 63 68 24   project:branch$
6ab0: 20 24 40 0a 20 20 20 20 64 76 63 73 3a 73 65 61   $@.    dvcs:sea
6ac0: 72 63 68 73 20 40 20 3e 6f 20 6d 61 74 63 68 3a  rchs @ >o match:
6ad0: 74 61 67 24 20 24 21 0a 20 20 20 20 63 68 61 74  tag$ $!.    chat
6ae0: 3e 73 65 61 72 63 68 73 2d 6c 6f 6f 70 20 6d 61  >searchs-loop ma
6af0: 74 63 68 3a 69 64 24 20 24 40 20 6f 3e 20 3b 0a  tch:id$ $@ o> ;.
6b00: 0a 3a 20 64 76 63 73 2d 75 70 20 28 20 2d 2d 20  .: dvcs-up ( -- 
6b10: 29 20 5c 20 63 68 65 63 6b 6f 75 74 20 6c 61 74  ) \ checkout lat
6b20: 65 73 74 20 72 65 76 69 73 69 6f 6e 0a 20 20 20  est revision.   
6b30: 20 64 76 63 73 3a 6e 65 77 2d 64 76 63 73 20 3e   dvcs:new-dvcs >
6b40: 6f 0a 20 20 20 20 70 75 6c 6c 2d 72 65 61 64 69  o.    pull-readi
6b50: 6e 20 20 66 69 6c 65 73 3e 64 76 63 73 20 20 6e  n  files>dvcs  n
6b60: 65 77 3e 64 76 63 73 20 20 64 76 63 73 3f 6d 6f  ew>dvcs  dvcs?mo
6b70: 64 69 66 69 65 64 0a 20 20 20 20 6e 65 77 2d 66  dified.    new-f
6b80: 69 6c 65 73 5b 5d 20 24 5b 5d 23 20 64 65 6c 2d  iles[] $[]# del-
6b90: 66 69 6c 65 73 5b 5d 20 24 5b 5d 23 20 64 30 3d  files[] $[]# d0=
6ba0: 20 49 46 0a 09 73 65 61 72 63 68 2d 6c 61 73 74   IF..search-last
6bb0: 2d 72 65 76 20 20 32 64 75 70 20 64 76 63 73 3a  -rev  2dup dvcs:
6bc0: 69 64 24 20 24 21 0a 09 32 64 75 70 20 64 76 63  id$ $!..2dup dvc
6bd0: 73 3a 6f 6c 64 69 64 24 20 24 40 20 73 74 72 3d  s:oldid$ $@ str=
6be0: 20 49 46 0a 09 20 20 20 20 32 64 72 6f 70 20 2e   IF..    2drop .
6bf0: 22 20 61 6c 72 65 61 64 79 20 75 70 20 74 6f 20  " already up to 
6c00: 64 61 74 65 22 20 63 72 0a 09 45 4c 53 45 20 20  date" cr..ELSE  
6c10: 69 64 3e 62 72 61 6e 63 68 65 73 20 20 63 6f 2d  id>branches  co-
6c20: 72 65 73 74 20 20 54 48 45 4e 0a 20 20 20 20 45  rest  THEN.    E
6c30: 4c 53 45 0a 09 2e 22 20 4c 6f 63 61 6c 20 63 68  LSE..." Local ch
6c40: 61 6e 67 65 73 2c 20 64 6f 6e 27 74 20 75 70 64  anges, don't upd
6c50: 61 74 65 22 20 63 72 0a 20 20 20 20 54 48 45 4e  ate" cr.    THEN
6c60: 0a 20 20 20 20 64 76 63 73 3a 64 69 73 70 6f 73  .    dvcs:dispos
6c70: 65 2d 64 76 63 73 20 6f 3e 20 3b 0a 0a 3a 20 64  e-dvcs o> ;..: d
6c80: 76 63 73 2d 72 65 76 65 72 74 20 28 20 2d 2d 20  vcs-revert ( -- 
6c90: 29 20 5c 20 72 65 73 74 6f 72 65 20 74 6f 20 6c  ) \ restore to l
6ca0: 61 73 74 20 72 65 76 69 73 69 6f 6e 0a 20 20 20  ast revision.   
6cb0: 20 64 76 63 73 3a 6e 65 77 2d 64 76 63 73 20 3e   dvcs:new-dvcs >
6cc0: 6f 0a 20 20 20 20 70 75 6c 6c 2d 72 65 61 64 69  o.    pull-readi
6cd0: 6e 20 20 64 76 63 73 3a 6f 6c 64 69 64 24 20 24  n  dvcs:oldid$ $
6ce0: 40 20 20 32 64 75 70 20 64 76 63 73 3a 69 64 24  @  2dup dvcs:id$
6cf0: 20 24 21 0a 20 20 20 20 69 64 3e 62 72 61 6e 63   $!.    id>branc
6d00: 68 65 73 20 20 63 6f 2d 72 65 73 74 0a 20 20 20  hes  co-rest.   
6d10: 20 64 76 63 73 3a 64 69 73 70 6f 73 65 2d 64 76   dvcs:dispose-dv
6d20: 63 73 20 6f 3e 20 3b 0a 0a 68 61 73 68 23 31 32  cs o> ;..hash#12
6d30: 38 20 62 75 66 66 65 72 3a 20 68 61 73 68 2d 73  8 buffer: hash-s
6d40: 61 76 65 0a 0a 3a 20 68 61 73 68 2d 69 6e 20 28  ave..: hash-in (
6d50: 20 61 64 64 72 20 75 20 2d 2d 20 68 61 73 68 20   addr u -- hash 
6d60: 75 20 29 0a 20 20 20 20 32 64 75 70 20 3e 66 69  u ).    2dup >fi
6d70: 6c 65 2d 68 61 73 68 20 68 61 73 68 2d 73 61 76  le-hash hash-sav
6d80: 65 20 68 61 73 68 23 31 32 38 20 73 6d 6f 76 65  e hash#128 smove
6d90: 0a 20 20 20 20 77 72 69 74 65 2d 65 6e 63 2d 68  .    write-enc-h
6da0: 61 73 68 65 64 20 32 64 72 6f 70 0a 20 20 20 20  ashed 2drop.    
6db0: 68 61 73 68 2d 73 61 76 65 20 68 61 73 68 23 31  hash-save hash#1
6dc0: 32 38 20 3b 0a 3a 20 68 61 73 68 2d 61 64 64 20  28 ;.: hash-add 
6dd0: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20  ( addr u -- ).  
6de0: 20 20 73 6c 75 72 70 2d 66 69 6c 65 20 68 61 73    slurp-file has
6df0: 68 2d 69 6e 20 32 64 72 6f 70 20 3b 0a 3a 20 68  h-in 2drop ;.: h
6e00: 61 73 68 2d 6f 75 74 20 28 20 61 64 64 72 20 75  ash-out ( addr u
6e10: 20 2d 2d 20 29 0a 20 20 20 20 62 61 73 65 38 35   -- ).    base85
6e20: 3e 24 20 32 64 75 70 20 32 3e 72 20 72 65 61 64  >$ 2dup 2>r read
6e30: 2d 65 6e 63 2d 68 61 73 68 65 64 20 70 61 74 63  -enc-hashed patc
6e40: 68 2d 69 6e 24 20 24 40 20 32 72 3e 20 68 61 73  h-in$ $@ 2r> has
6e50: 68 2d 38 35 20 73 70 69 74 2d 66 69 6c 65 20 3b  h-85 spit-file ;
6e60: 0a 0a 5c 20 70 75 6c 6c 20 61 6e 64 20 73 79 6e  ..\ pull and syn
6e70: 63 20 61 20 64 61 74 61 62 61 73 65 0a 0a 24 42  c a database..$B
6e80: 20 24 45 20 32 56 61 6c 75 65 20 64 76 63 73 2d   $E 2Value dvcs-
6e90: 62 75 66 73 23 0a 0a 56 61 72 69 61 62 6c 65 20  bufs#..Variable 
6ea0: 64 76 63 73 2d 72 65 71 75 65 73 74 23 0a 56 61  dvcs-request#.Va
6eb0: 72 69 61 62 6c 65 20 73 79 6e 63 2d 66 69 6c 65  riable sync-file
6ec0: 2d 6c 69 73 74 5b 5d 0a 24 31 30 20 43 6f 6e 73  -list[].$10 Cons
6ed0: 74 61 6e 74 20 2f 73 79 6e 63 2d 66 69 6c 65 73  tant /sync-files
6ee0: 0a 24 32 30 20 2f 73 79 6e 63 2d 66 69 6c 65 73  .$20 /sync-files
6ef0: 20 2a 20 43 6f 6e 73 74 61 6e 74 20 2f 73 79 6e   * Constant /syn
6f00: 63 2d 72 65 71 73 0a 0a 3a 20 64 76 63 73 2d 73  c-reqs..: dvcs-s
6f10: 79 6e 63 2d 6e 6f 6e 65 20 28 20 2d 2d 20 29 0a  ync-none ( -- ).
6f20: 20 20 20 20 2d 31 20 64 76 63 73 2d 72 65 71 75      -1 dvcs-requ
6f30: 65 73 74 23 20 2b 21 40 20 30 3c 3d 20 49 46 20  est# +!@ 0<= IF 
6f40: 20 64 76 63 73 2d 72 65 71 75 65 73 74 23 20 6f   dvcs-request# o
6f50: 66 66 20 20 54 48 45 4e 20 3b 0a 0a 65 76 65 6e  ff  THEN ;..even
6f60: 74 3a 20 3a 3e 64 76 63 73 2d 73 79 6e 63 2d 64  t: :>dvcs-sync-d
6f70: 6f 6e 65 20 28 20 6f 20 2d 2d 20 29 20 3e 6f 0a  one ( o -- ) >o.
6f80: 20 20 20 20 66 69 6c 65 2d 72 65 67 23 20 6f 66      file-reg# of
6f90: 66 20 20 66 69 6c 65 2d 63 6f 75 6e 74 20 6f 66  f  file-count of
6fa0: 66 0a 20 20 20 20 6d 73 67 2d 67 72 6f 75 70 24  f.    msg-group$
6fb0: 20 24 40 20 3f 73 61 76 65 2d 6d 73 67 20 20 30   $@ ?save-msg  0
6fc0: 20 64 76 63 73 2d 72 65 71 75 65 73 74 23 20 21   dvcs-request# !
6fd0: 0a 20 20 20 20 6d 73 67 28 20 2e 22 20 3d 3d 3d  .    msg( ." ===
6fe0: 20 6d 65 74 61 64 61 74 61 20 73 79 6e 63 20 64   metadata sync d
6ff0: 6f 6e 65 20 3d 3d 3d 22 20 66 6f 72 74 68 3a 63  one ===" forth:c
7000: 72 20 29 20 6f 3e 20 3b 0a 0a 3a 20 64 76 63 73  r ) o> ;..: dvcs
7010: 2d 73 79 6e 63 2d 64 6f 6e 65 20 28 20 2d 2d 20  -sync-done ( -- 
7020: 29 0a 20 20 20 20 6d 73 67 28 20 2e 22 20 64 76  ).    msg( ." dv
7030: 63 73 2d 73 79 6e 63 2d 64 6f 6e 65 22 20 66 6f  cs-sync-done" fo
7040: 72 74 68 3a 63 72 20 29 0a 20 20 20 20 6e 65 74  rth:cr ).    net
7050: 32 6f 3a 63 6c 6f 73 65 2d 61 6c 6c 0a 20 20 20  2o:close-all.   
7060: 20 6d 73 67 28 20 2e 22 20 64 76 63 73 2d 73 79   msg( ." dvcs-sy
7070: 6e 63 2d 64 6f 6e 65 20 63 6c 6f 73 65 64 22 20  nc-done closed" 
7080: 66 6f 72 74 68 3a 63 72 20 29 0a 20 20 20 20 3c  forth:cr ).    <
7090: 65 76 65 6e 74 20 6f 20 65 6c 69 74 2c 20 3a 3e  event o elit, :>
70a0: 64 76 63 73 2d 73 79 6e 63 2d 64 6f 6e 65 20 77  dvcs-sync-done w
70b0: 61 69 74 2d 74 61 73 6b 20 40 20 65 76 65 6e 74  ait-task @ event
70c0: 3e 20 3b 0a 0a 3a 20 2b 64 76 63 73 2d 73 79 6e  > ;..: +dvcs-syn
70d0: 63 2d 64 6f 6e 65 20 28 20 2d 2d 20 29 0a 20 20  c-done ( -- ).  
70e0: 20 20 5b 27 5d 20 64 76 63 73 2d 73 79 6e 63 2d    ['] dvcs-sync-
70f0: 64 6f 6e 65 20 69 73 20 73 79 6e 63 2d 64 6f 6e  done is sync-don
7100: 65 2d 78 74 0a 20 20 20 20 5b 27 5d 20 64 76 63  e-xt.    ['] dvc
7110: 73 2d 73 79 6e 63 2d 6e 6f 6e 65 20 69 73 20 73  s-sync-none is s
7120: 79 6e 63 2d 6e 6f 6e 65 2d 78 74 20 3b 0a 0a 61  ync-none-xt ;..a
7130: 6c 73 6f 20 6e 65 74 32 6f 2d 62 61 73 65 0a 3a  lso net2o-base.:
7140: 20 64 76 63 73 2d 6a 6f 69 6e 2c 20 28 20 2d 2d   dvcs-join, ( --
7150: 20 29 0a 20 20 20 20 5b 3a 20 6d 73 67 2d 6a 6f   ).    [: msg-jo
7160: 69 6e 20 6c 61 73 74 3f 2c 20 3b 5d 20 5b 6d 73  in last?, ;] [ms
7170: 67 2c 5d 20 3b 0a 70 72 65 76 69 6f 75 73 0a 0a  g,] ;.previous..
7180: 3a 20 64 76 63 73 2d 67 72 65 65 74 20 28 20 2d  : dvcs-greet ( -
7190: 2d 20 29 0a 20 20 20 20 6e 65 74 32 6f 2d 63 6f  - ).    net2o-co
71a0: 64 65 20 65 78 70 65 63 74 2d 6d 73 67 0a 20 20  de expect-msg.  
71b0: 20 20 6c 6f 67 20 21 74 69 6d 65 20 65 6e 64 2d    log !time end-
71c0: 77 69 74 68 20 64 76 63 73 2d 6a 6f 69 6e 2c 20  with dvcs-join, 
71d0: 67 65 74 2d 69 70 20 65 6e 64 2d 63 6f 64 65 20  get-ip end-code 
71e0: 3b 0a 0a 3a 20 64 76 63 73 2d 63 6f 6e 6e 65 63  ;..: dvcs-connec
71f0: 74 20 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a  t ( addr u -- ).
7200: 20 20 20 20 64 76 63 73 2d 62 75 66 73 23 20 63      dvcs-bufs# c
7210: 68 61 74 23 2d 63 6f 6e 6e 65 63 74 3f 20 49 46  hat#-connect? IF
7220: 20 20 32 20 64 76 63 73 2d 72 65 71 75 65 73 74    2 dvcs-request
7230: 23 20 21 20 20 64 76 63 73 2d 67 72 65 65 74 20  # !  dvcs-greet 
7240: 20 54 48 45 4e 20 3b 0a 0a 3a 20 64 76 63 73 2d   THEN ;..: dvcs-
7250: 63 6f 6e 6e 65 63 74 2d 6b 65 79 20 28 20 61 64  connect-key ( ad
7260: 64 72 20 75 20 2d 2d 20 29 0a 20 20 20 20 6b 65  dr u -- ).    ke
7270: 79 3e 67 72 6f 75 70 20 3f 6c 6f 61 64 2d 6d 73  y>group ?load-ms
7280: 67 6e 0a 20 20 20 20 64 75 70 20 30 3d 20 49 46  gn.    dup 0= IF
7290: 20 20 32 64 72 6f 70 20 22 22 20 6d 73 67 2d 67    2drop "" msg-g
72a0: 72 6f 75 70 24 20 24 40 20 6d 73 67 2d 67 72 6f  roup$ $@ msg-gro
72b0: 75 70 73 20 23 21 20 20 54 48 45 4e 0a 20 20 20  ups #!  THEN.   
72c0: 20 32 64 75 70 20 73 65 61 72 63 68 2d 63 6f 6e   2dup search-con
72d0: 6e 65 63 74 20 3f 64 75 70 2d 49 46 20 20 3e 6f  nect ?dup-IF  >o
72e0: 20 2b 67 72 6f 75 70 20 72 64 72 6f 70 20 32 64   +group rdrop 2d
72f0: 72 6f 70 20 20 45 58 49 54 20 20 54 48 45 4e 0a  rop  EXIT  THEN.
7300: 20 20 20 20 5c 20 63 68 65 63 6b 20 66 6f 72 20      \ check for 
7310: 64 69 73 63 6f 6e 6e 65 63 74 65 64 20 68 65 72  disconnected her
7320: 65 20 6f 72 20 69 6e 20 70 6b 2d 70 65 65 6b 3f  e or in pk-peek?
7330: 0a 20 20 20 20 32 64 75 70 20 70 6b 2d 70 65 65  .    2dup pk-pee
7340: 6b 3f 20 20 49 46 20 20 64 76 63 73 2d 63 6f 6e  k?  IF  dvcs-con
7350: 6e 65 63 74 20 20 45 4c 53 45 20 20 32 64 72 6f  nect  ELSE  2dro
7360: 70 20 20 54 48 45 4e 20 3b 0a 0a 3a 20 64 76 63  p  THEN ;..: dvc
7370: 73 2d 63 6f 6e 6e 65 63 74 73 3f 20 28 20 2d 2d  s-connects? ( --
7380: 20 66 6c 61 67 20 29 0a 20 20 20 20 63 68 61 74   flag ).    chat
7390: 2d 6b 65 79 73 20 5b 27 5d 20 64 76 63 73 2d 63  -keys ['] dvcs-c
73a0: 6f 6e 6e 65 63 74 2d 6b 65 79 20 24 5b 5d 6d 61  onnect-key $[]ma
73b0: 70 20 64 76 63 73 2d 72 65 71 75 65 73 74 23 20  p dvcs-request# 
73c0: 40 20 30 3e 20 3b 0a 0a 3a 20 77 61 69 74 2d 64  @ 0> ;..: wait-d
73d0: 76 63 73 2d 72 65 71 75 65 73 74 20 28 20 2d 2d  vcs-request ( --
73e0: 20 29 0a 20 20 20 20 42 45 47 49 4e 20 20 64 76   ).    BEGIN  dv
73f0: 63 73 2d 72 65 71 75 65 73 74 23 20 40 20 20 57  cs-request# @  W
7400: 48 49 4c 45 20 20 73 74 6f 70 20 20 52 45 50 45  HILE  stop  REPE
7410: 41 54 20 3b 0a 0a 3a 20 2b 6e 65 65 64 65 64 20  AT ;..: +needed 
7420: 28 20 61 64 64 72 20 75 20 2d 2d 20 29 0a 20 20  ( addr u -- ).  
7430: 20 20 32 64 75 70 20 65 6e 63 68 61 73 68 3e 66    2dup enchash>f
7440: 69 6c 65 6e 61 6d 65 20 66 69 6c 65 2d 73 74 61  ilename file-sta
7450: 74 75 73 20 6e 69 70 20 6e 6f 2d 66 69 6c 65 23  tus nip no-file#
7460: 20 3d 20 49 46 0a 09 64 76 63 73 28 20 2e 22 20   = IF..dvcs( ." 
7470: 6e 65 65 64 3a 20 22 20 32 64 75 70 20 38 35 74  need: " 2dup 85t
7480: 79 70 65 20 63 72 20 29 0a 09 73 79 6e 63 2d 66  ype cr )..sync-f
7490: 69 6c 65 2d 6c 69 73 74 5b 5d 20 24 69 6e 73 5b  ile-list[] $ins[
74a0: 5d 20 64 72 6f 70 0a 20 20 20 20 45 4c 53 45 20  ] drop.    ELSE 
74b0: 20 64 76 63 73 28 20 2e 22 20 64 6f 6e 27 74 20   dvcs( ." don't 
74c0: 6e 65 65 64 3a 20 22 20 32 64 75 70 20 38 35 74  need: " 2dup 85t
74d0: 79 70 65 20 63 72 20 29 20 32 64 72 6f 70 20 20  ype cr ) 2drop  
74e0: 54 48 45 4e 20 3b 0a 0a 3a 20 23 6e 65 65 64 65  THEN ;..: #neede
74f0: 64 20 28 20 68 61 73 68 20 2d 2d 20 29 0a 20 20  d ( hash -- ).  
7500: 20 20 63 65 6c 6c 2b 20 24 40 20 6b 65 79 7c 20    cell+ $@ key| 
7510: 2b 6e 65 65 64 65 64 20 3b 0a 3a 20 64 76 63 73  +needed ;.: dvcs
7520: 2d 6e 65 65 64 65 64 2d 66 69 6c 65 73 20 28 20  -needed-files ( 
7530: 2d 2d 20 29 0a 20 20 20 20 69 64 3e 70 61 74 63  -- ).    id>patc
7540: 68 23 20 5b 27 5d 20 23 6e 65 65 64 65 64 20 23  h# ['] #needed #
7550: 6d 61 70 0a 20 20 20 20 69 64 3e 73 6e 61 70 23  map.    id>snap#
7560: 20 20 5b 27 5d 20 23 6e 65 65 64 65 64 20 23 6d    ['] #needed #m
7570: 61 70 20 3b 0a 0a 3a 20 67 65 74 2d 6e 65 65 64  ap ;..: get-need
7580: 65 64 2d 66 69 6c 65 73 20 7b 20 6c 69 73 74 20  ed-files { list 
7590: 2d 2d 20 7d 20 2b 72 65 73 65 6e 64 0a 20 20 20  -- } +resend.   
75a0: 20 6c 69 73 74 20 24 5b 5d 23 20 30 20 3f 44 4f   list $[]# 0 ?DO
75b0: 0a 09 49 20 2f 73 79 6e 63 2d 72 65 71 73 20 2b  ..I /sync-reqs +
75c0: 20 49 27 20 75 6d 69 6e 20 49 20 55 2b 44 4f 0a   I' umin I U+DO.
75d0: 09 20 20 20 20 6e 65 74 32 6f 2d 63 6f 64 65 20  .    net2o-code 
75e0: 65 78 70 65 63 74 2b 73 6c 75 72 70 0a 09 20 20  expect+slurp..  
75f0: 20 20 24 31 30 20 62 6c 6f 63 6b 73 69 7a 65 21    $10 blocksize!
7600: 20 30 20 62 6c 6f 63 6b 61 6c 69 67 6e 21 0a 09   0 blockalign!..
7610: 20 20 20 20 49 20 2f 73 79 6e 63 2d 66 69 6c 65      I /sync-file
7620: 73 20 2b 20 49 27 20 75 6d 69 6e 20 49 20 55 2b  s + I' umin I U+
7630: 44 4f 0a 09 09 49 20 6c 69 73 74 20 24 5b 5d 40  DO...I list $[]@
7640: 20 6e 65 74 32 6f 3a 63 6f 70 79 23 0a 09 20 20   net2o:copy#..  
7650: 20 20 4c 4f 4f 50 0a 5c 09 20 20 20 20 49 20 2f    LOOP.\.    I /
7660: 73 79 6e 63 2d 66 69 6c 65 73 20 2b 20 49 27 20  sync-files + I' 
7670: 75 3e 3d 20 49 46 0a 09 20 20 20 20 65 6e 64 2d  u>= IF..    end-
7680: 63 6f 64 65 7c 20 6e 65 74 32 6f 3a 63 6c 6f 73  code| net2o:clos
7690: 65 2d 61 6c 6c 20 2d 6d 61 70 2d 72 65 73 65 6e  e-all -map-resen
76a0: 64 0a 09 20 20 20 20 49 20 2f 73 79 6e 63 2d 66  d..    I /sync-f
76b0: 69 6c 65 73 20 2b 20 49 27 20 75 3e 3d 20 49 46  iles + I' u>= IF
76c0: 0a 09 09 2b 72 65 73 65 6e 64 20 2b 66 6c 6f 77  ...+resend +flow
76d0: 2d 63 6f 6e 74 72 6f 6c 0a 09 09 6e 65 74 32 6f  -control...net2o
76e0: 2d 63 6f 64 65 20 65 78 70 65 63 74 2b 73 6c 75  -code expect+slu
76f0: 72 70 20 20 63 6c 6f 73 65 2d 61 6c 6c 20 20 61  rp  close-all  a
7700: 63 6b 20 72 65 77 69 6e 64 20 65 6e 64 2d 77 69  ck rewind end-wi
7710: 74 68 0a 09 09 5b 20 70 72 65 76 69 6f 75 73 20  th...[ previous 
7720: 5d 0a 09 20 20 20 20 54 48 45 4e 0a 5c 09 20 20  ]..    THEN.\.  
7730: 20 20 45 4c 53 45 20 20 65 6e 64 2d 63 6f 64 65    ELSE  end-code
7740: 20 20 54 48 45 4e 0a 09 2f 73 79 6e 63 2d 66 69    THEN../sync-fi
7750: 6c 65 73 20 2b 4c 4f 4f 50 0a 20 20 20 20 2f 73  les +LOOP.    /s
7760: 79 6e 63 2d 72 65 71 73 20 2b 4c 4f 4f 50 20 3b  ync-reqs +LOOP ;
7770: 0a 0a 3a 20 64 76 63 73 2d 64 61 74 61 2d 73 79  ..: dvcs-data-sy
7780: 6e 63 20 28 20 2d 2d 20 29 0a 20 20 20 20 73 79  nc ( -- ).    sy
7790: 6e 63 2d 66 69 6c 65 2d 6c 69 73 74 5b 5d 20 24  nc-file-list[] $
77a0: 5b 5d 6f 66 66 20 20 62 72 61 6e 63 68 65 73 5b  []off  branches[
77b0: 5d 20 24 5b 5d 6f 66 66 0a 20 20 20 20 6d 73 67  ] $[]off.    msg
77c0: 2d 67 72 6f 75 70 24 20 24 40 20 3f 6d 73 67 2d  -group$ $@ ?msg-
77d0: 6c 6f 67 0a 20 20 20 20 64 76 63 73 3a 63 6f 6d  log.    dvcs:com
77e0: 6d 69 74 73 20 40 20 2e 63 68 61 74 3e 62 72 61  mits @ .chat>bra
77f0: 6e 63 68 65 73 2d 6c 6f 6f 70 0a 20 20 20 20 64  nches-loop.    d
7800: 76 63 73 3a 63 6f 6d 6d 69 74 73 20 40 20 2e 64  vcs:commits @ .d
7810: 76 63 73 2d 6e 65 65 64 65 64 2d 66 69 6c 65 73  vcs-needed-files
7820: 0a 20 20 20 20 73 79 6e 63 2d 66 69 6c 65 2d 6c  .    sync-file-l
7830: 69 73 74 5b 5d 20 24 5b 5d 23 20 30 3e 20 63 6f  ist[] $[]# 0> co
7840: 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 0a 20 20 20  nnection and.   
7850: 20 49 46 20 20 20 20 73 79 6e 63 2d 66 69 6c 65   IF    sync-file
7860: 2d 6c 69 73 74 5b 5d 20 63 6f 6e 6e 65 63 74 69  -list[] connecti
7870: 6f 6e 20 2e 67 65 74 2d 6e 65 65 64 65 64 2d 66  on .get-needed-f
7880: 69 6c 65 73 20 20 54 48 45 4e 20 3b 0a 0a 3a 20  iles  THEN ;..: 
7890: 64 76 63 73 2d 72 65 66 2d 73 79 6e 63 20 28 20  dvcs-ref-sync ( 
78a0: 2d 2d 20 29 0a 20 20 20 20 73 65 61 72 63 68 2d  -- ).    search-
78b0: 6c 61 73 74 2d 72 65 76 20 69 64 3e 62 72 61 6e  last-rev id>bran
78c0: 63 68 65 73 0a 20 20 20 20 64 76 63 73 3a 6e 65  ches.    dvcs:ne
78d0: 77 2d 64 76 63 73 2d 72 65 66 73 20 3e 6f 0a 20  w-dvcs-refs >o. 
78e0: 20 20 20 62 72 61 6e 63 68 65 73 3e 64 76 63 73     branches>dvcs
78f0: 0a 20 20 20 20 64 76 63 73 3a 72 65 66 73 5b 5d  .    dvcs:refs[]
7900: 20 24 5b 5d 23 20 30 20 3f 44 4f 0a 09 2e 22 20   $[]# 0 ?DO..." 
7910: 72 65 66 3a 20 22 20 49 20 64 76 63 73 3a 72 65  ref: " I dvcs:re
7920: 66 73 5b 5d 20 24 5b 5d 40 20 38 35 74 79 70 65  fs[] $[]@ 85type
7930: 20 63 72 20 20 4c 4f 4f 50 0a 20 20 20 20 64 76   cr  LOOP.    dv
7940: 63 73 3a 72 65 66 73 5b 5d 20 24 5b 5d 23 20 30  cs:refs[] $[]# 0
7950: 3e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  > connection and
7960: 0a 20 20 20 20 49 46 20 20 64 76 63 73 3a 72 65  .    IF  dvcs:re
7970: 66 73 5b 5d 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  fs[] connection 
7980: 2e 67 65 74 2d 6e 65 65 64 65 64 2d 66 69 6c 65  .get-needed-file
7990: 73 20 20 54 48 45 4e 0a 20 20 20 20 64 76 63 73  s  THEN.    dvcs
79a0: 3a 64 69 73 70 6f 73 65 2d 64 76 63 73 2d 72 65  :dispose-dvcs-re
79b0: 66 73 20 6f 3e 20 3b 0a 0a 3a 20 68 61 6e 64 6c  fs o> ;..: handl
79c0: 65 2d 66 65 74 63 68 20 28 20 2d 2d 20 29 20 20  e-fetch ( -- )  
79d0: 3f 2e 6e 65 74 32 6f 2f 6f 62 6a 65 63 74 73 0a  ?.net2o/objects.
79e0: 20 20 20 20 64 76 63 73 3a 6e 65 77 2d 64 76 63      dvcs:new-dvc
79f0: 73 20 3e 6f 20 20 70 75 6c 6c 2d 72 65 61 64 69  s >o  pull-readi
7a00: 6e 0a 20 20 20 20 6d 73 67 28 20 2e 22 20 3d 3d  n.    msg( ." ==
7a10: 3d 20 73 79 6e 63 69 6e 67 20 6d 65 74 61 64 61  = syncing metada
7a20: 74 61 20 3d 3d 3d 22 20 66 6f 72 74 68 3a 63 72  ta ===" forth:cr
7a30: 20 29 0a 20 20 20 20 30 20 3e 6f 20 64 76 63 73   ).    0 >o dvcs
7a40: 2d 63 6f 6e 6e 65 63 74 73 3f 20 49 46 20 20 2b  -connects? IF  +
7a50: 64 76 63 73 2d 73 79 6e 63 2d 64 6f 6e 65 20 20  dvcs-sync-done  
7a60: 77 61 69 74 2d 64 76 63 73 2d 72 65 71 75 65 73  wait-dvcs-reques
7a70: 74 20 20 54 48 45 4e 20 6f 3e 0a 20 20 20 20 6d  t  THEN o>.    m
7a80: 73 67 28 20 2e 22 20 3d 3d 3d 20 73 79 6e 63 69  sg( ." === synci
7a90: 6e 67 20 64 61 74 61 20 3d 3d 3d 22 20 66 6f 72  ng data ===" for
7aa0: 74 68 3a 63 72 20 29 0a 20 20 20 20 64 76 63 73  th:cr ).    dvcs
7ab0: 2d 64 61 74 61 2d 73 79 6e 63 0a 20 20 20 20 6d  -data-sync.    m
7ac0: 73 67 28 20 2e 22 20 3d 3d 3d 20 64 61 74 61 20  sg( ." === data 
7ad0: 73 79 6e 63 20 64 6f 6e 65 20 3d 3d 3d 22 20 66  sync done ===" f
7ae0: 6f 72 74 68 3a 63 72 20 29 0a 20 20 20 20 64 76  orth:cr ).    dv
7af0: 63 73 2d 72 65 66 2d 73 79 6e 63 0a 20 20 20 20  cs-ref-sync.    
7b00: 6d 73 67 28 20 2e 22 20 3d 3d 3d 20 72 65 66 20  msg( ." === ref 
7b10: 73 79 6e 63 20 64 6f 6e 65 20 3d 3d 3d 22 20 66  sync done ===" f
7b20: 6f 72 74 68 3a 63 72 20 29 0a 20 20 20 20 63 6f  orth:cr ).    co
7b30: 6e 6e 65 63 74 69 6f 6e 20 3f 64 75 70 2d 49 46  nnection ?dup-IF
7b40: 0a 09 2e 64 61 74 61 2d 72 6d 61 70 20 49 46 20  ...data-rmap IF 
7b50: 20 6d 73 67 2d 67 72 6f 75 70 24 20 24 40 20 3e   msg-group$ $@ >
7b60: 67 72 6f 75 70 20 6c 61 73 74 23 20 73 69 6c 65  group last# sile
7b70: 6e 74 2d 6c 65 61 76 65 2d 63 68 61 74 20 20 54  nt-leave-chat  T
7b80: 48 45 4e 0a 20 20 20 20 54 48 45 4e 0a 20 20 20  HEN.    THEN.   
7b90: 20 64 76 63 73 3a 64 69 73 70 6f 73 65 2d 64 76   dvcs:dispose-dv
7ba0: 63 73 20 6f 3e 20 3b 0a 0a 3a 20 68 61 6e 64 6c  cs o> ;..: handl
7bb0: 65 2d 63 6c 6f 6e 65 20 28 20 2d 2d 20 29 0a 20  e-clone ( -- ). 
7bc0: 20 20 20 30 20 63 68 61 74 2d 6b 65 79 73 20 21     0 chat-keys !
7bd0: 40 20 7b 20 77 5e 20 63 6c 6f 6e 65 2d 6b 65 79  @ { w^ clone-key
7be0: 73 20 7d 0a 20 20 20 20 63 6c 6f 6e 65 2d 6b 65  s }.    clone-ke
7bf0: 79 73 20 5b 3a 20 3e 64 69 72 20 20 32 64 75 70  ys [: >dir  2dup
7c00: 20 63 68 61 74 2d 6b 65 79 73 20 24 2b 5b 5d 21   chat-keys $+[]!
7c10: 0a 09 5b 3a 20 40 2f 20 32 73 77 61 70 0a 09 20  ..[: @/ 2swap.. 
7c20: 20 20 20 27 23 27 20 24 73 70 6c 69 74 20 64 75     '#' $split du
7c30: 70 20 30 3d 20 49 46 20 20 32 64 72 6f 70 20 20  p 0= IF  2drop  
7c40: 45 4c 53 45 20 20 32 6e 69 70 20 20 54 48 45 4e  ELSE  2nip  THEN
7c50: 0a 09 20 20 20 20 32 64 75 70 20 24 31 46 46 20  ..    2dup $1FF 
7c60: 69 6e 69 74 2d 64 69 72 20 64 72 6f 70 20 32 64  init-dir drop 2d
7c70: 75 70 20 73 65 74 2d 64 69 72 20 74 68 72 6f 77  up set-dir throw
7c80: 0a 09 20 20 20 20 5b 3a 20 74 79 70 65 20 27 40  ..    [: type '@
7c90: 27 20 65 6d 69 74 20 2e 6b 65 79 2d 69 64 3f 20  ' emit .key-id? 
7ca0: 3b 5d 20 24 74 6d 70 20 64 76 63 73 2d 69 6e 69  ;] $tmp dvcs-ini
7cb0: 74 0a 09 20 20 20 20 68 61 6e 64 6c 65 2d 66 65  t..    handle-fe
7cc0: 74 63 68 20 64 76 63 73 2d 75 70 20 3b 5d 20 63  tch dvcs-up ;] c
7cd0: 61 74 63 68 0a 09 63 68 61 74 2d 6b 65 79 73 20  atch..chat-keys 
7ce0: 24 5b 5d 66 72 65 65 20 20 64 69 72 3e 20 20 74  $[]free  dir>  t
7cf0: 68 72 6f 77 0a 20 20 20 20 3b 5d 20 24 5b 5d 6d  hrow.    ;] $[]m
7d00: 61 70 0a 20 20 20 20 63 6c 6f 6e 65 2d 6b 65 79  ap.    clone-key
7d10: 73 20 40 20 63 68 61 74 2d 6b 65 79 73 20 21 20  s @ chat-keys ! 
7d20: 3b 0a 0a 5c 5c 5c 0a 4c 6f 63 61 6c 20 56 61 72  ;..\\\.Local Var
7d30: 69 61 62 6c 65 73 3a 0a 66 6f 72 74 68 2d 6c 6f  iables:.forth-lo
7d40: 63 61 6c 2d 77 6f 72 64 73 3a 0a 20 20 20 20 28  cal-words:.    (
7d50: 0a 20 20 20 20 20 28 28 22 6e 65 74 32 6f 3a 22  .     (("net2o:"
7d60: 20 22 2b 6e 65 74 32 6f 3a 22 29 20 64 65 66 69   "+net2o:") defi
7d70: 6e 69 74 69 6f 6e 2d 73 74 61 72 74 65 72 20 28  nition-starter (
7d80: 66 6f 6e 74 2d 6c 6f 63 6b 2d 6b 65 79 77 6f 72  font-lock-keywor
7d90: 64 2d 66 61 63 65 20 2e 20 31 29 0a 20 20 20 20  d-face . 1).    
7da0: 20 20 22 5b 20 5c 74 5c 6e 5d 22 20 74 20 6e 61    "[ \t\n]" t na
7db0: 6d 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 66 75  me (font-lock-fu
7dc0: 6e 63 74 69 6f 6e 2d 6e 61 6d 65 2d 66 61 63 65  nction-name-face
7dd0: 20 2e 20 33 29 29 0a 20 20 20 20 20 28 22 5b 61   . 3)).     ("[a
7de0: 2d 7a 30 2d 39 5d 2b 28 22 20 69 6d 6d 65 64 69  -z0-9]+(" immedi
7df0: 61 74 65 20 28 66 6f 6e 74 2d 6c 6f 63 6b 2d 63  ate (font-lock-c
7e00: 6f 6d 6d 65 6e 74 2d 66 61 63 65 20 2e 20 31 29  omment-face . 1)
7e10: 0a 20 20 20 20 20 20 22 29 22 20 6e 69 6c 20 63  .      ")" nil c
7e20: 6f 6d 6d 65 6e 74 20 28 66 6f 6e 74 2d 6c 6f 63  omment (font-loc
7e30: 6b 2d 63 6f 6d 6d 65 6e 74 2d 66 61 63 65 20 2e  k-comment-face .
7e40: 20 31 29 29 0a 20 20 20 20 29 0a 66 6f 72 74 68   1)).    ).forth
7e50: 2d 6c 6f 63 61 6c 2d 69 6e 64 65 6e 74 2d 77 6f  -local-indent-wo
7e60: 72 64 73 3a 0a 20 20 20 20 28 0a 20 20 20 20 20  rds:.    (.     
7e70: 28 28 22 6e 65 74 32 6f 3a 22 20 22 2b 6e 65 74  (("net2o:" "+net
7e80: 32 6f 3a 22 29 20 28 30 20 2e 20 32 29 20 28 30  2o:") (0 . 2) (0
7e90: 20 2e 20 32 29 20 6e 6f 6e 2d 69 6d 6d 65 64 69   . 2) non-immedi
7ea0: 61 74 65 29 0a 20 20 20 20 29 0a 45 6e 64 3a 0a  ate).    ).End:.