]> git.proxmox.com Git - cargo.git/commitdiff
Cleanup + topological sort
authorCarl Lerche <me@carllerche.com>
Wed, 30 Apr 2014 20:06:02 +0000 (13:06 -0700)
committerCarl Lerche <me@carllerche.com>
Wed, 30 Apr 2014 20:06:10 +0000 (13:06 -0700)
13 files changed:
src/cargo/core/dependency.rs
src/cargo/core/manifest.rs
src/cargo/core/mod.rs
src/cargo/core/namever.rs [new file with mode: 0644]
src/cargo/core/package.rs
src/cargo/core/source.rs
src/cargo/mod.rs
src/cargo/ops/cargo_compile.rs
src/cargo/ops/cargo_read_manifest.rs
src/cargo/ops/cargo_rustc.rs
src/cargo/sources/path.rs
src/cargo/util/graph.rs [new file with mode: 0644]
src/cargo/util/mod.rs

index 25a5f066ee15aa5006225d1f020634976c3ef7b5..6b1e11da9e868781a538fc800361100cc9e20231 100644 (file)
@@ -1,17 +1,17 @@
-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 {
index 6cca1442da8829da9ec713da0579377363c1787e..d4a4c6801394e4006d8107f3ec57813e0fd904a5 100644 (file)
@@ -1,4 +1,4 @@
-use core::package::NameVer;
+use core::NameVer;
 
 /*
  * TODO: Make all struct fields private
index e152908a5302697f45f0c5f5045b8757b3e15a18..49ee02f38f83ecb4b73aed540eb05958afbfe737 100644 (file)
@@ -1,3 +1,7 @@
+pub use self::namever::{
+    NameVer
+};
+
 pub use self::registry::{
     Registry,
     MemRegistry
@@ -11,12 +15,12 @@ pub use self::manifest::{
 };
 
 pub use self::package::{
-    Package,
-    NameVer
+    Package
 };
 
 pub use self::dependency::Dependency;
 
+pub mod namever;
 pub mod source;
 pub mod package;
 pub mod dependency;
diff --git a/src/cargo/core/namever.rs b/src/cargo/core/namever.rs
new file mode 100644 (file)
index 0000000..4899862
--- /dev/null
@@ -0,0 +1,40 @@
+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)
+    }
+}
index e51ce77dc3bcc5071b90def103c37cd47336b803..a54663860095d03c6838329d31790543c34d5db6 100644 (file)
@@ -1,41 +1,6 @@
 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
@@ -46,7 +11,7 @@ impl<E, S: Encoder<E>> Encodable<S,E> for NameVer {
  */
 #[deriving(Clone,Eq,Show)]
 pub struct Package {
-    name_ver: NameVer,
+    name_ver: core::NameVer,
     deps: Vec<core::Dependency>,
     root: ~str,
     source: ~str,
@@ -54,7 +19,7 @@ pub struct Package {
 }
 
 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()  }
     }
 
@@ -62,7 +27,7 @@ impl Package {
         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()
     }
 
index e50e08041e0a9cbc40fc19c1904c4a2782cd6b21..a0c49d6e01833c3159038a6252f4faca9943cb3a 100644 (file)
@@ -1,5 +1,5 @@
 use std::fmt;
-use core::package::NameVer;
+use core::NameVer;
 use CargoResult;
 
 #[deriving(Clone,Eq)]
index 59c284bc8124abb8b0fdd5252aeb509841a61343..4c5ace6bb1f644f235b325560db6085f204f9353 100644 (file)
@@ -21,9 +21,9 @@ use hammer::{FlagDecoder,FlagConfig,HammerError};
 
 
 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>;
index 1f1eef4c4b5c11efe8192abe938a51e7533e8dd5..24141931f15ce2fbb205a8eed1394c550b97a488 100644 (file)
@@ -19,11 +19,9 @@ use std::vec::Vec;
 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 {
@@ -68,8 +66,6 @@ fn exec_tty(program: &str, args: &[~str], input: Option<&mut Reader>) -> CargoRe
 }
 
 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;
index d777eae1ef64d48b43b831086e407c6c5ba387c1..7223e5a8814eccae1599b069121df1ad73e066f3 100644 (file)
@@ -5,8 +5,7 @@ use toml::from_toml;
 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 {
index 7a6021fe1017bbb5fcd6ca1c8e2d3bd5cdc49e44..056a479639f78fd59ef0857b7ce53046a87924b4 100644 (file)
@@ -5,11 +5,10 @@ use std::io::process::{Process,ProcessConfig,InheritFd};
 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;
index 40ef4f21df1f1ec697b0e88dca45b3f62ff45d24..256620bad51167785cf6360a1eb54292c60b93f1 100644 (file)
@@ -1,5 +1,5 @@
 use core::source::{Source,PackagePath};
-use core::package::NameVer;
+use core::NameVer;
 use CargoResult;
 use ops::cargo_read_manifest::read_manifest;
 
diff --git a/src/cargo/util/graph.rs b/src/cargo/util/graph.rs
new file mode 100644 (file)
index 0000000..5e88890
--- /dev/null
@@ -0,0 +1,56 @@
+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
+}
index 9bd067829df804cc1ad9ab1af6910da76dcf0dfe..aac3ef5463ab27ded4a886d611ea63c82ea83e47 100644 (file)
@@ -1,4 +1,5 @@
 pub use self::process_builder::{process,ProcessBuilder};
+pub mod graph;
 pub mod process_builder;
 pub mod config;
 pub mod important_paths;