Skip to content

Commit 564c494

Browse files
authored
update crates to latest (#212)
1 parent bb96d78 commit 564c494

File tree

8 files changed

+1258
-822
lines changed

8 files changed

+1258
-822
lines changed

Cargo.lock

+973-557
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+11-12
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name = "PowerSession"
33
version = "0.1.11"
44
authors = ["Yuwei B <contact@yba.dev>"]
5-
edition = "2021"
5+
edition = "2024"
66

77
license = "MIT"
88
description = "Asciinema-compatible terminal session recorder for Windows"
@@ -13,30 +13,29 @@ keywords = ["cli", "asciinema", "terminal", "recorder", "conpty"]
1313
categories = ["command-line-utilities"]
1414

1515
[dependencies]
16-
clap = { version = "3.2.17", features = ["cargo"] }
16+
clap = { version = "4.5", features = ["cargo"] }
1717
log = "0.4"
18-
fern = { version = "0.6", features = ["colored"] }
18+
fern = { version = "0.7", features = ["colored"] }
1919

2020
platform-dirs = "0.3.0"
2121

2222
serde = { version = "1.0", features = ["derive"] }
2323
serde_json = "1.0"
2424

25-
uuid = { version = "1.12.1", features = [
26-
"v4", # Lets you generate random UUIDs
27-
"fast-rng", # Use a faster (but still sufficiently random) RNG
25+
uuid = { version = "1.16.0", features = [
26+
"v4", # Lets you generate random UUIDs
27+
"fast-rng", # Use a faster (but still sufficiently random) RNG
2828
"macro-diagnostics", # Enable better diagnostics for compile-time UUIDs
29-
]}
29+
] }
3030

31-
reqwest = { version = "0.12.4", features = ["blocking", "multipart"] }
31+
reqwest = { version = "0.12", features = ["blocking", "multipart"] }
3232

3333
rustc_version_runtime = "0.3.0"
3434
os_info = "3"
35-
base64 = "0.13.0"
35+
base64 = "0.22"
3636

3737
#[cfg(windows)]
38-
windows = { version = "0.38.0", features=[
39-
"alloc",
38+
windows = { version = "0.61.1", features = [
4039
"Win32_Foundation",
4140
"Win32_Security",
4241
"Win32_System_Threading",
@@ -45,4 +44,4 @@ windows = { version = "0.38.0", features=[
4544
"Win32_System_Pipes",
4645
"Win32_Storage_FileSystem",
4746
"Win32_System_IO",
48-
]}
47+
] }

src/commands/api/asciinema.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use super::ApiService;
22

3+
use base64::Engine;
4+
use base64::prelude::BASE64_STANDARD;
35
use log::trace;
46
use os_info::Version;
57
use platform_dirs::AppDirs;
@@ -9,7 +11,6 @@ use std::fs::File;
911
use std::fs::{self, OpenOptions};
1012
use std::io::Write;
1113
use std::path::PathBuf;
12-
1314
use uuid::Uuid;
1415

1516
#[derive(Serialize, Deserialize)]
@@ -114,7 +115,7 @@ impl Asciinema {
114115
);
115116

116117
let cred = format!("user:{}", config.install_id);
117-
let cred_b64 = base64::encode_config(cred, base64::STANDARD);
118+
let cred_b64 = BASE64_STANDARD.encode(&cred);
118119
let hdr = format!("Basic {}", cred_b64);
119120
let mut auth_value = header::HeaderValue::from_str(hdr.as_str()).unwrap();
120121
auth_value.set_sensitive(true);

src/commands/record.rs

+54-50
Original file line numberDiff line numberDiff line change
@@ -92,66 +92,70 @@ impl Record {
9292
.write((serde_json::to_string(&header).unwrap() + "\n").as_bytes())
9393
.unwrap();
9494

95-
let (stdin_tx, stdin_rx) = channel::<(Arc<[u8]>, usize)>();
96-
let (stdout_tx, stdout_rx) = channel::<(Arc<[u8]>, usize)>();
97-
98-
thread::spawn(move || loop {
99-
let stdin = std::io::stdin();
100-
let mut handle = stdin.lock();
101-
let mut buf = [0; 10];
102-
let rv = handle.read(&mut buf);
103-
match rv {
104-
Ok(n) if n > 0 => {
105-
stdin_tx.send((Arc::from(buf), n)).unwrap();
106-
}
107-
_ => {
108-
panic!("pty stdin closed");
95+
let (stdin_tx, stdin_rx) = channel::<(Vec<u8>, usize)>();
96+
let (stdout_tx, stdout_rx) = channel::<(Vec<u8>, usize)>();
97+
98+
thread::spawn(move || {
99+
loop {
100+
let stdin = std::io::stdin();
101+
let mut handle = stdin.lock();
102+
let mut buf = [0; 10];
103+
let rv = handle.read(&mut buf);
104+
match rv {
105+
Ok(n) if n > 0 => {
106+
stdin_tx.send((buf.to_vec(), n)).unwrap();
107+
}
108+
_ => {
109+
panic!("pty stdin closed");
110+
}
109111
}
110112
}
111113
});
112114

113115
let output_writer = self.output_writer.clone();
114116
let filename = self.filename.clone();
115117

116-
thread::spawn(move || loop {
117-
let mut stdout = std::io::stdout();
118+
thread::spawn(move || {
119+
loop {
120+
let mut stdout = std::io::stdout();
121+
122+
let rv = stdout_rx.recv();
123+
match rv {
124+
Ok((buf, len)) => {
125+
if len == 0 {
126+
trace!("stdout received close indicator");
127+
println!("Record finished. Result saved to file {}", filename);
128+
break;
129+
}
130+
131+
let now = SystemTime::now()
132+
.duration_since(SystemTime::UNIX_EPOCH)
133+
.expect("check your machine time");
134+
135+
let ts = now.as_secs() as f64 + now.subsec_nanos() as f64 * 1e-9
136+
- record_start_time;
137+
// https://github.com/asciinema/asciinema/blob/5a385765f050e04523c9d74fbf98d5afaa2deff0/asciinema/asciicast/v2.py#L119
138+
let chars = String::from_utf8_lossy(&buf[..len]).to_string();
139+
let data = vec![
140+
LineItem::F64(ts),
141+
LineItem::String("o".to_string()),
142+
LineItem::String(chars),
143+
];
144+
let line = serde_json::to_string(&data).unwrap() + "\n";
145+
output_writer
146+
.lock()
147+
.unwrap()
148+
.write(line.as_bytes())
149+
.unwrap();
150+
151+
stdout.write(&buf[..len]).expect("failed to write stdout");
152+
stdout.flush().expect("failed to flush stdout");
153+
}
118154

119-
let rv = stdout_rx.recv();
120-
match rv {
121-
Ok((buf, len)) => {
122-
if len == 0 {
123-
trace!("stdout received close indicator");
124-
println!("Record finished. Result saved to file {}", filename);
155+
Err(err) => {
156+
error!("reading stdout: {}", err.to_string());
125157
break;
126158
}
127-
128-
let now = SystemTime::now()
129-
.duration_since(SystemTime::UNIX_EPOCH)
130-
.expect("check your machine time");
131-
132-
let ts =
133-
now.as_secs() as f64 + now.subsec_nanos() as f64 * 1e-9 - record_start_time;
134-
// https://github.com/asciinema/asciinema/blob/5a385765f050e04523c9d74fbf98d5afaa2deff0/asciinema/asciicast/v2.py#L119
135-
let chars = String::from_utf8_lossy(&buf[..len]).to_string();
136-
let data = vec![
137-
LineItem::F64(ts),
138-
LineItem::String("o".to_string()),
139-
LineItem::String(chars),
140-
];
141-
let line = serde_json::to_string(&data).unwrap() + "\n";
142-
output_writer
143-
.lock()
144-
.unwrap()
145-
.write(line.as_bytes())
146-
.unwrap();
147-
148-
stdout.write(&buf[..len]).expect("failed to write stdout");
149-
stdout.flush().expect("failed to flush stdout");
150-
}
151-
152-
Err(err) => {
153-
error!("reading stdout: {}", err.to_string());
154-
break;
155159
}
156160
}
157161
});

src/main.rs

+17-13
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ extern crate core;
55
mod commands;
66
mod terminal;
77

8-
use clap::{crate_version, AppSettings, Arg, Command};
8+
use clap::{Arg, Command, crate_version};
99
use commands::{Asciinema, Auth, Play};
1010
use commands::{Record, Upload};
1111
use fern::colors::ColoredLevelConfig;
@@ -31,7 +31,6 @@ fn setup_logger(level: log::LevelFilter) -> Result<(), fern::InitError> {
3131
fn main() {
3232
let app = Command::new("PowerSession")
3333
.version(crate_version!())
34-
.setting(AppSettings::DeriveDisplayOrder)
3534
.subcommand_required(true)
3635
.arg_required_else_help(true)
3736
.subcommand(
@@ -46,14 +45,14 @@ fn main() {
4645
.arg(
4746
Arg::new("command")
4847
.help("The command to record, defaults to $SHELL")
49-
.takes_value(true)
48+
.num_args(1)
5049
.short('c')
5150
.long("command"),
5251
)
5352
.arg(
5453
Arg::new("force")
5554
.help("Overwrite if session already exists")
56-
.takes_value(false)
55+
.num_args(0)
5756
.short('f')
5857
.long("force"),
5958
),
@@ -97,13 +96,13 @@ fn main() {
9796
.default_value("error")
9897
.default_missing_value("trace")
9998
.global(true)
100-
.takes_value(true),
99+
.num_args(1),
101100
);
102101

103102
let m = app.get_matches();
104103

105-
match m.value_of("log-level") {
106-
Some(log_level) => match log_level {
104+
match m.get_one::<String>("log-level") {
105+
Some(log_level) => match log_level.as_str() {
107106
"error" => setup_logger(log::LevelFilter::Error).unwrap(),
108107
"warn" => setup_logger(log::LevelFilter::Warn).unwrap(),
109108
"info" => setup_logger(log::LevelFilter::Info).unwrap(),
@@ -118,15 +117,20 @@ fn main() {
118117

119118
match m.subcommand() {
120119
Some(("play", play_matches)) => {
121-
let play = Play::new(play_matches.value_of("file").unwrap().to_owned());
120+
let play = Play::new(
121+
play_matches
122+
.get_one::<String>("file")
123+
.expect("record file required")
124+
.to_owned(),
125+
);
122126
play.execute();
123127
}
124128
Some(("rec", rec_matches)) => {
125129
let mut record = Record::new(
126-
rec_matches.value_of("file").unwrap().to_owned(),
130+
rec_matches.get_one::<String>("file").unwrap().to_owned(),
127131
None,
128-
rec_matches.value_of("command").map(Into::into),
129-
rec_matches.is_present("force"),
132+
rec_matches.get_one::<String>("command").map(Into::into),
133+
rec_matches.contains_id("force"),
130134
);
131135
record.execute();
132136
}
@@ -139,12 +143,12 @@ fn main() {
139143
let api_service = Asciinema::new();
140144
let upload = Upload::new(
141145
Box::new(api_service),
142-
upload_matches.value_of("file").unwrap().to_owned(),
146+
upload_matches.get_one::<String>("file").unwrap().to_owned(),
143147
);
144148
upload.execute();
145149
}
146150
Some(("server", new_server)) => {
147-
let url = &new_server.value_of("url").unwrap().to_owned();
151+
let url = &new_server.get_one::<String>("url").unwrap().to_owned();
148152
let is_url = reqwest::Url::parse(url);
149153
match is_url {
150154
Ok(_) => Asciinema::change_server(url.to_string()),

0 commit comments

Comments
 (0)