From ca1c8243c8beadf1ba985c86237c894aef823b1f Mon Sep 17 00:00:00 2001 From: ridiculousfish Date: Sat, 18 Feb 2012 21:56:30 -0800 Subject: [PATCH] Fix to prevent autosuggesting cd'ing to the current working directory --- highlight.cpp | 14 ++++++++++++-- highlight.h | 1 + path.cpp | 12 ++++++++++++ path.h | 3 +++ 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/highlight.cpp b/highlight.cpp index 8f7adf32e..55a029139 100644 --- a/highlight.cpp +++ b/highlight.cpp @@ -562,9 +562,19 @@ bool autosuggest_handle_special(const wcstring &str, const env_vars &vars, const /* We can specially handle the cd command */ handled = true; bool is_help = string_prefixes_string(dir, L"--help") || string_prefixes_string(dir, L"-h"); - if (! is_help && ! path_can_get_cdpath(dir, working_directory.c_str())) { + if (is_help) { suggestionOK = false; - break; + } else { + wchar_t *path = path_allocate_cdpath(dir.c_str(), working_directory.c_str()); + if (path == NULL) { + suggestionOK = false; + } else if (paths_are_same_file(working_directory, path)) { + /* Don't suggest the working directory as the path! */ + suggestionOK = false; + } else { + suggestionOK = true; + } + free(path); } } } diff --git a/highlight.h b/highlight.h index 275b83154..2e3669e23 100644 --- a/highlight.h +++ b/highlight.h @@ -108,5 +108,6 @@ rgb_color_t highlight_get_color( int highlight, bool is_background ); bool autosuggest_handle_special(const wcstring &str, const env_vars &vars, const wcstring &working_directory, bool *outSuggestionOK); + #endif diff --git a/path.cpp b/path.cpp index 57a8b1239..d56b917d8 100644 --- a/path.cpp +++ b/path.cpp @@ -529,6 +529,18 @@ bool path_is_valid(const wcstring &path, const wcstring &working_directory) return path_is_valid; } +bool paths_are_same_file(const wcstring &path1, const wcstring &path2) { + if (path1 == path2) + return true; + + struct stat s1, s2; + if (wstat(path1.c_str(), &s1) == 0 && wstat(path2.c_str(), &s2) == 0) { + return s1.st_ino == s2.st_ino && s1.st_dev == s2.st_dev; + } else { + return false; + } +} + wcstring get_working_directory(void) { wcstring wd = L"./"; wchar_t dir_path[4096]; diff --git a/path.h b/path.h index 86a2bf03a..e2f47f84d 100644 --- a/path.h +++ b/path.h @@ -65,6 +65,9 @@ void path_make_canonical( wcstring &path ); bool path_is_valid(const wcstring &path, const wcstring &working_directory); +/** Returns whether the two paths refer to the same file */ +bool paths_are_same_file(const wcstring &path1, const wcstring &path2); + wcstring get_working_directory(void); #endif