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>
This commit is contained in:
Elly Jones 2011-12-20 23:41:22 -05:00
parent 200439406d
commit bbc534bccc

View File

@ -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" {