Skip to content

Commit a9e8c40

Browse files
committed
Wrap set_var, remove_var in unsafe blocks
Rust 2024 is making these particular function unsafe, and this change prepares the project by making a best effort to change environment variables in a safe way. Since these values are only modified in tests, and generally only certain variables, this change should be generally safe. It also has zero direct impact on the production build.
1 parent a26eee4 commit a9e8c40

File tree

11 files changed

+554
-311
lines changed

11 files changed

+554
-311
lines changed

Cargo.toml

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ keywords = ["git", "editor", "tool", "rebase", "cli"]
1010
categories = ["command-line-interface", "command-line-utilities", "text-editors"]
1111
readme = "README.md"
1212
include = [
13-
"**/*.rs",
14-
"/Cargo.toml",
15-
"/CHANGELOG.md",
16-
"/LICENSE",
17-
"/readme",
18-
"/README.md"
13+
"**/*.rs",
14+
"/Cargo.toml",
15+
"/CHANGELOG.md",
16+
"/LICENSE",
17+
"/readme",
18+
"/README.md"
1919
]
2020
edition = "2021"
2121

@@ -78,20 +78,20 @@ Full feature terminal based sequence editor for git interactive rebase."""
7878
section = "utility"
7979
priority = "optional"
8080
assets = [
81-
["target/release/interactive-rebase-tool", "usr/bin/interactive-rebase-tool", "755"],
82-
["README.md", "usr/share/doc/interactive-rebase-tool/", "644"],
83-
["readme/**/*.md", "usr/share/doc/interactive-rebase-tool/readme/", "644"],
84-
["CHANGELOG.md", "usr/share/doc/interactive-rebase-tool/", "644"],
85-
["src/interactive-rebase-tool.1", "usr/share/man/man1/interactive-rebase-tool.1", "644"]
81+
["target/release/interactive-rebase-tool", "usr/bin/interactive-rebase-tool", "755"],
82+
["README.md", "usr/share/doc/interactive-rebase-tool/", "644"],
83+
["readme/**/*.md", "usr/share/doc/interactive-rebase-tool/readme/", "644"],
84+
["CHANGELOG.md", "usr/share/doc/interactive-rebase-tool/", "644"],
85+
["src/interactive-rebase-tool.1", "usr/share/man/man1/interactive-rebase-tool.1", "644"]
8686
]
8787

8888
[package.metadata.generate-rpm]
8989
assets = [
90-
{ source = "target/release/interactive-rebase-tool", dest = "/usr/bin/interactive-rebase-tool", mode = "755" },
91-
{ source = "README.md", dest = "/usr/share/doc/interactive-rebase-tool/", mode = "644" },
92-
{ source = "readme/*.md", dest = "/usr/share/doc/interactive-rebase-tool/readme/", mode = "644" },
93-
{ source = "CHANGELOG.md", dest = "/usr/share/doc/interactive-rebase-tool/", mode = "644" },
94-
{ source = "src/interactive-rebase-tool.1", dest = "/usr/share/man/man1/interactive-rebase-tool.1", mode = "644" },
90+
{ source = "target/release/interactive-rebase-tool", dest = "/usr/bin/interactive-rebase-tool", mode = "755" },
91+
{ source = "README.md", dest = "/usr/share/doc/interactive-rebase-tool/", mode = "644" },
92+
{ source = "readme/*.md", dest = "/usr/share/doc/interactive-rebase-tool/readme/", mode = "644" },
93+
{ source = "CHANGELOG.md", dest = "/usr/share/doc/interactive-rebase-tool/", mode = "644" },
94+
{ source = "src/interactive-rebase-tool.1", dest = "/usr/share/man/man1/interactive-rebase-tool.1", mode = "644" },
9595
]
9696

9797
[lints.rust]
@@ -103,7 +103,7 @@ nonstandard_style = { level = "warn", priority = -2 }
103103
rust_2018_compatibility = { level = "warn", priority = -2 }
104104
rust_2018_idioms = { level = "warn", priority = -2 }
105105
rust_2021_compatibility = { level = "warn", priority = -2 }
106-
# rust_2024_compatibility = { level = "warn", priority = -2 } - requires some significant changes
106+
rust_2024_compatibility = { level = "warn", priority = -2 }
107107
unused = { level = "warn", priority = -2 }
108108

109109
unknown_lints = { level = "warn", priority = -1 }

src/application.rs

Lines changed: 119 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ mod tests {
201201
create_config,
202202
create_event_reader,
203203
mocks,
204-
set_git_directory,
204+
with_git_directory,
205205
DefaultTestModule,
206206
TestModuleProvider,
207207
},
@@ -245,31 +245,31 @@ mod tests {
245245
}
246246

247247
#[test]
248-
#[serial_test::serial]
249248
fn load_repository_failure() {
250-
_ = set_git_directory("fixtures/not-a-repository");
251-
let event_provider = create_event_reader(|| Ok(None));
252-
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> =
253-
Application::new(&args(&["todofile"]), event_provider, create_mocked_crossterm());
254-
let exit = application_error!(application);
255-
assert_eq!(exit.get_status(), &ExitStatus::StateError);
256-
assert!(
257-
exit.get_message()
258-
.as_ref()
259-
.unwrap()
260-
.contains("Unable to load Git repository: ")
261-
);
249+
with_git_directory("fixtures/not-a-repository", |_| {
250+
let event_provider = create_event_reader(|| Ok(None));
251+
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> =
252+
Application::new(&args(&["todofile"]), event_provider, create_mocked_crossterm());
253+
let exit = application_error!(application);
254+
assert_eq!(exit.get_status(), &ExitStatus::StateError);
255+
assert!(
256+
exit.get_message()
257+
.as_ref()
258+
.unwrap()
259+
.contains("Unable to load Git repository: ")
260+
);
261+
});
262262
}
263263

264264
#[test]
265-
#[serial_test::serial]
266265
fn load_config_failure() {
267-
_ = set_git_directory("fixtures/invalid-config");
268-
let event_provider = create_event_reader(|| Ok(None));
269-
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> =
270-
Application::new(&args(&["rebase-todo"]), event_provider, create_mocked_crossterm());
271-
let exit = application_error!(application);
272-
assert_eq!(exit.get_status(), &ExitStatus::ConfigError);
266+
with_git_directory("fixtures/invalid-config", |_| {
267+
let event_provider = create_event_reader(|| Ok(None));
268+
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> =
269+
Application::new(&args(&["rebase-todo"]), event_provider, create_mocked_crossterm());
270+
let exit = application_error!(application);
271+
assert_eq!(exit.get_status(), &ExitStatus::ConfigError);
272+
});
273273
}
274274

275275
#[test]
@@ -303,50 +303,50 @@ mod tests {
303303
}
304304

305305
#[test]
306-
#[serial_test::serial]
307306
fn load_todo_file_load_error() {
308-
_ = set_git_directory("fixtures/simple");
309-
let event_provider = create_event_reader(|| Ok(None));
310-
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> =
311-
Application::new(&args(&["does-not-exist"]), event_provider, create_mocked_crossterm());
312-
let exit = application_error!(application);
313-
assert_eq!(exit.get_status(), &ExitStatus::FileReadError);
307+
with_git_directory("fixtures/simple", |_| {
308+
let event_provider = create_event_reader(|| Ok(None));
309+
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> =
310+
Application::new(&args(&["does-not-exist"]), event_provider, create_mocked_crossterm());
311+
let exit = application_error!(application);
312+
assert_eq!(exit.get_status(), &ExitStatus::FileReadError);
313+
});
314314
}
315315

316316
#[test]
317-
#[serial_test::serial]
318317
fn load_todo_file_noop() {
319-
let git_dir = set_git_directory("fixtures/simple");
320-
let rebase_todo = format!("{git_dir}/rebase-todo-noop");
321-
let event_provider = create_event_reader(|| Ok(None));
322-
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> = Application::new(
323-
&args(&[rebase_todo.as_str()]),
324-
event_provider,
325-
create_mocked_crossterm(),
326-
);
327-
let exit = application_error!(application);
328-
assert_eq!(exit.get_status(), &ExitStatus::Good);
318+
with_git_directory("fixtures/simple", |git_dir| {
319+
let rebase_todo = format!("{git_dir}/rebase-todo-noop");
320+
let event_provider = create_event_reader(|| Ok(None));
321+
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> = Application::new(
322+
&args(&[rebase_todo.as_str()]),
323+
event_provider,
324+
create_mocked_crossterm(),
325+
);
326+
let exit = application_error!(application);
327+
assert_eq!(exit.get_status(), &ExitStatus::Good);
328+
});
329329
}
330330

331331
#[test]
332-
#[serial_test::serial]
333332
fn load_todo_file_empty() {
334-
let git_dir = set_git_directory("fixtures/simple");
335-
let rebase_todo = format!("{git_dir}/rebase-todo-empty");
336-
let event_provider = create_event_reader(|| Ok(None));
337-
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> = Application::new(
338-
&args(&[rebase_todo.as_str()]),
339-
event_provider,
340-
create_mocked_crossterm(),
341-
);
342-
let exit = application_error!(application);
343-
assert_eq!(exit.get_status(), &ExitStatus::Good);
344-
assert!(
345-
exit.get_message()
346-
.as_ref()
347-
.unwrap()
348-
.contains("An empty rebase was provided, nothing to edit")
349-
);
333+
with_git_directory("fixtures/simple", |git_dir| {
334+
let rebase_todo = format!("{git_dir}/rebase-todo-empty");
335+
let event_provider = create_event_reader(|| Ok(None));
336+
let application: Result<Application<TestModuleProvider<DefaultTestModule>>, Exit> = Application::new(
337+
&args(&[rebase_todo.as_str()]),
338+
event_provider,
339+
create_mocked_crossterm(),
340+
);
341+
let exit = application_error!(application);
342+
assert_eq!(exit.get_status(), &ExitStatus::Good);
343+
assert!(
344+
exit.get_message()
345+
.as_ref()
346+
.unwrap()
347+
.contains("An empty rebase was provided, nothing to edit")
348+
);
349+
});
350350
}
351351

352352
#[test]
@@ -363,22 +363,21 @@ mod tests {
363363
}
364364

365365
#[test]
366-
#[serial_test::serial]
367366
fn run_until_finished_success() {
368-
let git_dir = set_git_directory("fixtures/simple");
369-
let rebase_todo = format!("{git_dir}/rebase-todo");
370-
let event_provider = create_event_reader(|| Ok(Some(Event::Key(KeyEvent::from(KeyCode::Char('W'))))));
371-
let mut application: Application<Modules> = Application::new(
372-
&args(&[rebase_todo.as_str()]),
373-
event_provider,
374-
create_mocked_crossterm(),
375-
)
376-
.unwrap();
377-
assert_ok!(application.run_until_finished());
367+
with_git_directory("fixtures/simple", |git_dir| {
368+
let rebase_todo = format!("{git_dir}/rebase-todo");
369+
let event_provider = create_event_reader(|| Ok(Some(Event::Key(KeyEvent::from(KeyCode::Char('W'))))));
370+
let mut application: Application<Modules> = Application::new(
371+
&args(&[rebase_todo.as_str()]),
372+
event_provider,
373+
create_mocked_crossterm(),
374+
)
375+
.unwrap();
376+
assert_ok!(application.run_until_finished());
377+
});
378378
}
379379

380380
#[test]
381-
#[serial_test::serial]
382381
fn run_join_error() {
383382
struct FailingThread;
384383
impl Threadable for FailingThread {
@@ -391,67 +390,68 @@ mod tests {
391390
}
392391
}
393392

394-
let git_dir = set_git_directory("fixtures/simple");
395-
let rebase_todo = format!("{git_dir}/rebase-todo");
396-
let event_provider = create_event_reader(|| Ok(Some(Event::Key(KeyEvent::from(KeyCode::Char('W'))))));
397-
let mut application: Application<Modules> = Application::new(
398-
&args(&[rebase_todo.as_str()]),
399-
event_provider,
400-
create_mocked_crossterm(),
401-
)
402-
.unwrap();
393+
with_git_directory("fixtures/simple", |git_dir| {
394+
let rebase_todo = format!("{git_dir}/rebase-todo");
395+
let event_provider = create_event_reader(|| Ok(Some(Event::Key(KeyEvent::from(KeyCode::Char('W'))))));
396+
let mut application: Application<Modules> = Application::new(
397+
&args(&[rebase_todo.as_str()]),
398+
event_provider,
399+
create_mocked_crossterm(),
400+
)
401+
.unwrap();
403402

404-
application.threads = Some(vec![Box::new(FailingThread {})]);
403+
application.threads = Some(vec![Box::new(FailingThread {})]);
405404

406-
let exit = application.run_until_finished().unwrap_err();
407-
assert_eq!(exit.get_status(), &ExitStatus::StateError);
408-
assert!(
409-
exit.get_message()
410-
.as_ref()
411-
.unwrap()
412-
.starts_with("Failed to join runtime:")
413-
);
405+
let exit = application.run_until_finished().unwrap_err();
406+
assert_eq!(exit.get_status(), &ExitStatus::StateError);
407+
assert!(
408+
exit.get_message()
409+
.as_ref()
410+
.unwrap()
411+
.starts_with("Failed to join runtime:")
412+
);
413+
});
414414
}
415415

416416
#[test]
417-
#[serial_test::serial]
418417
fn run_until_finished_kill() {
419-
let git_dir = set_git_directory("fixtures/simple");
420-
let rebase_todo = format!("{git_dir}/rebase-todo");
421-
let event_provider = create_event_reader(|| {
422-
Ok(Some(Event::Key(KeyEvent::new(
423-
KeyCode::Char('c'),
424-
KeyModifiers::CONTROL,
425-
))))
418+
with_git_directory("fixtures/simple", |git_dir| {
419+
let rebase_todo = format!("{git_dir}/rebase-todo");
420+
let event_provider = create_event_reader(|| {
421+
Ok(Some(Event::Key(KeyEvent::new(
422+
KeyCode::Char('c'),
423+
KeyModifiers::CONTROL,
424+
))))
425+
});
426+
let mut application: Application<Modules> = Application::new(
427+
&args(&[rebase_todo.as_str()]),
428+
event_provider,
429+
create_mocked_crossterm(),
430+
)
431+
.unwrap();
432+
let exit = application.run_until_finished().unwrap_err();
433+
assert_eq!(exit.get_status(), &ExitStatus::Kill);
426434
});
427-
let mut application: Application<Modules> = Application::new(
428-
&args(&[rebase_todo.as_str()]),
429-
event_provider,
430-
create_mocked_crossterm(),
431-
)
432-
.unwrap();
433-
let exit = application.run_until_finished().unwrap_err();
434-
assert_eq!(exit.get_status(), &ExitStatus::Kill);
435435
}
436436

437437
#[test]
438-
#[serial_test::serial]
439438
fn run_error_on_second_attempt() {
440-
let git_dir = set_git_directory("fixtures/simple");
441-
let rebase_todo = format!("{git_dir}/rebase-todo");
442-
let event_provider = create_event_reader(|| Ok(Some(Event::Key(KeyEvent::from(KeyCode::Char('W'))))));
443-
let mut application: Application<Modules> = Application::new(
444-
&args(&[rebase_todo.as_str()]),
445-
event_provider,
446-
create_mocked_crossterm(),
447-
)
448-
.unwrap();
449-
assert_ok!(application.run_until_finished());
450-
let exit = application.run_until_finished().unwrap_err();
451-
assert_eq!(exit.get_status(), &ExitStatus::StateError);
452-
assert_eq!(
453-
exit.get_message().as_ref().unwrap(),
454-
"Attempt made to run application a second time"
455-
);
439+
with_git_directory("fixtures/simple", |git_dir| {
440+
let rebase_todo = format!("{git_dir}/rebase-todo");
441+
let event_provider = create_event_reader(|| Ok(Some(Event::Key(KeyEvent::from(KeyCode::Char('W'))))));
442+
let mut application: Application<Modules> = Application::new(
443+
&args(&[rebase_todo.as_str()]),
444+
event_provider,
445+
create_mocked_crossterm(),
446+
)
447+
.unwrap();
448+
assert_ok!(application.run_until_finished());
449+
let exit = application.run_until_finished().unwrap_err();
450+
assert_eq!(exit.get_status(), &ExitStatus::StateError);
451+
assert_eq!(
452+
exit.get_message().as_ref().unwrap(),
453+
"Attempt made to run application a second time"
454+
);
455+
});
456456
}
457457
}

0 commit comments

Comments
 (0)