mirror of
https://github.com/zellij-org/zellij.git
synced 2024-12-25 02:06:19 +03:00
feat: change dependency for process_cwd
(#1001)
* feat: change dependency for process_cwd * test: add unittest for get_cwd * chore: apply clippy * test: change tty to openpty * test(e2e): update case
This commit is contained in:
parent
f6c56f6ea3
commit
65a12c0f5e
47
Cargo.lock
generated
47
Cargo.lock
generated
@ -415,6 +415,12 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
|
||||
|
||||
[[package]]
|
||||
name = "cranelift-bforest"
|
||||
version = "0.68.0"
|
||||
@ -612,26 +618,6 @@ dependencies = [
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darwin-libproc"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc629b7cf42586fee31dae31f9ab73fa5ff5f0170016aa61be5fcbc12a90c516"
|
||||
dependencies = [
|
||||
"darwin-libproc-sys",
|
||||
"libc",
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "darwin-libproc-sys"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ef0aa083b94c54aa4cfd9bbfd37856714c139d1dc511af80270558c7ba3b4816"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "derivative"
|
||||
version = "2.2.0"
|
||||
@ -1157,9 +1143,9 @@ checksum = "4d234d89ecf5621c935b69a4c7266c9a634a95e465081682be47358617ce825b"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.106"
|
||||
version = "0.2.112"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a60553f9a9e039a333b4e9b20573b9e9b9c0bb3a11e201ccc48ef4283456d673"
|
||||
checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
@ -2147,6 +2133,21 @@ dependencies = [
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.22.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f1bfab07306a27332451a662ca9c8156e3a9986f82660ba9c8e744fe8455d43"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"core-foundation-sys",
|
||||
"libc",
|
||||
"ntapi",
|
||||
"once_cell",
|
||||
"rayon",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tab-bar"
|
||||
version = "0.1.0"
|
||||
@ -2871,11 +2872,11 @@ dependencies = [
|
||||
"chrono",
|
||||
"close_fds",
|
||||
"daemonize",
|
||||
"darwin-libproc",
|
||||
"highway",
|
||||
"insta",
|
||||
"log",
|
||||
"serde_json",
|
||||
"sysinfo",
|
||||
"typetag",
|
||||
"unicode-width",
|
||||
"url",
|
||||
|
@ -943,7 +943,7 @@ pub fn detach_and_attach_session() {
|
||||
name: "Wait for session to be attached",
|
||||
instruction: |remote_terminal: RemoteTerminal| -> bool {
|
||||
let mut step_is_complete = false;
|
||||
if remote_terminal.cursor_position_is(77, 2) {
|
||||
if remote_terminal.cursor_position_is(3, 2) {
|
||||
// we're back inside the session
|
||||
step_is_complete = true;
|
||||
}
|
||||
|
@ -27,9 +27,7 @@ log = "0.4.14"
|
||||
typetag = "0.1.7"
|
||||
chrono = "0.4.19"
|
||||
close_fds = "0.3.2"
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
darwin-libproc = "0.2.0"
|
||||
sysinfo = "0.22.5"
|
||||
|
||||
[dev-dependencies]
|
||||
insta = "1.6.0"
|
||||
|
@ -2,12 +2,6 @@ use std::collections::HashMap;
|
||||
|
||||
use crate::panes::PaneId;
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
use darwin_libproc;
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
use std::fs;
|
||||
|
||||
use std::env;
|
||||
use std::os::unix::io::RawFd;
|
||||
use std::os::unix::process::CommandExt;
|
||||
@ -21,6 +15,8 @@ use async_std::fs::File as AsyncFile;
|
||||
use async_std::os::unix::io::FromRawFd;
|
||||
use interprocess::local_socket::LocalSocketStream;
|
||||
|
||||
use sysinfo::{ProcessExt, ProcessRefreshKind, System, SystemExt};
|
||||
|
||||
use nix::pty::{openpty, OpenptyResult, Winsize};
|
||||
use nix::sys::signal::{kill, Signal};
|
||||
use nix::sys::termios;
|
||||
@ -338,16 +334,15 @@ impl ServerOsApi for ServerOsInputOutput {
|
||||
fn load_palette(&self) -> Palette {
|
||||
default_palette()
|
||||
}
|
||||
#[cfg(target_os = "macos")]
|
||||
fn get_cwd(&self, pid: Pid) -> Option<PathBuf> {
|
||||
darwin_libproc::pid_cwd(pid.as_raw()).ok()
|
||||
}
|
||||
#[cfg(target_os = "linux")]
|
||||
fn get_cwd(&self, pid: Pid) -> Option<PathBuf> {
|
||||
fs::read_link(format!("/proc/{}/cwd", pid)).ok()
|
||||
}
|
||||
#[cfg(all(not(target_os = "linux"), not(target_os = "macos")))]
|
||||
fn get_cwd(&self, _pid: Pid) -> Option<PathBuf> {
|
||||
let mut system_info = System::new();
|
||||
// Update by minimizing information.
|
||||
// See https://docs.rs/sysinfo/0.22.5/sysinfo/struct.ProcessRefreshKind.html#
|
||||
system_info.refresh_processes_specifics(ProcessRefreshKind::default());
|
||||
|
||||
if let Some(process) = system_info.process(pid.into()) {
|
||||
return Some(process.cwd().to_path_buf());
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
@ -376,3 +371,7 @@ pub struct ChildId {
|
||||
/// field is it's parent process id.
|
||||
pub shell: Option<Pid>,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[path = "./unit/os_input_output_tests.rs"]
|
||||
mod os_input_output_tests;
|
||||
|
49
zellij-server/src/unit/os_input_output_tests.rs
Normal file
49
zellij-server/src/unit/os_input_output_tests.rs
Normal file
@ -0,0 +1,49 @@
|
||||
use super::*;
|
||||
|
||||
use nix::{pty::openpty, unistd::close};
|
||||
|
||||
struct TestTerminal {
|
||||
openpty: OpenptyResult,
|
||||
}
|
||||
|
||||
impl TestTerminal {
|
||||
pub fn new() -> TestTerminal {
|
||||
let openpty = openpty(None, None).expect("Could not create openpty");
|
||||
TestTerminal { openpty }
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
pub fn master(&self) -> RawFd {
|
||||
self.openpty.master
|
||||
}
|
||||
|
||||
pub fn slave(&self) -> RawFd {
|
||||
self.openpty.slave
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for TestTerminal {
|
||||
fn drop(&mut self) {
|
||||
close(self.openpty.master).expect("Failed to close the master");
|
||||
close(self.openpty.slave).expect("Failed to close the slave");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn get_cwd() {
|
||||
let test_terminal = TestTerminal::new();
|
||||
let test_termios =
|
||||
termios::tcgetattr(test_terminal.slave()).expect("Could not configure the termios");
|
||||
|
||||
let server = ServerOsInputOutput {
|
||||
orig_termios: Arc::new(Mutex::new(test_termios)),
|
||||
client_senders: Arc::default(),
|
||||
};
|
||||
|
||||
let pid = nix::unistd::getpid();
|
||||
assert!(
|
||||
server.get_cwd(pid).is_some(),
|
||||
"Get current working directory from PID {}",
|
||||
pid
|
||||
);
|
||||
}
|
Loading…
Reference in New Issue
Block a user