about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKevin Ballard <kevin@sb.org>2013-06-09 23:42:26 -0700
committerKevin Ballard <kevin@sb.org>2013-06-10 15:52:10 -0700
commit8f1edd5307079851f85dc2bade2081a2343b6ce8 (patch)
tree795421ffa63b947f27ca4bf93d132112e4ab1d5d
parent1310212c27c1c294e1f907b05a225440c987a912 (diff)
downloadrust-8f1edd5307079851f85dc2bade2081a2343b6ce8.tar.gz
rust-8f1edd5307079851f85dc2bade2081a2343b6ce8.zip
terminfo: Support more terminfo directory structures
OS X's terminfo uses the hex representation of the first character of
the terminal name as the directory name.

Ubuntu seems to use /lib/terminfo instead of /usr/share/terminfo, at
least on the one machine I have access to.
-rw-r--r--src/libextra/terminfo/searcher.rs15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/libextra/terminfo/searcher.rs b/src/libextra/terminfo/searcher.rs
index d109bb12e02..ecc99f74626 100644
--- a/src/libextra/terminfo/searcher.rs
+++ b/src/libextra/terminfo/searcher.rs
@@ -44,8 +44,13 @@ pub fn get_dbpath_for_term(term: &str) -> Option<~path> {
                         dirs_to_search.push(path(i.to_owned()));
                     }
                 },
-                // Found nothing, use the default path
-                None => dirs_to_search.push(path("/usr/share/terminfo"))
+                // Found nothing, use the default paths
+                // /usr/share/terminfo is the de facto location, but it seems
+                // Ubuntu puts it in /lib/terminfo
+                None => {
+                    dirs_to_search.push(path("/usr/share/terminfo"));
+                    dirs_to_search.push(path("/lib/terminfo"));
+                }
             }
         }
     };
@@ -56,6 +61,11 @@ pub fn get_dbpath_for_term(term: &str) -> Option<~path> {
         if os::path_exists(p) && os::path_exists(newp) {
             return Some(newp);
         }
+        // on some installations the dir is named after the hex of the char (e.g. OS X)
+        let newp = ~p.push_many(&[fmt!("%x", first_char[0] as uint), term.to_owned()]);
+        if os::path_exists(p) && os::path_exists(newp) {
+            return Some(newp);
+        }
     }
     None
 }
@@ -72,6 +82,7 @@ pub fn open(term: &str) -> Result<@Reader, ~str> {
 #[ignore(reason = "buildbots don't have ncurses installed and I can't mock everything I need")]
 fn test_get_dbpath_for_term() {
     // woefully inadequate test coverage
+    // note: current tests won't work with non-standard terminfo hierarchies (e.g. OS X's)
     use std::os::{setenv, unsetenv};
     fn x(t: &str) -> ~str { get_dbpath_for_term(t).expect("no terminfo entry found").to_str() };
     assert!(x("screen") == ~"/usr/share/terminfo/s/screen");