diff --git a/README.md b/README.md index 94780393..b02b8d2c 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,12 @@ The Julia launcher `julia` automatically determines which specific version of Ju The channel is used in the order listed above, using the first available option. +## Path used by Juliaup + +Juliaup will by default use the Julia depot at `~/.julia` to store Julia versions and configuration files. This can be changed by setting +the `JULIAUP_DEPOT_PATH` environment variable. Caution: Previous versions of Juliaup used the content of the environment variable +`JULIA_DEPOT_PATH` to locate Juliaup files, the current version changed this behavior and no longer depends on `JULIA_DEPOT_PATH`. + ## Juliaup server Juliaup by default downloads julia binary tarballs from the official server "https://julialang-s3.julialang.org". diff --git a/src/global_paths.rs b/src/global_paths.rs index 0768d3e6..2219e22c 100644 --- a/src/global_paths.rs +++ b/src/global_paths.rs @@ -17,43 +17,21 @@ pub struct GlobalPaths { } fn get_juliaup_home_path() -> Result { - let entry_sep = if std::env::consts::OS == "windows" { - ';' - } else { - ':' - }; - - match std::env::var("JULIA_DEPOT_PATH") { + match std::env::var("JULIAUP_DEPOT_PATH") { Ok(val) => { - // Note: Docs on JULIA_DEPOT_PATH states that if it exists but is empty, it should - // be interpreted as an empty array. This code instead interprets it as a 1-element - // array of the default path. - // We interpret it differently, because while Julia may work without a DEPOT_PATH, - // Juliaup does not currently, since it must check for new versions. - let mut paths = Vec::::new(); - for segment in val.split(entry_sep) { - // Empty segments resolve to the default first value of - // DEPOT_PATH - let segment_path = if segment.is_empty() { - get_default_juliaup_home_path()? - } else { - PathBuf::from(segment.to_string()) - }; - paths.push(segment_path); - } + let val = val.trim(); + + if val.is_empty() { + return get_default_juliaup_home_path(); + } else { + let path = PathBuf::from(val); - // First, we try to find any directory which already is initialized by - // Juliaup. - for path in paths.iter() { - let subpath = path.join("juliaup").join("juliaup.json"); - if subpath.is_file() { - return Ok(path.join("juliaup")); + if !path.is_absolute() { + return Err(anyhow!("The current value of '{}' for the environment variable JULIAUP_DEPOT_PATH is not an absolute path.", val)); + } else { + return Ok(PathBuf::from(val).join("juliaup")); } } - // If such a file does not exist, we pick the first segment in JULIA_DEPOT_PATH. - // This is guaranteed to be nonempty due to the properties of str::split. - let first_path = paths.iter().next().unwrap(); - return Ok(first_path.join("juliaup")); } Err(_) => return get_default_juliaup_home_path(), } diff --git a/tests/channel_selection.rs b/tests/channel_selection.rs index c1b7e092..35034837 100644 --- a/tests/channel_selection.rs +++ b/tests/channel_selection.rs @@ -9,6 +9,7 @@ fn channel_selection() { .arg("add") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -18,6 +19,7 @@ fn channel_selection() { .arg("add") .arg("1.7.3") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -27,6 +29,7 @@ fn channel_selection() { .arg("add") .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -36,6 +39,7 @@ fn channel_selection() { .arg("default") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -45,6 +49,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout("1.6.7"); @@ -55,6 +60,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout("1.8.5"); @@ -64,6 +70,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .env("JULIAUP_CHANNEL", "1.7.3") .assert() .success() @@ -75,6 +82,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .env("JULIAUP_CHANNEL", "1.7.3") .assert() .success() @@ -88,6 +96,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .failure() .stderr("ERROR: Invalid Juliaup channel `1.8.6` at command line.\n"); @@ -97,6 +106,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .env("JULIAUP_CHANNEL", "1.7.4") .assert() .failure() @@ -110,6 +120,7 @@ fn channel_selection() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .env("JULIAUP_CHANNEL", "1.7.4") .assert() .failure() diff --git a/tests/command_add.rs b/tests/command_add.rs index 61df86fa..b848b9bd 100644 --- a/tests/command_add.rs +++ b/tests/command_add.rs @@ -9,6 +9,7 @@ fn command_add() { .arg("add") .arg("1.6.4") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -19,6 +20,7 @@ fn command_add() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout("1.6.4"); diff --git a/tests/command_default.rs b/tests/command_default.rs index 7af37d51..7c32436d 100644 --- a/tests/command_default.rs +++ b/tests/command_default.rs @@ -9,6 +9,7 @@ fn command_default() { .arg("add") .arg("1.6.0") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -18,6 +19,7 @@ fn command_default() { .arg("default") .arg("1.6.0") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -27,6 +29,7 @@ fn command_default() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout("1.6.0"); diff --git a/tests/command_initial_setup_from_launcher_test.rs b/tests/command_initial_setup_from_launcher_test.rs index b517bb10..bb5d348f 100644 --- a/tests/command_initial_setup_from_launcher_test.rs +++ b/tests/command_initial_setup_from_launcher_test.rs @@ -15,6 +15,7 @@ fn command_initial_setup() { .unwrap() .arg("46029ef5-0b73-4a71-bff3-d0d05de42aac") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); diff --git a/tests/command_list_test.rs b/tests/command_list_test.rs index ce46e547..a50601bf 100644 --- a/tests/command_list_test.rs +++ b/tests/command_list_test.rs @@ -12,6 +12,7 @@ fn command_list() { .unwrap() .arg("list") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicate::str::starts_with(" Channel").and(predicate::str::contains("release"))); @@ -20,6 +21,7 @@ fn command_list() { .unwrap() .arg("ls") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicate::str::starts_with(" Channel").and(predicate::str::contains("release"))); diff --git a/tests/command_override_test.rs b/tests/command_override_test.rs index 637d4e59..e3a2f2a0 100644 --- a/tests/command_override_test.rs +++ b/tests/command_override_test.rs @@ -10,6 +10,7 @@ fn command_override_status_test() { .arg("add") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -19,6 +20,7 @@ fn command_override_status_test() { .arg("add") .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -28,6 +30,7 @@ fn command_override_status_test() { .arg("override") .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(" Path Channel \n---------------\n"); @@ -44,6 +47,7 @@ fn command_override_cur_dir_test() { .arg("add") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -53,6 +57,7 @@ fn command_override_cur_dir_test() { .arg("add") .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -62,6 +67,7 @@ fn command_override_cur_dir_test() { .arg("default") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -71,6 +77,7 @@ fn command_override_cur_dir_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success() @@ -82,6 +89,7 @@ fn command_override_cur_dir_test() { .arg("set") .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success(); @@ -91,6 +99,7 @@ fn command_override_cur_dir_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success() @@ -101,6 +110,7 @@ fn command_override_cur_dir_test() { .arg("override") .arg("unset") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success(); @@ -110,6 +120,7 @@ fn command_override_cur_dir_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success() @@ -127,6 +138,7 @@ fn command_override_arg_test() { .arg("add") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -136,6 +148,7 @@ fn command_override_arg_test() { .arg("add") .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -145,6 +158,7 @@ fn command_override_arg_test() { .arg("default") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -154,6 +168,7 @@ fn command_override_arg_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success() @@ -167,6 +182,7 @@ fn command_override_arg_test() { .arg(or_dir.as_os_str()) .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -175,6 +191,7 @@ fn command_override_arg_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success() @@ -187,6 +204,7 @@ fn command_override_arg_test() { .arg("--path") .arg(or_dir.as_os_str()) .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -195,6 +213,7 @@ fn command_override_arg_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir) .assert() .success() @@ -214,6 +233,7 @@ fn command_override_overlap_test() { .arg("add") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -223,6 +243,7 @@ fn command_override_overlap_test() { .arg("add") .arg("1.7.3") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -232,6 +253,7 @@ fn command_override_overlap_test() { .arg("add") .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -241,6 +263,7 @@ fn command_override_overlap_test() { .arg("default") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -253,6 +276,7 @@ fn command_override_overlap_test() { .arg(or_dir_parent.as_os_str()) .arg("1.7.3") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -264,6 +288,7 @@ fn command_override_overlap_test() { .arg(&or_dir_child.as_os_str()) .arg("1.8.5") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -272,6 +297,7 @@ fn command_override_overlap_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir_parent) .assert() .success() @@ -282,6 +308,7 @@ fn command_override_overlap_test() { .arg("-e") .arg("print(VERSION)") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .current_dir(&or_dir_child) .assert() .success() @@ -301,6 +328,7 @@ fn command_override_delete_empty_test() { .arg("add") .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -313,6 +341,7 @@ fn command_override_delete_empty_test() { .arg(or_dir1.as_os_str()) .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -324,6 +353,7 @@ fn command_override_delete_empty_test() { .arg(or_dir2.as_os_str()) .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -335,6 +365,7 @@ fn command_override_delete_empty_test() { .arg(or_dir3.as_os_str()) .arg("1.6.7") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -344,6 +375,7 @@ fn command_override_delete_empty_test() { .arg("unset") .arg("--nonexistent") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -352,6 +384,7 @@ fn command_override_delete_empty_test() { .arg("override") .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicates::ord::eq(" Path Channel \n---------------\n").not()); @@ -366,6 +399,7 @@ fn command_override_delete_empty_test() { .arg("unset") .arg("--nonexistent") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success(); @@ -374,6 +408,7 @@ fn command_override_delete_empty_test() { .arg("override") .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(" Path Channel \n---------------\n"); diff --git a/tests/command_remove.rs b/tests/command_remove.rs index 81c49859..bbe6fabc 100644 --- a/tests/command_remove.rs +++ b/tests/command_remove.rs @@ -12,6 +12,7 @@ fn command_remove() { .unwrap() .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicates::str::contains("1.6.4").not()); @@ -21,6 +22,7 @@ fn command_remove() { .arg("add") .arg("1.6.4") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -29,6 +31,7 @@ fn command_remove() { .unwrap() .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicates::str::contains("1.6.4")); @@ -38,6 +41,7 @@ fn command_remove() { .arg("add") .arg("release") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -46,6 +50,7 @@ fn command_remove() { .unwrap() .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicates::str::contains("1.6.4").and(predicates::str::contains("release"))); @@ -55,6 +60,7 @@ fn command_remove() { .arg("remove") .arg("release") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -63,6 +69,7 @@ fn command_remove() { .unwrap() .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(predicates::str::contains("1.6.4").and(predicates::str::contains("release").not())); diff --git a/tests/command_status_test.rs b/tests/command_status_test.rs index ae2bbf12..94c765d4 100644 --- a/tests/command_status_test.rs +++ b/tests/command_status_test.rs @@ -11,6 +11,7 @@ fn command_status() { .unwrap() .arg("status") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(" Default Channel Version Update \n-----------------------------------\n"); @@ -19,6 +20,7 @@ fn command_status() { .unwrap() .arg("st") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(" Default Channel Version Update \n-----------------------------------\n"); diff --git a/tests/command_update.rs b/tests/command_update.rs index 478c2f11..493029cc 100644 --- a/tests/command_update.rs +++ b/tests/command_update.rs @@ -11,6 +11,7 @@ fn command_update() { .unwrap() .arg("update") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout(""); @@ -19,6 +20,7 @@ fn command_update() { .unwrap() .arg("up") .env("JULIA_DEPOT_PATH", depot_dir.path()) + .env("JULIAUP_DEPOT_PATH", depot_dir.path()) .assert() .success() .stdout("");