Compare commits

..

No commits in common. "93172797e1f36c7447e136f11d09c46d6e77d2ef" and "9a12fd80213c985fc91ee75854918523106377f3" have entirely different histories.

49
sdn.cpp
View File

@ -1004,19 +1004,7 @@ fun is_ancestor_dir (const string &ancestor, const string &of) -> bool {
return of[ancestor.length ()] == '/' || (ancestor == "/" && ancestor != of);
}
/// If `path` is equal to the `current` directory, or lies underneath it,
/// return it as a relative path
fun relativize (string current, const string &path) -> string {
if (current == path)
return ".";
if (current.back () != '/')
current += '/';
if (!strncmp (current.c_str (), path.c_str (), current.length ()))
return path.substr (current.length ());
return path;
}
fun pop_levels (const string& old_cwd) {
fun pop_levels () {
string anchor; auto i = g.levels.rbegin ();
while (i != g.levels.rend () && !is_ancestor_dir (i->path, g.cwd)) {
if (i->path == g.cwd) {
@ -1027,13 +1015,6 @@ fun pop_levels (const string& old_cwd) {
i++;
g.levels.pop_back ();
}
// Don't pick up bullshit from foreign history entries, especially for /
if (is_ancestor_dir (g.cwd, old_cwd)) {
auto subpath = relativize (g.cwd, old_cwd);
anchor = subpath.substr (0, subpath.find ('/'));
}
fix_cursor_and_offset ();
if (!anchor.empty () && g.entries[g.cursor].filename != anchor)
search (to_wide (anchor));
@ -1066,6 +1047,18 @@ fun absolutize (const string &abs_base, const string &path) -> string {
return abs_base + "/" + path;
}
/// If `path` is equal to the `current` directory, or lies underneath it,
/// return it as a relative path
fun relativize (string current, const string &path) -> string {
if (current == path)
return ".";
if (current.back () != '/')
current += '/';
if (!strncmp (current.c_str (), path.c_str (), current.length ()))
return path.substr (current.length ());
return path;
}
// Roughly follows the POSIX description of `cd -L` because of symlinks.
// HOME and CDPATH handling is ommitted.
fun change_dir (const string &path) {
@ -1107,17 +1100,17 @@ fun change_dir (const string &path) {
return;
}
level last {g.offset, g.cursor, g.cwd, g.entries[g.cursor].filename};
auto old_cwd = g.cwd;
level last {g.offset, g.cursor, old_cwd, g.entries[g.cursor].filename};
g.cwd = full_path;
bool same_path = last.path == g.cwd;
bool same_path = old_cwd == g.cwd;
reload (same_path);
if (!same_path) {
if (is_ancestor_dir (last.path, g.cwd)) {
g.levels.push_back (last);
g.offset = g.cursor = 0;
if (is_ancestor_dir (last.path, g.cwd))
g.levels.push_back (last);
else
pop_levels (last.path);
} else if (!same_path) {
pop_levels ();
}
}
@ -1661,7 +1654,7 @@ int main (int argc, char *argv[]) {
load_colors ();
g.start_dir = g.cwd = initial_cwd ();
reload (false);
pop_levels (g.cwd);
pop_levels ();
update ();
// Invoking keypad() earlier would make ncurses flush its output buffer,