Compare commits
81 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| adb5dac1d2 | |||
| 2a58835f92 | |||
| 5f8d6b8e0e | |||
| 3663bffe5c | |||
| 72464fb428 | |||
| 23049b638c | |||
| f3c05dae62 | |||
| e6bdeb7c4b | |||
| 458baf5f78 | |||
| 597778fd2f | |||
| e53574970c | |||
| 9ede06e7a3 | |||
| a9441a8804 | |||
| 6c8944315a | |||
| 3bd2305115 | |||
| 7f296b2ef2 | |||
| c66ef5f85d | |||
| df6f398efc | |||
| c484ca6afe | |||
| f0846ff546 | |||
| c0469c69c1 | |||
| 865f372d5a | |||
| 52d860d402 | |||
| 866465c603 | |||
| dd6d39135e | |||
| 028c4fdbc6 | |||
| b4882533f8 | |||
| fc9e69d811 | |||
| 006b44f580 | |||
| a0e3fe8c94 | |||
| e54fffccdf | |||
| b36e12b654 | |||
| b5eecbf2e7 | |||
| 309e1200d0 | |||
| 12c80f9981 | |||
| d4a1bd6de7 | |||
| d46af6fe5b | |||
| ddbec3f204 | |||
| 83cad55b22 | |||
| bf7603d439 | |||
| 8ab690001d | |||
| 935d331e97 | |||
| 28fb50438e | |||
| a6c84daa1a | |||
| fb60236a54 | |||
| 4f7c20fc26 | |||
| 54c6d21fc5 | |||
| c031804464 | |||
| 5289fe872a | |||
| 7ea4acc289 | |||
| 6dbc043a7e | |||
| fb1668ede7 | |||
| 3d27e283ad | |||
| 4b205fa995 | |||
| e7126ae335 | |||
| b2312d7f1b | |||
| bffce041d7 | |||
| 037674ae13 | |||
| 8c59c822b6 | |||
| 59023e9602 | |||
| ad3a8b92d1 | |||
| c67f65e684 | |||
| d78b3a05ec | |||
| 5579f64dd0 | |||
| 773fbfe7c8 | |||
| 5b50f90d2b | |||
| 90f6ef0380 | |||
| 33619abdfb | |||
| c52aac012c | |||
| c9070930d2 | |||
| 918bda14ec | |||
| 33a0c7dcd3 | |||
| 8f1ab3485e | |||
| 18ae6e26b3 | |||
| 49bb8cb0bc | |||
| ec57f1e687 | |||
| 787eb7f399 | |||
| 85aa0883c8 | |||
| ff92ac0763 | |||
| a20d2df50a | |||
| 29e11f552f |
@@ -1,313 +1,256 @@
|
||||
version: 2.1
|
||||
|
||||
aliases:
|
||||
- &plume-docker
|
||||
image: plumeorg/plume-buildenv:v0.0.5
|
||||
- &defaults
|
||||
executors:
|
||||
default:
|
||||
parameters:
|
||||
postgres:
|
||||
type: boolean
|
||||
default: false
|
||||
selenium:
|
||||
type: boolean
|
||||
default: false
|
||||
docker:
|
||||
- *plume-docker
|
||||
- image: plumeorg/plume-buildenv:v0.0.9
|
||||
- image: <<#parameters.postgres>>circleci/postgres:9.6-alpine<</parameters.postgres>><<^parameters.postgres>>alpine:latest<</parameters.postgres>>
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_DB: plume
|
||||
- image: <<#parameters.selenium>>elgalu/selenium:latest<</parameters.selenium>><<^parameters.selenium>>alpine:latest<</parameters.selenium>>
|
||||
working_directory: ~/projects/Plume
|
||||
- &postgresql
|
||||
docker:
|
||||
- *plume-docker
|
||||
- image: circleci/postgres:9.6-alpine
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_DB: plume
|
||||
working_directory: ~/projects/Plume
|
||||
- &selenium
|
||||
docker:
|
||||
- *plume-docker
|
||||
- image: elgalu/selenium:latest
|
||||
working_directory: ~/projects/Plume
|
||||
- &postgresql_selenium
|
||||
docker:
|
||||
- *plume-docker
|
||||
- image: circleci/postgres:9.6-alpine
|
||||
environment:
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_DB: plume
|
||||
- image: elgalu/selenium:latest
|
||||
working_directory: ~/projects/Plume
|
||||
|
||||
- &attach_workspace
|
||||
attach_workspace:
|
||||
at: ~/projects/Plume/
|
||||
- &persist_to_workspace
|
||||
persist_to_workspace:
|
||||
root: ~/projects/Plume/
|
||||
paths:
|
||||
- ./
|
||||
|
||||
- &env_postgresql
|
||||
environment:
|
||||
MIGRATION_DIRECTORY: migrations/postgres
|
||||
FEATURES: postgres
|
||||
DATABASE_URL: postgres://postgres@localhost/plume
|
||||
RUST_TEST_THREADS: 1
|
||||
- &env_sqlite
|
||||
environment:
|
||||
MIGRATION_DIRECTORY: migrations/sqlite
|
||||
FEATURES: sqlite
|
||||
DATABASE_URL: plume.sqlite3
|
||||
RUST_TEST_THREADS: 1
|
||||
FEATURES: <<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
DATABASE_URL: <<#parameters.postgres>>postgres://postgres@localhost/plume<</parameters.postgres>><<^parameters.postgres>>plume.sqlite<</parameters.postgres>>
|
||||
|
||||
- &restore_cache
|
||||
restore_cache:
|
||||
keys:
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-notest
|
||||
- &save_cache
|
||||
save_cache:
|
||||
key: v2-plume-notest-{{ checksum "Cargo.lock" }}
|
||||
paths:
|
||||
|
||||
commands:
|
||||
restore_env:
|
||||
description: checkout and pull cache
|
||||
parameters:
|
||||
cache:
|
||||
type: enum
|
||||
default: none
|
||||
enum: ["none", "clippy", "postgres", "sqlite", "release-postgres", "release-sqlite"]
|
||||
steps:
|
||||
- checkout
|
||||
- run: git config --global --remove-section url."ssh://git@github.com"
|
||||
- restore_cache:
|
||||
keys:
|
||||
- v0-<< parameters.cache >>-{{ checksum "Cargo.lock" }}-{{ .Branch }}
|
||||
- v0-<< parameters.cache >>-{{ checksum "Cargo.lock" }}-master
|
||||
|
||||
cache:
|
||||
description: push cache
|
||||
parameters:
|
||||
cache:
|
||||
type: enum
|
||||
enum: ["clippy", "postgres", "sqlite", "release-postgres", "release-sqlite"]
|
||||
steps:
|
||||
- save_cache:
|
||||
key: v0-<< parameters.cache >>-{{ checksum "Cargo.lock" }}-{{ .Branch }}
|
||||
paths:
|
||||
- ~/.cargo/
|
||||
- ./target
|
||||
|
||||
- &restore_cache_web
|
||||
restore_cache:
|
||||
keys:
|
||||
- v2-plume-web-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-web
|
||||
- &save_cache_web
|
||||
save_cache:
|
||||
key: v2-plume-web-{{ checksum "Cargo.lock" }}
|
||||
paths:
|
||||
- ~/.cargo/
|
||||
- ./target
|
||||
|
||||
- &restore_cache_cli
|
||||
restore_cache:
|
||||
keys:
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-notest
|
||||
- &save_cache_cli
|
||||
save_cache:
|
||||
key: v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli
|
||||
paths:
|
||||
- ~/.cargo/
|
||||
- target
|
||||
|
||||
- &restore_cache_release
|
||||
restore_cache:
|
||||
keys:
|
||||
- v2-plume-release-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-release
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-notest
|
||||
- &save_cache_release
|
||||
save_cache:
|
||||
key: v2-plume-release-{{ checksum "Cargo.lock" }}
|
||||
paths:
|
||||
- ~/.cargo
|
||||
- target/release
|
||||
- target/wasm32-unknown-unknown/release
|
||||
|
||||
- &restore_cache_plume_dead_code
|
||||
restore_cache:
|
||||
keys:
|
||||
- v2-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume
|
||||
- v2-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-test-{{ checksum "/FEATURES" }}
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}
|
||||
- v2-plume-notest-{{ checksum "Cargo.lock" }}
|
||||
- v2-plume-notest
|
||||
- &save_cache_plume_dead_code
|
||||
save_cache:
|
||||
key: v2-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume
|
||||
paths:
|
||||
- ~/.cargo/
|
||||
- target
|
||||
|
||||
- &test_cli
|
||||
clippy:
|
||||
description: run cargo clippy
|
||||
parameters:
|
||||
package:
|
||||
type: string
|
||||
default: plume
|
||||
no_feature:
|
||||
type: boolean
|
||||
default: false
|
||||
steps:
|
||||
- *attach_workspace
|
||||
- run:
|
||||
name: Set cache key
|
||||
command: echo "$FEATURES" > /FEATURES
|
||||
- *restore_cache_cli
|
||||
- run:
|
||||
name: clippy
|
||||
command: cargo clippy --no-default-features --features="${FEATURES}" --release -p plume-cli -- -D warnings
|
||||
- *save_cache_cli
|
||||
- &test_unit
|
||||
steps:
|
||||
- *attach_workspace
|
||||
- run:
|
||||
name: Set cache key
|
||||
command: echo "$FEATURES" > /FEATURES
|
||||
- *restore_cache_plume_dead_code
|
||||
- run:
|
||||
name: clippy
|
||||
command: cargo clippy --no-default-features --features="${FEATURES}" --release -- -D warnings
|
||||
- run:
|
||||
name: compile test
|
||||
command: cargo test --no-default-features --features="${FEATURES}" --all --exclude plume-front --no-run || cargo test --no-default-features --features="${FEATURES}" --all --exclude plume-front --no-run
|
||||
- run:
|
||||
name: run test
|
||||
command: ./script/run_unit_test.sh
|
||||
- run:
|
||||
name: upload coverage
|
||||
command: ./script/upload_coverage.sh unit
|
||||
- *save_cache_plume_dead_code
|
||||
- run: cargo clippy <<^parameters.no_feature>>--no-default-features --features="${FEATURES}"<</parameters.no_feature>> --release -p <<parameters.package>> -- -D warnings
|
||||
|
||||
- &test_browser
|
||||
run_with_coverage:
|
||||
description: run command with environment for coverage
|
||||
parameters:
|
||||
cmd:
|
||||
type: string
|
||||
steps:
|
||||
- *attach_workspace
|
||||
- run:
|
||||
name: Set cache key
|
||||
command: echo "$FEATURES" > /FEATURES
|
||||
- *restore_cache_plume_dead_code
|
||||
- run:
|
||||
name: install server
|
||||
command: cargo install --debug --no-default-features --features="${FEATURES}",test --path . --force || cargo install --debug --no-default-features --features="${FEATURES}",test --path . --force
|
||||
- run:
|
||||
name: install plm
|
||||
command: cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli --force || cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli --force
|
||||
- run:
|
||||
name: run test
|
||||
command: ./script/run_browser_test.sh
|
||||
environment:
|
||||
BROWSER: firefox
|
||||
- run:
|
||||
name: upload coverage
|
||||
command: ./script/upload_coverage.sh integration
|
||||
- *save_cache_plume_dead_code
|
||||
- run: |
|
||||
export RUSTFLAGS="-Zprofile -Zfewer-names -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Coverflow-checks=off -Zno-landing-pads -Clink-arg=-Xlinker -Clink-arg=--no-keep-memory -Clink-arg=-Xlinker -Clink-arg=--reduce-memory-overheads"
|
||||
export CARGO_INCREMENTAL=0
|
||||
<< parameters.cmd >>
|
||||
|
||||
- &release
|
||||
upload_coverage:
|
||||
description: merge coverage files and upload to codecov.io
|
||||
parameters:
|
||||
type:
|
||||
type: string
|
||||
steps:
|
||||
- *attach_workspace
|
||||
- *restore_cache_release
|
||||
- run:
|
||||
name: build frontend
|
||||
command: cargo web deploy -p plume-front --release
|
||||
- run:
|
||||
name: build server
|
||||
command: cargo build --release --no-default-features --features="${FEATURES}" || cargo build --release --no-default-features --features="${FEATURES}"
|
||||
- run:
|
||||
name: build plm
|
||||
command: cargo build --release --no-default-features --features="${FEATURES}" -p plume-cli || cargo build --release --no-default-features --features="${FEATURES}" -p plume-cli
|
||||
- *save_cache_release
|
||||
- run: script/generate_artifact.sh
|
||||
- store_artifacts:
|
||||
path: plume.tar.gz
|
||||
destination: plume.tar.gz
|
||||
- run: zip -0 ccov.zip `find . -name 'plume*.gc*' -o -name 'plm*.gc*'`
|
||||
- run: grcov ccov.zip -s . -t lcov --llvm --branch --ignore-not-existing --ignore '/*' -o lcov.info
|
||||
- run: bash <(curl -s https://codecov.io/bash) -f lcov.info -F <<parameters.type>>
|
||||
- run: find . -name 'plume*.gc*' -delete -o -name 'plm*.gc*' -delete
|
||||
- run: rm ccov.zip lcov.info
|
||||
|
||||
build:
|
||||
description: build a package
|
||||
parameters:
|
||||
package:
|
||||
type: string
|
||||
default: plume
|
||||
release:
|
||||
type: boolean
|
||||
default: false
|
||||
steps:
|
||||
- run: |
|
||||
cmd="cargo build <<#parameters.release>>--release<</parameters.release>> --no-default-features --features="${FEATURES}" -p <<parameters.package>> -j"
|
||||
for i in 36 4 2 1 1; do
|
||||
$cmd $i && exit 0
|
||||
done
|
||||
exit 1
|
||||
|
||||
jobs:
|
||||
download_deps:
|
||||
<<: *defaults
|
||||
cargo fmt:
|
||||
executor:
|
||||
name: default
|
||||
steps:
|
||||
- checkout
|
||||
- *attach_workspace
|
||||
- *restore_cache
|
||||
- run: git config --global --remove-section url."ssh://git@github.com"
|
||||
- run: cargo fetch
|
||||
- *save_cache
|
||||
- *persist_to_workspace
|
||||
- restore_env
|
||||
- run: cargo fmt --all -- --check
|
||||
|
||||
cargo_fmt:
|
||||
<<: *defaults
|
||||
clippy:
|
||||
parameters:
|
||||
postgres:
|
||||
type: boolean
|
||||
executor:
|
||||
name: default
|
||||
postgres: << parameters.postgres >>
|
||||
steps:
|
||||
- *attach_workspace
|
||||
- run: cargo fmt --all -- --check
|
||||
- restore_env:
|
||||
cache: clippy
|
||||
- clippy
|
||||
- clippy:
|
||||
package: plume-cli
|
||||
- clippy:
|
||||
package: plume-front
|
||||
no_feature: true
|
||||
- cache:
|
||||
cache: clippy
|
||||
|
||||
build_web:
|
||||
<<: *defaults
|
||||
unit:
|
||||
parameters:
|
||||
postgres:
|
||||
type: boolean
|
||||
executor:
|
||||
name: default
|
||||
postgres: << parameters.postgres >>
|
||||
steps:
|
||||
- *attach_workspace
|
||||
- *restore_cache_web
|
||||
- run: cargo clippy -p plume-front -- -D warnings
|
||||
- run: cargo web deploy -p plume-front
|
||||
- *save_cache_web
|
||||
- *persist_to_workspace
|
||||
- restore_env:
|
||||
cache: <<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
- run_with_coverage:
|
||||
cmd: |
|
||||
cmd="cargo test --all --exclude plume-front --exclude plume-macro --no-run --no-default-features --features=${FEATURES} -j"
|
||||
for i in 36 4 2 1 1; do
|
||||
$cmd $i && break
|
||||
done
|
||||
cargo test --all --exclude plume-front --exclude plume-macro --no-default-features --features="${FEATURES}" -j1 -- --test-threads=1
|
||||
- upload_coverage:
|
||||
type: unit
|
||||
- cache:
|
||||
cache: <<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
|
||||
test_cli_postgresql:
|
||||
<<: *postgresql
|
||||
<<: *env_postgresql
|
||||
<<: *test_cli
|
||||
|
||||
test_cli_sqlite:
|
||||
<<: *defaults
|
||||
<<: *env_sqlite
|
||||
<<: *test_cli
|
||||
|
||||
test_unit_postgresql:
|
||||
<<: *postgresql
|
||||
<<: *env_postgresql
|
||||
<<: *test_unit
|
||||
|
||||
test_unit_sqlite:
|
||||
<<: *defaults
|
||||
<<: *env_sqlite
|
||||
<<: *test_unit
|
||||
|
||||
test_browser_postgresql:
|
||||
<<: *postgresql_selenium
|
||||
<<: *env_postgresql
|
||||
<<: *test_browser
|
||||
|
||||
test_browser_sqlite:
|
||||
<<: *selenium
|
||||
<<: *env_sqlite
|
||||
<<: *test_browser
|
||||
all_ok:
|
||||
docker:
|
||||
- image: alpine:3.7
|
||||
integration:
|
||||
parameters:
|
||||
postgres:
|
||||
type: boolean
|
||||
executor:
|
||||
name: default
|
||||
postgres: << parameters.postgres >>
|
||||
selenium: true
|
||||
steps:
|
||||
- run: /bin/true
|
||||
release_postgresql:
|
||||
<<: *defaults
|
||||
<<: *env_postgresql
|
||||
<<: *release
|
||||
release_sqlite:
|
||||
<<: *defaults
|
||||
<<: *env_sqlite
|
||||
<<: *release
|
||||
- restore_env:
|
||||
cache: <<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
- run: cargo web deploy -p plume-front
|
||||
- run_with_coverage:
|
||||
cmd: |
|
||||
cmd="cargo install --debug --no-default-features --features="${FEATURES}",test --force --path . -j"
|
||||
for i in 36 4 2 1 1; do
|
||||
$cmd $i && exit 0
|
||||
done
|
||||
exit 1
|
||||
- run_with_coverage:
|
||||
cmd: |
|
||||
cmd="cargo install --debug --no-default-features --features="${FEATURES}" --force --path plume-cli -j"
|
||||
for i in 36 4 2 1 1; do
|
||||
$cmd $i && exit 0
|
||||
done
|
||||
exit 1
|
||||
- run:
|
||||
name: run test
|
||||
command: ./script/run_browser_test.sh
|
||||
environment:
|
||||
BROWSER: firefox
|
||||
- upload_coverage:
|
||||
type: integration
|
||||
- cache:
|
||||
cache: <<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
|
||||
release:
|
||||
parameters:
|
||||
postgres:
|
||||
type: boolean
|
||||
executor:
|
||||
name: default
|
||||
postgres: << parameters.postgres >>
|
||||
steps:
|
||||
- restore_env:
|
||||
cache: release-<<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
- run: cargo web deploy -p plume-front --release
|
||||
- build:
|
||||
package: plume
|
||||
release: true
|
||||
- build:
|
||||
package: plume-cli
|
||||
release: true
|
||||
- cache:
|
||||
cache: release-<<#parameters.postgres>>postgres<</ parameters.postgres>><<^parameters.postgres>>sqlite<</parameters.postgres>>
|
||||
- run: ./script/generate_artifact.sh
|
||||
- unless:
|
||||
condition: << parameters.postgres >>
|
||||
steps:
|
||||
- run: ./script/upload_test_environment.sh
|
||||
- store_artifacts:
|
||||
path: plume.tar.gz
|
||||
destination: plume.tar.gz
|
||||
- store_artifacts:
|
||||
path: wasm.tar.gz
|
||||
destination: wasm.tar.gz
|
||||
|
||||
push translations:
|
||||
executor:
|
||||
name: default
|
||||
steps:
|
||||
- restore_env:
|
||||
cache: none
|
||||
- run: crowdin upload -b master
|
||||
|
||||
workflows:
|
||||
version: 2
|
||||
build_and_test:
|
||||
build and test:
|
||||
jobs:
|
||||
- download_deps
|
||||
- cargo_fmt:
|
||||
requires:
|
||||
- download_deps
|
||||
- build_web:
|
||||
requires:
|
||||
- download_deps
|
||||
- test_cli_postgresql:
|
||||
requires:
|
||||
- download_deps
|
||||
- test_cli_sqlite:
|
||||
requires:
|
||||
- download_deps
|
||||
- test_unit_postgresql:
|
||||
requires:
|
||||
- download_deps
|
||||
- test_unit_sqlite:
|
||||
requires:
|
||||
- download_deps
|
||||
- test_browser_postgresql:
|
||||
requires:
|
||||
- build_web
|
||||
- test_browser_sqlite:
|
||||
requires:
|
||||
- build_web
|
||||
- all_ok:
|
||||
requires:
|
||||
- cargo_fmt
|
||||
- test_cli_postgresql
|
||||
- test_cli_sqlite
|
||||
- test_unit_postgresql
|
||||
- test_unit_sqlite
|
||||
- test_browser_postgresql
|
||||
- test_browser_sqlite
|
||||
- release_postgresql:
|
||||
requires:
|
||||
- all_ok
|
||||
- release_sqlite:
|
||||
requires:
|
||||
- all_ok
|
||||
- cargo fmt
|
||||
- clippy:
|
||||
postgres: false
|
||||
- clippy:
|
||||
postgres: true
|
||||
- unit:
|
||||
postgres: false
|
||||
- unit:
|
||||
postgres: true
|
||||
- integration:
|
||||
postgres: false
|
||||
- integration:
|
||||
postgres: true
|
||||
- release:
|
||||
postgres: false
|
||||
- release:
|
||||
postgres: true
|
||||
- push translations:
|
||||
filters:
|
||||
branches:
|
||||
only:
|
||||
- /^master/
|
||||
|
||||
@@ -3,24 +3,21 @@ ENV PATH="/root/.cargo/bin:${PATH}"
|
||||
|
||||
#install native/circleci/build dependancies
|
||||
RUN apt update &&\
|
||||
apt install -y git ssh tar gzip ca-certificates &&\
|
||||
apt install -y binutils-dev build-essential cmake curl gcc gettext git libcurl4-openssl-dev libdw-dev libelf-dev libiberty-dev libpq-dev libsqlite3-dev libssl-dev make openssl pkg-config postgresql postgresql-contrib python zlib1g-dev python3-pip
|
||||
apt install -y --no-install-recommends git ssh tar gzip ca-certificates default-jre&&\
|
||||
apt install -y --no-install-recommends binutils-dev build-essential cmake curl gcc gettext git libcurl4-openssl-dev libdw-dev libelf-dev libiberty-dev libpq-dev libsqlite3-dev libssl-dev make openssl pkg-config postgresql postgresql-contrib python zlib1g-dev python3-pip zip unzip libclang-dev&&\
|
||||
rm -rf /var/lib/apt/lists/*
|
||||
|
||||
#install and configure rust
|
||||
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly-2019-03-23 -y &&\
|
||||
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly-2020-01-15 -y &&\
|
||||
rustup component add rustfmt clippy &&\
|
||||
rustup component add rust-std --target wasm32-unknown-unknown
|
||||
|
||||
#compile some deps
|
||||
RUN cargo install cargo-web &&\
|
||||
cargo install diesel_cli --no-default-features --features postgres,sqlite --version '=1.3.0' &&\
|
||||
cargo install grcov &&\
|
||||
strip /root/.cargo/bin/* &&\
|
||||
rm -fr ~/.cargo/registry
|
||||
|
||||
#install coverage tools
|
||||
RUN curl -L https://github.com/SimonKagstrom/kcov/archive/master.tar.gz | tar xz &&\
|
||||
mkdir -p kcov-master/build && cd kcov-master/build && cmake .. && make &&\
|
||||
make install && cd ../.. && rm -rf kcov-master
|
||||
|
||||
#set some compilation parametters
|
||||
COPY cargo_config /root/.cargo/config
|
||||
|
||||
@@ -30,3 +27,11 @@ RUN pip3 install selenium
|
||||
#install and configure caddy
|
||||
RUN curl https://getcaddy.com | bash -s personal
|
||||
COPY Caddyfile /Caddyfile
|
||||
|
||||
#install crowdin
|
||||
RUN mkdir /crowdin && cd /crowdin &&\
|
||||
curl -O https://downloads.crowdin.com/cli/v2/crowdin-cli.zip &&\
|
||||
unzip crowdin-cli.zip && rm crowdin-cli.zip &&\
|
||||
cd * && mv crowdin-cli.jar /usr/local/bin && cd && rm -rf /crowdin &&\
|
||||
/bin/echo -e '#!/bin/sh\njava -jar /usr/local/bin/crowdin-cli.jar $@' > /usr/local/bin/crowdin &&\
|
||||
chmod +x /usr/local/bin/crowdin
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
[target.x86_64-unknown-linux-gnu]
|
||||
# link dead code for coverage, attempt to reduce linking memory usage to not get killed
|
||||
rustflags = ["-Clink-dead-code", "-Clink-args=-Xlinker --no-keep-memory -Xlinker --reduce-memory-overheads"]
|
||||
rustflags = ["-Clink-args=-Xlinker --no-keep-memory -Xlinker --reduce-memory-overheads"]
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# This file contains your instance configuration
|
||||
# Some documentation about these variables is available here:
|
||||
# https://docs.joinplu.me/environment/
|
||||
|
||||
## GENERAL SETTINGS ##
|
||||
|
||||
# The directory containing database migrations
|
||||
# For Postgres: migrations/postgres
|
||||
# For SQlite: migrations/sqlite
|
||||
MIGRATION_DIRECTORY=migrations/postgres
|
||||
|
||||
# The URL of your database (or its path for SQlite databases)
|
||||
DATABASE_URL=postgres://plume:plume@localhost/plume
|
||||
|
||||
# The domain of your instance
|
||||
BASE_URL=plu.me
|
||||
|
||||
# The secret key for private cookies and CSRF protection
|
||||
# You can generate one with `openssl rand -base64 32`
|
||||
ROCKET_SECRET_KEY=
|
||||
|
||||
# Port and address which Plume will use
|
||||
ROCKET_PORT=7878
|
||||
ROCKET_ADDRESS=127.0.0.1
|
||||
|
||||
## MAIL CONFIG ##
|
||||
#MAIL_SERVER=smtp.plu.me
|
||||
#MAIL_ADDRESS=no-reply@plu.me
|
||||
#MAIL_USER=plume
|
||||
#MAIL_PASSWORD=
|
||||
#MAIL_HELO_NAME=no-reply@plu.me
|
||||
|
||||
## ADVANCED OPTIONS ##
|
||||
#MEDIA_UPLOAD_DIRECTORY=static/media
|
||||
#SEARCH_INDEX=search_index
|
||||
|
||||
# Sample logo configuration
|
||||
#PLUME_LOGO=icons/trwnh/paragraphs/plumeParagraphs.svg
|
||||
#PLUME_LOGO_FAVICON=icons/trwnh/paragraphs/plumeParagraphs32.png
|
||||
#PLUME_LOGO_48=icons/trwnh/paragraphs/plumeParagraphs48.png
|
||||
#PLUME_LOGO_72=icons/trwnh/paragraphs/plumeParagraphs72.png
|
||||
#PLUME_LOGO_96=icons/trwnh/paragraphs/plumeParagraphs96.png
|
||||
#PLUME_LOGO_144=icons/trwnh/paragraphs/plumeParagraphs144.png
|
||||
#PLUME_LOGO_160=icons/trwnh/paragraphs/plumeParagraphs160.png
|
||||
#PLUME_LOGO_192=icons/trwnh/paragraphs/plumeParagraphs192.png
|
||||
#PLUME_LOGO_256=icons/trwnh/paragraphs/plumeParagraphs256.png
|
||||
#PLUME_LOGO_512=icons/trwnh/paragraphs/plumeParagraphs512.png
|
||||
@@ -7,7 +7,7 @@ translations
|
||||
.env
|
||||
Rocket.toml
|
||||
!.gitkeep
|
||||
static/media
|
||||
static
|
||||
docker-compose.yml
|
||||
*.db
|
||||
*.sqlite
|
||||
@@ -16,8 +16,5 @@ docker-compose.yml
|
||||
tags.*
|
||||
!tags.rs
|
||||
search_index
|
||||
main.css
|
||||
*.wasm
|
||||
*.js
|
||||
.buildconfig
|
||||
__pycache__
|
||||
|
||||
@@ -1,46 +1,2 @@
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, sexual identity and orientation, etc.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
## Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at baptiste@gelez.xyz. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||
|
||||
[homepage]: http://contributor-covenant.org
|
||||
[version]: http://contributor-covenant.org/version/1/4/
|
||||
You can read our Code of Conduct [here](https://docs.joinplu.me/organization/code-of-conduct).
|
||||
By contributing to this repository, you agree to be bound by this Code of Conduct.
|
||||
|
||||
@@ -1,36 +1,39 @@
|
||||
[package]
|
||||
authors = ["Plume contributors"]
|
||||
name = "plume"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
repository = "https://github.com/Plume-org/Plume"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
activitypub = "0.1.3"
|
||||
askama_escape = "0.1"
|
||||
atom_syndication = "0.6"
|
||||
canapi = "0.2"
|
||||
colored = "1.7"
|
||||
dotenv = "0.13"
|
||||
clap = "2.33"
|
||||
colored = "1.8"
|
||||
dotenv = "0.14"
|
||||
gettext = { git = "https://github.com/Plume-org/gettext/", rev = "294c54d74c699fbc66502b480a37cc66c1daa7f3" }
|
||||
gettext-macros = { git = "https://github.com/Plume-org/gettext-macros/", rev = "a7c605f7edd6bfbfbfe7778026bfefd88d82db10" }
|
||||
gettext-utils = { git = "https://github.com/Plume-org/gettext-macros/", rev = "a7c605f7edd6bfbfbfe7778026bfefd88d82db10" }
|
||||
guid-create = "0.1"
|
||||
heck = "0.3.0"
|
||||
lettre = { git = "https://github.com/lettre/lettre", rev = "c988b1760ad8179d9e7f3fb8594d2b86cf2a0a49" }
|
||||
lettre_email = { git = "https://github.com/lettre/lettre", rev = "c988b1760ad8179d9e7f3fb8594d2b86cf2a0a49" }
|
||||
num_cpus = "1.0"
|
||||
rocket = "0.4.0"
|
||||
rocket_contrib = { version = "0.4.0", features = ["json"] }
|
||||
lettre = "0.9.2"
|
||||
lettre_email = "0.9.2"
|
||||
num_cpus = "1.10"
|
||||
rocket = "0.4.2"
|
||||
rocket_contrib = { version = "0.4.2", features = ["json"] }
|
||||
rocket_i18n = { git = "https://github.com/Plume-org/rocket_i18n", rev = "e922afa7c366038b3433278c03b1456b346074f2" }
|
||||
rpassword = "2.0"
|
||||
runtime-fmt = "0.3.0"
|
||||
scheduled-thread-pool = "0.2.0"
|
||||
rpassword = "4.0"
|
||||
runtime-fmt = "0.4.0"
|
||||
scheduled-thread-pool = "0.2.2"
|
||||
serde = "1.0"
|
||||
serde_json = "1.0"
|
||||
serde_qs = "0.4"
|
||||
serde_qs = "0.5"
|
||||
shrinkwraprs = "0.2.1"
|
||||
syntect = "3.3"
|
||||
validator = "0.8"
|
||||
validator_derive = "0.8"
|
||||
webfinger = "0.3.1"
|
||||
webfinger = "0.4.1"
|
||||
|
||||
[[bin]]
|
||||
name = "plume"
|
||||
@@ -42,7 +45,7 @@ version = "0.4"
|
||||
|
||||
[dependencies.ctrlc]
|
||||
features = ["termination"]
|
||||
version = "3.1.1"
|
||||
version = "3.1.2"
|
||||
|
||||
[dependencies.diesel]
|
||||
features = ["r2d2", "chrono"]
|
||||
@@ -64,10 +67,10 @@ path = "plume-models"
|
||||
|
||||
[dependencies.rocket_csrf]
|
||||
git = "https://github.com/fdb-hiroshima/rocket_csrf"
|
||||
rev = "4a72ea2ec716cb0b26188fb00bccf2ef7d1e031c"
|
||||
rev = "29910f2829e7e590a540da3804336577b48c7b31"
|
||||
|
||||
[build-dependencies]
|
||||
ructe = "0.5.6"
|
||||
ructe = "0.9.0"
|
||||
rsass = "0.9"
|
||||
|
||||
[features]
|
||||
@@ -78,4 +81,4 @@ debug-mailer = []
|
||||
test = []
|
||||
|
||||
[workspace]
|
||||
members = ["plume-api", "plume-cli", "plume-models", "plume-common", "plume-front"]
|
||||
members = ["plume-api", "plume-cli", "plume-models", "plume-common", "plume-front", "plume-macro"]
|
||||
|
||||
@@ -10,7 +10,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
gcc \
|
||||
make \
|
||||
openssl \
|
||||
libssl-dev
|
||||
libssl-dev \
|
||||
clang
|
||||
|
||||
WORKDIR /scratch
|
||||
COPY script/wasm-deps.sh .
|
||||
@@ -18,7 +19,6 @@ RUN chmod a+x ./wasm-deps.sh && sleep 1 && ./wasm-deps.sh
|
||||
|
||||
WORKDIR /app
|
||||
COPY Cargo.toml Cargo.lock rust-toolchain ./
|
||||
RUN cargo install diesel_cli --no-default-features --features postgres --version '=1.3.0'
|
||||
RUN cargo install cargo-web
|
||||
|
||||
COPY . .
|
||||
@@ -40,7 +40,6 @@ WORKDIR /app
|
||||
COPY --from=builder /app /app
|
||||
COPY --from=builder /usr/local/cargo/bin/plm /bin/
|
||||
COPY --from=builder /usr/local/cargo/bin/plume /bin/
|
||||
COPY --from=builder /usr/local/cargo/bin/diesel /bin/
|
||||
|
||||
CMD ["plume"]
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
<!--
|
||||
If your issue is not purely technical, it should be debated on Loomio first
|
||||
|
||||
https://framavox.org/g/WK40YHMA/plume
|
||||
-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Plume version (and/or commit):
|
||||
@@ -1,29 +1,55 @@
|
||||
<h1 align="center">
|
||||
<img src="https://raw.githubusercontent.com/Plume-org/Plume/master/static/icons/trwnh/feather/plumeFeather64.png" alt="Plume's logo">
|
||||
<img src="https://raw.githubusercontent.com/Plume-org/Plume/master/assets/icons/trwnh/feather/plumeFeather64.png" alt="Plume's logo">
|
||||
Plume
|
||||
</h1>
|
||||
<p align="center">
|
||||
<a href="https://travis-ci.org/Plume-org/Plume"><img src="https://travis-ci.org/Plume-org/Plume.svg?branch=master" alt="Build status"></a>
|
||||
<a href="hhttps://codecov.io/gh/Plume-org/Plume"><img src="https://codecov.io/gh/Plume-org/Plume/branch/master/graph/badge.svg" alt="Code coverage"></a>
|
||||
<a href="https://github.com/Plume-org/Plume/"><img alt="CircleCI" src="https://img.shields.io/circleci/build/gh/Plume-org/Plume.svg"></a>
|
||||
<a href="https://codecov.io/gh/Plume-org/Plume"><img src="https://codecov.io/gh/Plume-org/Plume/branch/master/graph/badge.svg" alt="Code coverage"></a>
|
||||
<a title="Crowdin" target="_blank" href="https://crowdin.com/project/plume"><img src="https://d322cqt584bo4o.cloudfront.net/plume/localized.svg"></a>
|
||||
<a href="https://hub.docker.com/r/plumeorg/plume"><img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/plumeorg/plume.svg"></a>
|
||||
<a href="https://liberapay.com/Plume"><img alt="Liberapay patrons" src="https://img.shields.io/liberapay/patrons/Plume.svg"></a>
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://joinplu.me/">Website</a>
|
||||
—
|
||||
<a href="https://docs.joinplu.me/">Documentation</a>
|
||||
—
|
||||
<a href="https://contribute.joinplu.me/">Contribute</a>
|
||||
<a href="https://docs.joinplu.me/contribute">Contribute</a>
|
||||
—
|
||||
<a href="https://joinplu.me/#instances">Instances list</a>
|
||||
</p>
|
||||
|
||||
Plume is a federated blogging engine, based on ActivityPub. It uses the Rocket framework, and Diesel to interact with the database.
|
||||
Plume is a **federated blogging engine**, based on *ActivityPub*. It is written in *Rust*, with the *Rocket* framework, and *Diesel* to interact with the database.
|
||||
The front-end uses *Ructe* templates, *WASM* and *SCSS*.
|
||||
|
||||
It is not yet ready for production use, but we have all the basic features (account management, blogs, articles, comments, etc) and a basic federation.
|
||||
## Features
|
||||
|
||||
Feel free to join our Matrix room: `#plume:disroot.org` to discuss about the project!
|
||||
A lot of features are still missing, but what is already here should be quite stable. Current and planned features include:
|
||||
|
||||
We also have a [Loomio group](https://framavox.org/g/WK40YHMA/plume) to debate and vote and features. Feel free to join it to take part in Plume's decision process.
|
||||
- **A blog-centric approach**: you can create as much blogs as you want with your account, to keep your different publications separated.
|
||||
- **Media management**: you can upload pictures to illustrate your articles, but also audio files if you host a podcast, and manage them all from Plume.
|
||||
- **Federation**: Plume is part of a network of interconnected websites called the Fediverse. Each of these websites (often called *instances*) have their own
|
||||
rules and thematics, but they can all communicate with each other.
|
||||
- **Collaborative writing**: invite other people to your blogs, and write articles together.
|
||||
|
||||
For more informations on the different ways to contribute, check out our [contribution page](https://contribute.joinplu.me). We are welcoming any kind of contribution, and you can probably find a way to help.
|
||||
## Get involved
|
||||
|
||||
As we want the various spaces related to the project (GitHub, Matrix, Loomio, etc) to be as safe as possible for everyone, we adopted [a code of conduct](https://github.com/Plume-org/Plume/blob/master/CODE_OF_CONDUCT.md). Please read it and make sure you accept it before contributing.
|
||||
If you want to have regular news about the project, the best place is probably [our blog](https://fediverse.blog/~/PlumeDev), or our Matrix room: [`#plume:disroot.org`](https://riot.im/app/#/room/#plume:disroot.org).
|
||||
|
||||
If you want to contribute more, a good first step is to read [our contribution guides](https://docs.joinplu.me/contribute). We accept all kind of contribution:
|
||||
|
||||
- [Back-end or front-end development](https://docs.joinplu.me/contribute/development/)
|
||||
- [Translations](https://docs.joinplu.me/contribute/translations/)
|
||||
- [Documentation](https://docs.joinplu.me/contribute/documentation/)
|
||||
- UI and/or UX design (we don't have a dedicated guide yet, but [we can talk](https://docs.joinplu.me/contribute/discussion/) to see how we can work together!)
|
||||
- [Taking part in discussions](https://docs.joinplu.me/contribute/discussion/)
|
||||
- [Financial support](https://docs.joinplu.me/contribute/donations/)
|
||||
|
||||
But this list is not exhaustive and if you want to contribute differently you are welcome too!
|
||||
|
||||
As we want the various spaces related to the project (GitHub, Matrix, Loomio, etc) to be as safe as possible for everyone, we adopted [a code of conduct](https://docs.joinplu.me/organization/code-of-conduct). Please read it and make sure you accept it before contributing.
|
||||
|
||||
## Starting your own instance
|
||||
|
||||
We provide various way to install Plume: from source, with pre-built binaries, with Docker or with YunoHost.
|
||||
For detailed explanations, please refer to [the documentation](https://docs.joinplu.me/installation/).
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 352 B After Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 462 B After Width: | Height: | Size: 462 B |
|
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 571 B After Width: | Height: | Size: 571 B |
|
Before Width: | Height: | Size: 612 B After Width: | Height: | Size: 612 B |
|
Before Width: | Height: | Size: 711 B After Width: | Height: | Size: 711 B |
|
Before Width: | Height: | Size: 820 B After Width: | Height: | Size: 820 B |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 618 B After Width: | Height: | Size: 618 B |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 942 B After Width: | Height: | Size: 942 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 562 B After Width: | Height: | Size: 562 B |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB |
|
Before Width: | Height: | Size: 905 B After Width: | Height: | Size: 905 B |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 358 B After Width: | Height: | Size: 358 B |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 432 B After Width: | Height: | Size: 432 B |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 501 B After Width: | Height: | Size: 501 B |
|
Before Width: | Height: | Size: 516 B After Width: | Height: | Size: 516 B |
|
Before Width: | Height: | Size: 575 B After Width: | Height: | Size: 575 B |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 728 B After Width: | Height: | Size: 728 B |
|
Before Width: | Height: | Size: 797 B After Width: | Height: | Size: 797 B |
|
Before Width: | Height: | Size: 851 B After Width: | Height: | Size: 851 B |
|
Before Width: | Height: | Size: 916 B After Width: | Height: | Size: 916 B |
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 485 B After Width: | Height: | Size: 485 B |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 595 B After Width: | Height: | Size: 595 B |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 648 B After Width: | Height: | Size: 648 B |
|
Before Width: | Height: | Size: 737 B After Width: | Height: | Size: 737 B |
|
Before Width: | Height: | Size: 828 B After Width: | Height: | Size: 828 B |
|
Before Width: | Height: | Size: 839 B After Width: | Height: | Size: 839 B |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 938 B After Width: | Height: | Size: 938 B |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |