about summary refs log tree commit diff
diff options
context:
space:
mode:
authorElly Jones <elly@leptoquark.net>2011-12-20 23:41:22 -0500
committerElly Jones <elly@leptoquark.net>2011-12-20 23:41:22 -0500
commitbbc534bcccfc1904104a1fa275a6a873a7675cd1 (patch)
tree5fc882ec5eef7c3abfa21e6b3d927694abe19073
parent200439406d828c58d5092ad5ebac9cc67adb3399 (diff)
downloadrust-bbc534bcccfc1904104a1fa275a6a873a7675cd1.tar.gz
rust-bbc534bcccfc1904104a1fa275a6a873a7675cd1.zip
cargo: allow 'ref' package key for git packages.
This lets you specify e.g. a tag or a branch name to be checked out for that
package.

Signed-off-by: Elly Jones <elly@leptoquark.net>
-rw-r--r--src/cargo/cargo.rs17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/cargo/cargo.rs b/src/cargo/cargo.rs
index 98c876e4986..99109f5d489 100644
--- a/src/cargo/cargo.rs
+++ b/src/cargo/cargo.rs
@@ -31,6 +31,7 @@ type package = {
     uuid: str,
     url: str,
     method: str,
+    ref: option::t<str>,
     tags: [str]
 };
 
@@ -242,6 +243,11 @@ fn load_one_source_package(&src: source, p: map::hashmap<str, json::json>) {
         }
     };
 
+    let ref = alt p.find("ref") {
+        some(json::string(_n)) { some(_n) }
+        _ { none }
+    };
+
     let tags = [];
     alt p.find("tags") {
         some(json::list(js)) {
@@ -260,6 +266,7 @@ fn load_one_source_package(&src: source, p: map::hashmap<str, json::json>) {
         uuid: uuid,
         url: url,
         method: method,
+        ref: ref,
         tags: tags
     });
     log "  Loaded package: " + src.name + "/" + name;
@@ -398,8 +405,14 @@ fn install_source(c: cargo, path: str) {
     }
 }
 
-fn install_git(c: cargo, wd: str, url: str) {
+fn install_git(c: cargo, wd: str, url: str, ref: option::t<str>) {
     run::run_program("git", ["clone", url, wd]);
+    if option::is_some::<str>(ref) {
+        let r = option::get::<str>(ref);
+        fs::change_dir(wd);
+        run::run_program("git", ["checkout", r]);
+    }
+
     install_source(c, wd);
 }
 
@@ -424,7 +437,7 @@ fn install_file(c: cargo, wd: str, path: str) {
 fn install_package(c: cargo, wd: str, pkg: package) {
     info("Installing with " + pkg.method + " from " + pkg.url + "...");
     if pkg.method == "git" {
-        install_git(c, wd, pkg.url);
+        install_git(c, wd, pkg.url, pkg.ref);
     } else if pkg.method == "http" {
         install_curl(c, wd, pkg.url);
     } else if pkg.method == "file" {