From 71d34a8872491f37011aa14c866a95165fc45f99 Mon Sep 17 00:00:00 2001 From: Zack Corr Date: Tue, 15 Jan 2013 23:57:03 +1000 Subject: [PATCH] rustpkg: More preliminary work --- src/librustpkg/api.rs | 20 ++++++++ src/librustpkg/rustpkg.rc | 50 ++++++++++++++++++- src/librustpkg/usage.rs | 100 ++++++++++++++++++++++++++++++++++++++ src/librustpkg/util.rs | 6 +++ 4 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 src/librustpkg/api.rs create mode 100644 src/librustpkg/usage.rs create mode 100644 src/librustpkg/util.rs diff --git a/src/librustpkg/api.rs b/src/librustpkg/api.rs new file mode 100644 index 000000000000..10868c236367 --- /dev/null +++ b/src/librustpkg/api.rs @@ -0,0 +1,20 @@ +use core::*; + +pub struct Crate { + file: ~str, + flags: ~[~str], + cfg: ~[~str] +} + +pub impl Crate { + fn flag(flag: ~str) -> Crate { + Crate { + flags: vec::append(self.flags, flag), + .. copy self + } + } +} + +pub fn build(_targets: ~[Crate]) { + // TODO: magic +} diff --git a/src/librustpkg/rustpkg.rc b/src/librustpkg/rustpkg.rc index e5f443abba43..a21bd2dc9ec6 100644 --- a/src/librustpkg/rustpkg.rc +++ b/src/librustpkg/rustpkg.rc @@ -16,7 +16,6 @@ url = "https://github.com/mozilla/rust/tree/master/src/librustpkg")]; #[crate_type = "lib"]; - #[no_core]; extern mod core(vers = "0.6"); @@ -24,8 +23,55 @@ extern mod std(vers = "0.6"); extern mod rustc(vers = "0.6"); extern mod syntax(vers = "0.6"); +use core::*; +use std::getopts; +use getopts::{optflag, optopt, opt_present}; use rustc::metadata::{filesearch}; -pub fn main() { +mod api; +mod usage; +mod util; +use util::*; + +pub fn main() { + let args = os::args(); + let opts = ~[optflag(~"h"), optflag(~"help")]; + let matches = &match getopts::getopts(args, opts) { + result::Ok(m) => m, + result::Err(f) => { + fail fmt!("%s", getopts::fail_str(f)); + } + }; + let help = opt_present(matches, ~"h") || opt_present(matches, ~"help"); + let mut args = copy matches.free; + + args.shift(); + + if (args.len() < 1) { + return usage::general(); + } + + let cmd = copy args[0]; + + if !is_cmd(cmd) { + return usage::general(); + } else if help { + match cmd { + ~"build" => usage::build(), + ~"clean" => usage::clean(), + ~"install" => usage::install(), + ~"prefer" => usage::prefer(), + ~"test" => usage::test(), + ~"uninstall" => usage::uninstall(), + ~"unprefer" => usage::unprefer(), + _ => usage::general() + } + } + + Ctx { cmd: cmd, args: args } } + +pub use Crate = api::Crate; +pub use build = api::build; +pub use util = api::util; diff --git a/src/librustpkg/usage.rs b/src/librustpkg/usage.rs new file mode 100644 index 000000000000..64fbb9916466 --- /dev/null +++ b/src/librustpkg/usage.rs @@ -0,0 +1,100 @@ +use core::io; + +pub fn general() { + io::println(~"Usage: rustpkg [options] [args..] + +Where is one of: + build, clean, install, prefer, test, uninstall, unprefer + +Options: + + -h, --help Display this message + -h, --help Display help for "); +} + +pub fn build() { + io::println(~"rustpkg [options..] build + +Build all targets described in the package script in the current +directory. + +Options: + -c, --cfg Pass a cfg flag to the package script"); +} + +pub fn clean() { + io::println(~"rustpkg clean + +Remove all build files in the work cache for the package in the current +directory."); +} + +pub fn install() { + io::println(~"rustpkg [options..] install [url] [target] + +Install a package from a URL by Git or cURL (FTP, HTTP, etc.). +If target is provided, Git will checkout the branch or tag before +continuing. If the URL is a TAR file (with or without compression), +extract it before installing. If a URL isn't provided, the package will +be built and installed from the current directory (which is +functionally the same as `rustpkg build` and installing the result). + +Examples: + rustpkg install + rustpkg install git://github.com/mozilla/servo.git + rustpkg install git://github.com/mozilla/servo.git v0.1.2 + rustpkg install http://rust-lang.org/hello-world-0.3.4.tar.gz + +Options: + -c, --cfg Pass a cfg flag to the package script + -p, --prefer Prefer the package after installing + (see `rustpkg prefer -h`)"); +} + +pub fn uninstall() { + io::println(~"rustpkg uninstall [@version] + +Remove a package by name and/or version. If version is omitted then all +versions of the package will be removed. If the package[s] is/are depended +on by another package then they cannot be removed. If the package is preferred +(see `rustpkg prefer -h`), it will attempt to prefer the next latest +version of the package if another version is installed, otherwise it'll remove +the symlink."); +} + +pub fn prefer() { + io::println(~"rustpkg [options..] prefer [@version] + +By default all binaries are given a unique name so that multiple versions can +coexist. The prefer command will symlink the uniquely named binary to +the binary directory under its bare name. The user will need to confirm +if the symlink will overwrite another. If version is not supplied, the latest +version of the package will be preferred. + +Example: + export PATH=$PATH:/home/user/.rustpkg/bin + rustpkg prefer machine@1.2.4 + machine -v + ==> v1.2.4 + rustpkg prefer machine@0.4.6 + machine -v + ==> v0.4.6"); +} + +pub fn unprefer() { + io::println(~"rustpkg [options..] unprefer + +Remove all symlinks from the store to the binary directory for a package +name. See `rustpkg prefer -h` for more information."); +} + +pub fn test() { + io::println(~"rustpkg [options..] test + +Build all targets described in the package script in the current directory +with the test flag. The test bootstraps will be run afterwards and the output +and exit code will be redirected. + +Options: + -c, --cfg Pass a cfg flag to the package script"); +} diff --git a/src/librustpkg/util.rs b/src/librustpkg/util.rs new file mode 100644 index 000000000000..304c4864d4c4 --- /dev/null +++ b/src/librustpkg/util.rs @@ -0,0 +1,6 @@ +pub fn is_cmd(cmd: ~str) -> bool { + let cmds = &[~"build", ~"clean", ~"install", ~"prefer", ~"test", + ~"uninstall", ~"unprefer"]; + + vec::contains(cmds, &cmd) +}