Working on faster refresh-all
							parent
							
								
									411a137563
								
							
						
					
					
						commit
						52bb93cf40
					
				| 
						 | 
				
			
			@ -1,24 +1,39 @@
 | 
			
		|||
! Copyright (C) 2008 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: threads io.files io.monitors init kernel
 | 
			
		||||
vocabs.loader tools.vocabs namespaces continuations ;
 | 
			
		||||
vocabs vocabs.loader tools.vocabs namespaces continuations
 | 
			
		||||
sequences splitting assocs ;
 | 
			
		||||
IN: tools.vocabs.monitor
 | 
			
		||||
 | 
			
		||||
! Use file system change monitoring to flush the tags/authors
 | 
			
		||||
! cache
 | 
			
		||||
SYMBOL: vocab-monitor
 | 
			
		||||
: vocab-dir>vocab-name ( path -- vocab )
 | 
			
		||||
    left-trim-separators right-trim-separators
 | 
			
		||||
    { { CHAR: / CHAR: . } { CHAR: \\ CHAR: . } } substitute ;
 | 
			
		||||
 | 
			
		||||
: monitor-thread ( -- )
 | 
			
		||||
    vocab-monitor get-global
 | 
			
		||||
    next-change 2drop
 | 
			
		||||
    t sources-changed? set-global reset-cache ;
 | 
			
		||||
: path>vocab-name ( path -- vocab )
 | 
			
		||||
    dup ".factor" tail? [ parent-directory ] when
 | 
			
		||||
    dup [ vocab-dir>vocab-name ] when ;
 | 
			
		||||
 | 
			
		||||
: start-monitor-thread
 | 
			
		||||
: changed-vocab ( vocab -- )
 | 
			
		||||
    dup vocab
 | 
			
		||||
    [ dup changed-vocabs get-global set-at ] [ drop ] if ;
 | 
			
		||||
 | 
			
		||||
: monitor-thread ( path monitor -- )
 | 
			
		||||
    #! On OS X, monitors give us the full path, so we chop it
 | 
			
		||||
    #! off if its there.
 | 
			
		||||
    next-change drop swap ?head drop
 | 
			
		||||
    path>vocab-name changed-vocab reset-cache ;
 | 
			
		||||
 | 
			
		||||
: start-monitor-thread ( root -- )
 | 
			
		||||
    #! Silently ignore errors during monitor creation since
 | 
			
		||||
    #! monitors are not supported on all platforms.
 | 
			
		||||
    (normalize-path) dup t <monitor> [ monitor-thread t ] 2curry
 | 
			
		||||
    "Vocabulary monitor" spawn-server drop ;
 | 
			
		||||
 | 
			
		||||
: start-monitor-threads ( -- )
 | 
			
		||||
    [
 | 
			
		||||
        "" resource-path t <monitor> vocab-monitor set-global
 | 
			
		||||
        [ monitor-thread t ] "Vocabulary monitor" spawn-server drop
 | 
			
		||||
        vocab-roots get [ start-monitor-thread ] each
 | 
			
		||||
        H{ } clone changed-vocabs set-global
 | 
			
		||||
        vocabs [ changed-vocab ] each
 | 
			
		||||
    ] ignore-errors ;
 | 
			
		||||
 | 
			
		||||
[ start-monitor-thread ] "tools.vocabs.monitor" add-init-hook
 | 
			
		||||
[ start-monitor-threads ] "tools.vocabs.monitor" add-init-hook
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,15 +21,15 @@ IN: tools.vocabs
 | 
			
		|||
 | 
			
		||||
: vocab-tests ( vocab -- tests )
 | 
			
		||||
    [
 | 
			
		||||
        dup vocab-tests-file [ , ] when*
 | 
			
		||||
        vocab-tests-dir [ % ] when*
 | 
			
		||||
        [ vocab-tests-file [ , ] when* ]
 | 
			
		||||
        [ vocab-tests-dir [ % ] when* ] bi
 | 
			
		||||
    ] { } make ;
 | 
			
		||||
 | 
			
		||||
: vocab-files ( vocab -- seq )
 | 
			
		||||
    [
 | 
			
		||||
        dup vocab-source-path [ , ] when*
 | 
			
		||||
        dup vocab-docs-path [ , ] when*
 | 
			
		||||
        vocab-tests %
 | 
			
		||||
        [ vocab-source-path [ , ] when* ]
 | 
			
		||||
        [ vocab-docs-path [ , ] when* ]
 | 
			
		||||
        [ vocab-tests % ] tri
 | 
			
		||||
    ] { } make ;
 | 
			
		||||
 | 
			
		||||
: source-modified? ( path -- ? )
 | 
			
		||||
| 
						 | 
				
			
			@ -56,20 +56,27 @@ IN: tools.vocabs
 | 
			
		|||
: modified-docs ( vocabs -- seq )
 | 
			
		||||
    [ vocab-docs-path ] modified ;
 | 
			
		||||
 | 
			
		||||
SYMBOL: changed-vocabs
 | 
			
		||||
 | 
			
		||||
[ f changed-vocabs set-global ] "tools.vocabs" add-init-hook
 | 
			
		||||
 | 
			
		||||
: filter-changed ( vocabs -- vocabs' )
 | 
			
		||||
    changed-vocabs get [
 | 
			
		||||
        [ delete-at* nip ] curry subset
 | 
			
		||||
    ] when* ;
 | 
			
		||||
 | 
			
		||||
: to-refresh ( prefix -- modified-sources modified-docs )
 | 
			
		||||
    child-vocabs
 | 
			
		||||
    dup modified-sources swap modified-docs ;
 | 
			
		||||
    child-vocabs filter-changed
 | 
			
		||||
    [ modified-sources ] [ modified-docs ] bi ;
 | 
			
		||||
 | 
			
		||||
: vocab-heading. ( vocab -- )
 | 
			
		||||
    nl
 | 
			
		||||
    "==== " write
 | 
			
		||||
    dup vocab-name swap vocab write-object ":" print
 | 
			
		||||
    [ vocab-name ] [ vocab write-object ] bi ":" print
 | 
			
		||||
    nl ;
 | 
			
		||||
 | 
			
		||||
: load-error. ( triple -- )
 | 
			
		||||
    dup first vocab-heading.
 | 
			
		||||
    dup second print-error
 | 
			
		||||
    drop ;
 | 
			
		||||
    [ first vocab-heading. ] [ second print-error ] bi ;
 | 
			
		||||
 | 
			
		||||
: load-failures. ( failures -- )
 | 
			
		||||
    [ load-error. nl ] each ;
 | 
			
		||||
| 
						 | 
				
			
			@ -89,30 +96,24 @@ SYMBOL: failures
 | 
			
		|||
    ] with-compiler-errors ;
 | 
			
		||||
 | 
			
		||||
: do-refresh ( modified-sources modified-docs -- )
 | 
			
		||||
    2dup
 | 
			
		||||
    [ f swap set-vocab-docs-loaded? ] each
 | 
			
		||||
    [ f swap set-vocab-source-loaded? ] each
 | 
			
		||||
    append prune require-all load-failures. ;
 | 
			
		||||
    [
 | 
			
		||||
        [ [ f swap set-vocab-source-loaded? ] each ]
 | 
			
		||||
        [ [ f swap set-vocab-docs-loaded? ] each ] bi*
 | 
			
		||||
    ]
 | 
			
		||||
    [ append prune require-all load-failures. ] 2bi ;
 | 
			
		||||
 | 
			
		||||
: refresh ( prefix -- ) to-refresh do-refresh ;
 | 
			
		||||
 | 
			
		||||
SYMBOL: sources-changed?
 | 
			
		||||
: refresh-all ( -- ) "" refresh ;
 | 
			
		||||
 | 
			
		||||
[ t sources-changed? set-global ] "tools.vocabs" add-init-hook
 | 
			
		||||
 | 
			
		||||
: refresh-all ( -- )
 | 
			
		||||
    "" refresh f sources-changed? set-global ;
 | 
			
		||||
 | 
			
		||||
MEMO: (vocab-file-contents) ( path -- lines )
 | 
			
		||||
    dup exists? [ utf8 file-lines ] [ drop f ] if ;
 | 
			
		||||
 | 
			
		||||
: vocab-file-contents ( vocab name -- seq )
 | 
			
		||||
    vocab-append-path dup [ (vocab-file-contents) ] when ;
 | 
			
		||||
MEMO: vocab-file-contents ( vocab name -- seq )
 | 
			
		||||
    vocab-append-path dup
 | 
			
		||||
    [ dup exists? [ utf8 file-lines ] [ drop f ] if ] when ;
 | 
			
		||||
 | 
			
		||||
: set-vocab-file-contents ( seq vocab name -- )
 | 
			
		||||
    dupd vocab-append-path [
 | 
			
		||||
        utf8 set-file-lines
 | 
			
		||||
        \ (vocab-file-contents) reset-memoized
 | 
			
		||||
        \ vocab-file-contents reset-memoized
 | 
			
		||||
    ] [
 | 
			
		||||
        "The " swap vocab-name
 | 
			
		||||
        " vocabulary was not loaded from the file system"
 | 
			
		||||
| 
						 | 
				
			
			@ -261,7 +262,7 @@ MEMO: all-authors ( -- seq )
 | 
			
		|||
 | 
			
		||||
: reset-cache ( -- )
 | 
			
		||||
    root-cache get-global clear-assoc
 | 
			
		||||
    \ (vocab-file-contents) reset-memoized
 | 
			
		||||
    \ vocab-file-contents reset-memoized
 | 
			
		||||
    \ all-vocabs-seq reset-memoized
 | 
			
		||||
    \ all-authors reset-memoized
 | 
			
		||||
    \ all-tags reset-memoized ;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue