From b5c72dab401648a09a4995e395e619af986f613b Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 15 Nov 2011 20:04:44 -0800 Subject: [PATCH] vocabs.refresh.monitor: handle symlink paths On macosx, fsevents always provides the true path for changed files, even if the monitored path includes symlinks. This screws things up if a symlinked path is used as a vocab root. Fixes #404. --- basis/vocabs/refresh/monitor/monitor.factor | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/basis/vocabs/refresh/monitor/monitor.factor b/basis/vocabs/refresh/monitor/monitor.factor index c9b664dc91..b72bae9d89 100644 --- a/basis/vocabs/refresh/monitor/monitor.factor +++ b/basis/vocabs/refresh/monitor/monitor.factor @@ -3,7 +3,8 @@ USING: accessors assocs command-line concurrency.messaging continuations init io.backend io.files io.monitors io.pathnames kernel namespaces sequences sets splitting threads fry -tr vocabs vocabs.loader vocabs.refresh vocabs.cache ; +tr vocabs vocabs.loader vocabs.refresh vocabs.cache +io.files.links ; IN: vocabs.refresh.monitor TR: convert-separators "/\\" ".." ; @@ -16,10 +17,15 @@ TR: convert-separators "/\\" ".." ; : path>vocab-name ( path -- vocab ) dup ".factor" tail? [ parent-directory ] when ; +: scrub-links-in-path ( path -- path' ) + normalize-path path-components "/" + [ append-path follow-links ] reduce ; + : chop-vocab-root ( path -- path' ) "resource:" prepend-path normalize-path dup vocab-roots get - [ normalize-path ] map + [ [ normalize-path ] map ] + [ [ scrub-links-in-path ] map ] bi append [ head? ] with find nip ?head drop ; @@ -29,7 +35,7 @@ TR: convert-separators "/\\" ".." ; : monitor-loop ( monitor -- ) #! On OS X, monitors give us the full path, so we chop it #! off if its there. - [ next-change path>> path>vocab changed-vocab reset-cache ] + [ next-change path>> P path>vocab changed-vocab reset-cache ] [ monitor-loop ] bi ;