Partially implement --preserve
Needs better implementation once stable Rust improves, or perhaps see if there's a crate for this Reference #4 but keep open
This commit is contained in:
parent
73d477924e
commit
08eb44ec1a
4 changed files with 65 additions and 1 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
**Version 0.5.1 (unreleased)**
|
**Version 0.6.0 (unreleased)**
|
||||||
- Fix issue where output directory would not be created if it did not exist
|
- Fix issue where output directory would not be created if it did not exist
|
||||||
- Use miniz for compression strategies where it outperforms zlib
|
- Use miniz for compression strategies where it outperforms zlib
|
||||||
|
- [SEMVER_MINOR] Partially implement -p / --preserve, as far as stable Rust will allow for now
|
||||||
|
|
||||||
**Version 0.5.0**
|
**Version 0.5.0**
|
||||||
- [SEMVER_MINOR] Palette entries can now reduced, on by default ([#11](https://github.com/shssoichiro/oxipng/issues/11))
|
- [SEMVER_MINOR] Palette entries can now reduced, on by default ([#11](https://github.com/shssoichiro/oxipng/issues/11))
|
||||||
|
|
|
||||||
45
src/lib.rs
45
src/lib.rs
|
|
@ -275,6 +275,51 @@ pub fn optimize(filepath: &Path, opts: &Options) -> Result<(), String> {
|
||||||
return Err(format!("Unable to write to file {}", opts.out_file.display()))
|
return Err(format!("Unable to write to file {}", opts.out_file.display()))
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if opts.preserve_attrs {
|
||||||
|
match File::open(filepath) {
|
||||||
|
Ok(f) => {
|
||||||
|
match f.metadata() {
|
||||||
|
Ok(metadata) => {
|
||||||
|
// TODO: Implement full permission changing on Unix
|
||||||
|
// Not available in stable, requires block cfg statements
|
||||||
|
// See https://github.com/rust-lang/rust/issues/15701
|
||||||
|
{
|
||||||
|
match out_file.metadata() {
|
||||||
|
Ok(out_meta) => {
|
||||||
|
let readonly = metadata.permissions()
|
||||||
|
.readonly();
|
||||||
|
out_meta.permissions()
|
||||||
|
.set_readonly(readonly);
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
if opts.verbosity.is_some() {
|
||||||
|
writeln!(&mut stderr(),
|
||||||
|
"Failed to set permissions on output file")
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
if opts.verbosity.is_some() {
|
||||||
|
writeln!(&mut stderr(),
|
||||||
|
"Failed to read permissions on input file")
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
if opts.verbosity.is_some() {
|
||||||
|
writeln!(&mut stderr(), "Failed to read permissions on input file")
|
||||||
|
.ok();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
let mut buffer = BufWriter::new(out_file);
|
let mut buffer = BufWriter::new(out_file);
|
||||||
match buffer.write_all(&output_data) {
|
match buffer.write_all(&output_data) {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
|
|
|
||||||
BIN
tests/files/preserve_attrs.png
Normal file
BIN
tests/files/preserve_attrs.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 112 KiB |
|
|
@ -463,3 +463,21 @@ fn interlaced_0_to_1_other_filter_mode() {
|
||||||
|
|
||||||
remove_file(output).ok();
|
remove_file(output).ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn preserve_attrs() {
|
||||||
|
let input = PathBuf::from("tests/files/preserve_attrs.png");
|
||||||
|
let mut opts = get_opts(&input);
|
||||||
|
opts.preserve_attrs = true;
|
||||||
|
let output = opts.out_file.clone();
|
||||||
|
|
||||||
|
test_it_converts(&input,
|
||||||
|
&output,
|
||||||
|
&opts,
|
||||||
|
png::ColorType::RGB,
|
||||||
|
png::BitDepth::Eight,
|
||||||
|
png::ColorType::RGB,
|
||||||
|
png::BitDepth::Eight);
|
||||||
|
|
||||||
|
// TODO: Actually check permissions
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue