From dcc5ea89c7ab82730305cd53886613c2332a295d Mon Sep 17 00:00:00 2001
From: John Benediktsson
Date: Mon, 6 Sep 2010 18:42:26 -0700
Subject: [PATCH 001/147] math.floating-point: adding double>ratio.
---
.../floating-point/floating-point-tests.factor | 18 +++++++++++++++++-
.../math/floating-point/floating-point.factor | 11 +++++++++++
2 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/extra/math/floating-point/floating-point-tests.factor b/extra/math/floating-point/floating-point-tests.factor
index 2f13237c9d..0bf09633a4 100644
--- a/extra/math/floating-point/floating-point-tests.factor
+++ b/extra/math/floating-point/floating-point-tests.factor
@@ -1,7 +1,7 @@
! Copyright (C) 2008 Doug Coleman.
! See http://factorcode.org/license.txt for BSD license.
USING: tools.test math.floating-point kernel
-math.constants fry sequences math ;
+math.constants fry sequences math random ;
IN: math.floating-point.tests
[ t ] [ pi >double< >double pi = ] unit-test
@@ -13,3 +13,19 @@ IN: math.floating-point.tests
[ f ] [ 10. infinity? ] unit-test
[ f ] [ -10. infinity? ] unit-test
[ f ] [ 0. infinity? ] unit-test
+
+[ 0 ] [ 0.0 double>ratio ] unit-test
+[ 1 ] [ 1.0 double>ratio ] unit-test
+[ 1/2 ] [ 0.5 double>ratio ] unit-test
+[ 3/4 ] [ 0.75 double>ratio ] unit-test
+[ 12+1/2 ] [ 12.5 double>ratio ] unit-test
+[ -12-1/2 ] [ -12.5 double>ratio ] unit-test
+[ 3+39854788871587/281474976710656 ] [ pi double>ratio ] unit-test
+
+: roundtrip ( n -- )
+ [ '[ _ ] ] keep '[ _ double>ratio >float ] unit-test ;
+
+{ 1 12 123 1234 } [ bits>double roundtrip ] each
+
+100 [ -10.0 10.0 uniform-random-float roundtrip ] times
+
diff --git a/extra/math/floating-point/floating-point.factor b/extra/math/floating-point/floating-point.factor
index e6e92919e2..fb9b258038 100644
--- a/extra/math/floating-point/floating-point.factor
+++ b/extra/math/floating-point/floating-point.factor
@@ -44,3 +44,14 @@ IN: math.floating-point
[ (double-exponent-bits) 11 on-bits = ]
[ (double-mantissa-bits) 0 = ]
} 1&& ;
+
+: check-special ( n -- n )
+ dup fp-special? [ "cannot be special" throw ] when ;
+
+: double>ratio ( double -- a/b )
+ check-special double>bits
+ [ (double-sign) zero? 1 -1 ? ]
+ [ (double-mantissa-bits) 52 2^ / ]
+ [ (double-exponent-bits) ] tri
+ dup zero? [ 1 + ] [ [ 1 + ] dip ] if 1023 - 2 swap ^ * * ;
+
From 61d0a7ab94d69a43eb8974cb8014e5af643aef2f Mon Sep 17 00:00:00 2001
From: John Benediktsson
Date: Sat, 4 Sep 2010 17:20:15 -0700
Subject: [PATCH 002/147] math.finance: Removing an instance of "spin".
---
extra/math/finance/finance-tests.factor | 2 ++
extra/math/finance/finance.factor | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/extra/math/finance/finance-tests.factor b/extra/math/finance/finance-tests.factor
index fc4ad0d07e..eb4b238f61 100644
--- a/extra/math/finance/finance-tests.factor
+++ b/extra/math/finance/finance-tests.factor
@@ -2,6 +2,8 @@ USING: kernel math math.functions math.finance tools.test ;
IN: math.finance.tests
+[ { 1 2 3 4 } ] [ { 1 2 3 4 5 } 1 ema ] unit-test
+
[ { 2 4 } ] [ { 1 3 5 } 2 sma ] unit-test
[ { 1 3 1 } ] [ { 1 3 2 6 3 } 2 momentum ] unit-test
diff --git a/extra/math/finance/finance.factor b/extra/math/finance/finance.factor
index f1c608bad9..12f58c891b 100644
--- a/extra/math/finance/finance.factor
+++ b/extra/math/finance/finance.factor
@@ -15,7 +15,7 @@ IN: math.finance
PRIVATE>
: ema ( seq n -- newseq )
- a swap unclip [ [ dup ] 2dip spin weighted ] accumulate 2nip ;
+ a swap unclip [ swap pick weighted ] accumulate 2nip ;
: sma ( seq n -- newseq )
clump [ mean ] map ;
From ea9918e099435d47c5d31cc61f84a410950373ef Mon Sep 17 00:00:00 2001
From: Doug Coleman
Date: Fri, 1 Oct 2010 01:23:31 -0500
Subject: [PATCH 003/147] Set the dns server based on the platform
---
extra/dns/dns.factor | 30 ++++++++++++++----------------
extra/dns/unix/authors.txt | 1 +
extra/dns/unix/platforms.txt | 1 +
extra/dns/unix/unix.factor | 13 +++++++++++++
extra/dns/windows/authors.txt | 1 +
extra/dns/windows/platforms.txt | 1 +
extra/dns/windows/windows.factor | 6 ++++++
7 files changed, 37 insertions(+), 16 deletions(-)
create mode 100644 extra/dns/unix/authors.txt
create mode 100644 extra/dns/unix/platforms.txt
create mode 100644 extra/dns/unix/unix.factor
create mode 100644 extra/dns/windows/authors.txt
create mode 100644 extra/dns/windows/platforms.txt
create mode 100644 extra/dns/windows/windows.factor
diff --git a/extra/dns/dns.factor b/extra/dns/dns.factor
index 61bdebfedd..4d14b27e89 100644
--- a/extra/dns/dns.factor
+++ b/extra/dns/dns.factor
@@ -4,11 +4,11 @@ USING: accessors alien.enums alien.syntax arrays assocs
byte-arrays calendar combinators combinators.smart constructors
destructors fry grouping io io.binary io.buffers
io.encodings.binary io.encodings.string io.encodings.utf8
-io.files io.ports io.sockets io.streams.byte-array io.timeouts
-kernel make math math.bitwise math.parser math.ranges
-math.statistics memoize namespaces random sequences
-slots.syntax splitting strings system unicode.categories
-vectors nested-comments io.sockets.private ;
+io.files io.ports io.sockets io.sockets.private
+io.streams.byte-array io.timeouts kernel make math math.bitwise
+math.parser math.ranges math.statistics memoize namespaces
+nested-comments random sequences slots.syntax splitting strings
+system unicode.categories vectors vocabs.loader ;
IN: dns
GENERIC: stream-peek1 ( stream -- byte/f )
@@ -59,17 +59,6 @@ SYMBOL: dns-servers
: clear-dns-servers ( -- )
V{ } clone dns-servers set-global ;
-! Google DNS servers
-CONSTANT: initial-dns-servers { "8.8.8.8" "8.8.4.4" }
-
-: load-resolve.conf ( -- seq )
- "/etc/resolv.conf" utf8 file-lines
- [ [ blank? ] trim ] map
- [ "#" head? not ] filter
- [ [ " " split1 swap ] dip push-at ] sequence>hashtable "nameserver" swap at ;
-
-dns-servers [ initial-dns-servers >vector ] initialize
-
: >dotted ( domain -- domain' )
dup "." tail? [ "." append ] unless ;
@@ -406,3 +395,12 @@ M: SOA rdata>byte-array
[ dns-A-query a-message. ]
[ dns-AAAA-query a-message. ]
[ dns-MX-query mx-message. ] tri ;
+
+HOOK: initial-dns-servers os ( -- seq )
+
+{
+ { [ os windows? ] [ "dns.windows" ] }
+ { [ os unix? ] [ "dns.unix" ] }
+} cond require
+
+dns-servers [ initial-dns-servers >vector ] initialize
diff --git a/extra/dns/unix/authors.txt b/extra/dns/unix/authors.txt
new file mode 100644
index 0000000000..7c1b2f2279
--- /dev/null
+++ b/extra/dns/unix/authors.txt
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/dns/unix/platforms.txt b/extra/dns/unix/platforms.txt
new file mode 100644
index 0000000000..509143d863
--- /dev/null
+++ b/extra/dns/unix/platforms.txt
@@ -0,0 +1 @@
+unix
diff --git a/extra/dns/unix/unix.factor b/extra/dns/unix/unix.factor
new file mode 100644
index 0000000000..6c5a1b9bf0
--- /dev/null
+++ b/extra/dns/unix/unix.factor
@@ -0,0 +1,13 @@
+! Copyright (C) 2010 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: assocs dns io.encodings.utf8 io.files kernel
+math.statistics sequences splitting system unicode.categories ;
+IN: dns.unix
+
+: load-resolve.conf ( -- seq )
+ "/etc/resolv.conf" utf8 file-lines
+ [ [ blank? ] trim ] map
+ [ "#" head? not ] filter
+ [ [ " " split1 swap ] dip push-at ] sequence>hashtable "nameserver" swap at ;
+
+M: unix initial-dns-servers load-resolve.conf ;
\ No newline at end of file
diff --git a/extra/dns/windows/authors.txt b/extra/dns/windows/authors.txt
new file mode 100644
index 0000000000..7c1b2f2279
--- /dev/null
+++ b/extra/dns/windows/authors.txt
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/dns/windows/platforms.txt b/extra/dns/windows/platforms.txt
new file mode 100644
index 0000000000..8e1a55995e
--- /dev/null
+++ b/extra/dns/windows/platforms.txt
@@ -0,0 +1 @@
+windows
diff --git a/extra/dns/windows/windows.factor b/extra/dns/windows/windows.factor
new file mode 100644
index 0000000000..a43eede183
--- /dev/null
+++ b/extra/dns/windows/windows.factor
@@ -0,0 +1,6 @@
+! Copyright (C) 2010 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: dns system windows.iphlpapi ;
+IN: dns.windows
+
+M: windows initial-dns-servers dns-server-ips ;
\ No newline at end of file
From 046efe7798e4d73a0d54ab2c60028bc85e088fbc Mon Sep 17 00:00:00 2001
From: Doug Coleman
Date: Wed, 29 Sep 2010 11:07:08 -0500
Subject: [PATCH 004/147] Update alien.enums docs
---
basis/alien/enums/enums-docs.factor | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/basis/alien/enums/enums-docs.factor b/basis/alien/enums/enums-docs.factor
index cc23a40df3..922aa260a8 100644
--- a/basis/alien/enums/enums-docs.factor
+++ b/basis/alien/enums/enums-docs.factor
@@ -24,7 +24,7 @@ HELP: number>enum
{ $description "Convert a number to an enum." } ;
ARTICLE: "alien.enums" "Enumeration types"
-"The " { $vocab-link "alien.enums" } " vocab contains the implementation for " { $link POSTPONE: ENUM: } " C types, and provides words for converting between enum symbols and integers."
+"The " { $vocab-link "alien.enums" } " vocab contains the implementation for " { $link POSTPONE: ENUM: } " C types, and provides words for converting between enum singletons and integers. It is possible to dispatch off of members of an enum."
$nl
"Defining enums at run-time:"
{ $subsection define-enum }
From ae60761d4291a9790a7cf3707b92611ec0f5ccdf Mon Sep 17 00:00:00 2001
From: Doug Coleman
Date: Fri, 1 Oct 2010 01:40:29 -0500
Subject: [PATCH 005/147] Fix furnace.actions help lint
---
basis/furnace/actions/actions-docs.factor | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/basis/furnace/actions/actions-docs.factor b/basis/furnace/actions/actions-docs.factor
index ae9dd9b65c..76f2ec036a 100644
--- a/basis/furnace/actions/actions-docs.factor
+++ b/basis/furnace/actions/actions-docs.factor
@@ -9,7 +9,7 @@ HELP:
HELP:
{ $values
- { "pair" "a pair with shape " { $snippet "{ class string }" } }
+ { "path" "a path" }
{ "response" response }
}
{ $description "Creates an HTTP response which serves a Chloe template. See " { $link "html.templates.chloe" } "." } ;
From 468d1d40c9450149141231a51543da6f01d62e9b Mon Sep 17 00:00:00 2001
From: Doug Coleman
Date: Fri, 1 Oct 2010 01:40:41 -0500
Subject: [PATCH 006/147] Fix compile error in images.jpeg
---
basis/images/jpeg/jpeg.factor | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/basis/images/jpeg/jpeg.factor b/basis/images/jpeg/jpeg.factor
index 7da9f6fc09..227aab21cd 100644
--- a/basis/images/jpeg/jpeg.factor
+++ b/basis/images/jpeg/jpeg.factor
@@ -121,16 +121,14 @@ TUPLE: jpeg-color-info
: decode-huff-table ( chunk -- )
data>> [ binary ] [ length ] bi limit-stream [
+ [ input-stream get stream>> [ count>> ] [ limit>> ] bi < ]
[
- [ input-stream get stream>> [ count>> ] [ limit>> ] bi < ]
- [
- read4/4 swap 2 * +
- 16 read
- dup [ ] [ + ] map-reduce read
- binary [ [ read [ B{ } ] unless* ] { } map-as ] with-byte-reader
- swap jpeg> huff-tables>> set-nth
- ] while
- ] with-input-stream*
+ read4/4 swap 2 * +
+ 16 read
+ dup [ ] [ + ] map-reduce read
+ binary [ [ read [ B{ } ] unless* ] { } map-as ] with-byte-reader
+ swap jpeg> huff-tables>> set-nth
+ ] while
] stream-throw-on-eof ;
: decode-scan ( chunk -- )
From b79c801b3cc3295525fd6aae9834c94ec7a8aaa6 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 18:11:57 -0700
Subject: [PATCH 007/147] logging.analysis: fix it up and make it work
---
basis/logging/analysis/analysis.factor | 43 ++++++++++++------------
basis/logging/insomniac/insomniac.factor | 8 ++---
basis/logging/logging-tests.factor | 4 ++-
basis/logging/parser/parser.factor | 21 ++++++++++--
4 files changed, 47 insertions(+), 29 deletions(-)
diff --git a/basis/logging/analysis/analysis.factor b/basis/logging/analysis/analysis.factor
index eb8a2eaf76..786aa77c52 100644
--- a/basis/logging/analysis/analysis.factor
+++ b/basis/logging/analysis/analysis.factor
@@ -1,8 +1,8 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences namespaces words assocs logging sorting
prettyprint io io.styles io.files io.encodings.utf8
-strings combinators accessors arrays
+strings combinators accessors arrays math
logging.server logging.parser calendar.format ;
IN: logging.analysis
@@ -20,6 +20,9 @@ SYMBOL: message-histogram
] when
drop ;
+: recent-histogram ( assoc n -- alist )
+ [ >alist sort-values ] dip short head ;
+
: analyze-entries ( entries word-names -- errors word-histogram message-histogram )
[
word-names set
@@ -27,44 +30,40 @@ SYMBOL: message-histogram
H{ } clone word-histogram set
H{ } clone message-histogram set
- [
- analyze-entry
- ] each
+ [ analyze-entry ] each
errors get
- word-histogram get
- message-histogram get
+ word-histogram get 10 recent-histogram
+ message-histogram get 10 recent-histogram
] with-scope ;
: histogram. ( assoc quot -- )
standard-table-style [
- [ >alist sort-values ] dip [
+ [
[ swapd with-cell pprint-cell ] with-row
] curry assoc-each
] tabular-output ; inline
-: log-entry. ( entry -- )
- "====== " write
- {
- [ date>> (timestamp>string) bl ]
- [ level>> pprint bl ]
- [ word-name>> write nl ]
- [ message>> "\n" join print ]
- } cleave ;
+: 10-most-recent ( errors -- errors )
+ 10 tail* "Only showing 10 most recent errors" print nl ;
: errors. ( errors -- )
- [ log-entry. ] each ;
+ dup length 10 >= [ 10-most-recent ] when
+ log-entries. ;
: analysis. ( errors word-histogram message-histogram -- )
- "==== INTERESTING MESSAGES:" print nl
+ nl "==== FREQUENT MESSAGES:" print nl
"Total: " write dup values sum . nl
[
- dup level>> write ": " write message>> "\n" join write
+ [ first name>> write bl ]
+ [ second write ": " write ]
+ [ third "\n" join write ]
+ tri
] histogram.
- nl
- "==== WORDS:" print nl
+ nl nl
+ "==== FREQUENT WORDS:" print nl
[ write ] histogram.
- nl
+ nl nl
"==== ERRORS:" print nl
errors. ;
diff --git a/basis/logging/insomniac/insomniac.factor b/basis/logging/insomniac/insomniac.factor
index 2a0be6aa79..0175fd1424 100644
--- a/basis/logging/insomniac/insomniac.factor
+++ b/basis/logging/insomniac/insomniac.factor
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: logging.analysis logging.server logging smtp kernel
io.files io.streams.string namespaces make timers assocs
@@ -14,7 +14,7 @@ SYMBOL: insomniac-recipients
: email-subject ( service -- string )
[
- "[INSOMNIAC] " % % " on " % io.sockets:host-name %
+ "Log analysis for " % % " on " % io.sockets:host-name %
] "" make ;
: (email-log-report) ( service word-names -- )
@@ -33,5 +33,5 @@ SYMBOL: insomniac-recipients
"logging.insomniac" [ (email-log-report) ] with-logging ;
: schedule-insomniac ( service word-names -- )
- [ [ email-log-report ] assoc-each rotate-logs ] 2curry
- 1 days delayed-every drop ;
+ [ email-log-report rotate-logs ] 2curry
+ 1 days every drop ;
diff --git a/basis/logging/logging-tests.factor b/basis/logging/logging-tests.factor
index 796c8769fc..a7cc6c6f5f 100644
--- a/basis/logging/logging-tests.factor
+++ b/basis/logging/logging-tests.factor
@@ -1,5 +1,5 @@
IN: logging.tests
-USING: tools.test logging math ;
+USING: tools.test logging logging.analysis io math ;
: input-logging-test ( a b -- c ) + ;
@@ -22,3 +22,5 @@ USING: tools.test logging math ;
[ f ] [ 1 0 error-logging-test ] unit-test
] with-logging
+
+[ ] [ "logging-test" { "input-logging-test" } analyze-log-file ] unit-test
diff --git a/basis/logging/parser/parser.factor b/basis/logging/parser/parser.factor
index dbc26c7efc..a359c9a254 100644
--- a/basis/logging/parser/parser.factor
+++ b/basis/logging/parser/parser.factor
@@ -1,9 +1,9 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors peg peg.parsers memoize kernel sequences
logging arrays words strings vectors io io.files
io.encodings.utf8 namespaces make combinators logging.server
-calendar calendar.format assocs ;
+calendar calendar.format assocs prettyprint ;
IN: logging.parser
TUPLE: log-entry date level word-name message ;
@@ -83,3 +83,20 @@ PEG: parse-log-line ( string -- entry ) 'log-line' ;
: parse-log-file ( service -- entries )
log-path 1 log# dup exists?
[ utf8 file-lines parse-log ] [ drop f ] if ;
+
+GENERIC: log-timestamp. ( date -- )
+
+M: timestamp log-timestamp. (timestamp>string) ;
+M: word log-timestamp. drop "multiline" write ;
+
+: log-entry. ( entry -- )
+ "====== " write
+ {
+ [ date>> log-timestamp. bl ]
+ [ level>> pprint bl ]
+ [ word-name>> write nl ]
+ [ message>> "\n" join print ]
+ } cleave ;
+
+: log-entries. ( errors -- )
+ [ log-entry. ] each ;
From 7fc552dd6c52851c56688924e1a76df24c328f72 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 18:18:54 -0700
Subject: [PATCH 008/147] logging.insomniac: clean up more
---
basis/logging/insomniac/insomniac.factor | 21 ++++++++-------------
1 file changed, 8 insertions(+), 13 deletions(-)
diff --git a/basis/logging/insomniac/insomniac.factor b/basis/logging/insomniac/insomniac.factor
index 0175fd1424..5f323d7ada 100644
--- a/basis/logging/insomniac/insomniac.factor
+++ b/basis/logging/insomniac/insomniac.factor
@@ -2,30 +2,25 @@
! See http://factorcode.org/license.txt for BSD license.
USING: logging.analysis logging.server logging smtp kernel
io.files io.streams.string namespaces make timers assocs
-io.encodings.utf8 accessors calendar sequences ;
+io.encodings.utf8 accessors calendar sequences locals ;
QUALIFIED: io.sockets
IN: logging.insomniac
SYMBOL: insomniac-sender
SYMBOL: insomniac-recipients
-: ?analyze-log ( service word-names -- string/f )
- [ analyze-log-file ] with-string-writer ;
-
: email-subject ( service -- string )
[
"Log analysis for " % % " on " % io.sockets:host-name %
] "" make ;
-: (email-log-report) ( service word-names -- )
- dupd ?analyze-log [ drop ] [
-
- swap >>body
- insomniac-recipients get >>to
- insomniac-sender get >>from
- swap email-subject >>subject
- send-email
- ] if-empty ;
+:: (email-log-report) ( service word-names -- )
+
+ [ service word-names analyze-log-file ] with-string-writer >>body
+ insomniac-recipients get >>to
+ insomniac-sender get >>from
+ service email-subject >>subject
+ send-email ;
\ (email-log-report) NOTICE add-error-logging
From ddd589cdeea80b24658341f5e3e980f5f937c81c Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 18:56:21 -0700
Subject: [PATCH 009/147] websites.concatenative, factorcode: move a few things
into config file
---
extra/websites/concatenative/concatenative.factor | 11 +++++------
extra/websites/factorcode/factorcode.factor | 7 +------
2 files changed, 6 insertions(+), 12 deletions(-)
diff --git a/extra/websites/concatenative/concatenative.factor b/extra/websites/concatenative/concatenative.factor
index 379ba32a57..53c6205554 100644
--- a/extra/websites/concatenative/concatenative.factor
+++ b/extra/websites/concatenative/concatenative.factor
@@ -59,19 +59,19 @@ TUPLE: concatenative-website < dispatcher ;
allow-edit-profile
allow-deactivation ;
+SYMBOLS: factor-recaptcha-public-key factor-recaptcha-private-key ;
+
: ( responder -- responder' )
"concatenative.org" >>domain
- "6LeJWQgAAAAAAFlYV7SuBClE9uSpGtV_ZS-qVON7" >>public-key
- "6LeJWQgAAAAAALh-XJgSSQ6xKygRgJ8-029Ip2Xv" >>private-key ;
+ factor-recaptcha-public-key get >>public-key
+ factor-recaptcha-private-key get >>private-key ;
: ( -- responder )
concatenative-website new-dispatcher
URL" /wiki/view/Front Page" "" add-responder ;
-SYMBOL: key-password
-SYMBOL: key-file
-SYMBOL: dh-file
+SYMBOLS: key-password key-file dh-file ;
: common-configuration ( -- )
"concatenative.org" 25 smtp-server set-global
@@ -112,7 +112,6 @@ SYMBOL: dh-file
test-db "builds.factorcode.org" add-responder
home "docs" append-path "docs.factorcode.org" add-responder
home "cgi" append-path "gitweb.factorcode.org" add-responder
- "new.factorcode.org" add-responder
main-responder set-global ;
: ( -- config )
diff --git a/extra/websites/factorcode/factorcode.factor b/extra/websites/factorcode/factorcode.factor
index 36450509b3..d4abba7988 100644
--- a/extra/websites/factorcode/factorcode.factor
+++ b/extra/websites/factorcode/factorcode.factor
@@ -4,14 +4,9 @@ USING: accessors http.server http.server.dispatchers
http.server.static kernel namespaces sequences ;
IN: websites.factorcode
-SYMBOL: users
-
: ( -- website )
- "resource:extra/websites/factorcode/" enable-fhtml >>default
- users get [
- [ "/home/" "/www/" surround ] keep add-responder
- ] each ;
+ "resource:extra/websites/factorcode/" enable-fhtml >>default ;
: init-testing ( -- )
main-responder set-global ;
From 8f44a059f57170c2511966d443d005de369db02b Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 19:04:06 -0700
Subject: [PATCH 010/147] websites.concatenative: change DB path
---
extra/webapps/mason/backend/backend.factor | 5 +++--
.../concatenative/concatenative.factor | 18 +++++++++---------
2 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/extra/webapps/mason/backend/backend.factor b/extra/webapps/mason/backend/backend.factor
index 217e6b8a1a..bb77dd8143 100644
--- a/extra/webapps/mason/backend/backend.factor
+++ b/extra/webapps/mason/backend/backend.factor
@@ -1,7 +1,8 @@
! Copyright (C) 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors calendar db db.sqlite db.tuples db.types kernel
-math math.order sequences combinators.short-circuit ;
+math math.order sequences combinators.short-circuit
+io.pathnames ;
IN: webapps.mason.backend
CONSTANT: +idle+ "idle"
@@ -72,7 +73,7 @@ counter "COUNTER" {
: os/cpu ( builder -- string )
[ os>> ] [ cpu>> ] bi "/" glue ;
-: mason-db ( -- db ) "resource:mason.db" ;
+: mason-db ( -- db ) home "mason.db" append-path ;
: with-mason-db ( quot -- )
mason-db [ with-transaction ] with-db ; inline
diff --git a/extra/websites/concatenative/concatenative.factor b/extra/websites/concatenative/concatenative.factor
index 53c6205554..d14f52e8df 100644
--- a/extra/websites/concatenative/concatenative.factor
+++ b/extra/websites/concatenative/concatenative.factor
@@ -30,12 +30,12 @@ webapps.mason.backend
websites.factorcode ;
IN: websites.concatenative
-: test-db ( -- db ) "resource:test.db" ;
+: website-db ( -- db ) home "website.db" append-path ;
: init-factor-db ( -- )
mason-db [ init-mason-db ] with-db
- test-db [
+ website-db [
init-furnace-tables
{
@@ -92,7 +92,7 @@ SYMBOLS: key-password key-file dh-file ;
"planet" add-responder
"mason" add-responder
"/tmp/docs/" "docs" add-responder
- test-db
+ website-db
main-responder set-global ;
: ( path -- responder )
@@ -106,10 +106,10 @@ SYMBOLS: key-password key-file dh-file ;
"wiki" add-responder
"user-admin" add-responder
- test-db "concatenative.org" add-responder
- test-db "paste.factorcode.org" add-responder
- test-db "planet.factorcode.org" add-responder
- test-db "builds.factorcode.org" add-responder
+ website-db "concatenative.org" add-responder
+ website-db "paste.factorcode.org" add-responder
+ website-db "planet.factorcode.org" add-responder
+ website-db "builds.factorcode.org" add-responder
home "docs" append-path "docs.factorcode.org" add-responder
home "cgi" append-path "gitweb.factorcode.org" add-responder
main-responder set-global ;
@@ -127,7 +127,7 @@ SYMBOLS: key-password key-file dh-file ;
8431 >>secure ;
: start-website ( -- server )
- test-db start-expiring
- test-db start-update-task
+ website-db start-expiring
+ website-db start-update-task
http-insomniac
start-server ;
From 8a95b763dd12b0e436d71d1fbc30263c7e298529 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 19:05:11 -0700
Subject: [PATCH 011/147] webapps.mason.docs-update: make docs path
configurable
---
extra/webapps/mason/docs-update/docs-update.factor | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/extra/webapps/mason/docs-update/docs-update.factor b/extra/webapps/mason/docs-update/docs-update.factor
index 7b685890e7..3ecfbef190 100644
--- a/extra/webapps/mason/docs-update/docs-update.factor
+++ b/extra/webapps/mason/docs-update/docs-update.factor
@@ -1,15 +1,17 @@
! Copyright (C) 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors continuations furnace.actions help.html
-http.server.responses io.directories io.directories.hierarchy
-io.launcher io.files io.pathnames kernel memoize threads
-webapps.mason.utils ;
+USING: accessors continuations namespaces sequences
+furnace.actions help.html http.server.responses io.directories
+io.directories.hierarchy io.launcher io.files io.pathnames
+kernel memoize threads webapps.mason.utils ;
IN: webapps.mason.docs-update
+SYMBOL: docs-path
+
: update-docs ( -- )
home [
"newdocs" make-directory
- "newdocs" [ { "tar" "xfz" "../docs.tar.gz" } try-process ] with-directory
+ "newdocs" [ { "tar" "xfz" } docs-path get suffix try-process ] with-directory
"docs" exists? [ "docs" "docs.old" move-file ] when
"newdocs/docs" "docs" move-file
From 67db4d73ac99951486eb1f9fe1e46decbdfc85ce Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 19:06:45 -0700
Subject: [PATCH 012/147] logging.insomniac: fix docs
---
basis/logging/insomniac/insomniac-docs.factor | 5 -----
1 file changed, 5 deletions(-)
diff --git a/basis/logging/insomniac/insomniac-docs.factor b/basis/logging/insomniac/insomniac-docs.factor
index ccec5e50cf..4a989cfc87 100644
--- a/basis/logging/insomniac/insomniac-docs.factor
+++ b/basis/logging/insomniac/insomniac-docs.factor
@@ -8,11 +8,6 @@ HELP: insomniac-sender
HELP: insomniac-recipients
{ $var-description "A sequence of e-mail addresses to mail log reports to. Must be set before " { $vocab-link "logging.insomniac" } " is used." } ;
-HELP: ?analyze-log
-{ $values { "service" "a log service name" } { "word-names" "a sequence of strings" } { "string/f" string } }
-{ $description "Analyzes the most recent log and outputs the string analysis, or outputs " { $link f } " if it doesn't exist." }
-{ $see-also analyze-log } ;
-
HELP: email-log-report
{ $values { "service" "a log service name" } { "word-names" "a sequence of strings" } }
{ $description "E-mails a log report for the given log service. The " { $link insomniac-sender } " and " { $link insomniac-recipients } " parameters must be set up first. The " { $snippet "word-names" } " parameter is documented in " { $link analyze-entries } "." } ;
From 0945aac30dbe1efd4fded3d06306f426a2f19d1e Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 19:42:10 -0700
Subject: [PATCH 013/147] websites.concatenative: more tweaks
---
extra/webapps/mason/docs-update/docs-update.factor | 13 +++++++------
extra/websites/concatenative/concatenative.factor | 3 ---
2 files changed, 7 insertions(+), 9 deletions(-)
diff --git a/extra/webapps/mason/docs-update/docs-update.factor b/extra/webapps/mason/docs-update/docs-update.factor
index 3ecfbef190..3621f096ec 100644
--- a/extra/webapps/mason/docs-update/docs-update.factor
+++ b/extra/webapps/mason/docs-update/docs-update.factor
@@ -1,17 +1,18 @@
! Copyright (C) 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors continuations namespaces sequences
-furnace.actions help.html http.server.responses io.directories
-io.directories.hierarchy io.launcher io.files io.pathnames
-kernel memoize threads webapps.mason.utils ;
+USING: accessors furnace.actions help.html
+http.server.responses io.directories io.directories.hierarchy
+io.files io.launcher io.pathnames kernel mason.config memoize
+namespaces sequences threads webapps.mason.utils ;
IN: webapps.mason.docs-update
-SYMBOL: docs-path
+: docs-path ( -- path )
+ docs-directory get "docs.tar.gz" append-path ;
: update-docs ( -- )
home [
"newdocs" make-directory
- "newdocs" [ { "tar" "xfz" } docs-path get suffix try-process ] with-directory
+ "newdocs" [ { "tar" "xfz" } docs-path suffix try-process ] with-directory
"docs" exists? [ "docs" "docs.old" move-file ] when
"newdocs/docs" "docs" move-file
diff --git a/extra/websites/concatenative/concatenative.factor b/extra/websites/concatenative/concatenative.factor
index d14f52e8df..b4ce1ce1a7 100644
--- a/extra/websites/concatenative/concatenative.factor
+++ b/extra/websites/concatenative/concatenative.factor
@@ -74,10 +74,7 @@ SYMBOLS: factor-recaptcha-public-key factor-recaptcha-private-key ;
SYMBOLS: key-password key-file dh-file ;
: common-configuration ( -- )
- "concatenative.org" 25 smtp-server set-global
"noreply@concatenative.org" lost-password-from set-global
- "website@concatenative.org" insomniac-sender set-global
- { "slava@factorcode.org" } insomniac-recipients set-global
init-factor-db ;
: init-testing ( -- )
From 6550a96e03526716e14cc968f128004dc95a567d Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 19:54:12 -0700
Subject: [PATCH 014/147] webapps.planet: include its own icon
---
extra/webapps/planet/icons/feed-icon-14x14.png | Bin 0 -> 689 bytes
extra/webapps/planet/planet.factor | 2 ++
extra/webapps/planet/planet.xml | 2 +-
3 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 extra/webapps/planet/icons/feed-icon-14x14.png
diff --git a/extra/webapps/planet/icons/feed-icon-14x14.png b/extra/webapps/planet/icons/feed-icon-14x14.png
new file mode 100644
index 0000000000000000000000000000000000000000..b3c949d2244f2c0c81d65e74719af2a1b56d06a3
GIT binary patch
literal 689
zcmV;i0#5yjP)(tky!*UETcH-TCU7SrqEjJM#?B`_A)!p7(kFf9-P@=@15kkTkGK
zgFusyy#KECqZzRdBLb=P?$(kUP;>kYTDeG&{|a+iOiRbI6nbQ)j#7bOf>iF=C+|_py<&Fo1F5cC*iEM?zZGC{ejNg4LWYp=S$L6Qaby6y
zp$+F`250{%tU{Lg$5*ROH}y!1UKJS4*xqd7P(Y3JQF?lrnf?yerr%&6yGXLG1ur*B
z{$&R1@Oj)yl@%rY5rh?j(j10Yz_DBs`AKFU_QnB;)(aqQmGi&ieOS|21^NP9UMpa<
zU&p!f6RZ6Owp^X!EXA=0SbN&h?CrQK%Q3(=YBqqHD^9ZUM0Hxt-6-KT;>lf@j?Z+v
zHm(}`>85I&E<7e}oz?6UwjAogowzGO8kSN7+2`b^$Az9L{K5*ko87EV45LT-`_##3
z>d3AGh@>=mbg34|6}+-gT9N+6Dr@44VEl44O&{&|w=qpbzC#iWMKa?5)>tI+KLQK@
Xq0QFqn(9Yl00000NkvXXu0mjfZ8t "" add-responder
"feed.xml" add-responder
"admin" add-responder
+ "vocab:webapps/planet/icons/" "icons" add-responder
{ planet "planet-common" } >>template ;
diff --git a/extra/webapps/planet/planet.xml b/extra/webapps/planet/planet.xml
index 08cf07d4ce..525e1e38fe 100644
--- a/extra/webapps/planet/planet.xml
+++ b/extra/webapps/planet/planet.xml
@@ -48,7 +48,7 @@
Planet Lisp.
-
+
Syndicate
From 0811f7b244096d72b0451fff0f4e9feaee0ecbcc Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 19:54:57 -0700
Subject: [PATCH 015/147] bunny, gpu.demos.bunny: bunny has moved
---
extra/bunny/model/model.factor | 2 +-
extra/gpu/demos/bunny/bunny.factor | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/extra/bunny/model/model.factor b/extra/bunny/model/model.factor
index cfe95956c0..0f22b531c6 100644
--- a/extra/bunny/model/model.factor
+++ b/extra/bunny/model/model.factor
@@ -42,7 +42,7 @@ IN: bunny.model
: model-path ( -- path ) "bun_zipper.ply" temp-file ;
-: model-url ( -- url ) "http://factorcode.org/bun_zipper.ply" ;
+: model-url ( -- url ) "http://factorcode.org/slava/bun_zipper.ply" ;
: maybe-download ( -- path )
model-path dup exists? [
diff --git a/extra/gpu/demos/bunny/bunny.factor b/extra/gpu/demos/bunny/bunny.factor
index f29e12c1a2..0491191c63 100644
--- a/extra/gpu/demos/bunny/bunny.factor
+++ b/extra/gpu/demos/bunny/bunny.factor
@@ -145,7 +145,7 @@ UNIFORM-TUPLE: loading-uniforms
: bunny-model-path ( -- path ) "bun_zipper.ply" temp-file ;
-CONSTANT: bunny-model-url "http://factorcode.org/bun_zipper.ply"
+CONSTANT: bunny-model-url "http://factorcode.org/slava/bun_zipper.ply"
: download-bunny ( -- path )
bunny-model-path dup exists? [
From cfbbe37e388dd890f0198dae79c335b3f998b2ba Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 20:00:54 -0700
Subject: [PATCH 016/147] webapps.planet: workaround
---
extra/webapps/planet/planet.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/extra/webapps/planet/planet.xml b/extra/webapps/planet/planet.xml
index 525e1e38fe..c7c124d23c 100644
--- a/extra/webapps/planet/planet.xml
+++ b/extra/webapps/planet/planet.xml
@@ -48,7 +48,7 @@
Planet Lisp.
-
+
Syndicate
From dcf87ddf9739882d248d85f8b9e9bf0de6b4b5e4 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 20:54:56 -0700
Subject: [PATCH 017/147] websites.concatenative: run builder check here
---
extra/websites/concatenative/concatenative.factor | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/extra/websites/concatenative/concatenative.factor b/extra/websites/concatenative/concatenative.factor
index b4ce1ce1a7..b91d58f433 100644
--- a/extra/websites/concatenative/concatenative.factor
+++ b/extra/websites/concatenative/concatenative.factor
@@ -3,7 +3,7 @@
USING: accessors kernel sequences assocs io.files io.pathnames
io.sockets io.sockets.secure io.servers
namespaces db db.tuples db.sqlite smtp urls
-logging.insomniac
+logging.insomniac calendar timers
html.templates.chloe
http.server
http.server.dispatchers
@@ -27,6 +27,7 @@ webapps.user-admin
webapps.help
webapps.mason
webapps.mason.backend
+webapps.mason.backend.watchdog
websites.factorcode ;
IN: websites.concatenative
@@ -123,8 +124,12 @@ SYMBOLS: key-password key-file dh-file ;
8080 >>insecure
8431 >>secure ;
+: start-watchdog ( -- )
+ [ check-builders ] 6 hours every drop ;
+
: start-website ( -- server )
website-db start-expiring
website-db start-update-task
http-insomniac
+ start-watchdog
start-server ;
From c97dd81bc3c6b43009bf87137d39b0357989136f Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 23:45:09 -0500
Subject: [PATCH 018/147] GNUmakefile: fix on Windows
---
GNUmakefile | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/GNUmakefile b/GNUmakefile
index 38e3b0d736..43fba15c0b 100755
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -154,12 +154,12 @@ solaris-x86-64:
$(MAKE) $(ALL) CONFIG=vm/Config.solaris.x86.64
winnt-x86-32:
- $(MAKE) $(ALL) CONFIG=vm/Config.windows.nt.x86.32
- $(MAKE) factor-console CONFIG=vm/Config.windows.nt.x86.32
+ $(MAKE) $(ALL) CONFIG=vm/Config.windows.x86.32
+ $(MAKE) factor-console CONFIG=vm/Config.windows.x86.32
winnt-x86-64:
- $(MAKE) $(ALL) CONFIG=vm/Config.windows.nt.x86.64
- $(MAKE) factor-console CONFIG=vm/Config.windows.nt.x86.64
+ $(MAKE) $(ALL) CONFIG=vm/Config.windows.x86.64
+ $(MAKE) factor-console CONFIG=vm/Config.windows.x86.64
ifdef CONFIG
From f7bc78c9f74714e82f9f44cfa893fe27e87d7aa0 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Sat, 2 Oct 2010 23:50:48 -0500
Subject: [PATCH 019/147] vm: fix Config.windows
---
vm/Config.windows | 1 +
1 file changed, 1 insertion(+)
mode change 100644 => 100755 vm/Config.windows
diff --git a/vm/Config.windows b/vm/Config.windows
old mode 100644
new mode 100755
index 1886ee77d6..1ae91b15c2
--- a/vm/Config.windows
+++ b/vm/Config.windows
@@ -5,6 +5,7 @@ SHARED_DLL_EXTENSION=.dll
LIBS = -lm
+PLAF_DLL_OBJS += vm/os-windows.o vm/mvm-windows.o
PLAF_EXE_OBJS += vm/resources.o vm/main-windows.o
EXE_SUFFIX=
From dab42457d069c0899291bbfbead8dbb1848c4bb0 Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Mon, 4 Oct 2010 20:38:59 -0700
Subject: [PATCH 020/147] webapps.mason: update for factorcode.org changes
---
extra/webapps/mason/download-package.xml | 2 +-
extra/webapps/mason/download-release.xml | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/extra/webapps/mason/download-package.xml b/extra/webapps/mason/download-package.xml
index ff366fb4f4..1d56d3e3cb 100644
--- a/extra/webapps/mason/download-package.xml
+++ b/extra/webapps/mason/download-package.xml
@@ -7,7 +7,7 @@
Factor binary package for
-
+
Factor binary package for
diff --git a/extra/webapps/mason/download-release.xml b/extra/webapps/mason/download-release.xml
index ffb485e173..a1d4766206 100644
--- a/extra/webapps/mason/download-release.xml
+++ b/extra/webapps/mason/download-release.xml
@@ -7,7 +7,7 @@
Factor binary package for
-
+
Factor binary package for
From 62645adff561a3b54cfad91b2f177b038310a6af Mon Sep 17 00:00:00 2001
From: Slava Pestov
Date: Mon, 4 Oct 2010 21:07:30 -0700
Subject: [PATCH 021/147] websites.factorcode: add screenshots
---
extra/websites/factorcode/factor-macosx.png | Bin 0 -> 212141 bytes
extra/websites/factorcode/factor-windows7.png | Bin 0 -> 1003067 bytes
2 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 extra/websites/factorcode/factor-macosx.png
create mode 100644 extra/websites/factorcode/factor-windows7.png
diff --git a/extra/websites/factorcode/factor-macosx.png b/extra/websites/factorcode/factor-macosx.png
new file mode 100644
index 0000000000000000000000000000000000000000..06e44ecf70f77609ecd0f3b4c0be73d4a8504b2c
GIT binary patch
literal 212141
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