toolcontext: make compute_nit_dir more robust
authorJean Privat <jean@pryen.org>
Tue, 4 Nov 2014 02:11:45 +0000 (21:11 -0500)
committerJean Privat <jean@pryen.org>
Tue, 4 Nov 2014 02:11:45 +0000 (21:11 -0500)
Signed-off-by: Jean Privat <jean@pryen.org>

src/toolcontext.nit

index a443b0a..bcf571f 100644 (file)
@@ -404,32 +404,43 @@ The Nit language documentation and the source code of its tools and libraries ma
        # The identified root directory of the Nit project
        var nit_dir: nullable String = null
 
-       private fun compute_nit_dir: nullable String
+       private fun compute_nit_dir: String
        do
                # a environ variable has precedence
                var res = "NIT_DIR".environ
-               if not res.is_empty then return res
+               if not res.is_empty then
+                       if not check_nit_dir(res) then
+                               fatal_error(null, "Fatal Error: the value of NIT_DIR does not seem to be a valid base Nit directory: {res}")
+                       end
+                       return res
+               end
 
                # find the runpath of the program from argv[0]
                res = "{sys.program_name.dirname}/.."
-               if res.file_exists and "{res}/src/nit.nit".file_exists then return res.simplify_path
+               if check_nit_dir(res) then return res.simplify_path
 
                # find the runpath of the process from /proc
                var exe = "/proc/self/exe"
                if exe.file_exists then
                        res = exe.realpath
                        res = res.dirname.join_path("..")
-                       if res.file_exists and "{res}/src/nit.nit".file_exists then return res.simplify_path
+                       if check_nit_dir(res) then return res.simplify_path
                end
 
                # search in the PATH
                var ps = "PATH".environ.split(":")
                for p in ps do
                        res = p/".."
-                       if res.file_exists and "{res}/src/nit.nit".file_exists then return res.simplify_path
+                       if check_nit_dir(res) then return res.simplify_path
                end
 
-               return null
+               fatal_error(null, "Fatal Error: Cannot locate a valid base nit directory. It is quite unexpected. Try to set the environment variable `NIT_DIR` or to use the `--nit-dir` option.")
+               abort
+       end
+
+       private fun check_nit_dir(res: String): Bool
+       do
+               return res.file_exists and "{res}/src/nit.nit".file_exists
        end
 end