forked from rust-lang/rust
-
-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#7409 - xFrednet:5394-vs-code-tasks, r=giraffa…
…te,flip1995 Added `cargo dev setup vscode-tasks` for simplicity This PR adds a setup command to `clippy dev` that installs tasks into the Clippy vscode workspace. These might be useful as they be used via shortcuts and are accessible over the GUI. The available tasks are: * `cargo check` (standard Linux shortcut `[ctrl] + [shift] + b`) * `cargo dev fmt` * `cargo uitest` (with a comment how to add the `TESTNAME` environment value) * `cargo test` * `cargo dev bless` --- changelog: none only internal changes again. cc rust-lang#5394 r? `@flip1995` This should be pretty much the same as the other `cargo dev setup` commands. Would you mind reviewing this? 🙃
- Loading branch information
Showing
5 changed files
with
202 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,23 @@ | ||
pub mod git_hook; | ||
pub mod intellij; | ||
pub mod vscode; | ||
|
||
use std::path::Path; | ||
|
||
const CLIPPY_DEV_DIR: &str = "clippy_dev"; | ||
|
||
/// This function verifies that the tool is being executed in the clippy directory. | ||
/// This is useful to ensure that setups only modify Clippys resources. The verification | ||
/// is done by checking that `clippy_dev` is a sub directory of the current directory. | ||
/// | ||
/// It will print an error message and return `false` if the directory could not be | ||
/// verified. | ||
fn verify_inside_clippy_dir() -> bool { | ||
let path = Path::new(CLIPPY_DEV_DIR); | ||
if path.exists() && path.is_dir() { | ||
true | ||
} else { | ||
eprintln!("error: unable to verify that the working directory is clippys directory"); | ||
false | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,104 @@ | ||
use std::fs; | ||
use std::path::Path; | ||
|
||
use super::verify_inside_clippy_dir; | ||
|
||
const VSCODE_DIR: &str = ".vscode"; | ||
const TASK_SOURCE_FILE: &str = "util/etc/vscode-tasks.json"; | ||
const TASK_TARGET_FILE: &str = ".vscode/tasks.json"; | ||
|
||
pub fn install_tasks(force_override: bool) { | ||
if !check_install_precondition(force_override) { | ||
return; | ||
} | ||
|
||
match fs::copy(TASK_SOURCE_FILE, TASK_TARGET_FILE) { | ||
Ok(_) => { | ||
println!("info: the task file can be removed with `cargo dev remove vscode-tasks`"); | ||
println!("vscode tasks successfully installed"); | ||
}, | ||
Err(err) => eprintln!( | ||
"error: unable to copy `{}` to `{}` ({})", | ||
TASK_SOURCE_FILE, TASK_TARGET_FILE, err | ||
), | ||
} | ||
} | ||
|
||
fn check_install_precondition(force_override: bool) -> bool { | ||
if !verify_inside_clippy_dir() { | ||
return false; | ||
} | ||
|
||
let vs_dir_path = Path::new(VSCODE_DIR); | ||
if vs_dir_path.exists() { | ||
// verify the target will be valid | ||
if !vs_dir_path.is_dir() { | ||
eprintln!("error: the `.vscode` path exists but seems to be a file"); | ||
return false; | ||
} | ||
|
||
// make sure that we don't override any existing tasks by accident | ||
let path = Path::new(TASK_TARGET_FILE); | ||
if path.exists() { | ||
if force_override { | ||
return delete_vs_task_file(path); | ||
} | ||
|
||
eprintln!( | ||
"error: there is already a `task.json` file inside the `{}` directory", | ||
VSCODE_DIR | ||
); | ||
println!("info: use the `--force-override` flag to override the existing `task.json` file"); | ||
return false; | ||
} | ||
} else { | ||
match fs::create_dir(vs_dir_path) { | ||
Ok(_) => { | ||
println!("info: created `{}` directory for clippy", VSCODE_DIR); | ||
}, | ||
Err(err) => { | ||
eprintln!( | ||
"error: the task target directory `{}` could not be created ({})", | ||
VSCODE_DIR, err | ||
); | ||
}, | ||
} | ||
} | ||
|
||
true | ||
} | ||
|
||
pub fn remove_tasks() { | ||
let path = Path::new(TASK_TARGET_FILE); | ||
if path.exists() { | ||
if delete_vs_task_file(path) { | ||
try_delete_vs_directory_if_empty(); | ||
println!("vscode tasks successfully removed"); | ||
} | ||
} else { | ||
println!("no vscode tasks were found"); | ||
} | ||
} | ||
|
||
fn delete_vs_task_file(path: &Path) -> bool { | ||
if let Err(err) = fs::remove_file(path) { | ||
eprintln!("error: unable to delete the existing `tasks.json` file ({})", err); | ||
return false; | ||
} | ||
|
||
true | ||
} | ||
|
||
/// This function will try to delete the `.vscode` directory if it's empty. | ||
/// It may fail silently. | ||
fn try_delete_vs_directory_if_empty() { | ||
let path = Path::new(VSCODE_DIR); | ||
if path.read_dir().map_or(false, |mut iter| iter.next().is_none()) { | ||
// The directory is empty. We just try to delete it but allow a silence | ||
// fail as an empty `.vscode` directory is still valid | ||
let _silence_result = fs::remove_dir(path); | ||
} else { | ||
// The directory is not empty or could not be read. Either way don't take | ||
// any further actions | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
{ | ||
"version": "2.0.0", | ||
"tasks": [ | ||
{ | ||
"label": "cargo check", | ||
"type": "shell", | ||
"command": "cargo check", | ||
"problemMatcher": [], | ||
"group": { | ||
"kind": "build", | ||
"isDefault": true, | ||
}, | ||
}, | ||
{ | ||
"label": "cargo dev fmt", | ||
"type": "shell", | ||
"command": "cargo dev fmt", | ||
"problemMatcher": [], | ||
"group": "none", | ||
}, | ||
{ | ||
"label": "cargo uitest", | ||
"type": "shell", | ||
"command": "cargo uitest", | ||
"options": { | ||
"env": { | ||
"RUST_BACKTRACE": "1", | ||
// This task will usually execute all UI tests inside `tests/ui` you can | ||
// optionally uncomment the line below and only run a specific test. | ||
// | ||
// See: https://github.com/rust-lang/rust-clippy/blob/master/doc/adding_lints.md#testing | ||
// | ||
// "TESTNAME": "<TODO>", | ||
}, | ||
}, | ||
"problemMatcher": [], | ||
"group": { | ||
"kind": "test", | ||
"isDefault": true, | ||
} | ||
}, | ||
{ | ||
"label": "cargo test", | ||
"type": "shell", | ||
"command": "cargo test", | ||
"problemMatcher": [], | ||
"group": "test", | ||
}, | ||
{ | ||
"label": "cargo dev bless", | ||
"type": "shell", | ||
"command": "cargo dev bless", | ||
"problemMatcher": [], | ||
"group": "none", | ||
}, | ||
], | ||
} |