Compare commits
No commits in common. "93172797e1f36c7447e136f11d09c46d6e77d2ef" and "9a12fd80213c985fc91ee75854918523106377f3" have entirely different histories.
93172797e1
...
9a12fd8021
49
sdn.cpp
49
sdn.cpp
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user