From b7c3d7199d493fe2510a298118031b2ac89a21ad Mon Sep 17 00:00:00 2001 From: Robert Masen Date: Thu, 1 Nov 2018 17:20:35 -0500 Subject: [PATCH] add --watch-only flag --- src/cli.rs | 4 ++ src/cmd/serve.rs | 142 ++++++++++++++++++++++++++--------------------- src/main.rs | 5 +- 3 files changed, 86 insertions(+), 65 deletions(-) diff --git a/src/cli.rs b/src/cli.rs index fcf7271..ca40aaa 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -62,6 +62,10 @@ pub fn build_cli() -> App<'static, 'static> { .default_value("127.0.0.1") .takes_value(true) .help("Changes the base_url"), + Arg::with_name("watch_only") + .long("watch-only") + .takes_value(false) + .help("Do not start a server, just re-build project on changes") ]), ]) } diff --git a/src/cmd/serve.rs b/src/cmd/serve.rs index 9107109..e4794c7 100644 --- a/src/cmd/serve.rs +++ b/src/cmd/serve.rs @@ -166,6 +166,7 @@ pub fn serve( output_dir: &str, base_url: &str, config_file: &str, + watch_only: bool, ) -> Result<()> { let start = Instant::now(); let (mut site, address) = create_new_site(interface, port, output_dir, base_url, config_file)?; @@ -206,49 +207,56 @@ pub fn serve( // output path is going to need to be moved later on, so clone it for the // http closure to avoid contention. let static_root = output_path.clone(); - thread::spawn(move || { - let s = server::new(move || { - App::new() - .middleware(NotFoundHandler { rendered_template: static_root.join("404.html") }) - .resource(r"/livereload.js", |r| r.f(livereload_handler)) - // Start a webserver that serves the `output_dir` directory - .handler( - r"/", - fs::StaticFiles::new(&static_root) - .unwrap() - .show_files_listing() - .files_listing_renderer(handle_directory), - ) - }) - .bind(&address) - .expect("Can't start the webserver") - .shutdown_timeout(20); - println!("Web server is available at http://{}", &address); - s.run(); - }); - - // The websocket for livereload - let ws_server = WebSocket::new(|output: Sender| { - move |msg: Message| { - if msg.into_text().unwrap().contains("\"hello\"") { - return output.send(Message::text( - r#" - { - "command": "hello", - "protocols": [ "http://livereload.com/protocols/official-7" ], - "serverName": "Zola" - } - "#, - )); + let broadcaster = if !watch_only { + + thread::spawn(move || { + let s = server::new(move || { + App::new() + .middleware(NotFoundHandler { rendered_template: static_root.join("404.html") }) + .resource(r"/livereload.js", |r| r.f(livereload_handler)) + // Start a webserver that serves the `output_dir` directory + .handler( + r"/", + fs::StaticFiles::new(&static_root) + .unwrap() + .show_files_listing() + .files_listing_renderer(handle_directory), + ) + }) + .bind(&address) + .expect("Can't start the webserver") + .shutdown_timeout(20); + println!("Web server is available at http://{}", &address); + s.run(); + }); + // The websocket for livereload + let ws_server = WebSocket::new(|output: Sender| { + move |msg: Message| { + if msg.into_text().unwrap().contains("\"hello\"") { + return output.send(Message::text( + r#" + { + "command": "hello", + "protocols": [ "http://livereload.com/protocols/official-7" ], + "serverName": "Zola" + } + "#, + )); + } + Ok(()) } - Ok(()) - } - }) - .unwrap(); - let broadcaster = ws_server.broadcaster(); - thread::spawn(move || { - ws_server.listen(&*ws_address).unwrap(); - }); + }) + .unwrap(); + let broadcaster = ws_server.broadcaster(); + thread::spawn(move || { + ws_server.listen(&*ws_address).unwrap(); + }); + Some(broadcaster) + } else { + println!("Watching in watch only mode, no web server will be started"); + None + }; + let pwd = env::current_dir().unwrap(); @@ -297,21 +305,25 @@ pub fn serve( match detect_change_kind(&pwd, &path) { (ChangeKind::Content, _) => { console::info(&format!("-> Content changed {}", path.display())); - // Force refresh - rebuild_done_handling( - &broadcaster, - rebuild::after_content_change(&mut site, &path), - "/x.js", - ); + if let Some(ref broadcaster) = broadcaster { + // Force refresh + rebuild_done_handling( + broadcaster, + rebuild::after_content_change(&mut site, &path), + "/x.js", + ); + } } (ChangeKind::Templates, _) => { console::info(&format!("-> Template changed {}", path.display())); - // Force refresh - rebuild_done_handling( - &broadcaster, - rebuild::after_template_change(&mut site, &path), - "/x.js", - ); + if let Some(ref broadcaster) = broadcaster { + // Force refresh + rebuild_done_handling( + broadcaster, + rebuild::after_template_change(&mut site, &path), + "/x.js", + ); + } } (ChangeKind::StaticFiles, p) => { if path.is_file() { @@ -319,21 +331,25 @@ pub fn serve( "-> Static file changes detected {}", path.display() )); + if let Some(ref broadcaster) = broadcaster { + rebuild_done_handling( + broadcaster, + copy_file(&path, &site.output_path, &site.static_path), + &p.to_string_lossy(), + ); + } + } + } + (ChangeKind::Sass, p) => { + console::info(&format!("-> Sass file changed {}", path.display())); + if let Some(ref broadcaster) = broadcaster { rebuild_done_handling( &broadcaster, - copy_file(&path, &site.output_path, &site.static_path), + site.compile_sass(&site.base_path), &p.to_string_lossy(), ); } } - (ChangeKind::Sass, p) => { - console::info(&format!("-> Sass file changed {}", path.display())); - rebuild_done_handling( - &broadcaster, - site.compile_sass(&site.base_path), - &p.to_string_lossy(), - ); - } (ChangeKind::Config, _) => { console::info("-> Config changed. The whole site will be reloaded. The browser needs to be refreshed to make the changes visible."); site = create_new_site( diff --git a/src/main.rs b/src/main.rs index b9ae55b..4a2593a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,11 +77,12 @@ fn main() { ::std::process::exit(1); } } - + let watch_only = matches.is_present("watch_only"); let output_dir = matches.value_of("output_dir").unwrap(); let base_url = matches.value_of("base_url").unwrap(); + println!("watch_only: {}", watch_only); console::info("Building site..."); - match cmd::serve(interface, port, output_dir, base_url, config_file) { + match cmd::serve(interface, port, output_dir, base_url, config_file, watch_only) { Ok(()) => (), Err(e) => { console::unravel_errors("", &e);