diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f3767469..fd95d7f8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,7 +32,7 @@ build_meson: script: - mv debian/control-newer debian/control - apt-get -y build-dep . - - meson . _build/ -Ddepdatadir=/usr/share --werror + - meson . _build/ -Ddepdatadir=/usr/share -Dfind_orphans=true --werror - ninja -C _build install except: variables: diff --git a/Cargo.toml.in b/Cargo.toml.in index 5667197a..b69e0df9 100644 --- a/Cargo.toml.in +++ b/Cargo.toml.in @@ -16,6 +16,10 @@ path = "@path@/src/bin/test_layout.rs" name = "test_layout" path = "@path@/examples/test_layout.rs" +[[example]] +name = "find_orphan_layouts" +path = "@path@/examples/find_orphan_layouts.rs" + [features] glib_v0_14 = [] diff --git a/examples/find_orphan_layouts.rs b/examples/find_orphan_layouts.rs new file mode 100644 index 00000000..ba036b22 --- /dev/null +++ b/examples/find_orphan_layouts.rs @@ -0,0 +1,53 @@ +/*! Tests if any layout files are not in use */ + +extern crate rs; + +use rs::resources; +use std::env; +use std::error::Error; +use std::ffi::OsStr; +use std::fs; +use std::path::{Path, PathBuf}; + +enum Orphans { + None, + Present, +} + +fn check(base: &Path, dir: &Path) -> Result> { + let mut orphans = Orphans::None; + for entry in fs::read_dir(dir)? { + let entry = entry?; + let path = entry.path(); + + if entry.file_type()?.is_dir() { + check(base, &path)?; + } else { + if Some(OsStr::new("yaml")) == path.extension() { + let resource_path = path + .strip_prefix(base).unwrap() + .with_extension(""); + let resource_path = resource_path + .to_str().unwrap(); + let resource_path = resource_path + .strip_prefix('/').unwrap_or(resource_path); + if let None = resources::get_keyboard(resource_path) { + println!("Data not registered in the resources file: {:?}", path); + orphans = Orphans::Present; + } + } + } + } + Ok(orphans) +} + +fn main() -> () { + let path = env::args().nth(1).expect("Provide a path"); + let path = PathBuf::from(path); + + match check(&path, &path) { + Err(e) => panic!("{:?}", e), + Ok(Orphans::Present) => panic!("Unregistered files present. Check the tutorial in doc/tutorial.md"), + _ => {}, + } +} diff --git a/meson_options.txt b/meson_options.txt index 294340fd..1de4874d 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,6 +7,10 @@ option('tests', type: 'boolean', value: true, description: 'Whether to compile unit tests') +option('find_orphans', + type: 'boolean', value: false, + description: 'Check if all present layout files are included in resources.') + option('newer', type: 'boolean', value: false, description: 'Build with dependencies newer than those of Byzantium') diff --git a/src/lib.rs b/src/lib.rs index d508d051..f1e70c69 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -39,7 +39,7 @@ mod outputs; mod panel; mod popover; mod receiver; -mod resources; +pub mod resources; mod state; mod style; mod submission; diff --git a/tests/meson.build b/tests/meson.build index ae726442..51da1d7c 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -127,3 +127,14 @@ foreach layout : [ endforeach endif + +if get_option('find_orphans') + test('test_find_orphans', + cargo_script, + args: ['run'] + cargo_build_flags + + ['--example', 'find_orphan_layouts', + '--', meson.source_root() + '/data/keyboards/'], + timeout: timeout, + workdir: meson.build_root(), + ) +endif \ No newline at end of file