aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrooks J Rady <b.j.rady@gmail.com>2021-09-19 16:25:52 +0100
committerBrooks J Rady <b.j.rady@gmail.com>2021-09-19 16:25:52 +0100
commit1a1c10a22674522ab7b15a352ef77ca0bfb1991f (patch)
treeedef2a1e1e49eec3a0abf82ea85bb20404198ac5 /src
parentMerge branch 'main' of github.com:zellij-org/zellij (diff)
parentchore(docs): update changelog (diff)
downloadsl0ppij-1a1c10a22674522ab7b15a352ef77ca0bfb1991f.tar.gz
sl0ppij-1a1c10a22674522ab7b15a352ef77ca0bfb1991f.tar.xz
sl0ppij-1a1c10a22674522ab7b15a352ef77ca0bfb1991f.zip
Merge branch 'main' of github.com:zellij-org/zellij
Diffstat (limited to 'src')
-rw-r--r--src/main.rs95
-rw-r--r--src/sessions.rs48
-rw-r--r--src/tests/e2e/cases.rs86
-rw-r--r--src/tests/e2e/remote_runner.rs6
4 files changed, 152 insertions, 83 deletions
diff --git a/src/main.rs b/src/main.rs
index f0d00f77..0a91ca65 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -4,12 +4,15 @@ mod sessions;
mod tests;
use crate::install::populate_data_dir;
-use sessions::{assert_session, assert_session_ne, get_active_session, list_sessions};
+use sessions::{
+ assert_session, assert_session_ne, get_active_session, get_sessions, list_sessions,
+ print_sessions, session_exists, ActiveSession,
+};
use std::process;
use zellij_client::{os_input_output::get_client_os_input, start_client, ClientInfo};
use zellij_server::{os_input_output::get_server_os_input, start_server};
use zellij_utils::{
- cli::{CliArgs, Command, Sessions},
+ cli::{CliArgs, Command, SessionCommand, Sessions},
consts::{ZELLIJ_TMP_DIR, ZELLIJ_TMP_LOG_DIR},
logging::*,
setup::{get_default_data_dir, Setup},
@@ -36,6 +39,14 @@ pub fn main() {
};
start_server(Box::new(os_input), path);
} else {
+ let (config, layout, config_options) = match Setup::from_options(&opts) {
+ Ok(results) => results,
+ Err(e) => {
+ eprintln!("{}", e);
+ process::exit(1);
+ }
+ };
+
let os_input = match get_client_os_input() {
Ok(os_input) => os_input,
Err(e) => {
@@ -44,40 +55,77 @@ pub fn main() {
}
};
if let Some(Command::Sessions(Sessions::Attach {
- mut session_name,
+ session_name,
force,
+ create,
+ options,
})) = opts.command.clone()
{
- if let Some(session) = session_name.as_ref() {
- assert_session(session);
- } else {
- session_name = Some(get_active_session());
- }
+ let config_options = match options {
+ Some(SessionCommand::Options(o)) => config_options.merge(o),
+ None => config_options,
+ };
- let (config, _, config_options) = match Setup::from_options(&opts) {
- Ok(results) => results,
- Err(e) => {
- eprintln!("{}", e);
- process::exit(1);
+ let (client, attach_layout) = match session_name.as_ref() {
+ Some(session) => {
+ if create {
+ if !session_exists(session).unwrap() {
+ (ClientInfo::New(session_name.unwrap()), layout)
+ } else {
+ (
+ ClientInfo::Attach(
+ session_name.unwrap(),
+ force,
+ config_options.clone(),
+ ),
+ None,
+ )
+ }
+ } else {
+ assert_session(session);
+ (
+ ClientInfo::Attach(
+ session_name.unwrap(),
+ force,
+ config_options.clone(),
+ ),
+ None,
+ )
+ }
}
+ None => match get_active_session() {
+ ActiveSession::None => {
+ if create {
+ (
+ ClientInfo::New(names::Generator::default().next().unwrap()),
+ layout,
+ )
+ } else {
+ println!("No active zellij sessions found.");
+ process::exit(1);
+ }
+ }
+ ActiveSession::One(session_name) => (
+ ClientInfo::Attach(session_name, force, config_options.clone()),
+ None,
+ ),
+ ActiveSession::Many => {
+ println!("Please specify the session name to attach to. The following sessions are active:");
+ print_sessions(get_sessions().unwrap());
+ process::exit(1);
+ }
+ },
};
start_client(
Box::new(os_input),
opts,
config,
- ClientInfo::Attach(session_name.unwrap(), force, config_options),
- None,
+ config_options,
+ client,
+ attach_layout,
);
} else {
- let (config, layout, _) = match Setup::from_options(&opts) {
- Ok(results) => results,
- Err(e) => {
- eprintln!("{}", e);
- process::exit(1);
- }
- };
-
let session_name = opts
.session
.clone()
@@ -93,6 +141,7 @@ pub fn main() {
Box::new(os_input),
opts,
config,
+ config_options,
ClientInfo::New(session_name),
layout,
);
diff --git a/src/sessions.rs b/src/sessions.rs
index fb1a9635..9f1e20f0 100644
--- a/src/sessions.rs
+++ b/src/sessions.rs
@@ -6,7 +6,7 @@ use zellij_utils::{
ipc::{ClientToServerMsg, IpcSenderWithContext},
};
-fn get_sessions() -> Result<Vec<String>, io::ErrorKind> {
+pub(crate) fn get_sessions() -> Result<Vec<String>, io::ErrorKind> {
match fs::read_dir(&*ZELLIJ_SOCK_DIR) {
Ok(files) => {
let mut sessions = Vec::new();
@@ -47,7 +47,7 @@ fn assert_socket(name: &str) -> bool {
}
}
-fn print_sessions(sessions: Vec<String>) {
+pub(crate) fn print_sessions(sessions: Vec<String>) {
let curr_session = std::env::var("ZELLIJ_SESSION_NAME").unwrap_or_else(|_| "".into());
sessions.iter().for_each(|session| {
let suffix = if curr_session == *session {
@@ -59,22 +59,29 @@ fn print_sessions(sessions: Vec<String>) {
})
}
-pub(crate) fn get_active_session() -> String {
+pub(crate) enum ActiveSession {
+ None,
+ One(String),
+ Many,
+}
+
+pub(crate) fn get_active_session() -> ActiveSession {
match get_sessions() {
Ok(mut sessions) => {
if sessions.len() == 1 {
- return sessions.pop().unwrap();
+ return ActiveSession::One(sessions.pop().unwrap());
}
if sessions.is_empty() {
- println!("No active zellij sessions found.");
+ ActiveSession::None
} else {
- println!("Please specify the session name to attach to. The following sessions are active:");
- print_sessions(sessions);
+ ActiveSession::Many
}
}
- Err(e) => eprintln!("Error occured: {:?}", e),
+ Err(e) => {
+ eprintln!("Error occured: {:?}", e);
+ process::exit(1);
+ }
}
- process::exit(1);
}
pub(crate) fn list_sessions() {
@@ -95,15 +102,30 @@ pub(crate) fn list_sessions() {
process::exit(exit_code);
}
-pub(crate) fn assert_session(name: &str) {
- match get_sessions() {
+pub(crate) fn session_exists(name: &str) -> Result<bool, io::ErrorKind> {
+ return match get_sessions() {
Ok(sessions) => {
if sessions.iter().any(|s| s == name) {
+ return Ok(true);
+ }
+ Ok(false)
+ }
+ Err(e) => Err(e),
+ };
+}
+
+pub(crate) fn assert_session(name: &str) {
+ match session_exists(name) {
+ Ok(result) => {
+ if result {
return;
+ } else {
+ println!("No session named {:?} found.", name);
}
- println!("No session named {:?} found.", name);
}
- Err(e) => eprintln!("Error occured: {:?}", e),
+ Err(e) => {
+ eprintln!("Error occured: {:?}", e);
+ }
};
process::exit(1);
}
diff --git a/src/tests/e2e/cases.rs b/src/tests/e2e/cases.rs
index dda7d96a..307986c1 100644
--- a/src/tests/e2e/cases.rs
+++ b/src/tests/e2e/cases.rs
@@ -157,7 +157,7 @@ pub fn cannot_split_terminals_vertically_when_active_terminal_is_too_small() {
instruction: |mut remote_terminal: RemoteTerminal| -> bool {
// this is just normal input that should be sent into the one terminal so that we can make
// sure we silently failed to split in the previous step
- remote_terminal.send_key(&"Hi!".as_bytes());
+ remote_terminal.send_key("Hi!".as_bytes());
true
},
})
@@ -205,26 +205,26 @@ pub fn scrolling_inside_a_pane() {
let mut step_is_complete = false;
if remote_terminal.cursor_position_is(63, 2) && remote_terminal.tip_appears() {
// cursor is in the newly opened second pane
- remote_terminal.send_key(&format!("{:0<56}", "line1 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line2 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line3 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line4 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line5 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line6 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line7 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line8 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line9 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line10 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line11 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line12 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line13 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line14 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line15 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line16 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line17 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line18 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line19 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<57}", "line20 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<56}", "line1 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line2 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line3 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line4 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line5 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line6 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line7 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line8 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line9 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line10 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line11 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line12 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line13 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line14 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line15 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line16 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line17 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line18 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line19 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<57}", "line20 ").as_bytes());
step_is_complete = true;
}
step_is_complete
@@ -574,7 +574,7 @@ pub fn lock_mode() {
if remote_terminal.snapshot_contains("INTERFACE LOCKED") {
remote_terminal.send_key(&TAB_MODE);
remote_terminal.send_key(&NEW_TAB_IN_TAB_MODE);
- remote_terminal.send_key(&"abc".as_bytes());
+ remote_terminal.send_key("abc".as_bytes());
step_is_complete = true;
}
step_is_complete
@@ -675,7 +675,7 @@ pub fn detach_and_attach_session() {
let mut step_is_complete = false;
if remote_terminal.cursor_position_is(63, 2) && remote_terminal.tip_appears() {
// new pane has been opened and focused
- remote_terminal.send_key(&"I am some text".as_bytes());
+ remote_terminal.send_key("I am some text".as_bytes());
step_is_complete = true;
}
step_is_complete
@@ -825,26 +825,26 @@ pub fn scrolling_inside_a_pane_with_mouse() {
let mut step_is_complete = false;
if remote_terminal.cursor_position_is(63, 2) && remote_terminal.tip_appears() {
// cursor is in the newly opened second pane
- remote_terminal.send_key(&format!("{:0<56}", "line1 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line2 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line3 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line4 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line5 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line6 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line7 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line8 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line9 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line10 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line11 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line12 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line13 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line14 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line15 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line16 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line17 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line18 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<58}", "line19 ").as_bytes());
- remote_terminal.send_key(&format!("{:0<57}", "line20 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<56}", "line1 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line2 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line3 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line4 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line5 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line6 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line7 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line8 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line9 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line10 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line11 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line12 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line13 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line14 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line15 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line16 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line17 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line18 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<58}", "line19 ").as_bytes());
+ remote_terminal.send_key(format!("{:0<57}", "line20 ").as_bytes());
step_is_complete = true;
}
step_is_complete
diff --git a/src/tests/e2e/remote_runner.rs b/src/tests/e2e/remote_runner.rs
index de9c35ed..7c4587f3 100644
--- a/src/tests/e2e/remote_runner.rs
+++ b/src/tests/e2e/remote_runner.rs
@@ -34,9 +34,7 @@ fn setup_remote_environment(channel: &mut ssh2::Channel, win_size: Size) {
.request_pty("xterm", None, Some((columns, rows, 0, 0)))
.unwrap();
channel.shell().unwrap();
- channel
- .write_all(format!("export PS1=\"$ \"\n").as_bytes())
- .unwrap();
+ channel.write_all("export PS1=\"$ \"\n".as_bytes()).unwrap();
channel.flush().unwrap();
}
@@ -154,7 +152,7 @@ impl<'a> RemoteTerminal<'a> {
format!("x: {}, y: {}", self.cursor_x, self.cursor_y)
}
pub fn send_key(&mut self, key: &[u8]) {
- self.channel.write(key).unwrap();
+ self.channel.write_all(key).unwrap();
self.channel.flush().unwrap();
}
pub fn change_size(&mut self, cols: u32, rows: u32) {