CI and docs updates

This commit is contained in:
Matteo Paonessa 2024-12-27 20:02:08 +01:00
parent 963b05f101
commit f79fbdead9
10 changed files with 297 additions and 162 deletions

2
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,2 @@
github: [ Lymphatus ]
#custom: ['https://www.paypal.com/donate/?hosted_button_id=W74TDJHTBKSAY']

View File

@ -1,8 +1,3 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "cargo" # See documentation for possible values

15
.github/workflows/clippy.yml vendored Normal file
View File

@ -0,0 +1,15 @@
name: Clippy check
on:
- push
- pull_request
env:
RUSTFLAGS: "-Dwarnings"
jobs:
clippy_check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Clippy
run: cargo clippy --all-targets --all-features

21
.github/workflows/fmt.yml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Code formatting
on:
- push
- pull_request
jobs:
fmt_check:
name: Fmt
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check code formatting
run: cargo fmt -- --check

View File

@ -1,10 +1,8 @@
name: Test
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
- push
- pull_request
env:
CARGO_TERM_COLOR: always
@ -14,7 +12,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [macos-latest, ubuntu-latest, windows-latest]
os: [ macos-latest, ubuntu-latest, windows-latest ]
steps:
- uses: actions/checkout@v4

View File

@ -1,21 +1,22 @@
## CHANGELOG
* 0.22.0 - Same folder as input, suffix options + lossless flag
* 0.21.0 - Compress by quality and long/short edge resize options
* 0.20.0 - Keep original dates and format conversion
* 0.19.0 - Rust migration
* 0.18.0 - Fixed Windows build + libcaesium 0.9.3
* 0.17.0 - libcaesium 0.9.2
* 0.16.0 - Using libcaesium Rust library
* 0.15.2 - Fixed Windows -RS bug
* 0.15.1 - Fixed rename bug on Windows + "Compressing..." message
* 0.15.0 - Support for libcaesium 0.5.0
* 0.14.0 - Added --quiet option
* 0.13.1 - Bugfix
* 0.13.0 - Bugfix
* 0.12.1 - Bugfix
* 0.12.0 - Resizing (experimental)
* 0.11.0 - Fixing paths issues and dry-run option
* 0.10.2 - Bugfixes & full Windows support
* 0.10.1 - All features are available
* 0.10.0 - Switched to cmake build system and libcaesium
* 0.9.1 - Initial development stage
- 1.0.0-beta.0 - Same folder as input, suffix options + lossless flag + code refactoring
- 0.21.0 - Compress by quality and long/short edge resize options
- 0.20.0 - Keep original dates and format conversion
- 0.19.0 - Rust migration
- 0.18.0 - Fixed Windows build + libcaesium 0.9.3
- 0.17.0 - libcaesium 0.9.2
- 0.16.0 - Using libcaesium Rust library
- 0.15.2 - Fixed Windows -RS bug
- 0.15.1 - Fixed rename bug on Windows + "Compressing..." message
- 0.15.0 - Support for libcaesium 0.5.0
- 0.14.0 - Added --quiet option
- 0.13.1 - Bugfix
- 0.13.0 - Bugfix
- 0.12.1 - Bugfix
- 0.12.0 - Resizing (experimental)
- 0.11.0 - Fixing paths issues and dry-run option
- 0.10.2 - Bugfixes & full Windows support
- 0.10.1 - All features are available
- 0.10.0 - Switched to cmake build system and libcaesium
- 0.9.1 - Initial development stage

149
README.md
View File

@ -1,145 +1,58 @@
## Caesium CommandLineTools
###### caesium-clt - v1.0.0-beta.0
## Caesium Command Line Tools
###### REQUIREMENTS
* [Rust](https://www.rust-lang.org/tools/install)
----------
[![](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86)](https://github.com/sponsors/Lymphatus)
[![Test](https://github.com/Lymphatus/caesium-clt/workflows/Test/badge.svg)](https://github.com/Lymphatus/caesium-clt/actions?query=workflow%3ATest)
[![Clippy](https://github.com/Lymphatus/caesium-clt/actions/workflows/clippy.yaml/badge.svg)](https://github.com/Lymphatus/caesium-clt/actions/workflows/clippy.yaml)
[![Code formatting](https://github.com/Lymphatus/caesium-clt/actions/workflows/fmt.yaml/badge.svg)](https://github.com/Lymphatus/caesium-clt/actions/workflows/fmt.yaml)
v1.0.0-beta.0
### Development
#### Requirements
* [Rust](https://www.rust-lang.org/tools/install) >= 1.79.0
#### Build
###### COMPILATION
`cargo build --release`
----------
### Usage
###### USAGE
See full usage docs [here](docs/USAGE.md).
```
Usage: caesiumclt [OPTIONS] <--quality <QUALITY>|--lossless|--max-size <MAX_SIZE>> <--output <OUTPUT>|--same-folder-as-input> [FILES]...
Arguments:
[FILES]...
Options:
-q, --quality <QUALITY>
sets output file quality between [0-100]
--lossless
perform lossless compression
--max-size <MAX_SIZE>
set the expected maximum output size in bytes
--width <WIDTH>
width of the output image, if height is not set will preserve aspect ratio
--height <HEIGHT>
height of the output image, if width is not set will preserve aspect ratio
--long-edge <LONG_EDGE>
sets the size of the longest edge of the image
--short-edge <SHORT_EDGE>
sets the size of the shortest edge of the image
-o, --output <OUTPUT>
output folder
--same-folder-as-input
sets the output folder to be the same as the input folder, overwrites original files
--format <FORMAT>
convert to the selected output format, or keep the original
[default: original]
[possible values: jpeg, png, webp, tiff, original]
--png-opt-level <PNG_OPT_LEVEL>
select level for PNG optimization, between [0-6]
[default: 3]
--zopfli
use zopfli when optimizing PNG files (it may take a very long time to complete)
-e, --exif
keeps EXIF info during compression
--keep-dates
keep original file date information
--suffix <SUFFIX>
add a suffix to the output filename
-R, --recursive
if input is a folder, scan subfolders too
-S, --keep-structure
keep the folder structure, can be used only with -R
-d, --dry-run
do not write output files
--threads <THREADS>
specify the number of parallel jobs (max is the number of processors available)
[default: 1]
-O, --overwrite <OVERWRITE>
overwrite policy
[default: all]
Possible values:
- all: Always overwrite
- never: Never overwrite
- bigger: Overwrite only if the file to be overwritten is bigger
-Q, --quiet
suppress all output
--verbose <VERBOSE>
select how much output you want to see
[default: progress]
Possible values:
- quiet: Suppress all output
- progress: Show only progress and final results
- warnings-and-errors: Show also skipped and error messages
- all: Print all
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
```
----------
###### EX AMPLES
#### Examples
Losslessly compress ```image1.jpg```, located in the ```home``` directory, into a folder called ```output```
```
$ caesiumclt -q 0 -o ~/output/ ~/image.jpg
```
Compress ```image1.jpg```, located in the ```home``` directory, into a folder called ```output``` with lossy compression and quality set to 80
Compress ```image1.jpg```, located in the ```home``` directory, into a folder called ```output``` with lossy compression
and quality set to 80
```
$ caesiumclt -q 80 -o ~/output/ ~/image.jpg
```
Losslessly compress ```image1.jpg```, located in the ```home``` directory, into a folder called ```output``` and keeps EXIF metadata
Losslessly compress ```image1.jpg```, located in the ```home``` directory, into a folder called ```output``` and keeps
EXIF metadata
```
$ caesiumclt -q 0 -e -o ~/output/ ~/image.jpg
```
Losslessly compress ```Pictures``` folder and subfolders, located in the ```home``` directory, into a folder called ```output```
Losslessly compress ```Pictures``` folder and subfolders, located in the ```home``` directory, into a folder called
```output```
```
$ caesiumclt -q 0 -R -o ~/output/ ~/Pictures
```
Losslessly compress ```Pictures``` folder and subfolders, located in the ```home``` directory, into a folder called ```output``` retaining the input folder structure
Losslessly compress ```Pictures``` folder and subfolders, located in the ```home``` directory, into a folder called
```output``` retaining the input folder structure
```
$ caesiumclt -q 0 -RS -o ~/output/ ~/Pictures
```

195
docs/USAGE.md Normal file
View File

@ -0,0 +1,195 @@
## CaesiumCLT Usage
### Options
##### Compression (at least one is required)
- -q, --quality <QUALITY>
Sets compression quality between 0 and 100. Higher the value, better the quality and bigger the file size.
- --lossless
Perform lossless compression. Some file formats may not support this or result in bigger file sizes.
- --max-size <MAX_SIZE>
Attempts to compress the image to the nearest size in bytes without exceeding it. If the requested size is too small,
it will output the smallest possible result.
##### Advanced compression
- --png-opt-level <PNG_OPT_LEVEL>
Sets the optimization level for PNG files. Higher values result in better compression but take longer to complete.
Possible values are between 0 and 6. Default is 3.
- --zopfli
Use zopfli when optimizing PNG files. It may take a very long time to complete, especially if the application is not
build in release mode.
##### Metadata
- -e, --exif
Keeps EXIF metadata info during compression, if present. This can slightly increase the output file size.
- --keep-dates
Keeps the original last modified and last accessed date information, if possible.
##### Resizing
- --width <WIDTH>
Sets the width of the output image. If height is not set, it will preserve the aspect ratio. Can't be used with
`--long-edge` or `--short-edge`.
- --height <HEIGHT>
Sets the height of the output image. If width is not set, it will preserve the aspect ratio. Can't be used with
`--long-edge` or `--short-edge`.
- --long-edge <LONG_EDGE>
Sets the size of the longest edge of the image. It is aware of rotation metadata. Can't be used with `--width` or
`--height` or `--short-edge`.
- --short-edge <SHORT_EDGE>
Sets the size of the shortest edge of the image. It is aware of rotation metadata. Can't be used with `--width` or
`--height` or `--long-edge`.
##### Destination
- -o, --output <OUTPUT>
Sets the output folder. If the folder does not exist, it will be created. Can't be used with `--same-folder-as-input`.
- --same-folder-as-input
Sets the output folder to be the same as the input folder. WARNING: this can potentially overwrite the original files
if a suffix is not set. Overwritten files CANNOT be recovered.
- --suffix <SUFFIX>
Adds a suffix to the output filename, before the file extension.
- -S, --keep-structure
Preserves the folder tree structure of the input files. Can be used only with `-R`.
- -o, --overwrite <OVERWRITE>
Sets the overwrite policy if the output file already exists. Possible values are:
- `all`: Always overwrite
- `never`: Never overwrite
- `bigger`: Overwrite only if the file to be overwritten is bigger
- --format <FORMAT>
Converts the original image to the selected format. Possible values are:
- `jpeg`
- `png`
- `webp`
- `tiff`
- `original` (default, no changes)
##### Other
- -R, --recursive
If the input is a folder, scan its subfolders too.
- -d, --dry-run
Do not write output files, only simulate the process.
- --threads <THREADS>
Specify the number of parallel jobs. The maximum is the number of processors available. `0` means that the application
will try to guess the maximum number of parallel jobs available. Default is `0`.
- -Q, --quiet
Suppress all output. Overrides `--verbose`.
- --verbose <VERBOSE>
Select how much output you want to see. Possible values are:
- `quiet`: Suppress all output
- `progress`: Show only progress and final results
- `warnings-and-errors`: Show also skipped and error messages
- `all`: Print all
- -h, --help
Print help. A summary can be seen with `-h`.
- -V, --version
Print version.
### Full help
```
Usage: caesiumclt [OPTIONS] <--quality <QUALITY>|--lossless|--max-size <MAX_SIZE>> <--output <OUTPUT>|--same-folder-as-input> [FILES]...
Arguments:
[FILES]...
Options:
-q, --quality <QUALITY>
sets output file quality between [0-100]
--lossless
perform lossless compression
--max-size <MAX_SIZE>
set the expected maximum output size in bytes
--width <WIDTH>
width of the output image, if height is not set will preserve aspect ratio
--height <HEIGHT>
height of the output image, if width is not set will preserve aspect ratio
--long-edge <LONG_EDGE>
sets the size of the longest edge of the image
--short-edge <SHORT_EDGE>
sets the size of the shortest edge of the image
-o, --output <OUTPUT>
output folder
--same-folder-as-input
sets the output folder to be the same as the input folder, overwrites original files
--format <FORMAT>
convert to the selected output format, or keep the original
[default: original]
[possible values: jpeg, png, webp, tiff, original]
--png-opt-level <PNG_OPT_LEVEL>
select level for PNG optimization, between [0-6]
[default: 3]
--zopfli
use zopfli when optimizing PNG files (it may take a very long time to complete)
-e, --exif
keeps EXIF info during compression
--keep-dates
keep original file date information
--suffix <SUFFIX>
add a suffix to the output filename
-R, --recursive
if input is a folder, scan subfolders too
-S, --keep-structure
keep the folder structure, can be used only with -R
-d, --dry-run
do not write output files
--threads <THREADS>
specify the number of parallel jobs (max is the number of processors available)
[default: 0]
-O, --overwrite <OVERWRITE>
overwrite policy
[default: all]
Possible values:
- all: Always overwrite
- never: Never overwrite
- bigger: Overwrite only if the file to be overwritten is bigger
-Q, --quiet
suppress all output
--verbose <VERBOSE>
select how much output you want to see
[default: progress]
Possible values:
- quiet: Suppress all output
- progress: Show only progress and final results
- warnings-and-errors: Show also skipped and error messages
- all: Print all
-h, --help
Print help (see a summary with '-h')
-V, --version
Print version
```

View File

@ -1,6 +1 @@
comment_width = 120
format_code_in_doc_comments = true
imports_granularity = "Crate"
imports_layout = "Vertical"
wrap_comments = true
max_width = 120

View File

@ -1,5 +1,5 @@
use std::path::PathBuf;
use clap::{Args, Parser, ValueEnum};
use std::path::PathBuf;
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
pub enum OverwritePolicy {
@ -8,7 +8,7 @@ pub enum OverwritePolicy {
/// Never overwrite
Never,
/// Overwrite only if the file to be overwritten is bigger
Bigger
Bigger,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
@ -29,7 +29,7 @@ pub enum VerboseLevel {
/// Show also skipped and error messages
WarningsAndErrors = 2,
/// Print all
All = 3
All = 3,
}
#[derive(Parser, Debug)]
@ -81,7 +81,7 @@ pub struct CommandLineArgs {
pub dry_run: bool,
/// specify the number of parallel jobs (max is the number of processors available)
#[arg(long, default_value = "1")]
#[arg(long, default_value = "0")]
pub threads: u32,
/// overwrite policy