[INFO] fetching crate diffly 0.2.0... [INFO] checking diffly-0.2.0 against master#8a703520e80d87d4423c01f9d4fbc9e5f6533a02 for pr-154205-1 [INFO] extracting crate diffly 0.2.0 into /workspace/builds/worker-6-tc1/source [INFO] started tweaking crates.io crate diffly 0.2.0 [INFO] removed 0 missing examples [INFO] finished tweaking crates.io crate diffly 0.2.0 [INFO] tweaked toml for crates.io crate diffly 0.2.0 written to /workspace/builds/worker-6-tc1/source/Cargo.toml [INFO] validating manifest of crates.io crate diffly 0.2.0 on toolchain 8a703520e80d87d4423c01f9d4fbc9e5f6533a02 [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }` [INFO] crate crates.io crate diffly 0.2.0 already has a lockfile, it will not be regenerated [INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }` [INFO] [stderr] Updating crates.io index [INFO] [stderr] Downloading crates ... [INFO] [stderr] Downloaded zmij v1.0.20 [INFO] [stderr] Downloaded vte v0.10.1 [INFO] [stderr] Downloaded ansi-str v0.8.0 [INFO] [stderr] Downloaded tabled_derive v0.9.0 [INFO] [stderr] Downloaded redox_syscall v0.7.1 [INFO] [stderr] Downloaded sailfish-macros v0.10.1 [INFO] [stderr] Downloaded ansitok v0.2.0 [INFO] [stderr] Downloaded sailfish v0.10.1 [INFO] [stderr] Downloaded sailfish-compiler v0.10.1 [INFO] [stderr] Downloaded toml_parser v1.0.7+spec-1.1.0 [INFO] [stderr] Downloaded papergrid v0.13.0 [INFO] [stderr] Downloaded itoap v1.0.1 [INFO] [stderr] Downloaded rsa v0.9.10 [INFO] [stderr] Downloaded tabled v0.17.0 [INFO] [stderr] Downloaded libc v0.2.181 [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }` [INFO] [stdout] 049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c [INFO] running `Command { std: "docker" "start" "-a" "049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "inspect" "049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c", kill_on_drop: false }` [INFO] [stdout] 049b3f9c80be4ca2d1e29cd6b59a304691e551d556a8add79ed55422c7cc724c [INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-6-tc1/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=forbid" "-e" "RUSTDOCFLAGS=--cap-lints=forbid" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-w" "/opt/rustwide/workdir" "-m" "1610612736" "--user" "0:0" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:d429b63d4308055ea97f60fb1d3dfca48854a00942f1bd2ad806beaf015945ec" "/opt/rustwide/cargo-home/bin/cargo" "+8a703520e80d87d4423c01f9d4fbc9e5f6533a02" "check" "--frozen" "--all" "--all-targets" "--message-format=json", kill_on_drop: false }` [INFO] [stdout] 25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec [INFO] running `Command { std: "docker" "start" "-a" "25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec", kill_on_drop: false }` [INFO] [stderr] Compiling proc-macro2 v1.0.106 [INFO] [stderr] Compiling libc v0.2.181 [INFO] [stderr] Compiling serde_core v1.0.228 [INFO] [stderr] Checking smallvec v1.15.1 [INFO] [stderr] Compiling serde v1.0.228 [INFO] [stderr] Compiling crossbeam-utils v0.8.21 [INFO] [stderr] Compiling getrandom v0.3.4 [INFO] [stderr] Compiling toml_write v0.1.2 [INFO] [stderr] Compiling winnow v0.7.14 [INFO] [stderr] Compiling zmij v1.0.20 [INFO] [stderr] Compiling indexmap v2.13.0 [INFO] [stderr] Compiling serde_json v1.0.149 [INFO] [stderr] Compiling sailfish-compiler v0.10.1 [INFO] [stderr] Compiling rustls v0.23.36 [INFO] [stderr] Compiling cfg-if v1.0.4 [INFO] [stderr] Checking form_urlencoded v1.2.2 [INFO] [stderr] Checking futures-io v0.3.31 [INFO] [stderr] Checking futures-sink v0.3.31 [INFO] [stderr] Checking parking v2.2.1 [INFO] [stderr] Compiling home v0.5.12 [INFO] [stderr] Checking crc v3.4.0 [INFO] [stderr] Checking futures-util v0.3.31 [INFO] [stderr] Checking sha2 v0.10.9 [INFO] [stderr] Checking webpki-roots v0.26.11 [INFO] [stderr] Checking hashlink v0.10.0 [INFO] [stderr] Compiling sailfish v0.10.1 [INFO] [stderr] Checking unicode-segmentation v1.12.0 [INFO] [stderr] Checking base64 v0.22.1 [INFO] [stderr] Checking option-ext v0.2.0 [INFO] [stderr] Checking pathdiff v0.2.3 [INFO] [stderr] Checking ryu v1.0.23 [INFO] [stderr] Checking itoap v1.0.1 [INFO] [stderr] Checking concurrent-queue v2.5.0 [INFO] [stderr] Checking crossbeam-queue v0.3.12 [INFO] [stderr] Checking convert_case v0.6.0 [INFO] [stderr] Checking event-listener v5.4.1 [INFO] [stderr] Compiling quote v1.0.44 [INFO] [stderr] Compiling syn v2.0.114 [INFO] [stderr] Compiling filetime v0.2.27 [INFO] [stderr] Checking toml_parser v1.0.7+spec-1.1.0 [INFO] [stderr] Checking parking_lot_core v0.9.12 [INFO] [stderr] Checking getrandom v0.2.17 [INFO] [stderr] Checking errno v0.3.14 [INFO] [stderr] Checking mio v1.1.1 [INFO] [stderr] Checking socket2 v0.6.2 [INFO] [stderr] Checking dirs-sys v0.4.1 [INFO] [stderr] Checking ring v0.17.14 [INFO] [stderr] Checking signal-hook-registry v1.4.8 [INFO] [stderr] Checking dirs v5.0.1 [INFO] [stderr] Checking parking_lot v0.12.5 [INFO] [stderr] Checking tempfile v3.25.0 [INFO] [stderr] Checking futures-intrusive v0.5.0 [INFO] [stderr] Checking uuid v1.20.0 [INFO] [stderr] Checking serde_spanned v1.0.4 [INFO] [stderr] Checking toml_datetime v0.7.5+spec-1.1.0 [INFO] [stderr] Checking toml v0.9.12+spec-1.1.0 [INFO] [stderr] Checking rustls-webpki v0.103.9 [INFO] [stderr] Checking config v0.15.19 [INFO] [stderr] Compiling synstructure v0.13.2 [INFO] [stderr] Compiling zerovec-derive v0.11.2 [INFO] [stderr] Compiling serde_derive v1.0.228 [INFO] [stderr] Compiling displaydoc v0.2.5 [INFO] [stderr] Compiling tokio-macros v2.6.0 [INFO] [stderr] Compiling thiserror-impl v2.0.18 [INFO] [stderr] Compiling tracing-attributes v0.1.31 [INFO] [stderr] Compiling async-trait v0.1.89 [INFO] [stderr] Compiling zerofrom-derive v0.1.6 [INFO] [stderr] Compiling yoke-derive v0.8.1 [INFO] [stderr] Checking tokio v1.49.0 [INFO] [stderr] Checking thiserror v2.0.18 [INFO] [stderr] Checking zerofrom v0.1.6 [INFO] [stderr] Checking tracing v0.1.44 [INFO] [stderr] Checking yoke v0.8.1 [INFO] [stderr] Checking zerovec v0.11.5 [INFO] [stderr] Checking zerotrie v0.2.3 [INFO] [stderr] Checking tinystr v0.8.2 [INFO] [stderr] Checking potential_utf v0.1.4 [INFO] [stderr] Checking icu_collections v2.1.1 [INFO] [stderr] Checking icu_locale_core v2.1.1 [INFO] [stderr] Checking icu_provider v2.1.1 [INFO] [stderr] Checking icu_properties v2.1.2 [INFO] [stderr] Checking icu_normalizer v2.1.1 [INFO] [stderr] Checking either v1.15.0 [INFO] [stderr] Checking chrono v0.4.43 [INFO] [stderr] Compiling serde_spanned v0.6.9 [INFO] [stderr] Compiling toml_datetime v0.6.11 [INFO] [stderr] Compiling toml_edit v0.22.27 [INFO] [stderr] Checking idna_adapter v1.2.1 [INFO] [stderr] Checking idna v1.1.0 [INFO] [stderr] Checking url v2.5.8 [INFO] [stderr] Checking tokio-stream v0.1.18 [INFO] [stderr] Checking sqlx-core v0.8.6 [INFO] [stderr] Compiling toml v0.8.23 [INFO] [stderr] Compiling sailfish-macros v0.10.1 [INFO] [stderr] Checking sqlx v0.8.6 [INFO] [stderr] Checking diffly v0.2.0 (/opt/rustwide/workdir) [INFO] [stdout] warning: unnecessary braces around block return value [INFO] [stdout] --> /opt/rustwide/target/debug/build/sailfish-compiler-538dd34e892f4514/out/templates/acb4512fb34a59c6-1811e2eaaa1204b8:2:19186 [INFO] [stdout] | [INFO] [stdout] 2 | ... ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n

⏱ Performance

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n \n \n \n \n \n \n \n \n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n \n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
OperationTableRowsTime (ms)
") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __... [INFO] [stdout] | ^^ ^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_braces)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] help: remove these braces [INFO] [stdout] | [INFO] [stdout] 2 - { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n
\n
\n

Diffly

\n \n
\n

📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , ".") ; __sf_rt :: render_escaped ! (__sf_buf , table . table_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n \n \n
\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n +") ; __sf_rt :: render_escaped ! (__sf_buf , table . inserts . len ()) ; __sf_rt :: render_text ! (__sf_buf , " insert") ; __sf_rt :: render_escaped ! (__sf_buf , if table . inserts . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ~") ; __sf_rt :: render_escaped ! (__sf_buf , table . updates . len ()) ; __sf_rt :: render_text ! (__sf_buf , " update") ; __sf_rt :: render_escaped ! (__sf_buf , if table . updates . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n -") ; __sf_rt :: render_escaped ! (__sf_buf , table . deletes . len ()) ; __sf_rt :: render_text ! (__sf_buf , " delete") ; __sf_rt :: render_escaped ! (__sf_buf , if table . deletes . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
\n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n

Updates

\n \n \n \n \n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
PKColumnBeforeAfter
") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n

⏱ Performance

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n \n \n \n \n \n \n \n \n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n \n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
OperationTableRowsTime (ms)
") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } } [INFO] [stdout] 2 + { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n
\n
\n

Diffly

\n \n
\n

📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , ".") ; __sf_rt :: render_escaped ! (__sf_buf , table . table_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n \n \n
\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n +") ; __sf_rt :: render_escaped ! (__sf_buf , table . inserts . len ()) ; __sf_rt :: render_text ! (__sf_buf , " insert") ; __sf_rt :: render_escaped ! (__sf_buf , if table . inserts . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ~") ; __sf_rt :: render_escaped ! (__sf_buf , table . updates . len ()) ; __sf_rt :: render_text ! (__sf_buf , " update") ; __sf_rt :: render_escaped ! (__sf_buf , if table . updates . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n -") ; __sf_rt :: render_escaped ! (__sf_buf , table . deletes . len ()) ; __sf_rt :: render_text ! (__sf_buf , " delete") ; __sf_rt :: render_escaped ! (__sf_buf , if table . deletes . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
\n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n

Updates

\n \n \n \n \n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
PKColumnBeforeAfter
") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n

⏱ Performance

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n \n \n \n \n \n \n \n \n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n \n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
OperationTableRowsTime (ms)
") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stdout] warning: unnecessary braces around block return value [INFO] [stdout] --> /opt/rustwide/target/debug/build/sailfish-compiler-538dd34e892f4514/out/templates/acb4512fb34a59c6-1811e2eaaa1204b8:2:19186 [INFO] [stdout] | [INFO] [stdout] 2 | ... ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n

⏱ Performance

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n \n \n \n \n \n \n \n \n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n \n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
OperationTableRowsTime (ms)
") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __... [INFO] [stdout] | ^^ ^^ [INFO] [stdout] | [INFO] [stdout] = note: `#[warn(unused_braces)]` (part of `#[warn(unused)]`) on by default [INFO] [stdout] help: remove these braces [INFO] [stdout] | [INFO] [stdout] 2 - { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n
\n
\n

Diffly

\n \n
\n

📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , ".") ; __sf_rt :: render_escaped ! (__sf_buf , table . table_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n \n \n
\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n +") ; __sf_rt :: render_escaped ! (__sf_buf , table . inserts . len ()) ; __sf_rt :: render_text ! (__sf_buf , " insert") ; __sf_rt :: render_escaped ! (__sf_buf , if table . inserts . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ~") ; __sf_rt :: render_escaped ! (__sf_buf , table . updates . len ()) ; __sf_rt :: render_text ! (__sf_buf , " update") ; __sf_rt :: render_escaped ! (__sf_buf , if table . updates . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n -") ; __sf_rt :: render_escaped ! (__sf_buf , table . deletes . len ()) ; __sf_rt :: render_text ! (__sf_buf , " delete") ; __sf_rt :: render_escaped ! (__sf_buf , if table . deletes . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
\n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n

Updates

\n \n \n \n \n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
PKColumnBeforeAfter
") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n

⏱ Performance

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n \n \n \n \n \n \n \n \n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n \n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
OperationTableRowsTime (ms)
") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } } [INFO] [stdout] 2 + { let changeset = self . changeset ; __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\nDiffly - Changeset ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "\n\n\n\n\n\n\n
\n
\n

Diffly

\n \n
\n

📋 Changeset | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . driver) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . changeset_id) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . source_schema) ; __sf_rt :: render_text ! (__sf_buf , " → ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , " | ") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . created_at) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_inserts) ; __sf_rt :: render_text ! (__sf_buf , "
Inserts
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_updates) ; __sf_rt :: render_text ! (__sf_buf , "
Updates
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . total_deletes) ; __sf_rt :: render_text ! (__sf_buf , "
Deletes
\n
") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . summary . tables_affected) ; __sf_rt :: render_text ! (__sf_buf , "
Tables
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; for table in & changeset . tables { __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , changeset . target_schema) ; __sf_rt :: render_text ! (__sf_buf , ".") ; __sf_rt :: render_escaped ! (__sf_buf , table . table_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n
\n \n \n
\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n +") ; __sf_rt :: render_escaped ! (__sf_buf , table . inserts . len ()) ; __sf_rt :: render_text ! (__sf_buf , " insert") ; __sf_rt :: render_escaped ! (__sf_buf , if table . inserts . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ~") ; __sf_rt :: render_escaped ! (__sf_buf , table . updates . len ()) ; __sf_rt :: render_text ! (__sf_buf , " update") ; __sf_rt :: render_escaped ! (__sf_buf , if table . updates . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n -") ; __sf_rt :: render_escaped ! (__sf_buf , table . deletes . len ()) ; __sf_rt :: render_text ! (__sf_buf , " delete") ; __sf_rt :: render_escaped ! (__sf_buf , if table . deletes . len () > 1 { "s" } else { "" }) ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
\n
\n
\n\n ") ; if ! table . inserts . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Inserts" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . inserts ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . updates . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . updates ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { __sf_rt :: render_text ! (__sf_buf , "
\n

Updates

\n \n \n \n \n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let pk_str = table . primary_key . iter () . filter_map (| k | row . pk . get (k) . map (| v | format ! ("{}={}" , k , v))) . collect :: < Vec < _ > > () . join (", ") ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; for (i , col_diff) in row . changed_columns . iter () . enumerate () { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; if i == 0 { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
PKColumnBeforeAfter
") ; __sf_rt :: render_escaped ! (__sf_buf , pk_str) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . column) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . before . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , & col_diff . after . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n ") ; if ! table . deletes . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let group_name = "Deletes" ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; let rows = & table . deletes ; __sf_rt :: render_text ! (__sf_buf , "\n ") ; { let pk_cols = & table . primary_key ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let non_pk_cols : Vec < & String > = rows [0] . data . keys () . filter (| k | ! pk_cols . contains (k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let pk_present : Vec < & String > = pk_cols . iter () . filter (| k | rows [0] . data . contains_key (* k)) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n") ; let all_cols : Vec < & String > = pk_present . iter () . copied () . chain (non_pk_cols . iter () . copied ()) . collect () ; __sf_rt :: render_text ! (__sf_buf , "\n
\n

") ; __sf_rt :: render_escaped ! (__sf_buf , group_name) ; __sf_rt :: render_text ! (__sf_buf , "

\n \n ") ; if ! rows . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n \n \n ") ; for col in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n \n \n ") ; for row in rows { __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; for col_name in & all_cols { __sf_rt :: render_text ! (__sf_buf , "\n ") ; let v = row . data . get (* col_name) . unwrap_or (& serde_json :: Value :: Null) ; __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; __sf_rt :: render_escaped ! (__sf_buf , col) ; __sf_rt :: render_text ! (__sf_buf , "
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , v . to_string ()) ; __sf_rt :: render_text ! (__sf_buf , "\n
\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n
") ; } __sf_rt :: render_text ! (__sf_buf , "\n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; if let Some (perf) = & changeset . perf { __sf_rt :: render_text ! (__sf_buf , "\n") ; if ! perf . timings . is_empty () { __sf_rt :: render_text ! (__sf_buf , "\n
\n

⏱ Performance

\n
\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_rows_fetched) ; __sf_rt :: render_text ! (__sf_buf , " row(s) fetched\n ·\n ") ; __sf_rt :: render_escaped ! (__sf_buf , perf . total_ms) ; __sf_rt :: render_text ! (__sf_buf , " ms total elapsed\n
\n
\n \n \n \n \n \n \n \n \n \n \n ") ; for t in & perf . timings { __sf_rt :: render_text ! (__sf_buf , "\n = 1000 { __sf_rt :: render_text ! (__sf_buf , "perf-slow") ; } else if t . duration_ms >= 100 { __sf_rt :: render_text ! (__sf_buf , "perf-medium") ; } else { __sf_rt :: render_text ! (__sf_buf , "perf-fast") ; } __sf_rt :: render_text ! (__sf_buf , "\">\n \n \n \n \n \n ") ; } __sf_rt :: render_text ! (__sf_buf , "\n \n
OperationTableRowsTime (ms)
") ; __sf_rt :: render_escaped ! (__sf_buf , t . operation) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . table) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . rows) ; __sf_rt :: render_text ! (__sf_buf , "") ; __sf_rt :: render_escaped ! (__sf_buf , t . duration_ms) ; __sf_rt :: render_text ! (__sf_buf , "
\n
\n
\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n") ; } __sf_rt :: render_text ! (__sf_buf , "\n\n") ; { __sf_rt :: render_text ! (__sf_buf , "
\n\n") ; } } [INFO] [stdout] | [INFO] [stdout] [INFO] [stdout] [INFO] [stderr] Finished `dev` profile [unoptimized + debuginfo] target(s) in 21.88s [INFO] running `Command { std: "docker" "inspect" "25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec", kill_on_drop: false }` [INFO] running `Command { std: "docker" "rm" "-f" "25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec", kill_on_drop: false }` [INFO] [stdout] 25c2a6c0efd7786753c30e7f139ae82e7a85cf7d15c972c281efa8e2a2bbd7ec