<< Back to previous view

[TNS-47] Files removed after non-canonical directory scan Created: 25/Apr/17  Updated: 25/Apr/17  Resolved: 25/Apr/17

Status: Closed
Project: tools.namespace
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Defect Priority: Major
Reporter: Stuart Sierra Assignee: Stuart Sierra
Resolution: Completed Votes: 0
Labels: None
Environment:

tools.namespace 0.3.0-*



 Description   

If a directory is scanned twice with the same directory, but with different (non-canonical) root directories supplied to c.t.n.dir/scan-dirs, files in the directory will be considered "deleted" and subsequently "unloaded" by c.t.n.reload.

This can happen after using c.t.n.repl/set-refresh-dirs with non-canonical (i.e. local) directory paths.

Steps to reproduce

In a shell:

mkdir demo
cd demo
mkdir src lib
echo "(ns foo (:require clojure.set))" > src/foo.clj

Copy the following JAR files into the lib directory:

clojure-1.8.0.jar
java.classpath-0.2.3.jar
tools.namespace-0.3.0-alpha3.jar
tools.reader-1.0.0-beta4.jar

Back in the shell, in the project directory:

java -cp src:lib/* clojure.main
Clojure 1.8.0
user=> (require 'clojure.tools.namespace.repl)
nil
user=> (clojure.tools.namespace.repl/refresh)
:reloading (foo)
:ok
user=> (clojure.tools.namespace.repl/set-refresh-dirs "src")
("src")
user=> (clojure.tools.namespace.repl/refresh)
:reloading ()
:ok
user=> (find-ns 'foo)
nil

The foo namespace should still exist after the second call to refresh, but it has been removed. Calling refresh a third time will not recover the file, because its timestamp has not changed since the previous call.

Note that this does not happen if the foo namespace has no dependencies, because it will not be present in the tracker's dependency map and therefore is never considered as a candidate for unloading.



 Comments   
Comment by Stuart Sierra [ 25/Apr/17 4:18 PM ]

Fixed in 0.3.0-alpha4





Generated at Sun Apr 30 12:00:12 CDT 2017 using JIRA 4.4#649-r158309.