Show More
@@ -286,9 +286,9 b' dependencies = [' | |||||
286 |
|
286 | |||
287 | [[package]] |
|
287 | [[package]] | |
288 | name = "format-bytes" |
|
288 | name = "format-bytes" | |
289 |
version = "0.2. |
|
289 | version = "0.2.1" | |
290 | source = "registry+https://github.com/rust-lang/crates.io-index" |
|
290 | source = "registry+https://github.com/rust-lang/crates.io-index" | |
291 | checksum = "cc35f5e45d6b31053cea13078ffc6fa52fa8617aa54b7ac2011720d9c009e04f" |
|
291 | checksum = "8030ff4b04f0ca1c612d6fe49f2fc18caf56fb01497cb370b41cfd36d89b3b06" | |
292 | dependencies = [ |
|
292 | dependencies = [ | |
293 | "format-bytes-macros", |
|
293 | "format-bytes-macros", | |
294 | "proc-macro-hack", |
|
294 | "proc-macro-hack", |
@@ -14,6 +14,7 b' use crate::config::layer::{' | |||||
14 | }; |
|
14 | }; | |
15 | use crate::utils::files::get_bytes_from_os_str; |
|
15 | use crate::utils::files::get_bytes_from_os_str; | |
16 | use format_bytes::{write_bytes, DisplayBytes}; |
|
16 | use format_bytes::{write_bytes, DisplayBytes}; | |
|
17 | use std::collections::HashSet; | |||
17 | use std::env; |
|
18 | use std::env; | |
18 | use std::path::{Path, PathBuf}; |
|
19 | use std::path::{Path, PathBuf}; | |
19 | use std::str; |
|
20 | use std::str; | |
@@ -361,6 +362,14 b' impl Config {' | |||||
361 | None |
|
362 | None | |
362 | } |
|
363 | } | |
363 |
|
364 | |||
|
365 | /// Return all keys defined for the given section | |||
|
366 | pub fn get_section_keys(&self, section: &[u8]) -> HashSet<&[u8]> { | |||
|
367 | self.layers | |||
|
368 | .iter() | |||
|
369 | .flat_map(|layer| layer.iter_keys(section)) | |||
|
370 | .collect() | |||
|
371 | } | |||
|
372 | ||||
364 | /// Get raw values bytes from all layers (even untrusted ones) in order |
|
373 | /// Get raw values bytes from all layers (even untrusted ones) in order | |
365 | /// of precedence. |
|
374 | /// of precedence. | |
366 | #[cfg(test)] |
|
375 | #[cfg(test)] |
@@ -115,6 +115,14 b' impl ConfigLayer {' | |||||
115 | Some(self.sections.get(section)?.get(item)?) |
|
115 | Some(self.sections.get(section)?.get(item)?) | |
116 | } |
|
116 | } | |
117 |
|
117 | |||
|
118 | /// Returns the keys defined in the given section | |||
|
119 | pub fn iter_keys(&self, section: &[u8]) -> impl Iterator<Item = &[u8]> { | |||
|
120 | self.sections | |||
|
121 | .get(section) | |||
|
122 | .into_iter() | |||
|
123 | .flat_map(|section| section.keys().map(|vec| &**vec)) | |||
|
124 | } | |||
|
125 | ||||
118 | pub fn is_empty(&self) -> bool { |
|
126 | pub fn is_empty(&self) -> bool { | |
119 | self.sections.is_empty() |
|
127 | self.sections.is_empty() | |
120 | } |
|
128 | } |
@@ -17,5 +17,5 b' log = "0.4.11"' | |||||
17 | micro-timer = "0.3.1" |
|
17 | micro-timer = "0.3.1" | |
18 | regex = "1.3.9" |
|
18 | regex = "1.3.9" | |
19 | env_logger = "0.7.1" |
|
19 | env_logger = "0.7.1" | |
20 |
format-bytes = "0.2. |
|
20 | format-bytes = "0.2.1" | |
21 | users = "0.11.0" |
|
21 | users = "0.11.0" |
@@ -4,7 +4,7 b' use clap::App;' | |||||
4 | use clap::AppSettings; |
|
4 | use clap::AppSettings; | |
5 | use clap::Arg; |
|
5 | use clap::Arg; | |
6 | use clap::ArgMatches; |
|
6 | use clap::ArgMatches; | |
7 | use format_bytes::format_bytes; |
|
7 | use format_bytes::{format_bytes, join}; | |
8 | use hg::config::Config; |
|
8 | use hg::config::Config; | |
9 | use hg::repo::{Repo, RepoError}; |
|
9 | use hg::repo::{Repo, RepoError}; | |
10 | use hg::utils::files::{get_bytes_from_os_str, get_path_from_bytes}; |
|
10 | use hg::utils::files::{get_bytes_from_os_str, get_path_from_bytes}; | |
@@ -25,6 +25,8 b' fn main_with_result(' | |||||
25 | repo: Result<&Repo, &NoRepoInCwdError>, |
|
25 | repo: Result<&Repo, &NoRepoInCwdError>, | |
26 | config: &Config, |
|
26 | config: &Config, | |
27 | ) -> Result<(), CommandError> { |
|
27 | ) -> Result<(), CommandError> { | |
|
28 | check_extensions(config)?; | |||
|
29 | ||||
28 | let app = App::new("rhg") |
|
30 | let app = App::new("rhg") | |
29 | .global_setting(AppSettings::AllowInvalidUtf8) |
|
31 | .global_setting(AppSettings::AllowInvalidUtf8) | |
30 | .setting(AppSettings::SubcommandRequired) |
|
32 | .setting(AppSettings::SubcommandRequired) | |
@@ -352,3 +354,25 b' impl OnUnsupported {' | |||||
352 | } |
|
354 | } | |
353 | } |
|
355 | } | |
354 | } |
|
356 | } | |
|
357 | ||||
|
358 | const SUPPORTED_EXTENSIONS: &[&[u8]] = &[b"blackbox", b"share"]; | |||
|
359 | ||||
|
360 | fn check_extensions(config: &Config) -> Result<(), CommandError> { | |||
|
361 | let enabled = config.get_section_keys(b"extensions"); | |||
|
362 | ||||
|
363 | let mut unsupported = enabled; | |||
|
364 | for supported in SUPPORTED_EXTENSIONS { | |||
|
365 | unsupported.remove(supported); | |||
|
366 | } | |||
|
367 | ||||
|
368 | if unsupported.is_empty() { | |||
|
369 | Ok(()) | |||
|
370 | } else { | |||
|
371 | Err(CommandError::UnsupportedFeature { | |||
|
372 | message: format_bytes!( | |||
|
373 | b"extensions: {}", | |||
|
374 | join(unsupported, b", ") | |||
|
375 | ), | |||
|
376 | }) | |||
|
377 | } | |||
|
378 | } |
General Comments 0
You need to be logged in to leave comments.
Login now