-use core::package::NameVer;
+use core;
#[deriving(Eq,Clone,Show)]
pub struct Dependency {
- name: NameVer
+ name: core::NameVer
}
impl Dependency {
pub fn new(name: &str) -> Dependency {
- Dependency { name: NameVer::new(name.to_owned(), "1.0.0") }
+ Dependency { name: core::NameVer::new(name.to_owned(), "1.0.0") }
}
pub fn with_name_and_version(name: &str, version: &str) -> Dependency {
- Dependency { name: NameVer::new(name, version) }
+ Dependency { name: core::NameVer::new(name, version) }
}
pub fn get_name<'a>(&'a self) -> &'a str {
-use core::package::NameVer;
+use core::NameVer;
/*
* TODO: Make all struct fields private
+pub use self::namever::{
+ NameVer
+};
+
pub use self::registry::{
Registry,
MemRegistry
};
pub use self::package::{
- Package,
- NameVer
+ Package
};
pub use self::dependency::Dependency;
+pub mod namever;
pub mod source;
pub mod package;
pub mod dependency;
--- /dev/null
+use semver;
+use serialize::{
+ Encodable,
+ Encoder,
+ Decodable,
+ Decoder
+};
+
+#[deriving(Clone,Eq,Show,Ord)]
+pub struct NameVer {
+ name: ~str,
+ version: semver::Version
+}
+
+impl NameVer {
+ pub fn new(name: &str, version: &str) -> NameVer {
+ NameVer { name: name.to_owned(), version: semver::parse(version.to_owned()).unwrap() }
+ }
+
+ pub fn get_name<'a>(&'a self) -> &'a str {
+ self.name.as_slice()
+ }
+
+ pub fn get_version<'a>(&'a self) -> &'a semver::Version {
+ &self.version
+ }
+}
+
+impl<E, D: Decoder<E>> Decodable<D,E> for NameVer {
+ fn decode(d: &mut D) -> Result<NameVer, E> {
+ let vector: Vec<~str> = try!(Decodable::decode(d));
+ Ok(NameVer { name: vector.get(0).clone(), version: semver::parse(vector.get(1).clone()).unwrap() })
+ }
+}
+
+impl<E, S: Encoder<E>> Encodable<S,E> for NameVer {
+ fn encode(&self, e: &mut S) -> Result<(), E> {
+ (vec!(self.name.clone(), self.version.to_str())).encode(e)
+ }
+}
use std::vec::Vec;
use semver;
-use semver::{Version,parse};
use core;
-use serialize::{Encodable,Encoder,Decodable,Decoder};
-
-#[deriving(Clone,Eq,Show,Ord)]
-pub struct NameVer {
- name: ~str,
- version: Version
-}
-
-impl NameVer {
- pub fn new(name: &str, version: &str) -> NameVer {
- NameVer { name: name.to_owned(), version: semver::parse(version.to_owned()).unwrap() }
- }
-
- pub fn get_name<'a>(&'a self) -> &'a str {
- self.name.as_slice()
- }
-
- pub fn get_version<'a>(&'a self) -> &'a Version {
- &self.version
- }
-}
-
-impl<E, D: Decoder<E>> Decodable<D,E> for NameVer {
- fn decode(d: &mut D) -> Result<NameVer, E> {
- let vector: Vec<~str> = try!(Decodable::decode(d));
- Ok(NameVer { name: vector.get(0).clone(), version: parse(vector.get(1).clone()).unwrap() })
- }
-}
-
-impl<E, S: Encoder<E>> Encodable<S,E> for NameVer {
- fn encode(&self, e: &mut S) -> Result<(), E> {
- (vec!(self.name.clone(), self.version.to_str())).encode(e)
- }
-}
/**
* Represents a rust library internally to cargo. This will things like where
*/
#[deriving(Clone,Eq,Show)]
pub struct Package {
- name_ver: NameVer,
+ name_ver: core::NameVer,
deps: Vec<core::Dependency>,
root: ~str,
source: ~str,
}
impl Package {
- pub fn new(name: &NameVer, deps: &Vec<core::Dependency>, root: &str, source: &str, target: &str) -> Package {
+ pub fn new(name: &core::NameVer, deps: &Vec<core::Dependency>, root: &str, source: &str, target: &str) -> Package {
Package { name_ver: name.clone(), deps: deps.clone(), root: root.to_owned(), source: source.to_owned(), target: target.to_owned() }
}
self.name_ver.get_name()
}
- pub fn get_version<'a>(&'a self) -> &'a Version {
+ pub fn get_version<'a>(&'a self) -> &'a semver::Version {
self.name_ver.get_version()
}
use std::fmt;
-use core::package::NameVer;
+use core::NameVer;
use CargoResult;
#[deriving(Clone,Eq)]
pub mod core;
-pub mod util;
-pub mod sources;
pub mod ops;
+pub mod sources;
+pub mod util;
pub type CargoResult<T> = Result<T, CargoError>;
use serialize::{Decodable};
use hammer::{FlagDecoder,FlagConfig,FlagConfiguration,HammerError};
use std::io;
-use std::os;
use std::io::BufReader;
use std::io::process::{Process,ProcessExit,ProcessOutput,InheritFd,ProcessConfig};
use {ToCargoError,CargoResult};
-use util::config::{get_config,all_configs};
#[deriving(Decodable)]
struct Options {
}
fn exec(program: &str, args: &[~str], input: Option<&mut Reader>, configurator: |&mut ProcessConfig|) -> CargoResult<Process> {
- let paths = get_config(os::getcwd(), "source-paths");
-
let mut config = ProcessConfig::new();
config.program = program;
config.args = args;
use {CargoResult,ToCargoError,core};
use std::path::Path;
use collections::HashMap;
-use core::package::NameVer;
-use core::dependency::Dependency;
+use core::NameVer;
#[deriving(Decodable,Encodable,Eq,Clone)]
struct SerializedManifest {
use std::path::Path;
use {CargoResult,CargoError,ToCargoError,NoFlags,core};
-/**
- cargo-rustc -- ...args
- Delegate ...args to actual rustc command
-*/
+
+pub fn compile() {
+}
pub fn execute(_: NoFlags, manifest: core::Manifest) -> CargoResult<Option<core::Manifest>> {
let core::Manifest { root, lib, bin, .. } = manifest;
use core::source::{Source,PackagePath};
-use core::package::NameVer;
+use core::NameVer;
use CargoResult;
use ops::cargo_read_manifest::read_manifest;
--- /dev/null
+use collections::HashMap;
+
+trait Node<'a, I: Iterator<&'a Self>> {
+ fn children(&'a self) -> I;
+}
+
+trait Graph<'a, N: Node<'a, I>, I: Iterator<&'a N>> {
+ fn nodes(&'a self) -> I;
+}
+
+#[deriving(Clone)]
+enum Mark {
+ InProgress,
+ Done
+}
+
+/**
+ * Returns None in the event of a cycle
+ */
+pub fn topsort<'a, N: Node<'a, I>, G: Graph<'a, N, I>, I: Iterator<&'a N>>(graph: &'a G) -> Option<Vec<&'a N>> {
+ let mut ret = Vec::new();
+ let mut iter: I = graph.nodes();
+ let mut stack = Vec::<&'a N>::new();
+ let mut marks: HashMap<*N, Mark> = HashMap::new();
+
+ // Prime the stack
+ for node in iter {
+ visit(node, &mut ret, &mut marks);
+ }
+
+ Some(ret)
+}
+
+fn visit<'a, N: Node<'a, I>, I: Iterator<&'a N>>(curr: &'a N, dst: &mut Vec<&'a N>, marks: &mut HashMap<*N, Mark>) {
+ let ident = curr as *N;
+
+ if marks.contains_key(&ident) {
+ return;
+ }
+
+ marks.insert(ident, InProgress);
+
+ let mut iter: I = curr.children();
+
+ for child in iter {
+ visit::<'a, N, I>(child, dst, marks);
+ }
+
+ dst.push(curr);
+ marks.insert(ident, Done);
+}
+
+#[cfg(test)]
+mod test {
+ // TODO: tests
+}
pub use self::process_builder::{process,ProcessBuilder};
+pub mod graph;
pub mod process_builder;
pub mod config;
pub mod important_paths;