about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-12-20 17:31:51 -0800
committerbors <bors@rust-lang.org>2013-12-20 17:31:51 -0800
commit45d24a5f7cd9c27b89ff0d80bd3238150d9a94dc (patch)
treec4385ae73dfc416ed58b20911450c397647af14c /src
parent9d1de0b699a669d01ea5ecd3dea0424ab94db369 (diff)
parent5cf2f54bb12c66f6ea26b0f3c607817cfaab2c2f (diff)
auto merge of #11031 : jhasse/rust/patch-msys-3, r=cmr
Enable ANSI colors if TERM is set to cygwin and terminfo is not available (msys terminal on Windows). See #2807
Diffstat (limited to 'src')
-rw-r--r--src/libextra/term.rs58
-rw-r--r--src/libextra/terminfo/parser/compiled.rs15
2 files changed, 28 insertions, 45 deletions
diff --git a/src/libextra/term.rs b/src/libextra/term.rs
index aace15ee7a6..05e9b65d19c 100644
--- a/src/libextra/term.rs
+++ b/src/libextra/term.rs
@@ -15,11 +15,11 @@
 
 use std::io::{Decorator, Writer};
 
-#[cfg(not(target_os = "win32"))] use std::os;
-#[cfg(not(target_os = "win32"))] use terminfo::*;
-#[cfg(not(target_os = "win32"))] use terminfo::searcher::open;
-#[cfg(not(target_os = "win32"))] use terminfo::parser::compiled::parse;
-#[cfg(not(target_os = "win32"))] use terminfo::parm::{expand, Number, Variables};
+use std::os;
+use terminfo::*;
+use terminfo::searcher::open;
+use terminfo::parser::compiled::{parse, msys_terminfo};
+use terminfo::parm::{expand, Number, Variables};
 
 // FIXME (#2807): Windows support.
 
@@ -74,7 +74,6 @@ pub mod attr {
     }
 }
 
-#[cfg(not(target_os = "win32"))]
 fn cap_for_attr(attr: attr::Attr) -> &'static str {
     match attr {
         attr::Bold               => "bold",
@@ -93,29 +92,24 @@ fn cap_for_attr(attr: attr::Attr) -> &'static str {
     }
 }
 
-#[cfg(not(target_os = "win32"))]
 pub struct Terminal<T> {
     priv num_colors: u16,
     priv out: T,
     priv ti: ~TermInfo
 }
 
-#[cfg(target_os = "win32")]
-pub struct Terminal<T> {
-    priv num_colors: u16,
-    priv out: T,
-}
-
-#[cfg(not(target_os = "win32"))]
 impl<T: Writer> Terminal<T> {
     pub fn new(out: T) -> Result<Terminal<T>, ~str> {
-        let term = os::getenv("TERM");
-        if term.is_none() {
-            return Err(~"TERM environment variable undefined");
-        }
+        let term = match os::getenv("TERM") {
+            Some(t) => t,
+            None => return Err(~"TERM environment variable undefined")
+        };
 
-        let entry = open(term.unwrap());
+        let entry = open(term);
         if entry.is_err() {
+            if "cygwin" == term { // msys terminal
+                return Ok(Terminal {out: out, ti: msys_terminfo(), num_colors: 8});
+            }
             return Err(entry.unwrap_err());
         }
 
@@ -241,32 +235,6 @@ impl<T: Writer> Terminal<T> {
     }
 }
 
-#[cfg(target_os = "win32")]
-impl<T: Writer> Terminal<T> {
-    pub fn new(out: T) -> Result<Terminal<T>, ~str> {
-        return Ok(Terminal {out: out, num_colors: 0});
-    }
-
-    pub fn fg(&mut self, _color: color::Color) -> bool {
-        false
-    }
-
-    pub fn bg(&mut self, _color: color::Color) -> bool {
-        false
-    }
-
-    pub fn attr(&mut self, _attr: attr::Attr) -> bool {
-        false
-    }
-
-    pub fn supports_attr(&self, _attr: attr::Attr) -> bool {
-        false
-    }
-
-    pub fn reset(&self) {
-    }
-}
-
 impl<T: Writer> Decorator<T> for Terminal<T> {
     fn inner(self) -> T {
         self.out
diff --git a/src/libextra/terminfo/parser/compiled.rs b/src/libextra/terminfo/parser/compiled.rs
index bc997c5147d..d42340cb817 100644
--- a/src/libextra/terminfo/parser/compiled.rs
+++ b/src/libextra/terminfo/parser/compiled.rs
@@ -316,6 +316,21 @@ pub fn parse(file: &mut io::Reader,
     Ok(~TermInfo {names: term_names, bools: bools_map, numbers: numbers_map, strings: string_map })
 }
 
+/// Create a dummy TermInfo struct for msys terminals
+pub fn msys_terminfo() -> ~TermInfo {
+    let mut strings = HashMap::new();
+    strings.insert(~"sgr0", bytes!("\x1b[0m").to_owned());
+    strings.insert(~"bold", bytes!("\x1b[1m;").to_owned());
+    strings.insert(~"setaf", bytes!("\x1b[3%p1%dm").to_owned());
+    strings.insert(~"setab", bytes!("\x1b[4%p1%dm").to_owned());
+    ~TermInfo {
+        names: ~[~"cygwin"], // msys is a fork of an older cygwin version
+        bools: HashMap::new(),
+        numbers: HashMap::new(),
+        strings: strings
+    }
+}
+
 #[cfg(test)]
 mod test {
     use super::*;