Merge pull request #1329 from matthiasbeyer/libimagstore/file-parsing-fix
This fixes the file parsing (again)
This commit is contained in:
commit
80cb70d77c
4 changed files with 144 additions and 2 deletions
|
@ -64,6 +64,8 @@ This section contains the changelog from the last release to the next release.
|
|||
* The patch explained by the point above introduced a bug which caused
|
||||
entries to be read as a single line, which was fixed as well.
|
||||
* `imag-diary create --timed` did not work as expected
|
||||
* `libimagstore` got another fix with the file parsing, as the
|
||||
`std::str::Lines` iterator takes empty lines as no lines.
|
||||
|
||||
|
||||
## 0.6.1
|
||||
|
|
|
@ -144,5 +144,28 @@ baz"#, env!("CARGO_PKG_VERSION"))).unwrap();
|
|||
assert_eq!(bah.get_content(), "Hello World\nbaz");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn lazy_file_multiline_trailing_newlines() {
|
||||
let fs = InMemoryFileAbstraction::new();
|
||||
|
||||
let mut path = PathBuf::from("tests");
|
||||
path.set_file_name("test1");
|
||||
let mut lf = InMemoryFileAbstractionInstance::new(fs.backend().clone(), path.clone());
|
||||
|
||||
let loca = StoreId::new_baseless(path).unwrap();
|
||||
let file = Entry::from_str(loca.clone(), &format!(r#"---
|
||||
[imag]
|
||||
version = "{}"
|
||||
---
|
||||
Hello World
|
||||
baz
|
||||
|
||||
"#, env!("CARGO_PKG_VERSION"))).unwrap();
|
||||
|
||||
lf.write_file_content(&file).unwrap();
|
||||
let bah = lf.get_file_content(loca).unwrap();
|
||||
assert_eq!(bah.get_content(), "Hello World\nbaz\n\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1207,6 +1207,14 @@ version = '0.0.3'
|
|||
---
|
||||
Hai";
|
||||
|
||||
static TEST_ENTRY_TNL : &'static str = "---
|
||||
[imag]
|
||||
version = '0.0.3'
|
||||
---
|
||||
Hai
|
||||
|
||||
";
|
||||
|
||||
#[test]
|
||||
fn test_entry_from_str() {
|
||||
use super::Entry;
|
||||
|
@ -1230,6 +1238,17 @@ Hai";
|
|||
assert_eq!(TEST_ENTRY, string);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_entry_to_str_trailing_newline() {
|
||||
use super::Entry;
|
||||
use std::path::PathBuf;
|
||||
println!("{}", TEST_ENTRY_TNL);
|
||||
let entry = Entry::from_str(StoreId::new_baseless(PathBuf::from("test/foo~1.3")).unwrap(),
|
||||
TEST_ENTRY_TNL).unwrap();
|
||||
let string = entry.to_str();
|
||||
|
||||
assert_eq!(TEST_ENTRY_TNL, string);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
|
@ -46,10 +46,10 @@ pub fn entry_buffer_to_header_content(buf: &str) -> Result<(Value, String)> {
|
|||
let mut content = String::new();
|
||||
let mut header_consumed = false;
|
||||
|
||||
let mut iter = buf.lines().skip(1).peekable(); // the first line is "---"
|
||||
let mut iter = buf.split("\n").skip(1).peekable(); // the first line is "---"
|
||||
|
||||
while let Some(line) = iter.next() {
|
||||
if line == "---" {
|
||||
if line == "---" && !header_consumed {
|
||||
header_consumed = true;
|
||||
// do not further process the line
|
||||
} else {
|
||||
|
@ -68,3 +68,101 @@ pub fn entry_buffer_to_header_content(buf: &str) -> Result<(Value, String)> {
|
|||
Ok((Value::parse(&header)?, String::from(content)))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::entry_buffer_to_header_content;
|
||||
|
||||
fn mkfile(content: &str) -> String {
|
||||
format!(r#"---
|
||||
[imag]
|
||||
version = '{version}'
|
||||
---
|
||||
{content}"#, version = env!("CARGO_PKG_VERSION"), content = content)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_entry_buffer_to_header_content_1() {
|
||||
let content = "Hai";
|
||||
let file = format!(r#"---
|
||||
[imag]
|
||||
version = '{version}'
|
||||
---
|
||||
{content}"#, version = env!("CARGO_PKG_VERSION"), content = content);
|
||||
|
||||
let res = entry_buffer_to_header_content(&file);
|
||||
|
||||
assert!(res.is_ok());
|
||||
let (_, res_content) = res.unwrap();
|
||||
assert_eq!(res_content, content)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_entry_buffer_to_header_content_2() {
|
||||
let content = r#"Hai
|
||||
"#;
|
||||
|
||||
let file = mkfile(&content);
|
||||
eprintln!("FILE: <<<{}>>>", file);
|
||||
let res = entry_buffer_to_header_content(&file);
|
||||
|
||||
assert!(res.is_ok());
|
||||
let (_, res_content) = res.unwrap();
|
||||
eprintln!("CONTENT: <<<{}>>>", res_content);
|
||||
assert_eq!(res_content, content)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_entry_buffer_to_header_content_3() {
|
||||
let content = r#"Hai
|
||||
|
||||
barbar
|
||||
|
||||
"#;
|
||||
|
||||
let file = mkfile(&content);
|
||||
let res = entry_buffer_to_header_content(&file);
|
||||
|
||||
assert!(res.is_ok());
|
||||
let (_, res_content) = res.unwrap();
|
||||
assert_eq!(res_content, content)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_entry_buffer_to_header_content_4() {
|
||||
let content = r#"Hai
|
||||
|
||||
---
|
||||
barbar
|
||||
---
|
||||
|
||||
"#;
|
||||
|
||||
let file = mkfile(&content);
|
||||
let res = entry_buffer_to_header_content(&file);
|
||||
|
||||
assert!(res.is_ok());
|
||||
let (_, res_content) = res.unwrap();
|
||||
assert_eq!(res_content, content)
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_entry_buffer_to_header_content_5() {
|
||||
let content = r#"Hai
|
||||
|
||||
---
|
||||
barbar
|
||||
---
|
||||
|
||||
|
||||
"#;
|
||||
|
||||
let file = mkfile(&content);
|
||||
let res = entry_buffer_to_header_content(&file);
|
||||
|
||||
assert!(res.is_ok());
|
||||
let (_, res_content) = res.unwrap();
|
||||
assert_eq!(res_content, content)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue