Explore syntax for built-in tasks. Implementation is still ... crap
This commit is contained in:
parent
e2a5f74c3a
commit
35e186f828
|
@ -131,6 +131,16 @@ version = "0.1.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
|
checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "form_urlencoded"
|
||||||
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"
|
||||||
|
dependencies = [
|
||||||
|
"matches",
|
||||||
|
"percent-encoding",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "generic-array"
|
name = "generic-array"
|
||||||
version = "0.12.3"
|
version = "0.12.3"
|
||||||
|
@ -192,6 +202,17 @@ dependencies = [
|
||||||
"quick-error 1.2.3",
|
"quick-error 1.2.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "idna"
|
||||||
|
version = "0.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
|
||||||
|
dependencies = [
|
||||||
|
"matches",
|
||||||
|
"unicode-bidi",
|
||||||
|
"unicode-normalization",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "0.4.7"
|
version = "0.4.7"
|
||||||
|
@ -266,6 +287,12 @@ version = "1.0.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "matches"
|
||||||
|
version = "0.1.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.3.4"
|
version = "2.3.4"
|
||||||
|
@ -315,6 +342,12 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "percent-encoding"
|
||||||
|
version = "2.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pest"
|
name = "pest"
|
||||||
version = "2.1.3"
|
version = "2.1.3"
|
||||||
|
@ -542,6 +575,21 @@ dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tinyvec"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f"
|
||||||
|
dependencies = [
|
||||||
|
"tinyvec_macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tinyvec_macros"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typenum"
|
name = "typenum"
|
||||||
version = "1.12.0"
|
version = "1.12.0"
|
||||||
|
@ -554,12 +602,42 @@ version = "0.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
|
checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-bidi"
|
||||||
|
version = "0.3.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
|
||||||
|
dependencies = [
|
||||||
|
"matches",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-normalization"
|
||||||
|
version = "0.1.16"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606"
|
||||||
|
dependencies = [
|
||||||
|
"tinyvec",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-xid"
|
name = "unicode-xid"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "url"
|
||||||
|
version = "2.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"
|
||||||
|
dependencies = [
|
||||||
|
"form_urlencoded",
|
||||||
|
"idna",
|
||||||
|
"matches",
|
||||||
|
"percent-encoding",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vcpkg"
|
name = "vcpkg"
|
||||||
version = "0.2.11"
|
version = "0.2.11"
|
||||||
|
@ -633,4 +711,5 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
"ssh2",
|
"ssh2",
|
||||||
|
"url",
|
||||||
]
|
]
|
||||||
|
|
|
@ -12,12 +12,8 @@ task 'tasks/echo' {
|
||||||
msg = 'This is nice'
|
msg = 'This is nice'
|
||||||
}
|
}
|
||||||
|
|
||||||
task 'tasks/shell/bash' {
|
task 'zap://sh' {
|
||||||
script = '''
|
script = '''
|
||||||
ls
|
pwd
|
||||||
touch foo
|
|
||||||
'''
|
'''
|
||||||
|
|
||||||
// Don't run again if the foo file is present
|
|
||||||
provides = 'foo'
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,3 +22,4 @@ serde_derive = "~1.0"
|
||||||
serde_json = "~1.0"
|
serde_json = "~1.0"
|
||||||
serde_yaml = "~0.8"
|
serde_yaml = "~0.8"
|
||||||
ssh2 = "~0.9.0"
|
ssh2 = "~0.9.0"
|
||||||
|
url = "~2.2"
|
||||||
|
|
|
@ -6,7 +6,7 @@ use pest::Parser;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use crate::ExecutableTask;
|
use crate::{ExecutableTask, Task};
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[grammar = "plan.pest"]
|
#[grammar = "plan.pest"]
|
||||||
|
@ -36,10 +36,15 @@ impl Plan {
|
||||||
match pair.as_rule() {
|
match pair.as_rule() {
|
||||||
Rule::string => {
|
Rule::string => {
|
||||||
let name = parse_str(&mut pair.into_inner())?;
|
let name = parse_str(&mut pair.into_inner())?;
|
||||||
// The .ztask extension is to be omitted in task declarations
|
let task = match name.starts_with("zap://") {
|
||||||
let path = PathBuf::from(format!("{}.ztask", name));
|
true => Task::from_url(&name),
|
||||||
|
false => {
|
||||||
|
let path = PathBuf::from(format!("{}.ztask", name));
|
||||||
|
Task::from_path(&path)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
match crate::task::Task::from_path(&path) {
|
match task {
|
||||||
Ok(task) => raw_task = Some(task),
|
Ok(task) => raw_task = Some(task),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
error!("Failed to parse task: {:?}", err);
|
error!("Failed to parse task: {:?}", err);
|
||||||
|
|
|
@ -7,6 +7,7 @@ use std::collections::HashMap;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::Read;
|
use std::io::Read;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
#[grammar = "task.pest"]
|
#[grammar = "task.pest"]
|
||||||
|
@ -180,6 +181,28 @@ impl Task {
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn from_url(url: &str) -> Result<Self, PestError<Rule>> {
|
||||||
|
if let Ok(url) = Url::parse(url) {
|
||||||
|
println!("UR: {:?}", url);
|
||||||
|
if let Some(name) = url.host_str() {
|
||||||
|
// XXX: Temporary hard-coding see #5
|
||||||
|
let mut task = Task::new(name);
|
||||||
|
assert_eq!(name, "sh");
|
||||||
|
// This is a hacky temporary workaround for now too
|
||||||
|
// a real builtin shouldn't need to bother with a handlebars template
|
||||||
|
task.script.inline = Some("#!/bin/sh\n{{script}}".into());
|
||||||
|
return Ok(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(PestError::new_from_pos(
|
||||||
|
ErrorVariant::CustomError {
|
||||||
|
message: "Could not find a valid task definition".to_string(),
|
||||||
|
},
|
||||||
|
pest::Position::from_start(url),
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn from_path(path: &PathBuf) -> Result<Self, PestError<Rule>> {
|
pub fn from_path(path: &PathBuf) -> Result<Self, PestError<Rule>> {
|
||||||
match File::open(path) {
|
match File::open(path) {
|
||||||
Ok(mut file) => {
|
Ok(mut file) => {
|
||||||
|
@ -317,4 +340,10 @@ mod tests {
|
||||||
let script = task.script;
|
let script = task.script;
|
||||||
assert_eq!(script.as_bytes(None).unwrap(), "env".as_bytes());
|
assert_eq!(script.as_bytes(None).unwrap(), "env".as_bytes());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn task_from_url() {
|
||||||
|
let task = Task::from_url("zap://sh").expect("Failed to load task from URL");
|
||||||
|
assert_eq!(task.name, "sh");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
/*
|
|
||||||
* The sh task is a simple passthrough to /bin/sh on the target machine
|
|
||||||
*/
|
|
||||||
|
|
||||||
task Sh {
|
|
||||||
parameters {
|
|
||||||
script {
|
|
||||||
required = true
|
|
||||||
help = 'A script to run via the /bin/sh'
|
|
||||||
type = string
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
script {
|
|
||||||
inline = '''#!/bin/sh
|
|
||||||
{{script}}
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue