diff --git a/src/cargo/cargo.rs b/src/cargo/cargo.rs
index ff2e7a6346f..9184e11db0a 100644
--- a/src/cargo/cargo.rs
+++ b/src/cargo/cargo.rs
@@ -194,27 +194,15 @@ fn install_source(c: cargo, path: str) {
     }
 }
 
-fn install_git(c: cargo, _path: str) {
-    let wd = tempfile::mkdtemp(c.workdir + fs::path_sep(), "");
-    alt wd {
-        some(p) {
-            run::run_program("git", ["clone", _path, p]);
-            install_source(c, p);
-        }
-        _ { fail "needed temp dir"; }
-    }
+fn install_git(c: cargo, wd: str, _path: str) {
+    run::run_program("git", ["clone", _path, wd]);
+    install_source(c, wd);
 }
 
-fn install_file(c: cargo, _path: str) {
-    let wd = tempfile::mkdtemp(c.workdir + fs::path_sep(), "");
-    alt wd {
-        some(p) {
-            run::run_program("tar", ["-x", "--strip-components=1",
-                                     "-C", p, "-f", _path]);
-            install_source(c, p);
-        }
-        _ { fail "needed temp dir"; }
-    }
+fn install_file(c: cargo, wd: str, _path: str) {
+    run::run_program("tar", ["-x", "--strip-components=1",
+                             "-C", wd, "-f", _path]);
+    install_source(c, wd);
 }
 
 fn cmd_install(c: cargo, argv: [str]) {
@@ -224,12 +212,19 @@ fn cmd_install(c: cargo, argv: [str]) {
         ret;
     }
 
+    let wd = alt tempfile::mkdtemp(c.workdir + fs::path_sep(), "") {
+        some(_wd) { _wd }
+        none. { fail "needed temp dir"; }
+    };
+
     if str::starts_with(argv[2], "git:") {
-        install_git(c, argv[2]);
-    }
-    if str::starts_with(argv[2], "file:") {
+        install_git(c, wd, argv[2]);
+    } else if str::starts_with(argv[2], "github:") {
+        let path = rest(argv[2], 7u);
+        install_git(c, wd, "git://github.com/" + path);
+    } else if str::starts_with(argv[2], "file:") {
         let path = rest(argv[2], 5u);
-        install_file(c, path);
+        install_file(c, wd, path);
     }
 }