cargo: 2 modes -> 3 modes, and clarify them

* -g or --mode=user to create/use .cargo under $HOME
* -G or --mode=system to create/use .cargo under sysroot
* by default, `cargo` uses .cargo under current working directory
This commit is contained in:
Tycho Sci 2012-02-07 17:15:39 +09:00 committed by Brian Anderson
parent 48e206ee81
commit d846169b15
2 changed files with 67 additions and 23 deletions

View File

@ -5,7 +5,8 @@ use std;
import rustc::syntax::{ast, codemap};
import rustc::syntax::parse::parser;
import rustc::util::filesearch::{get_cargo_root, get_cargo_root_nearest};
import rustc::util::filesearch::{get_cargo_root, get_cargo_root_nearest,
get_cargo_sysroot};
import rustc::driver::diagnostic;
import std::fs;
@ -20,7 +21,7 @@ import str;
import std::tempfile;
import vec;
import std::getopts;
import getopts::{optflag, opt_present};
import getopts::{optflag, optopt, opt_present};
enum _src {
/* Break cycles in package <-> source */
@ -69,12 +70,14 @@ type pkg = {
type options = {
test: bool,
cwd: bool,
mode: mode,
free: [str],
};
enum mode { system_mode, user_mode, local_mode }
fn opts() -> [getopts::opt] {
[optflag("g"), optflag("global"), optflag("test")]
[optflag("g"), optflag("G"), optopt("mode"), optflag("test")]
}
fn info(msg: str) {
@ -343,21 +346,40 @@ fn build_cargo_options(argv: [str]) -> options {
};
let test = opt_present(match, "test");
let cwd = !(opt_present(match, "g") || opt_present(match, "global"));
let mode = if opt_present(match, "G") {
if opt_present(match, "mode") { fail "--mode and -G both provided"; }
if opt_present(match, "g") { fail "-G and -g both provided"; }
system_mode
} else if opt_present(match, "g") {
if opt_present(match, "mode") { fail "--mode and -g both provided"; }
if opt_present(match, "G") { fail "-G and -g both provided"; }
user_mode
} else if opt_present(match, "mode") {
alt getopts::opt_str(match, "mode") {
"system" { system_mode }
"user" { user_mode }
"local" { local_mode }
_ { fail "argument to `mode` must be one of `system`" +
", `user`, or `normal`";
}
}
} else {
local_mode
};
{test: test, cwd: cwd, free: match.free}
{test: test, mode: mode, free: match.free}
}
fn configure(opts: options) -> cargo {
let get_cargo_dir = if opts.cwd {
get_cargo_root_nearest
} else {
get_cargo_root
let get_cargo_dir = alt opts.mode {
system_mode { get_cargo_sysroot }
user_mode { get_cargo_root }
local_mode { get_cargo_root_nearest }
};
let p = alt get_cargo_dir() {
result::ok(p) { p }
result::err(e) { fail e }
result::ok(p) { p }
result::err(e) { fail e }
};
let sources = map::new_str_hash::<source>();
@ -736,6 +758,8 @@ fn cmd_init(c: cargo) {
}
info(#fmt["signature ok for sources.json"]);
run::run_program("cp", [srcfile, destsrcfile]);
info(#fmt["Initialized .cargo in %s", c.root]);
}
fn print_pkg(s: source, p: package) {
@ -775,14 +799,28 @@ fn cmd_search(c: cargo) {
}
fn cmd_usage() {
print("Usage: cargo <verb> [args...]");
print(" init Set up .cargo");
print(" install [--test] [source/]package-name Install by name");
print(" install [--test] uuid:[source/]package-uuid Install by uuid");
print(" list [source] List packages");
print(" search <name | '*'> [tags...] Search packages");
print(" sync Sync all sources");
print(" usage This");
print("Usage: cargo <verb> [options] [args...]" +
"
init Set up .cargo
install [--test] [source/]package-name Install by name
install [--test] uuid:[source/]package-uuid Install by uuid
list [source] List packages
search <name | '*'> [tags...] Search packages
sync Sync all sources
usage This
Options:
--mode=[system,user,local] change mode as (system/user/local)
-g equivalent to --mode=user
-G equivalent to --mode=system
NOTE:
This command creates/uses local-level .cargo by default.
To create/use user-level .cargo, use option -g/--mode=user.
To create/use system-level .cargo, use option -G/--mode=system.
");
}
fn main(argv: [str]) {

View File

@ -10,6 +10,7 @@ export pick;
export pick_file;
export search;
export relative_target_lib_path;
export get_cargo_sysroot;
export get_cargo_root;
export get_cargo_root_nearest;
export libdir;
@ -47,6 +48,8 @@ fn mk_filesearch(maybe_sysroot: option<fs::path>,
result::ok(p) { [p] }
result::err(p) { [] }
}
+ [fs::connect(fs::connect(self.sysroot, ".cargo"),
libdir())]
}
fn get_target_lib_path() -> fs::path {
make_target_lib_path(self.sysroot, self.target_triple)
@ -109,6 +112,10 @@ fn get_sysroot(maybe_sysroot: option<fs::path>) -> fs::path {
}
}
fn get_cargo_sysroot() -> result::t<fs::path, str> {
result::ok(fs::connect(get_default_sysroot(), ".cargo"))
}
fn get_cargo_root() -> result::t<fs::path, str> {
alt generic_os::getenv("CARGO_ROOT") {
some(_p) { result::ok(_p) }
@ -129,9 +136,8 @@ fn get_cargo_root_nearest() -> result::t<fs::path, str> {
let cwd_cargo = fs::connect(cwd, ".cargo");
let par_cargo = fs::connect(dirname, ".cargo");
// FIXME: this duplicates lib path
if cwd_cargo == p {
ret result::ok(p);
if fs::path_is_dir(cwd_cargo) || cwd_cargo == p {
ret result::ok(cwd_cargo);
}
while vec::is_not_empty(dirpath) && par_cargo != p {