use std::fmt::{Show,Formatter};
use semver::Version;
use serialize::{Encoder,Encodable};
+use core::source::SourceId;
use core::{
Dependency,
PackageId,
+ Source,
Summary
};
use core::dependency::SerializedDependency;
authors: Vec<String>,
targets: Vec<Target>,
target_dir: Path,
+ sources: Vec<SourceId>
}
impl Show for Manifest {
}
impl Manifest {
- pub fn new(summary: &Summary, targets: &[Target], target_dir: &Path) -> Manifest {
+ pub fn new(summary: &Summary, targets: &[Target], target_dir: &Path, sources: Vec<SourceId>) -> Manifest {
Manifest {
summary: summary.clone(),
authors: Vec::new(),
targets: Vec::from_slice(targets),
- target_dir: target_dir.clone()
+ target_dir: target_dir.clone(),
+ sources: sources
}
}
pub fn get_target_dir<'a>(&'a self) -> &'a Path {
&self.target_dir
}
+
+ pub fn get_sources<'a>(&'a self) -> &'a [SourceId] {
+ self.sources.as_slice()
+ }
}
impl Target {
use core::dependency::SerializedDependency;
use util::graph;
use serialize::{Encoder,Encodable};
+use core::source::SourceId;
#[deriving(Clone,PartialEq)]
pub struct Package {
}
impl Package {
- pub fn new(manifest: &Manifest, manifest_path: &Path) -> Package {
+ pub fn new(manifest: Manifest, manifest_path: &Path) -> Package {
Package {
- manifest: manifest.clone(),
+ manifest: manifest,
manifest_path: manifest_path.clone()
}
}
pub fn get_absolute_target_dir(&self) -> Path {
self.get_root().join(self.get_target_dir())
}
+
+ pub fn get_sources<'a>(&'a self) -> &'a [SourceId] {
+ self.manifest.get_sources()
+ }
}
impl Show for Package {
+use url::Url;
use core::{Summary,Package,PackageId};
use util::CargoResult;
+use sources::GitSource;
/**
* A Source finds and downloads remote packages based on names and
fn get(&self, packages: &[PackageId]) -> CargoResult<Vec<Package>>;
}
+#[deriving(Clone,PartialEq)]
+pub enum SourceKind {
+ GitKind(String)
+}
+
+#[deriving(Clone,PartialEq)]
+pub struct SourceId {
+ pub kind: SourceKind,
+ pub url: Url
+}
+
+impl SourceId {
+ pub fn new(kind: SourceKind, url: Url) -> SourceId {
+ SourceId { kind: kind, url: url }
+ }
+}
+
pub struct SourceSet {
sources: Vec<Box<Source>>
}
*/
use std::os;
+use std::result;
use util::config;
use util::config::{ConfigValue};
use core::{Package,PackageSet,Source,SourceSet};
use core::resolver::resolve;
-use sources::path::PathSource;
+use core::source::{GitKind,SourceId};
+use sources::{PathSource,GitSource};
+use sources::git::GitRemote;
use ops;
-use util::{other_error, CargoResult, Wrap};
+use util::{CargoResult, Wrap, Require, simple_human, other_error};
pub fn compile(manifest_path: &Path) -> CargoResult<()> {
log!(4, "compile; manifest-path={}", manifest_path.display());
}
fn sources_for(package: &Package) -> CargoResult<SourceSet> {
- let sources = try!(sources_from_config([package.get_manifest_path().dir_path()]));
+ let mut sources = try!(sources_from_config([package.get_manifest_path().dir_path()]));
+
+ let git_sources: Vec<Box<Source>> = try!(result::collect(package.get_sources().iter().map(|source_id: &SourceId| {
+ match source_id.kind {
+ GitKind(ref reference) => {
+ let remote = GitRemote::new(source_id.url.clone(), false);
+ let home = try!(os::homedir().require(simple_human("Cargo couldn't find a home directory")));
+ let git = home.join(".cargo").join("git");
+ // .cargo/git/db
+ // .cargo/git/checkouts
+ let db_path = git.join("db").join(source_id.url.to_str());
+ let checkout_path = git.join("checkouts").join(source_id.url.to_str()).join(reference.as_slice());
+ Ok(box GitSource::new(remote, reference.clone(), db_path, checkout_path, false) as Box<Source>)
+ }
+ }
+ })));
+
+ sources.push_all_move(git_sources);
+
Ok(SourceSet::new(sources))
}
let data = try!(file.read_to_end().map_err(io_error));
let manifest = try!(read_manifest(data.as_slice(), namespace));
- Ok(Package::new(&manifest, path))
+ Ok(Package::new(manifest, path))
}
use toml;
+use url;
use url::Url;
use std::collections::HashMap;
use serialize::Decodable;
-use core::{Summary,Manifest,Target,Dependency,PackageId};
+use core::source::{SourceId,GitKind};
+use core::{Summary,Manifest,Target,Dependency,PackageId,Source};
use util::{CargoResult,Require,simple_human,toml_error};
pub fn to_manifest(contents: &[u8], namespace: &Url) -> CargoResult<Manifest> {
impl TomlManifest {
pub fn to_manifest(&self, namespace: &Url) -> CargoResult<Manifest> {
+ let mut sources = vec!();
// Get targets
let targets = normalize(self.lib.as_ref().map(|l| l.as_slice()), self.bin.as_ref().map(|b| b.as_slice()));
for (n, v) in dependencies.iter() {
let version = match *v {
SimpleDep(ref string) => string.clone(),
- DetailedDep(ref details) => details.version.clone()
+ DetailedDep(ref details) => {
+ details.other.find_equiv(&"git").map(|git| {
+ // TODO: Don't unwrap here
+ let kind = GitKind("master".to_str());
+ let url = url::from_str(git.as_slice()).unwrap();
+ sources.push(SourceId::new(kind, url));
+ });
+ details.version.clone()
+ }
};
deps.push(try!(Dependency::parse(n.as_slice(), version.as_slice())))
Ok(Manifest::new(
&Summary::new(&self.project.to_package_id(namespace), deps.as_slice()),
targets.as_slice(),
- &Path::new("target")))
+ &Path::new("target"),
+ sources))
}
}