diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..ab8615fc --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,67 @@ +name: deploy + +on: + push: + tags: + - 'v*.*.*' + +jobs: + create-binaries: + runs-on: windows-latest + steps: + - uses: actions/checkout@v1 + - name: Install Rust + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable-x86_64-pc-windows-gnu + override: true + - name: Build oxipng + run: | + cargo build --release + - name: Create zip + run: | + $OXIPNG_PATH="$Env:GITHUB_WORKSPACE\target\release" + 7z a oxipng.zip "Cargo.lock" "$OXIPNG_PATH\oxipng.exe" "C:\usr\local" + - name: Upload binaries + uses: actions/upload-artifact@v1 + with: + name: oxipng-binaries + path: oxipng.zip + + deploy: + needs: create-binaries + env: + FILENAME: oxipng-windows-sdk + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Download the zip + uses: actions/download-artifact@v1 + with: + name: oxipng-binaries + - name: Unzip oxipng Windows binaries + run: | + unzip oxipng-binaries/oxipng.zip -d oxipng-binaries + mv oxipng-binaries/Cargo.lock . + - name: Handle binaries + run: | + mv oxipng-binaries/local oxipng-binaries/$FILENAME + strip oxipng-binaries/oxipng.exe + - name: Package release binaries + id: data + run: | + VERSION=$(cargo pkgid | cut -d# -f2 | cut -d: -f2) + echo "::set-output name=version::$VERSION" + cd oxipng-binaries + zip -r oxipng-$VERSION-windows.zip $FILENAME + - name: Create a release + uses: softprops/action-gh-release@v1 + with: + name: v${{ steps.data.outputs.version }} + files: | + Cargo.lock + oxipng-binaries/oxipng-${{ steps.data.outputs.version }}-windows.zip + oxipng-binaries/oxipng.exe + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/oxipng.yml b/.github/workflows/oxipng.yml new file mode 100644 index 00000000..57e26d1d --- /dev/null +++ b/.github/workflows/oxipng.yml @@ -0,0 +1,121 @@ +name: oxipng + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + build-test-unix: + runs-on: ubuntu-latest + strategy: + matrix: + conf: + - minimum-stable + - latest-stable + - latest-beta + - latest-nightly + include: + - conf: minimum-stable + toolchain: 1.41.0 + - conf: latest-stable + toolchain: stable + - conf: latest-beta + toolchain: beta + - conf: latest-nightly + toolchain: nightly + steps: + - uses: actions/checkout@v1 + - name: Install ${{ matrix.toolchain }} + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: ${{ matrix.toolchain }} + override: true + components: clippy, rustfmt + - name: Cache cargo registry + uses: actions/cache@v1 + with: + path: ~/.cargo/registry/cache + key: ${{ runner.os }}-${{ matrix.conf }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-${{ matrix.conf }}-cargo-registry- + - name: Run rustfmt + if: matrix.toolchain == 'stable' + uses: actions-rs/cargo@v1 + with: + command: fmt + args: -- --check + - name: Run clippy + if: matrix.toolchain == 'stable' + uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: -- -D warnings + - name: Run tests + run: cargo test + - name: Build benchmarks + if: matrix.toolchain == 'nightly' + run: cargo bench --no-run + - name: Build docs + run: cargo doc --no-deps + - name: Check no default features + if: matrix.toolchain == 'stable' + uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --no-default-features -- -D warnings + + build-test-windows: + runs-on: windows-latest + strategy: + matrix: + conf: + - minimum-stable + - latest-stable + include: + - conf: minimum-stable + toolchain: 1.41.0 + - conf: latest-stable + toolchain: stable + steps: + - uses: actions/checkout@v1 + - name: Install ${{ matrix.toolchain }} + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: ${{ matrix.toolchain }} + override: true + components: clippy, rustfmt + - name: Cache cargo registry + uses: actions/cache@v1 + with: + path: ~/.cargo/registry/cache + key: ${{ runner.os }}-${{ matrix.conf }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-${{ matrix.conf }}-cargo-registry- + - name: Run rustfmt + if: matrix.toolchain == 'stable' + uses: actions-rs/cargo@v1 + with: + command: fmt + args: -- --check + - name: Run clippy + if: matrix.toolchain == 'stable' + uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: -- -D warnings + - name: Run tests + run: cargo test + - name: Build docs + run: cargo doc --no-deps + - name: Check no default features + if: matrix.toolchain == 'stable' + uses: actions-rs/clippy-check@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + args: --no-default-features -- -D warnings diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6e4b97f7..00000000 --- a/.travis.yml +++ /dev/null @@ -1,49 +0,0 @@ -language: rust - -env: - global: - - PROJECT_NAME=oxipng - -matrix: - include: - - os: osx - rust: stable - env: TARGET=x86_64-apple-darwin - cache: cargo - - os: linux - rust: 1.41.0 - env: TARGET=x86_64-unknown-linux-gnu - cache: cargo - - os: linux - rust: stable - env: TARGET=x86_64-unknown-linux-gnu - cache: cargo - - os: linux - rust: beta - env: TARGET=x86_64-unknown-linux-gnu - cache: cargo - - os: linux - rust: nightly - env: TARGET=x86_64-unknown-linux-gnu - cache: cargo - allow_failures: - - rust: beta - - rust: nightly - -deploy: - provider: releases - api_key: - secure: FarU1VnPW15WXkNP76rQH0VdB+dnp6Op7t2/bl5oCjn7OQ8R3vB32vxCP7DXtBvtE2U9z3CeRmE4pKIRN1rObb/GUyNKxPH0UJiTtDgGtxtTYZHdBjED2nEqdcA2+G1ElCub5O3NhtzsRLM1KPPukJcts6gCFgK/tgcDyKLMX/iGsXOuxOwqu6algZOTcHIaT4M8/TjH7g/hzOz8UKoaqZgSLuKLJ+J30LCJKK4umW57Nev66ATavBWQ3MIFCTyBc9YSsMSQcsjtlA7jcHNhelsCxQHzbxXWQK1jF439QXyNHog3tS41qmfMal+TUhW/NiSkqwJ1//PowD+oYI7si/biBawf6PU2oz5AfWknzPr4k6lAX2WYDcRLIkwEwKi5fHrvMYL0TuNWGb8gF+7DD+7DRaZrRLAbrA6SOFGydSPNzO7HvEYJjs39/2LfqXOQ0aie4ez5fGzsE655D+U1ulmVOx3Y6C1rxKi/oBVJZNuvdMPqtRpgbFYtAsk//wM+nt+YH8TndFR+x6AjZ9OTSDbbJwMLm1SckDLAE/sAC/vU+A6io82uMuDvKmPrtiOKsZp4kmwo5N1CWvIBtvd8evIMPAOFW51AncxnCvCiqYGtfB/BkKAr7mcxiwuWVwXMkOpSr7JzfQd8C5gOEMVczA9qnB6fRCY+dpxGjY0LSY0= - file_glob: true - file: ${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}.* - # don't delete the artifacts from previous phases - skip_cleanup: true - # deploy when a new tag is pushed - on: - # channel to use to produce the release artifacts - condition: $TRAVIS_RUST_VERSION = stable - tags: true - -notifications: - email: - on_success: never diff --git a/Cargo.lock b/Cargo.lock index b97d72f4..b590c228 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,7 +319,6 @@ dependencies = [ "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "rgb 0.8.16 (registry+https://github.com/rust-lang/crates.io-index)", - "vec_map 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "wild 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "zopfli 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index f1b37073..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,64 +0,0 @@ -environment: - global: - # This will be used as part of the zipfile name - PROJECT_NAME: oxipng - matrix: - # Stable channel - - TARGET: i686-pc-windows-msvc - CHANNEL: stable - - TARGET: x86_64-pc-windows-msvc - CHANNEL: stable - - TARGET: x86_64-pc-windows-msvc - CHANNEL: nightly - -# Install Rust and Cargo -# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml) -install: - - curl -sSf -o rustup-init.exe https://win.rustup.rs - - rustup-init.exe --default-host %TARGET% --default-toolchain %CHANNEL% -y - - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin - - rustc -Vv - - cargo -V - -# 'cargo test' takes care of building for us, so disable Appveyor's build stage. This prevents -# the "directory does not contain a project or solution file" error. -# source: https://github.com/starkat99/appveyor-rust/blob/master/appveyor.yml#L113 -build: false - -# Equivalent to Travis' `script` phase -test_script: - - cargo build - - cargo test %TESTFLAGS% - -before_deploy: - # Generate artifacts for release - - SET RUSTFLAGS=-C target-feature=+crt-static - - cargo build --release - - mkdir staging - - copy target\release\oxipng.exe staging - - cd staging - # release zipfile will look like 'rust-everywhere-v1.2.3-x86_64-pc-windows-msvc' - - 7z a ../%PROJECT_NAME%-%APPVEYOR_REPO_TAG_NAME%-%TARGET%.zip * - - appveyor PushArtifact ../%PROJECT_NAME%-%APPVEYOR_REPO_TAG_NAME%-%TARGET%.zip - -deploy: - description: 'Windows release' - # All the zipped artifacts will be deployed - artifact: /.*\.zip/ - # - Go to 'https://github.com/settings/tokens/new' and generate a Token with only the - # `public_repo` scope enabled - # - Then go to 'https://ci.appveyor.com/tools/encrypt' and enter the newly generated token. - # - Enter the "encrypted value" below - auth_token: - secure: JT77kw2p+U5Z9yM/77QjEWRFgvyaGOO2SquE5OBgUNpqSt4VDg/Mdicy8pkSvSEu - provider: GitHub - # deploy when a new tag is pushed and only on the stable channel - on: - # channel to use to produce the release artifacts - # NOTE make sure you only release *once* per target - CHANNEL: stable - appveyor_repo_tag: true - -branches: - only: - - master diff --git a/rustfmt.toml b/rustfmt.toml deleted file mode 100644 index 828232f4..00000000 --- a/rustfmt.toml +++ /dev/null @@ -1 +0,0 @@ -format_strings = false diff --git a/src/deflate/deflater.rs b/src/deflate/deflater.rs index 19f93db8..ce502cb1 100644 --- a/src/deflate/deflater.rs +++ b/src/deflate/deflater.rs @@ -1,5 +1,5 @@ -use crate::{PngError, PngResult}; use crate::atomicmin::AtomicMin; +use crate::{PngError, PngResult}; use libdeflater::{CompressionError, CompressionLvl, Compressor}; pub fn deflate(data: &[u8], max_size: &AtomicMin) -> PngResult> { diff --git a/src/headers.rs b/src/headers.rs index fcf92ae5..0695bd0e 100644 --- a/src/headers.rs +++ b/src/headers.rs @@ -1,9 +1,9 @@ -use indexmap::IndexSet; use crate::colors::{BitDepth, ColorType}; use crate::error::PngError; use crate::PngResult; use byteorder::{BigEndian, ReadBytesExt}; use crc::crc32; +use indexmap::IndexSet; use std::io::Cursor; #[derive(Debug, Clone, Copy)] diff --git a/src/lib.rs b/src/lib.rs index a22b1c38..fc6165b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -28,7 +28,7 @@ use crate::png::PngImage; use crate::reduction::*; use crc::crc32; use image::{DynamicImage, GenericImageView, ImageFormat, Pixel}; -use indexmap::{IndexSet, IndexMap}; +use indexmap::{IndexMap, IndexSet}; use rayon::prelude::*; use std::fmt; use std::fs::{copy, File}; @@ -583,8 +583,7 @@ fn optimize_png( eprintln!("Trying: {} combinations", results.len()); } - let filters: IndexMap> = - filter + let filters: IndexMap> = filter .par_iter() .with_max_len(1) .map(|f| { @@ -866,12 +865,9 @@ fn perform_strip(png: &mut PngData, opts: &Options) { match opts.strip { // Strip headers Headers::None => (), - Headers::Keep(ref hdrs) => { - raw.aux_headers.retain(|hdr, _| { - std::str::from_utf8(hdr) - .map_or(false, |name| hdrs.contains(name)) - }) - } + Headers::Keep(ref hdrs) => raw + .aux_headers + .retain(|hdr, _| std::str::from_utf8(hdr).map_or(false, |name| hdrs.contains(name))), Headers::Strip(ref hdrs) => { for hdr in hdrs { raw.aux_headers.remove(hdr.as_bytes()); diff --git a/src/reduction/alpha.rs b/src/reduction/alpha.rs index 71d23a08..8412aba1 100644 --- a/src/reduction/alpha.rs +++ b/src/reduction/alpha.rs @@ -1,4 +1,3 @@ -use indexmap::IndexSet; use crate::colors::AlphaOptim; use crate::colors::ColorType; use crate::evaluate::Evaluator; @@ -7,6 +6,7 @@ use crate::png::scan_lines::ScanLine; use crate::png::PngImage; #[cfg(not(feature = "parallel"))] use crate::rayon::prelude::*; +use indexmap::IndexSet; #[cfg(feature = "parallel")] use rayon::prelude::*; use std::sync::Arc; diff --git a/src/reduction/mod.rs b/src/reduction/mod.rs index b486d8fc..1b9f7fc7 100644 --- a/src/reduction/mod.rs +++ b/src/reduction/mod.rs @@ -1,7 +1,7 @@ use crate::colors::{BitDepth, ColorType}; use crate::headers::IhdrData; use crate::png::PngImage; -use indexmap::map::{IndexMap, Entry::*}; +use indexmap::map::{Entry::*, IndexMap}; use rgb::RGBA8; use std::borrow::Cow; diff --git a/tests/flags.rs b/tests/flags.rs index 928420a8..42954193 100644 --- a/tests/flags.rs +++ b/tests/flags.rs @@ -437,7 +437,6 @@ fn zopfli_mode() { ); } - #[test] fn libdeflater_mode() { let input = PathBuf::from("tests/files/zopfli_mode.png");