From f8df69d9a119967ea723a6924829da6a44dba210 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:00:24 -0600
Subject: [PATCH 1/8] Rename io.monitor to io.monitors; add log-viewer demo

---
 extra/help/handbook/handbook.factor                |  4 ++--
 extra/io/{monitor => monitors}/authors.txt         |  0
 .../monitors-docs.factor}                          | 14 +++++++-------
 .../monitor.factor => monitors/monitors.factor}    |  2 +-
 extra/io/{monitor => monitors}/summary.txt         |  0
 extra/io/unix/linux/linux.factor                   |  2 +-
 .../windows/nt/{monitor => monitors}/authors.txt   |  0
 .../monitor.factor => monitors/monitors.factor}    |  7 +++----
 extra/io/windows/nt/nt.factor                      |  2 +-
 extra/log-viewer/authors.txt                       |  1 +
 extra/log-viewer/log-viewer.factor                 | 14 ++++++++++++++
 extra/log-viewer/summary.txt                       |  1 +
 extra/log-viewer/tags.txt                          |  1 +
 13 files changed, 32 insertions(+), 16 deletions(-)
 rename extra/io/{monitor => monitors}/authors.txt (100%)
 rename extra/io/{monitor/monitor-docs.factor => monitors/monitors-docs.factor} (87%)
 rename extra/io/{monitor/monitor.factor => monitors/monitors.factor} (94%)
 rename extra/io/{monitor => monitors}/summary.txt (100%)
 rename extra/io/windows/nt/{monitor => monitors}/authors.txt (100%)
 rename extra/io/windows/nt/{monitor/monitor.factor => monitors/monitors.factor} (94%)
 create mode 100755 extra/log-viewer/authors.txt
 create mode 100755 extra/log-viewer/log-viewer.factor
 create mode 100755 extra/log-viewer/summary.txt
 create mode 100755 extra/log-viewer/tags.txt

diff --git a/extra/help/handbook/handbook.factor b/extra/help/handbook/handbook.factor
index 234e7891d7..81e4bea7b3 100755
--- a/extra/help/handbook/handbook.factor
+++ b/extra/help/handbook/handbook.factor
@@ -137,7 +137,7 @@ ARTICLE: "collections" "Collections"
 { $subsection "graphs" }
 { $subsection "buffers" } ;
 
-USING: io.sockets io.launcher io.mmap io.monitor ;
+USING: io.sockets io.launcher io.mmap io.monitors ;
 
 ARTICLE: "io" "Input and output" 
 { $subsection "streams" }
@@ -155,7 +155,7 @@ ARTICLE: "io" "Input and output"
 "Advanced features:"
 { $subsection "io.launcher" }
 { $subsection "io.mmap" }
-{ $subsection "io.monitor" } ;
+{ $subsection "io.monitors" } ;
 
 ARTICLE: "tools" "Developer tools"
 { $subsection "tools.annotations" }
diff --git a/extra/io/monitor/authors.txt b/extra/io/monitors/authors.txt
similarity index 100%
rename from extra/io/monitor/authors.txt
rename to extra/io/monitors/authors.txt
diff --git a/extra/io/monitor/monitor-docs.factor b/extra/io/monitors/monitors-docs.factor
similarity index 87%
rename from extra/io/monitor/monitor-docs.factor
rename to extra/io/monitors/monitors-docs.factor
index de649f48e7..9d985ff3fb 100755
--- a/extra/io/monitor/monitor-docs.factor
+++ b/extra/io/monitors/monitors-docs.factor
@@ -1,4 +1,4 @@
-IN: io.monitor
+IN: io.monitors
 USING: help.markup help.syntax continuations ;
 
 HELP: <monitor>
@@ -9,7 +9,7 @@ $nl
 
 HELP: next-change
 { $values { "monitor" "a monitor" } { "path" "a pathname string" } { "changes" "a change descriptor" } }
-{ $description "Waits for file system changes and outputs the pathname of the first changed file. The change descriptor is aq sequence of symbols documented in " { $link "io.monitor.descriptors" } "." } ;
+{ $description "Waits for file system changes and outputs the pathname of the first changed file. The change descriptor is aq sequence of symbols documented in " { $link "io.monitors.descriptors" } "." } ;
 
 HELP: with-monitor
 { $values { "path" "a pathname string" } { "recursive?" "a boolean" } { "quot" "a quotation with stack effect " { $snippet "( monitor -- )" } } }
@@ -27,7 +27,7 @@ HELP: +modify-file+
 HELP: +rename-file+
 { $description "Indicates that file has been renamed." } ;
 
-ARTICLE: "io.monitor.descriptors" "File system change descriptors"
+ARTICLE: "io.monitors.descriptors" "File system change descriptors"
 "Change descriptors output by " { $link next-change } ":"
 { $subsection +add-file+ }
 { $subsection +remove-file+ }
@@ -35,24 +35,24 @@ ARTICLE: "io.monitor.descriptors" "File system change descriptors"
 { $subsection +rename-file+ }
 { $subsection +add-file+ } ;
 
-ARTICLE: "io.monitor" "File system change monitors"
+ARTICLE: "io.monitors" "File system change monitors"
 "File system change monitors listen for changes to file names, attributes and contents under a specified directory. They can optionally be recursive, in which case subdirectories are also monitored."
 $nl
 "Creating a file system change monitor and listening for changes:"
 { $subsection <monitor> }
 { $subsection next-change }
-{ $subsection "io.monitor.descriptors" }
+{ $subsection "io.monitors.descriptors" }
 "Monitors are closed by calling " { $link dispose } " or " { $link with-disposal } "."
 $nl
 "A utility combinator which opens a monitor and cleans it up after:"
 { $subsection with-monitor }
 "An example which watches the Factor directory for changes:"
 { $code
-    "USE: io.monitor"
+    "USE: io.monitors"
     ": watch-loop ( monitor -- )"
     "    dup next-change . . nl nl flush watch-loop ;"
     ""
     "\"\" resource-path f [ watch-loop ] with-monitor"
 } ;
 
-ABOUT: "io.monitor"
+ABOUT: "io.monitors"
diff --git a/extra/io/monitor/monitor.factor b/extra/io/monitors/monitors.factor
similarity index 94%
rename from extra/io/monitor/monitor.factor
rename to extra/io/monitors/monitors.factor
index 1d8499b392..d652f34f1e 100755
--- a/extra/io/monitor/monitor.factor
+++ b/extra/io/monitors/monitors.factor
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io.backend kernel continuations namespaces sequences
 assocs hashtables sorting arrays ;
-IN: io.monitor
+IN: io.monitors
 
 <PRIVATE
 
diff --git a/extra/io/monitor/summary.txt b/extra/io/monitors/summary.txt
similarity index 100%
rename from extra/io/monitor/summary.txt
rename to extra/io/monitors/summary.txt
diff --git a/extra/io/unix/linux/linux.factor b/extra/io/unix/linux/linux.factor
index dcf1beabf9..9c4aced03f 100755
--- a/extra/io/unix/linux/linux.factor
+++ b/extra/io/unix/linux/linux.factor
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel io.backend io.monitor io.monitor.private io.files
+USING: kernel io.backend io.monitors io.monitors.private io.files
 io.buffers io.nonblocking io.unix.backend io.unix.select
 io.unix.launcher unix.linux.inotify assocs namespaces threads
 continuations init math alien.c-types alien ;
diff --git a/extra/io/windows/nt/monitor/authors.txt b/extra/io/windows/nt/monitors/authors.txt
similarity index 100%
rename from extra/io/windows/nt/monitor/authors.txt
rename to extra/io/windows/nt/monitors/authors.txt
diff --git a/extra/io/windows/nt/monitor/monitor.factor b/extra/io/windows/nt/monitors/monitors.factor
similarity index 94%
rename from extra/io/windows/nt/monitor/monitor.factor
rename to extra/io/windows/nt/monitors/monitors.factor
index 6f956760a8..a593e829fe 100755
--- a/extra/io/windows/nt/monitor/monitor.factor
+++ b/extra/io/windows/nt/monitors/monitors.factor
@@ -3,9 +3,9 @@
 USING: alien.c-types destructors io.windows
 io.windows.nt.backend kernel math windows windows.kernel32
 windows.types libc assocs alien namespaces continuations
-io.monitor io.monitor.private io.nonblocking io.buffers io.files
+io.monitors io.monitors.private io.nonblocking io.buffers io.files
 io sequences hashtables sorting arrays combinators ;
-IN: io.windows.nt.monitor
+IN: io.windows.nt.monitors
 
 : open-directory ( path -- handle )
     FILE_LIST_DIRECTORY
@@ -70,8 +70,7 @@ M: windows-nt-io <monitor> ( path recursive? -- monitor )
         FILE_NOTIFY_INFORMATION-FileName
         FILE_NOTIFY_INFORMATION-FileNameLength
         FILE_NOTIFY_INFORMATION-Action
-    } get-slots parse-action 1array swap
-    memory>u16-string ;
+    } get-slots parse-action 1array -rot memory>u16-string ;
 
 : (changed-files) ( buffer -- )
     dup parse-file-notify changed-file
diff --git a/extra/io/windows/nt/nt.factor b/extra/io/windows/nt/nt.factor
index 5bdefd7713..b957aa2fca 100755
--- a/extra/io/windows/nt/nt.factor
+++ b/extra/io/windows/nt/nt.factor
@@ -5,7 +5,7 @@ USE: io.windows
 USE: io.windows.nt.backend
 USE: io.windows.nt.files
 USE: io.windows.nt.launcher
-USE: io.windows.nt.monitor
+USE: io.windows.nt.monitors
 USE: io.windows.nt.sockets
 USE: io.windows.mmap
 USE: io.backend
diff --git a/extra/log-viewer/authors.txt b/extra/log-viewer/authors.txt
new file mode 100755
index 0000000000..1901f27a24
--- /dev/null
+++ b/extra/log-viewer/authors.txt
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/log-viewer/log-viewer.factor b/extra/log-viewer/log-viewer.factor
new file mode 100755
index 0000000000..0f139d184e
--- /dev/null
+++ b/extra/log-viewer/log-viewer.factor
@@ -0,0 +1,14 @@
+USING: kernel io io.files io.monitors ;
+IN: log-viewer
+
+: read-lines ( stream -- )
+    dup stream-readln dup
+    [ print read-lines ] [ 2drop flush ] if ;
+
+: tail-file-loop ( stream monitor -- )
+    dup next-change 2drop over read-lines tail-file-loop ;
+
+: tail-file ( file -- )
+    dup <file-reader> dup read-lines
+    swap parent-directory f <monitor>
+    tail-file-loop ;
diff --git a/extra/log-viewer/summary.txt b/extra/log-viewer/summary.txt
new file mode 100755
index 0000000000..5eb102447a
--- /dev/null
+++ b/extra/log-viewer/summary.txt
@@ -0,0 +1 @@
+Simple log file watcher demo using io.monitors
diff --git a/extra/log-viewer/tags.txt b/extra/log-viewer/tags.txt
new file mode 100755
index 0000000000..cb5fc203e1
--- /dev/null
+++ b/extra/log-viewer/tags.txt
@@ -0,0 +1 @@
+demos

From 20e4fcecda6d3b2a2d20756ae002fa85c19a1b34 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:48:38 -0600
Subject: [PATCH 2/8] Make OS name more consistent for extra/builder

---
 Makefile                       | 8 ++++----
 core/system/system-docs.factor | 3 ++-
 core/system/system.factor      | 2 +-
 vm/os-windows-nt.h             | 2 +-
 4 files changed, 8 insertions(+), 7 deletions(-)
 mode change 100644 => 100755 core/system/system-docs.factor
 mode change 100644 => 100755 core/system/system.factor

diff --git a/Makefile b/Makefile
index aad7fe90eb..5e1a9d6220 100755
--- a/Makefile
+++ b/Makefile
@@ -63,8 +63,8 @@ default:
 	@echo "macosx-ppc"
 	@echo "solaris-x86-32"
 	@echo "solaris-x86-64"
-	@echo "windows-ce-arm"
-	@echo "windows-nt-x86-32"
+	@echo "wince-arm"
+	@echo "winnt-x86-32"
 	@echo ""
 	@echo "Additional modifiers:"
 	@echo ""
@@ -122,10 +122,10 @@ solaris-x86-32:
 solaris-x86-64:
 	$(MAKE) $(EXECUTABLE) CONFIG=vm/Config.solaris.x86.64
 
-windows-nt-x86-32:
+winnt-x86-32:
 	$(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.nt.x86.32
 
-windows-ce-arm:
+wince-arm:
 	$(MAKE) $(EXECUTABLE) CONFIG=vm/Config.windows.ce.arm
 
 macosx.app: factor
diff --git a/core/system/system-docs.factor b/core/system/system-docs.factor
old mode 100644
new mode 100755
index d80cfa9ceb..bdd04307df
--- a/core/system/system-docs.factor
+++ b/core/system/system-docs.factor
@@ -51,7 +51,8 @@ HELP: os
         "openbsd"
         "netbsd"
         "solaris"
-        "windows"
+        "wince"
+        "winnt"
     }
 } ;
 
diff --git a/core/system/system.factor b/core/system/system.factor
old mode 100644
new mode 100755
index 4983260a36..4500720058
--- a/core/system/system.factor
+++ b/core/system/system.factor
@@ -22,7 +22,7 @@ splitting assocs ;
     os "wince" = ; foldable
 
 : winnt? ( -- ? )
-    os "windows" = ; foldable
+    os "winnt" = ; foldable
 
 : windows? ( -- ? )
     wince? winnt? or ; foldable
diff --git a/vm/os-windows-nt.h b/vm/os-windows-nt.h
index 9e451f0301..e289b6617d 100755
--- a/vm/os-windows-nt.h
+++ b/vm/os-windows-nt.h
@@ -12,7 +12,7 @@ typedef char F_SYMBOL;
 #define unbox_symbol_string unbox_char_string
 #define from_symbol_string from_char_string
 
-#define FACTOR_OS_STRING "windows"
+#define FACTOR_OS_STRING "winnt"
 #define FACTOR_DLL L"factor-nt.dll"
 #define FACTOR_DLL_NAME "factor-nt.dll"
 

From cf99e405fe22f35900160fc054d401894f101d69 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:50:24 -0600
Subject: [PATCH 3/8] More intuitive error message for about

---
 extra/help/help.factor | 3 +++
 1 file changed, 3 insertions(+)
 mode change 100644 => 100755 extra/help/help.factor

diff --git a/extra/help/help.factor b/extra/help/help.factor
old mode 100644
new mode 100755
index 87bc0a4b7f..aefbf2aba2
--- a/extra/help/help.factor
+++ b/extra/help/help.factor
@@ -96,6 +96,9 @@ M: word set-article-parent swap "help-parent" set-word-prop ;
     article-content print-content nl ;
 
 : about ( vocab -- )
+    dup vocab [ ] [
+        "No such vocabulary: " swap append throw
+    ] ?if
     dup vocab-help [
         help
     ] [

From 551b3a42a130eaf0e0ea77e1b9ba873c5e5628db Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:52:16 -0600
Subject: [PATCH 4/8] New reset-memoized word

---
 extra/memoize/memoize.factor       | 3 +++
 extra/xmode/catalog/catalog.factor | 2 +-
 2 files changed, 4 insertions(+), 1 deletion(-)
 mode change 100644 => 100755 extra/xmode/catalog/catalog.factor

diff --git a/extra/memoize/memoize.factor b/extra/memoize/memoize.factor
index 5fa112921c..3b0b8fd29f 100755
--- a/extra/memoize/memoize.factor
+++ b/extra/memoize/memoize.factor
@@ -50,3 +50,6 @@ M: memoized definition "memo-quot" word-prop ;
 : memoize-quot ( quot effect -- memo-quot )
     gensym swap dupd "declared-effect" set-word-prop
     dup rot define-memoized 1quotation ;
+
+: reset-memoized ( word -- )
+    "memoize" word-prop clear-assoc ;
diff --git a/extra/xmode/catalog/catalog.factor b/extra/xmode/catalog/catalog.factor
old mode 100644
new mode 100755
index 9c7e6a1ee7..d6402603fa
--- a/extra/xmode/catalog/catalog.factor
+++ b/extra/xmode/catalog/catalog.factor
@@ -99,7 +99,7 @@ SYMBOL: rule-sets
     (load-mode) dup finalize-mode ;
 
 : reset-modes ( -- )
-    \ (load-mode) "memoize" word-prop clear-assoc ;
+    \ (load-mode) reset-memoized ;
 
 : ?glob-matches ( string glob/f -- ? )
     dup [ glob-matches? ] [ 2drop f ] if ;

From 18403d15faf04ade5a159672585fdb4f68a12bff Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:55:10 -0600
Subject: [PATCH 5/8] tools.browser now uses io.monitor

---
 extra/tools/browser/browser-docs.factor | 22 ++++++++++--
 extra/tools/browser/browser.factor      | 47 ++++++++++++++++++-------
 extra/vocabs/monitor/authors.txt        |  1 +
 extra/vocabs/monitor/monitor.factor     | 14 ++++++++
 extra/vocabs/monitor/summary.txt        |  1 +
 5 files changed, 71 insertions(+), 14 deletions(-)
 mode change 100644 => 100755 extra/tools/browser/browser-docs.factor
 create mode 100644 extra/vocabs/monitor/authors.txt
 create mode 100755 extra/vocabs/monitor/monitor.factor
 create mode 100644 extra/vocabs/monitor/summary.txt

diff --git a/extra/tools/browser/browser-docs.factor b/extra/tools/browser/browser-docs.factor
old mode 100644
new mode 100755
index db0e5942f5..28bef58a8a
--- a/extra/tools/browser/browser-docs.factor
+++ b/extra/tools/browser/browser-docs.factor
@@ -2,16 +2,34 @@ USING: help.markup help.syntax io strings ;
 IN: tools.browser
 
 ARTICLE: "vocab-index" "Vocabulary index"
-{ $tags,authors }
+{ $tags }
+{ $authors }
 { $describe-vocab "" } ;
 
 ARTICLE: "tools.browser" "Vocabulary browser"
 "Getting and setting vocabulary meta-data:"
+{ $subsection vocab-file-contents }
+{ $subsection set-vocab-file-contents }
 { $subsection vocab-summary }
 { $subsection set-vocab-summary }
 { $subsection vocab-tags }
 { $subsection set-vocab-tags }
-{ $subsection add-vocab-tags } ;
+{ $subsection add-vocab-tags }
+"Global meta-data:"
+{ $subsection all-vocabs }
+{ $subsection all-vocabs-seq }
+{ $subsection all-tags }
+{ $subsection all-authors }
+"Because loading the above data is expensive, it is cached. The cache is flushed by the " { $vocab-link "vocabs.monitor" } " vocabulary. It can also be flushed manually when file system change monitors are not available:"
+{ $subsection reset-cache } ;
+
+HELP: vocab-file-contents
+{ $values { "vocab" "a vocabulary specifier" } { "name" string } { "seq" "a sequence of lines, or " { $link f } } }
+{ $description "Outputs the contents of the file named " { $snippet "name" } " from the vocabulary's directory, or " { $link f } " if the file does not exist." } ;
+
+HELP: set-vocab-file-contents
+{ $values { "seq" "a sequence of lines" } { "vocab" "a vocabulary specifier" } { "name" string } }
+{ $description "Stores a sequence of lines to the file named " { $snippet "name" } " from the vocabulary's directory." } ;
 
 HELP: vocab-summary
 { $values { "vocab" "a vocabulary specifier" } { "summary" "a string or " { $link f } } }
diff --git a/extra/tools/browser/browser.factor b/extra/tools/browser/browser.factor
index dabc37e5de..7aefbc8aaa 100755
--- a/extra/tools/browser/browser.factor
+++ b/extra/tools/browser/browser.factor
@@ -1,13 +1,30 @@
-! Copyright (C) 2007 Slava Pestov.
+! Copyright (C) 2007, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: namespaces splitting sequences io.files kernel assocs
 words vocabs vocabs.loader definitions parser continuations
 inspector debugger io io.styles io.streams.lines hashtables
 sorting prettyprint source-files arrays combinators strings
 system math.parser help.markup help.topics help.syntax
-help.stylesheet ;
+help.stylesheet memoize ;
 IN: tools.browser
 
+MEMO: (vocab-file-contents) ( path -- lines )
+    ?resource-path dup exists?
+    [ <file-reader> lines ] [ drop f ] if ;
+
+: vocab-file-contents ( vocab name -- seq )
+    vocab-path+ dup [ (vocab-file-contents) ] when ;
+
+: set-vocab-file-contents ( seq vocab name -- )
+    dupd vocab-path+ [
+        ?resource-path
+        <file-writer> [ [ print ] each ] with-stream
+    ] [
+        "The " swap vocab-name
+        " vocabulary was not loaded from the file system"
+        3append throw
+    ] ?if ;
+
 : vocab-summary-path ( vocab -- string )
     vocab-dir "summary.txt" path+ ;
 
@@ -86,7 +103,7 @@ M: vocab-link summary vocab-summary ;
         dup [ "" vocabs-in-dir ] { } make
     ] { } map>assoc ;
 
-: all-vocabs-seq ( -- seq )
+MEMO: all-vocabs-seq ( -- seq )
     all-vocabs values concat ;
 
 : dangerous? ( name -- ? )
@@ -288,20 +305,20 @@ C: <vocab-author> vocab-author
 : $tagged-vocabs ( element -- )
     first tagged vocabs. ;
 
-: all-tags ( vocabs -- seq ) [ vocab-tags ] map>set ;
+MEMO: all-tags ( -- seq )
+    all-vocabs-seq [ vocab-tags ] map>set ;
 
 : $authored-vocabs ( element -- )
     first authored vocabs. ;
 
-: all-authors ( vocabs -- seq ) [ vocab-authors ] map>set ;
+MEMO: all-authors ( -- seq )
+    all-vocabs-seq [ vocab-authors ] map>set ;
 
-: $tags,authors ( element -- )
-    drop
-    all-vocabs-seq
-    "Tags" $heading
-    dup all-tags tags.
-    "Authors" $heading
-    all-authors authors. ;
+: $tags ( element -- )
+    drop "Tags" $heading all-tags tags. ;
+
+: $authors ( element -- )
+    drop "Authors" $heading all-authors authors. ;
 
 M: vocab-spec article-title vocab-name " vocabulary" append ;
 
@@ -339,3 +356,9 @@ M: vocab-author article-content
 M: vocab-author article-parent drop "vocab-index" ;
 
 M: vocab-author summary article-title ;
+
+: reset-cache ( -- )
+    \ (vocab-file-contents) reset-memoized
+    \ all-vocabs-seq reset-memoized
+    \ all-authors reset-memoized
+    \ all-tags reset-memoized ;
diff --git a/extra/vocabs/monitor/authors.txt b/extra/vocabs/monitor/authors.txt
new file mode 100644
index 0000000000..1901f27a24
--- /dev/null
+++ b/extra/vocabs/monitor/authors.txt
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/extra/vocabs/monitor/monitor.factor b/extra/vocabs/monitor/monitor.factor
new file mode 100755
index 0000000000..24aa8b1d99
--- /dev/null
+++ b/extra/vocabs/monitor/monitor.factor
@@ -0,0 +1,14 @@
+USING: threads io.files io.monitors init kernel tools.browser ;
+IN: vocabs.monitor
+
+! Use file system change monitoring to flush the tags/authors
+! cache
+: update-thread ( monitor -- )
+    dup next-change 2drop reset-cache update-thread ;
+
+: start-update-thread
+    [
+        "" resource-path t <monitor> update-thread
+    ] in-thread ;
+
+[ start-update-thread ] "tools.browser" add-init-hook
diff --git a/extra/vocabs/monitor/summary.txt b/extra/vocabs/monitor/summary.txt
new file mode 100644
index 0000000000..27c0d3867a
--- /dev/null
+++ b/extra/vocabs/monitor/summary.txt
@@ -0,0 +1 @@
+Use io.monitors to clear tools.browser authors/tags/summary cache

From c87bd84635ed8c984f2cd9d87ef0e14b6711adef Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:55:20 -0600
Subject: [PATCH 6/8] Fix opengl tags

---
 extra/opengl/tags.txt | 3 ---
 1 file changed, 3 deletions(-)
 mode change 100644 => 100755 extra/opengl/tags.txt

diff --git a/extra/opengl/tags.txt b/extra/opengl/tags.txt
old mode 100644
new mode 100755
index 5e477dbcb3..bb863cf9a0
--- a/extra/opengl/tags.txt
+++ b/extra/opengl/tags.txt
@@ -1,4 +1 @@
-opengl.glu
-opengl.gl
-opengl
 bindings

From 687cd7860321ac07a36f0c6d96b1c1cd946099b6 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 18:55:28 -0600
Subject: [PATCH 7/8] Word moved

---
 extra/tools/deploy/config/config.factor | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/extra/tools/deploy/config/config.factor b/extra/tools/deploy/config/config.factor
index e6d03c2233..1f34e68f29 100755
--- a/extra/tools/deploy/config/config.factor
+++ b/extra/tools/deploy/config/config.factor
@@ -1,8 +1,8 @@
-! Copyright (C) 2007 Slava Pestov.
+! Copyright (C) 2007, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: vocabs.loader io.files io kernel sequences assocs
 splitting parser prettyprint namespaces math vocabs
-hashtables ;
+hashtables tools.browser ;
 IN: tools.deploy.config
 
 SYMBOL: deploy-name

From 038578939f998bcdce47e47980cf019e3971105b Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@factorcode.org>
Date: Tue, 5 Feb 2008 19:01:19 -0600
Subject: [PATCH 8/8] Change require-all for Ed

---
 core/vocabs/loader/loader-docs.factor | 13 +++----
 core/vocabs/loader/loader.factor      | 50 ++++++++++++---------------
 extra/bootstrap/io/io.factor          |  2 ++
 3 files changed, 30 insertions(+), 35 deletions(-)

diff --git a/core/vocabs/loader/loader-docs.factor b/core/vocabs/loader/loader-docs.factor
index 899d50407f..bc88661530 100755
--- a/core/vocabs/loader/loader-docs.factor
+++ b/core/vocabs/loader/loader-docs.factor
@@ -124,15 +124,12 @@ HELP: refresh
 { $values { "prefix" string } }
 { $description "Reloads source files and documentation belonging to loaded vocabularies whose names are prefixed by " { $snippet "prefix" } " which have been modified on disk." } ;
 
+HELP: refresh-all-error
+{ $values { "vocabs" "a sequence of vocabularies" } }
+{ $description "Throws a " { $link require-all-error } "." }
+{ $error-description "Thrown by " { $link require-all } " if one or more vocabulary failed to load." } ;
+
 HELP: refresh-all
 { $description "Reloads source files and documentation for all loaded vocabularies which have been modified on disk." } ;
 
 { refresh refresh-all } related-words
-
-HELP: vocab-file-contents
-{ $values { "vocab" "a vocabulary specifier" } { "name" string } { "seq" "a sequence of lines, or " { $link f } } }
-{ $description "Outputs the contents of the file named " { $snippet "name" } " from the vocabulary's directory, or " { $link f } " if the file does not exist." } ;
-
-HELP: set-vocab-file-contents
-{ $values { "seq" "a sequence of lines" } { "vocab" "a vocabulary specifier" } { "name" string } }
-{ $description "Stores a sequence of lines to the file named " { $snippet "name" } " from the vocabulary's directory." } ;
diff --git a/core/vocabs/loader/loader.factor b/core/vocabs/loader/loader.factor
index f2c5b2a012..6e6d1923e0 100755
--- a/core/vocabs/loader/loader.factor
+++ b/core/vocabs/loader/loader.factor
@@ -148,16 +148,31 @@ SYMBOL: load-help?
     dup update-roots
     dup modified-sources swap modified-docs ;
 
-: require-restart { { "Ignore this vocabulary" t } } ;
+: load-error. ( vocab error -- )
+    "While loading " swap dup >vocab-link write-object ":" print
+    print-error ;
 
-: require-all ( seq -- )
-    [
+TUPLE: require-all-error vocabs ;
+
+: require-all-error ( vocabs -- )
+    \ require-all-error construct-boa throw ;
+
+M: require-all-error summary
+    drop "The require-all operation failed" ;
+
+: require-all ( vocabs -- )
+    dup length 1 = [ first require ] [
         [
-            [ require ]
-            [ require-restart rethrow-restarts 2drop ]
-            recover
-        ] each
-    ] with-compiler-errors ;
+            [
+                [ [ require ] [ 2array , ] recover ] each
+            ] { } make
+            dup empty? [ drop ] [
+                "==== LOAD ERRORS:" print
+                dup [ nl load-error. ] assoc-each
+                keys require-all-error
+            ] if
+        ] with-compiler-errors
+    ] if ;
 
 : do-refresh ( modified-sources modified-docs -- )
     2dup
@@ -190,22 +205,3 @@ load-vocab-hook set-global
 M: vocab where vocab-where ;
 
 M: vocab-link where vocab-where ;
-
-: vocab-file-contents ( vocab name -- seq )
-    vocab-path+ dup [
-        ?resource-path dup exists? [
-            <file-reader> lines
-        ] [
-            drop f
-        ] if
-    ] when ;
-
-: set-vocab-file-contents ( seq vocab name -- )
-    dupd vocab-path+ [
-        ?resource-path
-        <file-writer> [ [ print ] each ] with-stream
-    ] [
-        "The " swap vocab-name
-        " vocabulary was not loaded from the file system"
-        3append throw
-    ] ?if ;
diff --git a/extra/bootstrap/io/io.factor b/extra/bootstrap/io/io.factor
index 065f7dd5c4..4d5440e546 100755
--- a/extra/bootstrap/io/io.factor
+++ b/extra/bootstrap/io/io.factor
@@ -10,3 +10,5 @@ IN: bootstrap.io
         { [ wince? ] [ "windows.ce" ] }
     } cond append require
 ] when
+
+"vocabs.monitor" require