2020-11-12 08:41:47 +01:00
[
2022-10-21 10:02:12 +02:00
{
"name" : "addr2line" ,
2023-01-18 13:24:29 +01:00
"version" : "0.19.0" ,
2022-10-21 10:02:12 +02:00
"authors" : null ,
"repository" : "https://github.com/gimli-rs/addr2line" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A cross-platform symbolication library written in Rust, using `gimli`"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "adler" ,
2021-03-07 10:04:34 +01:00
"version" : "1.0.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Jonas Schievink <jonasschievink@gmail.com>" ,
"repository" : "https://github.com/jonas-schievink/adler.git" ,
2020-12-15 08:10:25 +01:00
"license" : "0BSD OR Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A simple clean-room implementation of the Adler-32 checksum"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "aes" ,
"version" : "0.7.5" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/block-ciphers" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Pure Rust implementation of the Advanced Encryption Standard (a.k.a. Rijndael) including support for AES in counter mode (a.k.a. AES-CTR)"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ahash" ,
2021-10-26 00:16:40 +02:00
"version" : "0.7.6" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tom Kaitchuck <Tom.Kaitchuck@gmail.com>" ,
"repository" : "https://github.com/tkaitchuck/ahash" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A non-cryptographic hash function using AES-NI for high performance"
} ,
{
"name" : "aho-corasick" ,
2022-12-07 08:00:14 +01:00
"version" : "0.7.20" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/aho-corasick" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fast multiple substring searching."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "ammonia" ,
2022-12-07 08:00:14 +01:00
"version" : "3.3.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Michael Howell <michael@notriddle.com>" ,
"repository" : "https://github.com/rust-ammonia/ammonia" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "HTML Sanitization"
} ,
2022-09-24 04:39:21 +02:00
{
"name" : "android_system_properties" ,
"version" : "0.1.5" ,
"authors" : "Nicolas Silva <nical@fastmail.com>" ,
"repository" : "https://github.com/nical/android_system_properties" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Minimal Android system properties wrapper"
} ,
2020-11-24 09:41:03 +01:00
{
"name" : "anki" ,
"version" : "0.0.0" ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
2020-11-24 09:41:03 +01:00
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Anki's Rust library code"
} ,
2021-03-26 00:40:41 +01:00
{
"name" : "anki_i18n" ,
"version" : "0.0.0" ,
2022-12-07 08:00:14 +01:00
"authors" : "Ankitects Pty Ltd and contributors <https://help.ankiweb.net>" ,
2021-03-26 00:40:41 +01:00
"repository" : null ,
"license" : "AGPL-3.0-or-later" ,
"license_file" : null ,
"description" : "Anki's Rust library i18n code"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "anyhow" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.68" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/anyhow" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Flexible concrete Error type built on std::error::Error"
} ,
{
"name" : "arrayref" ,
"version" : "0.3.6" ,
"authors" : "David Roundy <roundyd@physics.oregonstate.edu>" ,
"repository" : "https://github.com/droundy/arrayref" ,
"license" : "BSD-2-Clause" ,
"license_file" : null ,
"description" : "Macros to take array references of slices"
} ,
2021-10-02 12:42:03 +02:00
{
"name" : "arrayvec" ,
2021-11-18 11:54:00 +01:00
"version" : "0.7.2" ,
2021-10-02 12:42:03 +02:00
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/arrayvec" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A vector with fixed capacity, backed by an array (it can be stored on the stack too). Implements fixed capacity ArrayVec and ArrayString."
} ,
2022-12-09 11:49:39 +01:00
{
"name" : "ascii_percent_encoding" ,
"version" : "0.0.0" ,
"authors" : "The rust-url developers" ,
"repository" : null ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Like percent_encoding, but does not encode non-ASCII characters."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "assert-json-diff" ,
"version" : "2.0.2" ,
"authors" : "David Pedersen <david.pdrsn@gmail.com>" ,
"repository" : "https://github.com/davidpdrsn/assert-json-diff.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Easily compare two JSON values and get great output"
} ,
{
"name" : "async-channel" ,
"version" : "1.8.0" ,
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/async-channel" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Async multi-producer multi-consumer channel"
} ,
{
"name" : "async-compression" ,
"version" : "0.3.15" ,
"authors" : "Wim Looman <wim@nemo157.com>|Allen Bui <fairingrey@gmail.com>" ,
"repository" : "https://github.com/Nemo157/async-compression" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Adaptors between compression crates and Rust's modern asynchronous IO types."
} ,
{
"name" : "async-stream" ,
"version" : "0.3.3" ,
"authors" : "Carl Lerche <me@carllerche.com>" ,
"repository" : "https://github.com/tokio-rs/async-stream" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Asynchronous streams using async & await notation"
} ,
{
"name" : "async-stream-impl" ,
"version" : "0.3.3" ,
"authors" : "Carl Lerche <me@carllerche.com>" ,
"repository" : "https://github.com/tokio-rs/async-stream" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "proc macros for async-stream crate"
} ,
2021-01-05 10:58:53 +01:00
{
"name" : "async-trait" ,
2023-01-18 13:24:29 +01:00
"version" : "0.1.61" ,
2021-01-05 10:58:53 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/async-trait" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Type erasure for async trait methods"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "autocfg" ,
2022-02-25 07:30:59 +01:00
"version" : "1.1.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Josh Stone <cuviper@gmail.com>" ,
"repository" : "https://github.com/cuviper/autocfg" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Automatic cfg for Rust compiler features"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "axum" ,
2023-01-18 13:24:29 +01:00
"version" : "0.6.2" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/tokio-rs/axum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Web framework that focuses on ergonomics and modularity"
} ,
{
"name" : "axum-client-ip" ,
"version" : "0.3.1" ,
"authors" : null ,
"repository" : "https://github.com/imbolc/axum-client-ip" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A client IP address extractor for Axum"
} ,
{
"name" : "axum-core" ,
2023-01-18 13:24:29 +01:00
"version" : "0.3.1" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/tokio-rs/axum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Core types and traits for axum"
} ,
{
"name" : "axum-macros" ,
2023-01-18 13:24:29 +01:00
"version" : "0.3.1" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"authors" : null ,
"repository" : "https://github.com/tokio-rs/axum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Macros for axum"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "backtrace" ,
2023-01-18 13:24:29 +01:00
"version" : "0.3.67" ,
2022-10-21 10:02:12 +02:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/backtrace-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A library to acquire a stack trace (backtrace) at runtime in a Rust program."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "base64" ,
2022-12-07 08:00:14 +01:00
"version" : "0.13.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alice Maz <alice@alicemaz.com>|Marshall Pierce <marshall@mpierce.org>" ,
"repository" : "https://github.com/marshallpierce/rust-base64" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "encodes and decodes base64 as bytes or utf8"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "base64" ,
"version" : "0.21.0" ,
"authors" : "Alice Maz <alice@alicemaz.com>|Marshall Pierce <marshall@mpierce.org>" ,
"repository" : "https://github.com/marshallpierce/rust-base64" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "encodes and decodes base64 as bytes or utf8"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "base64ct" ,
"version" : "1.5.3" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/formats/tree/master/base64ct" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Pure Rust implementation of Base64 (RFC 4648) which avoids any usages of data-dependent branches/LUTs and thereby provides portable \"best effort\" constant-time operation and embedded-friendly no_std support"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "bitflags" ,
2021-10-02 12:42:03 +02:00
"version" : "1.3.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/bitflags/bitflags" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A macro to generate structures which behave like bitflags."
} ,
{
"name" : "blake3" ,
2022-12-07 08:00:14 +01:00
"version" : "1.3.3" ,
2022-01-15 05:59:43 +01:00
"authors" : "Jack O'Connor <oconnor663@gmail.com>|Samuel Neves" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/BLAKE3-team/BLAKE3" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR CC0-1.0" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "the BLAKE3 hash function"
} ,
2022-01-15 05:59:43 +01:00
{
"name" : "block-buffer" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.3" ,
2022-01-15 05:59:43 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Buffer type for block processing of data"
} ,
2022-06-01 12:26:16 +02:00
{
"name" : "bstr" ,
"version" : "0.2.17" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/bstr" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A string type that is not required to be valid UTF-8."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "bumpalo" ,
2023-01-18 13:24:29 +01:00
"version" : "3.12.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Nick Fitzgerald <fitzgen@gmail.com>" ,
"repository" : "https://github.com/fitzgen/bumpalo" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A fast bump allocation arena for Rust."
} ,
{
"name" : "byteorder" ,
2021-03-27 05:47:16 +01:00
"version" : "1.4.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/byteorder" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Library for reading/writing numbers in big-endian and little-endian."
} ,
2020-12-28 01:12:10 +01:00
{
"name" : "bytes" ,
2022-12-07 08:00:14 +01:00
"version" : "1.3.0" ,
2020-12-28 01:12:10 +01:00
"authors" : "Carl Lerche <me@carllerche.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/tokio-rs/bytes" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Types and traits for working with bytes"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "bzip2" ,
2023-01-18 13:24:29 +01:00
"version" : "0.4.4" ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/bzip2-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bindings to libbzip2 for bzip2 compression and decompression exposed as Reader/Writer streams."
} ,
{
"name" : "bzip2-sys" ,
"version" : "0.1.11+1.0.8" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/bzip2-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Bindings to libbzip2 for bzip2 compression and decompression exposed as Reader/Writer streams."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "cc" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.78" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
2022-12-07 08:00:14 +01:00
"repository" : "https://github.com/rust-lang/cc-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A build-time dependency for Cargo build scripts to assist in invoking the native C compiler to compile native C code into a static archive to be linked into Rust code."
} ,
{
"name" : "cfg-if" ,
"version" : "1.0.0" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/cfg-if" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A macro to ergonomically define an item depending on a large number of #[cfg] parameters. Structured like an if-else chain, the first matching branch is the item that gets emitted."
} ,
{
"name" : "chrono" ,
2022-12-07 08:00:14 +01:00
"version" : "0.4.23" ,
2022-09-24 04:39:21 +02:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/chronotope/chrono" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Date and time library for Rust"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "cipher" ,
"version" : "0.3.0" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Traits for describing block ciphers and stream ciphers"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "coarsetime" ,
2022-09-24 04:39:21 +02:00
"version" : "0.1.22" ,
2020-11-12 08:41:47 +01:00
"authors" : "Frank Denis <github@pureftpd.org>" ,
"repository" : "https://github.com/jedisct1/rust-coarsetime" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Time and duration crate optimized for speed"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "codespan-reporting" ,
"version" : "0.11.1" ,
"authors" : "Brendan Zabarauskas <bjzaba@yahoo.com.au>" ,
"repository" : "https://github.com/brendanzab/codespan" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Beautiful diagnostic reporting for text-based programming languages"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "concurrent-queue" ,
2023-01-18 13:24:29 +01:00
"version" : "2.1.0" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>|Taiki Endo <te316e89@gmail.com>|John Nunley <jtnunley01@gmail.com>" ,
"repository" : "https://github.com/smol-rs/concurrent-queue" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Concurrent multi-producer multi-consumer queue"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "constant_time_eq" ,
"version" : "0.1.5" ,
"authors" : "Cesar Eduardo Barros <cesarb@cesarb.eti.br>" ,
"repository" : "https://github.com/cesarb/constant_time_eq" ,
"license" : "CC0-1.0" ,
"license_file" : null ,
"description" : "Compares two equal-sized byte strings in constant time."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "constant_time_eq" ,
"version" : "0.2.4" ,
"authors" : "Cesar Eduardo Barros <cesarb@cesarb.eti.br>" ,
"repository" : "https://github.com/cesarb/constant_time_eq" ,
"license" : "Apache-2.0 OR CC0-1.0 OR MIT-0" ,
"license_file" : null ,
"description" : "Compares two equal-sized byte strings in constant time."
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "convert_case" ,
"version" : "0.6.0" ,
"authors" : "Rutrum <dave@rutrum.net>" ,
"repository" : "https://github.com/rutrum/convert-case" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Convert strings into any case"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "core-foundation" ,
2022-02-25 07:30:59 +01:00
"version" : "0.9.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/core-foundation-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings to Core Foundation for macOS"
} ,
{
"name" : "core-foundation-sys" ,
2021-10-26 00:16:40 +02:00
"version" : "0.8.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/core-foundation-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings to Core Foundation for macOS"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "cpufeatures" ,
"version" : "0.2.5" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Lightweight runtime CPU feature detection for x86/x86_64 and aarch64 with no_std support and support for mobile targets including Android and iOS"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "crc32fast" ,
2022-02-25 07:30:59 +01:00
"version" : "1.3.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sam Rijs <srijs@airpost.net>|Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/srijs/rust-crc32fast" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fast, SIMD-accelerated CRC32 (IEEE) checksum computation"
} ,
{
"name" : "crossbeam-channel" ,
2022-09-24 04:39:21 +02:00
"version" : "0.5.6" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/crossbeam-rs/crossbeam" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Multi-producer multi-consumer channels for message passing"
} ,
2020-12-01 05:49:23 +01:00
{
"name" : "crossbeam-utils" ,
2022-12-07 08:00:14 +01:00
"version" : "0.8.14" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-12-01 05:49:23 +01:00
"repository" : "https://github.com/crossbeam-rs/crossbeam" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-12-01 05:49:23 +01:00
"license_file" : null ,
"description" : "Utilities for concurrent programming"
} ,
2020-11-12 08:41:47 +01:00
{
2022-01-15 05:59:43 +01:00
"name" : "crypto-common" ,
2022-09-24 04:39:21 +02:00
"version" : "0.1.6" ,
2022-01-15 05:59:43 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-01-15 05:59:43 +01:00
"description" : "Common cryptographic traits"
2020-11-12 08:41:47 +01:00
} ,
2022-06-01 12:26:16 +02:00
{
"name" : "csv" ,
"version" : "1.1.6" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/rust-csv" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Fast CSV parsing with support for serde."
} ,
{
"name" : "csv-core" ,
"version" : "0.1.10" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/rust-csv" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Bare bones CSV parsing with no_std support."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "cxx" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.86" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/cxx" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Safe interop between Rust and C++"
} ,
{
"name" : "cxx-build" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.86" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/cxx" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "C++ code generator for integrating `cxx` crate into a Cargo build."
} ,
{
"name" : "cxxbridge-flags" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.86" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/cxx" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Compiler configuration of the `cxx` crate (implementation detail)"
} ,
{
"name" : "cxxbridge-macro" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.86" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/cxx" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Implementation detail of the `cxx` crate."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "deadpool" ,
"version" : "0.9.5" ,
"authors" : "Michael P. Jung <michael.jung@terreon.de>" ,
"repository" : "https://github.com/bikeshedder/deadpool" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Dead simple async pool"
} ,
{
"name" : "deadpool-runtime" ,
"version" : "0.1.2" ,
"authors" : "Michael P. Jung <michael.jung@terreon.de>" ,
"repository" : "https://github.com/bikeshedder/deadpool" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Dead simple async pool utitities for sync managers"
} ,
2023-01-18 13:24:29 +01:00
{
"name" : "difflib" ,
"version" : "0.4.0" ,
"authors" : "Dima Kudosh <dimakudosh@gmail.com>" ,
"repository" : "https://github.com/DimaKudosh/difflib" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Port of Python's difflib library to Rust."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "digest" ,
2022-12-07 08:00:14 +01:00
"version" : "0.10.6" ,
2020-11-12 08:41:47 +01:00
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "Traits for cryptographic hash functions and message authentication codes"
2020-11-12 08:41:47 +01:00
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "displaydoc" ,
"version" : "0.2.3" ,
"authors" : "Jane Lusby <jlusby@yaah.dev>" ,
"repository" : "https://github.com/yaahc/displaydoc" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A derive macro for implementing the display Trait via a doc comment and string interpolation"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "doc-comment" ,
"version" : "0.3.3" ,
"authors" : "Guillaume Gomez <guillaume1.gomez@gmail.com>" ,
"repository" : "https://github.com/GuillaumeGomez/doc-comment" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Macro to generate doc comments"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "either" ,
2022-09-24 04:39:21 +02:00
"version" : "1.8.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/either" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The enum `Either` with variants `Left` and `Right` is a general purpose sum type with two cases."
} ,
{
"name" : "encoding_rs" ,
2022-09-24 04:39:21 +02:00
"version" : "0.8.31" ,
2020-11-12 08:41:47 +01:00
"authors" : "Henri Sivonen <hsivonen@hsivonen.fi>" ,
"repository" : "https://github.com/hsivonen/encoding_rs" ,
2022-09-24 04:39:21 +02:00
"license" : "(Apache-2.0 OR MIT) AND BSD-3-Clause" ,
"license_file" : null ,
2020-11-12 08:41:47 +01:00
"description" : "A Gecko-oriented implementation of the Encoding Standard"
} ,
{
"name" : "env_logger" ,
2022-12-07 08:00:14 +01:00
"version" : "0.10.0" ,
2022-09-24 04:39:21 +02:00
"authors" : null ,
2022-12-07 08:00:14 +01:00
"repository" : "https://github.com/rust-cli/env_logger/" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A logging implementation for `log` which is configured via an environment variable."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "errno" ,
"version" : "0.2.8" ,
"authors" : "Chris Wong <lambda.fairy@gmail.com>" ,
"repository" : "https://github.com/lambda-fairy/rust-errno" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Cross-platform interface to the `errno` variable."
} ,
{
"name" : "errno-dragonfly" ,
"version" : "0.1.2" ,
"authors" : "Michael Neumann <mneumann@ntecs.de>" ,
"repository" : "https://github.com/mneumann/errno-dragonfly-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Exposes errno functionality to stable Rust on DragonFlyBSD"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "event-listener" ,
"version" : "2.5.3" ,
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/event-listener" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Notify async tasks or threads"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "fallible-iterator" ,
"version" : "0.2.0" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-fallible-iterator" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fallible iterator traits"
} ,
{
"name" : "fallible-streaming-iterator" ,
"version" : "0.1.9" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/fallible-streaming-iterator" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fallible streaming iteration"
} ,
2022-01-15 05:59:43 +01:00
{
"name" : "fastrand" ,
2022-09-24 04:39:21 +02:00
"version" : "1.8.0" ,
2022-01-15 05:59:43 +01:00
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/smol-rs/fastrand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A simple and fast random number generator"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "fixedbitset" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss" ,
2022-01-15 05:59:43 +01:00
"repository" : "https://github.com/petgraph/fixedbitset" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "FixedBitSet is a simple bitset collection"
} ,
{
"name" : "flate2" ,
2022-12-07 08:00:14 +01:00
"version" : "1.0.25" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Josh Triplett <josh@joshtriplett.org>" ,
"repository" : "https://github.com/rust-lang/flate2-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "DEFLATE compression and decompression exposed as Read/BufRead/Write streams. Supports miniz_oxide and multiple zlib implementations. Supports zlib, gzip, and raw deflate streams."
2020-11-12 08:41:47 +01:00
} ,
{
"name" : "fluent" ,
2021-10-02 12:42:03 +02:00
"version" : "0.16.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Staś Małolepszy <stas@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A localization system designed to unleash the entire expressive power of natural language translations."
} ,
{
"name" : "fluent-bundle" ,
2021-10-26 00:16:40 +02:00
"version" : "0.15.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Staś Małolepszy <stas@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A localization system designed to unleash the entire expressive power of natural language translations."
} ,
{
"name" : "fluent-langneg" ,
"version" : "0.13.0" ,
"authors" : "Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-langneg-rs" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A library for language and locale negotiation."
} ,
{
"name" : "fluent-syntax" ,
2021-03-27 04:24:11 +01:00
"version" : "0.11.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Staś Małolepszy <stas@mozilla.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Parser/Serializer tools for Fluent Syntax."
} ,
{
"name" : "fnv" ,
"version" : "1.0.7" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/servo/rust-fnv" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Fowler– Noll– Vo hash function"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "foreign-types" ,
"version" : "0.3.2" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "A framework for Rust wrappers over C APIs"
} ,
{
"name" : "foreign-types-shared" ,
"version" : "0.1.1" ,
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/foreign-types" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "An internal crate used by foreign-types"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "form_urlencoded" ,
2022-09-24 04:39:21 +02:00
"version" : "1.1.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Parser and serializer for the application/x-www-form-urlencoded syntax, as used by HTML forms."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "forwarded-header-value" ,
"version" : "0.1.1" ,
"authors" : "James Brown <jbrown@easypost.com>" ,
"repository" : "https://github.com/EasyPost/rust-forwarded-header-value" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Parser for values from the Forwarded header (RFC 7239)"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "futf" ,
2022-02-25 07:30:59 +01:00
"version" : "0.1.5" ,
2021-02-06 04:42:38 +01:00
"authors" : "Keegan McAllister <kmcallister@mozilla.com>" ,
"repository" : "https://github.com/servo/futf" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Handling fragments of UTF-8"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "An implementation of futures and streams featuring zero allocations, composability, and iterator-like interfaces."
} ,
{
"name" : "futures-channel" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Channels for asynchronous communication using futures-rs."
} ,
{
"name" : "futures-core" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The core traits and types in for the `futures` library."
} ,
{
"name" : "futures-executor" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Executors for asynchronous tasks based on the futures-rs library."
} ,
{
"name" : "futures-io" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The `AsyncRead`, `AsyncWrite`, `AsyncSeek`, and `AsyncBufRead` traits for the futures-rs library."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "futures-lite" ,
"version" : "1.12.0" ,
"authors" : "Stjepan Glavina <stjepang@gmail.com>|Contributors to futures-rs" ,
"repository" : "https://github.com/smol-rs/futures-lite" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Futures, streams, and async I/O combinators"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures-macro" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The futures-rs procedural macro implementations."
} ,
{
"name" : "futures-sink" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The asynchronous `Sink` trait for the futures-rs library."
} ,
{
"name" : "futures-task" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Tools for working with tasks."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "futures-timer" ,
"version" : "3.0.2" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/async-rs/futures-timer" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Timeouts for futures."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "futures-util" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.25" ,
2021-12-03 11:04:47 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/rust-lang/futures-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Common utilities and extension traits for the futures-rs library."
} ,
{
"name" : "generic-array" ,
2022-09-24 04:39:21 +02:00
"version" : "0.14.6" ,
2020-11-12 08:41:47 +01:00
"authors" : "Bartłomiej Kamiński <fizyk20@gmail.com>|Aaron Trent <novacrazy@gmail.com>" ,
"repository" : "https://github.com/fizyk20/generic-array.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Generic types implementing functionality of arrays"
} ,
2021-02-06 06:02:40 +01:00
{
"name" : "getopts" ,
"version" : "0.2.21" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/getopts" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "getopts-like option parsing."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "getrandom" ,
"version" : "0.1.16" ,
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/getrandom" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A small cross-platform library for retrieving random data from system source"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "getrandom" ,
2022-12-07 08:00:14 +01:00
"version" : "0.2.8" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/getrandom" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A small cross-platform library for retrieving random data from system source"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "gimli" ,
2023-01-18 13:24:29 +01:00
"version" : "0.27.0" ,
2022-10-21 10:02:12 +02:00
"authors" : null ,
"repository" : "https://github.com/gimli-rs/gimli" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A library for reading and writing the DWARF debugging format."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "h2" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.15" ,
2020-11-12 08:41:47 +01:00
"authors" : "Carl Lerche <me@carllerche.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/h2" ,
"license" : "MIT" ,
"license_file" : null ,
2022-03-15 07:51:52 +01:00
"description" : "An HTTP/2 client and server"
2020-11-12 08:41:47 +01:00
} ,
2021-06-25 08:22:21 +02:00
{
"name" : "hashbrown" ,
2022-09-24 04:39:21 +02:00
"version" : "0.12.3" ,
2021-06-25 08:22:21 +02:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/rust-lang/hashbrown" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A Rust port of Google's SwissTable hash map"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "hashlink" ,
2022-09-24 04:39:21 +02:00
"version" : "0.8.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "kyren <kerriganw@gmail.com>" ,
"repository" : "https://github.com/kyren/hashlink" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "HashMap-like containers that hold their key-value pairs in a user controllable order"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "headers" ,
"version" : "0.3.8" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/headers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "typed HTTP headers"
} ,
{
"name" : "headers-core" ,
"version" : "0.2.0" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/headers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "typed HTTP headers core trait"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "heck" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Without Boats <woboats@gmail.com>" ,
"repository" : "https://github.com/withoutboats/heck" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "heck is a case conversion library."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "hermit-abi" ,
"version" : "0.2.6" ,
"authors" : "Stefan Lankes" ,
"repository" : "https://github.com/hermitcore/rusty-hermit" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "hermit-abi is small interface to call functions from the unikernel RustyHermit. It is used to build the target `x86_64-unknown-hermit`."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "hex" ,
2021-03-07 10:04:34 +01:00
"version" : "0.4.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "KokaKiwi <kokakiwi@kokakiwi.net>" ,
"repository" : "https://github.com/KokaKiwi/rust-hex" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Encoding and decoding data into/from hexadecimal representation."
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "hmac" ,
"version" : "0.12.1" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/MACs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Generic implementation of Hash-based Message Authentication Code (HMAC)"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "html5ever" ,
2022-09-24 04:39:21 +02:00
"version" : "0.26.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "The html5ever Project Developers" ,
"repository" : "https://github.com/servo/html5ever" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "High-performance browser-grade HTML5 parser"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "htmlescape" ,
"version" : "0.3.1" ,
"authors" : "Viktor Dahl <pazaconyoman@gmail.com>" ,
"repository" : "https://github.com/veddan/rust-htmlescape" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT OR MPL-2.0" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library for HTML entity encoding and decoding"
} ,
{
"name" : "http" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.8" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Carl Lerche <me@carllerche.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/http" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A set of types for representing HTTP requests and responses."
} ,
{
"name" : "http-body" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.5" ,
2020-11-12 08:41:47 +01:00
"authors" : "Carl Lerche <me@carllerche.com>|Lucio Franco <luciofranco14@gmail.com>|Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/http-body" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Trait representing an asynchronous, streaming, HTTP request or response body."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "http-range-header" ,
"version" : "0.3.0" ,
"authors" : null ,
"repository" : "https://github.com/MarcusGrass/parse-range-headers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "No-dep range header parser"
} ,
{
"name" : "http-types" ,
"version" : "2.12.0" ,
"authors" : "Yoshua Wuyts <yoshuawuyts@gmail.com>" ,
"repository" : "https://github.com/http-rs/http-types" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Common types for HTTP operations."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "httparse" ,
2022-09-24 04:39:21 +02:00
"version" : "1.8.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/httparse" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A tiny, safe, speedy, zero-copy HTTP/1.x parser."
} ,
{
"name" : "httpdate" ,
2021-11-18 11:54:00 +01:00
"version" : "1.0.2" ,
2021-04-27 14:18:12 +02:00
"authors" : "Pyfisch <pyfisch@posteo.org>" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/pyfisch/httpdate" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "HTTP date parsing and formatting"
} ,
{
"name" : "humantime" ,
2021-02-03 11:29:48 +01:00
"version" : "2.1.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Paul Colomiets <paul@colomiets.name>" ,
"repository" : "https://github.com/tailhook/humantime" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A parser and formatter for std::time::{Duration, SystemTime}"
} ,
{
"name" : "hyper" ,
2022-12-07 08:00:14 +01:00
"version" : "0.14.23" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/hyper" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A fast and correct HTTP library."
} ,
{
"name" : "hyper-rustls" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.23.2" ,
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/ctz/hyper-rustls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR ISC OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Rustls+hyper integration for pure rust HTTPS"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "hyper-tls" ,
2021-04-27 14:18:12 +02:00
"version" : "0.5.0" ,
2020-11-15 05:02:53 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/hyper-tls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "Default TLS implementation for use with hyper"
} ,
2022-09-24 04:39:21 +02:00
{
"name" : "iana-time-zone" ,
2022-12-07 08:00:14 +01:00
"version" : "0.1.53" ,
"authors" : "Andrew Straw <strawman@astraw.com>|René Kijewski <rene.kijewski@fu-berlin.de>|Ryan Lopopolo <rjl@hyperbo.la>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/strawlab/iana-time-zone" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "get the IANA time zone for the current system"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "iana-time-zone-haiku" ,
"version" : "0.1.1" ,
"authors" : "René Kijewski <crates.io@k6i.de>" ,
"repository" : "https://github.com/strawlab/iana-time-zone" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "iana-time-zone support crate for Haiku OS"
} ,
2022-02-10 00:55:43 +01:00
{
"name" : "id_tree" ,
"version" : "1.8.0" ,
"authors" : "Ian Burns <iwburns8@gmail.com>" ,
"repository" : "https://github.com/iwburns/id-tree" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A library for creating and modifying Tree structures."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "idna" ,
2022-09-24 04:39:21 +02:00
"version" : "0.3.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url/" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "IDNA (Internationalizing Domain Names in Applications) and Punycode."
} ,
{
"name" : "indexmap" ,
2022-12-07 08:00:14 +01:00
"version" : "1.9.2" ,
2022-09-24 04:39:21 +02:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/bluss/indexmap" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "A hash table with consistent order and fast iteration."
2020-11-12 08:41:47 +01:00
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "infer" ,
"version" : "0.2.3" ,
"authors" : "Bojan <dbojan@gmail.com>" ,
"repository" : "https://github.com/bojand/infer" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Small crate to infer file types based on its magic number signature"
} ,
2021-03-26 00:40:41 +01:00
{
"name" : "inflections" ,
"version" : "1.1.1" ,
"authors" : "Caleb Meredith <calebmeredith8@gmail.com>" ,
"repository" : "https://docs.rs/inflections" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "High performance inflection transformation library for changing properties of words like the case."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "instant" ,
2021-10-26 00:16:40 +02:00
"version" : "0.1.12" ,
2020-11-12 08:41:47 +01:00
"authors" : "sebcrozet <developer@crozet.re>" ,
"repository" : "https://github.com/sebcrozet/instant" ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : "A partial replacement for std::time::Instant that works on WASM too."
} ,
{
"name" : "intl-memoizer" ,
2021-02-03 11:29:48 +01:00
"version" : "0.5.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/projectfluent/fluent-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A memoizer specifically tailored for storing lazy-initialized intl formatters."
} ,
{
"name" : "intl_pluralrules" ,
2022-12-07 08:00:14 +01:00
"version" : "7.0.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Kekoa Riggin <kekoariggin@gmail.com>|Zibi Braniecki <zbraniecki@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/pluralrules" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Unicode Plural Rules categorizer for numeric input."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "io-lifetimes" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.4" ,
2022-12-07 08:00:14 +01:00
"authors" : "Dan Gohman <dev@sunfishcode.online>" ,
"repository" : "https://github.com/sunfishcode/io-lifetimes" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "A low-level I/O ownership and borrowing library"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ipnet" ,
2023-01-18 13:24:29 +01:00
"version" : "2.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Kris Price <kris@krisprice.nz>" ,
"repository" : "https://github.com/krisprice/ipnet" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Provides types and useful methods for working with IPv4 and IPv6 network addresses, commonly called IP prefixes. The new `IpNet`, `Ipv4Net`, and `Ipv6Net` types build on the existing `IpAddr`, `Ipv4Addr`, and `Ipv6Addr` types already provided in Rust's standard library and align to their design to stay consistent. The module also provides useful traits that extend `Ipv4Addr` and `Ipv6Addr` with methods for `Add`, `Sub`, `BitAnd`, and `BitOr` operations. The module only uses stable feature so it is guaranteed to compile using the stable toolchain."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "is-terminal" ,
2023-01-18 13:24:29 +01:00
"version" : "0.4.2" ,
2022-12-07 08:00:14 +01:00
"authors" : "softprops <d.tangren@gmail.com>|Dan Gohman <dev@sunfishcode.online>" ,
"repository" : "https://github.com/sunfishcode/is-terminal" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Test whether a given stream is a terminal"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "itertools" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.5" ,
2021-06-25 07:35:25 +02:00
"authors" : "bluss" ,
"repository" : "https://github.com/rust-itertools/itertools" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Extra iterator adaptors, iterator methods, free functions, and macros."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "itoa" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.5" ,
2022-01-15 05:59:43 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/itoa" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Fast integer primitive to string conversion"
} ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
{
"name" : "jobserver" ,
2022-09-24 04:39:21 +02:00
"version" : "0.1.25" ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/jobserver-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An implementation of the GNU make jobserver for Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "js-sys" ,
2022-09-24 04:39:21 +02:00
"version" : "0.3.60" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings for all JS global objects and functions in all JS environments like Node.js and browsers, built on `#[wasm_bindgen]` using the `wasm-bindgen` crate."
} ,
{
"name" : "lazy_static" ,
"version" : "1.4.0" ,
"authors" : "Marvin Löbel <loebel.marvin@gmail.com>" ,
"repository" : "https://github.com/rust-lang-nursery/lazy-static.rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A macro for declaring lazily evaluated statics in Rust."
} ,
{
"name" : "libc" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.2.139" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/libc" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Raw FFI bindings to platform libraries like libc."
} ,
{
"name" : "libsqlite3-sys" ,
2022-12-07 08:00:14 +01:00
"version" : "0.25.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rusqlite developers" ,
"repository" : "https://github.com/rusqlite/rusqlite" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Native bindings to the libsqlite3 library"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "link-cplusplus" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.8" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/link-cplusplus" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Link libstdc++ or libc++ automatically or manually"
} ,
{
"name" : "linux-raw-sys" ,
2023-01-18 13:24:29 +01:00
"version" : "0.1.4" ,
2022-12-07 08:00:14 +01:00
"authors" : "Dan Gohman <dev@sunfishcode.online>" ,
"repository" : "https://github.com/sunfishcode/linux-raw-sys" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Generated bindings for Linux's userspace API"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "lock_api" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.9" ,
2020-11-12 08:41:47 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/parking_lot" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Wrappers to create fully-featured Mutex and RwLock types. Compatible with no_std."
} ,
{
"name" : "log" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.17" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/log" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A lightweight logging facade for Rust"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "mac" ,
"version" : "0.1.1" ,
"authors" : "Jonathan Reem <jonathan.reem@gmail.com>" ,
"repository" : "https://github.com/reem/rust-mac.git" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A collection of great and ubiqutitous macros."
} ,
{
"name" : "maplit" ,
"version" : "1.0.2" ,
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/maplit" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Collection “literal” macros for HashMap, HashSet, BTreeMap, and BTreeSet."
} ,
{
"name" : "markup5ever" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "The html5ever Project Developers" ,
"repository" : "https://github.com/servo/html5ever" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Common code for xml5ever and html5ever"
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "matchers" ,
"version" : "0.1.0" ,
"authors" : "Eliza Weisman <eliza@buoyant.io>" ,
"repository" : "https://github.com/hawkw/matchers" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Regex matching on character and byte streams."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "matches" ,
2021-10-02 12:42:03 +02:00
"version" : "0.1.9" ,
2020-11-12 08:41:47 +01:00
"authors" : "Simon Sapin <simon.sapin@exyr.org>" ,
"repository" : "https://github.com/SimonSapin/rust-std-candidates" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A macro to evaluate, as a boolean, whether an expression matches a pattern."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "matchit" ,
"version" : "0.7.0" ,
"authors" : "Ibraheem Ahmed <ibraheem@ibraheem.ca>" ,
"repository" : "https://github.com/ibraheemdev/matchit" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A blazing fast URL router."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "memchr" ,
2022-09-24 04:39:21 +02:00
"version" : "2.5.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>|bluss" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/BurntSushi/memchr" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Safe interface to memchr."
} ,
{
"name" : "mime" ,
"version" : "0.3.16" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/hyperium/mime" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Strongly Typed Mimes"
} ,
{
"name" : "mime_guess" ,
2022-02-25 07:30:59 +01:00
"version" : "2.0.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Austin Bonander <austin.bonander@gmail.com>" ,
"repository" : "https://github.com/abonander/mime_guess" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A simple crate for detection of a file's MIME type by its extension."
} ,
2021-10-02 12:42:03 +02:00
{
"name" : "minimal-lexical" ,
2021-11-18 11:54:00 +01:00
"version" : "0.2.1" ,
2021-10-02 12:42:03 +02:00
"authors" : "Alex Huszagh <ahuszagh@gmail.com>" ,
"repository" : "https://github.com/Alexhuszagh/minimal-lexical" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Fast float parsing conversion routines."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "miniz_oxide" ,
"version" : "0.6.2" ,
"authors" : "Frommi <daniil.liferenko@gmail.com>|oyvindln <oyvindln@users.noreply.github.com>" ,
"repository" : "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide" ,
"license" : "Apache-2.0 OR MIT OR Zlib" ,
"license_file" : null ,
"description" : "DEFLATE compression and decompression library rewritten in Rust based on miniz"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "mio" ,
2022-12-07 08:00:14 +01:00
"version" : "0.8.5" ,
2021-04-27 14:18:12 +02:00
"authors" : "Carl Lerche <me@carllerche.com>|Thomas de Zeeuw <thomasdezeeuw@gmail.com>|Tokio Contributors <team@tokio.rs>" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/tokio-rs/mio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Lightweight non-blocking IO"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "multer" ,
"version" : "2.0.4" ,
"authors" : "Rousan Ali <hello@rousan.io>" ,
"repository" : "https://github.com/rousan/multer-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An async parser for `multipart/form-data` content-type in Rust."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "multimap" ,
2021-03-27 05:47:16 +01:00
"version" : "0.8.3" ,
2020-11-12 08:41:47 +01:00
"authors" : "Håvar Nøvik <havar.novik@gmail.com>" ,
"repository" : "https://github.com/havarnov/multimap" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A multimap implementation."
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "native-tls" ,
2022-12-07 08:00:14 +01:00
"version" : "0.2.11" ,
2020-11-15 05:02:53 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-native-tls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-15 05:02:53 +01:00
"license_file" : null ,
"description" : "A wrapper over a platform's native TLS implementation"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "new_debug_unreachable" ,
"version" : "1.0.4" ,
"authors" : "Matt Brubeck <mbrubeck@limpet.net>|Jonathan Reem <jonathan.reem@gmail.com>" ,
"repository" : "https://github.com/mbrubeck/rust-debug-unreachable" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "panic in debug, intrinsics::unreachable() in release (fork of debug_unreachable)"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "nom" ,
2023-01-18 13:24:29 +01:00
"version" : "7.1.3" ,
2021-06-25 07:35:25 +02:00
"authors" : "contact@geoffroycouprie.com" ,
"repository" : "https://github.com/Geal/nom" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A byte-oriented, zero-copy, parser combinators library"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "nonempty" ,
"version" : "0.7.0" ,
"authors" : "Alexis Sellier <self@cloudhead.io>" ,
"repository" : "https://github.com/cloudhead/nonempty" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Correct by construction non-empty vector"
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "nu-ansi-term" ,
"version" : "0.46.0" ,
"authors" : "ogham@bsago.me|Ryan Scheel (Havvy) <ryan.havvy@gmail.com>|Josh Triplett <josh@joshtriplett.org>|The Nushell Project Developers" ,
"repository" : "https://github.com/nushell/nu-ansi-term" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Library for ANSI terminal colors and styles (bold, underline)"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "num-format" ,
2022-12-07 08:00:14 +01:00
"version" : "0.4.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Brian Myers <brian.carl.myers@gmail.com>" ,
"repository" : "https://github.com/bcmyers/num-format" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A Rust crate for producing string-representations of numbers, formatted according to international standards"
} ,
{
"name" : "num-integer" ,
2022-09-24 04:39:21 +02:00
"version" : "0.1.45" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-num/num-integer" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Integer traits and functions"
} ,
{
"name" : "num-traits" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.15" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-num/num-traits" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Numeric traits for generic mathematics"
} ,
{
"name" : "num_cpus" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.15.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/num_cpus" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Get the number of CPUs on a machine."
} ,
{
"name" : "num_enum" ,
2022-03-15 07:51:52 +01:00
"version" : "0.5.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "Daniel Wagner-Hall <dawagner@gmail.com>|Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>|Vincent Esche <regexident@gmail.com>" ,
"repository" : "https://github.com/illicitonion/num_enum" ,
2022-01-15 05:59:43 +01:00
"license" : "Apache-2.0 OR BSD-3-Clause OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Procedural macros to make inter-operation between primitives and enums easier."
} ,
{
"name" : "num_enum_derive" ,
2022-03-15 07:51:52 +01:00
"version" : "0.5.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "Daniel Wagner-Hall <dawagner@gmail.com>|Daniel Henry-Mantilla <daniel.henry.mantilla@gmail.com>|Vincent Esche <regexident@gmail.com>" ,
"repository" : "https://github.com/illicitonion/num_enum" ,
2022-01-15 05:59:43 +01:00
"license" : "Apache-2.0 OR BSD-3-Clause OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Internal implementation details for ::num_enum (Procedural macros to make inter-operation between primitives and enums easier)"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "object" ,
2023-01-18 13:24:29 +01:00
"version" : "0.30.2" ,
2022-10-21 10:02:12 +02:00
"authors" : null ,
"repository" : "https://github.com/gimli-rs/object" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A unified interface for reading and writing object file formats."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "once_cell" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.17.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Aleksey Kladov <aleksey.kladov@gmail.com>" ,
"repository" : "https://github.com/matklad/once_cell" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Single assignment cells and lazy values."
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "opaque-debug" ,
"version" : "0.3.0" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/utils" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Macro for opaque Debug trait implementation"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "openssl" ,
2022-12-23 07:03:43 +01:00
"version" : "0.10.45" ,
2020-11-15 05:02:53 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-openssl" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "OpenSSL bindings"
} ,
2022-09-24 04:39:21 +02:00
{
"name" : "openssl-macros" ,
"version" : "0.1.0" ,
"authors" : null ,
"repository" : null ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Internal macros used by the openssl crate."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "openssl-probe" ,
2022-01-15 05:59:43 +01:00
"version" : "0.1.5" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/openssl-probe" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Tool for helping to find SSL certificate locations on the system for OpenSSL"
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "openssl-sys" ,
2022-12-23 07:03:43 +01:00
"version" : "0.9.80" ,
2020-11-15 05:02:53 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-openssl" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "FFI bindings to OpenSSL"
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "overload" ,
"version" : "0.1.1" ,
"authors" : "Daniel Salvadori <danaugrs@gmail.com>" ,
"repository" : "https://github.com/danaugrs/overload" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provides a macro to simplify operator overloading."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "parking" ,
"version" : "2.0.0" ,
"authors" : "Stjepan Glavina <stjepang@gmail.com>|The Rust Project Developers" ,
"repository" : "https://github.com/stjepang/parking" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Thread parking and unparking"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "parking_lot" ,
2022-09-24 04:39:21 +02:00
"version" : "0.12.1" ,
2022-02-28 01:28:39 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/parking_lot" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "More compact and efficient implementations of the standard synchronization primitives."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "parking_lot_core" ,
2023-01-18 13:24:29 +01:00
"version" : "0.9.6" ,
2022-02-28 01:28:39 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/parking_lot" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An advanced API for creating custom synchronization primitives."
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "password-hash" ,
"version" : "0.4.2" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/traits/tree/master/password-hash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Traits which describe the functionality of password hashing algorithms, as well as a `no_std`-friendly implementation of the PHC string format (a well-defined subset of the Modular Crypt Format a.k.a. MCF)"
} ,
{
"name" : "pbkdf2" ,
"version" : "0.11.0" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/password-hashes/tree/master/pbkdf2" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Generic implementation of PBKDF2"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "percent-encoding" ,
2022-09-24 04:39:21 +02:00
"version" : "2.2.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url/" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Percent encoding and decoding"
} ,
{
"name" : "petgraph" ,
2022-09-24 04:39:21 +02:00
"version" : "0.6.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "bluss|mitchmindtree" ,
"repository" : "https://github.com/petgraph/petgraph" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Graph data structure library. Provides graph types and graph algorithms."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "phf" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.1" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Runtime support for perfect hash function data structures"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "phf" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.1" ,
2021-06-25 07:35:25 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-06-25 07:35:25 +02:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Runtime support for perfect hash function data structures"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "phf_codegen" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Codegen library for PHF types"
} ,
{
"name" : "phf_generator" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "PHF generation logic"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "phf_generator" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.1" ,
2021-06-25 07:35:25 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-06-25 07:35:25 +02:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "PHF generation logic"
} ,
2021-07-23 11:39:40 +02:00
{
"name" : "phf_macros" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.1" ,
2021-07-23 11:39:40 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-03-26 00:40:41 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Macros to generate types in the phf crate"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "phf_shared" ,
2022-09-24 04:39:21 +02:00
"version" : "0.10.0" ,
2021-02-06 04:42:38 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
"repository" : "https://github.com/sfackler/rust-phf" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Support code shared by PHF libraries"
} ,
2021-06-25 07:35:25 +02:00
{
"name" : "phf_shared" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.1" ,
2021-06-25 07:35:25 +02:00
"authors" : "Steven Fackler <sfackler@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/rust-phf/rust-phf" ,
2021-06-25 07:35:25 +02:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Support code shared by PHF libraries"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "pin-project" ,
2022-09-24 04:39:21 +02:00
"version" : "1.0.12" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/taiki-e/pin-project" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A crate for safe and ergonomic pin-projection."
} ,
{
"name" : "pin-project-internal" ,
2022-09-24 04:39:21 +02:00
"version" : "1.0.12" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/taiki-e/pin-project" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Implementation detail of the `pin-project` crate."
} ,
2020-11-24 07:57:37 +01:00
{
"name" : "pin-project-lite" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.9" ,
2022-01-15 05:59:43 +01:00
"authors" : null ,
2020-11-24 07:57:37 +01:00
"repository" : "https://github.com/taiki-e/pin-project-lite" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A lightweight version of pin-project written with declarative macros."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "pin-utils" ,
"version" : "0.1.0" ,
"authors" : "Josef Brandl <mail@josefbrandl.de>" ,
"repository" : "https://github.com/rust-lang-nursery/pin-utils" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Utilities for pinning"
} ,
{
"name" : "pkg-config" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.26" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/rust-lang/pkg-config-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library to run the pkg-config system tool at build time in order to be used in Cargo build scripts."
} ,
{
"name" : "ppv-lite86" ,
2022-12-07 08:00:14 +01:00
"version" : "0.2.17" ,
2020-11-12 08:41:47 +01:00
"authors" : "The CryptoCorrosion Contributors" ,
"repository" : "https://github.com/cryptocorrosion/cryptocorrosion" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Implementation of the crypto-simd API for x86"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "precomputed-hash" ,
"version" : "0.1.1" ,
"authors" : "Emilio Cobos Álvarez <emilio@crisal.io>" ,
"repository" : "https://github.com/emilio/precomputed-hash" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A library intending to be a base dependency to expose a precomputed hash"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "prettyplease" ,
2023-01-18 13:24:29 +01:00
"version" : "0.1.23" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/prettyplease" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A minimal `syn` syntax tree pretty-printer"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "proc-macro-crate" ,
2022-09-24 04:39:21 +02:00
"version" : "1.2.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Bastian Köcher <git@kchr.de>" ,
"repository" : "https://github.com/bkchr/proc-macro-crate" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Replacement for crate (macro_rules keyword) in proc-macros"
} ,
{
"name" : "proc-macro-hack" ,
2023-01-18 13:24:29 +01:00
"version" : "0.5.20+deprecated" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/proc-macro-hack" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Procedural macros in expression position"
} ,
{
"name" : "proc-macro2" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.50" ,
2021-11-18 11:54:00 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>|Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/dtolnay/proc-macro2" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case."
} ,
{
"name" : "prost" ,
2023-01-18 13:24:29 +01:00
"version" : "0.11.6" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
{
"name" : "prost-build" ,
2023-01-18 13:24:29 +01:00
"version" : "0.11.6" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com>|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
{
"name" : "prost-derive" ,
2023-01-18 13:24:29 +01:00
"version" : "0.11.6" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com>|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
{
"name" : "prost-types" ,
2023-01-18 13:24:29 +01:00
"version" : "0.11.6" ,
2022-09-24 04:39:21 +02:00
"authors" : "Dan Burkert <dan@danburkert.com>|Lucio Franco <luciofranco14@gmail.com|Tokio Contributors <team@tokio.rs>" ,
2021-10-02 12:42:03 +02:00
"repository" : "https://github.com/tokio-rs/prost" ,
2020-11-12 08:41:47 +01:00
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A Protocol Buffers implementation for the Rust Language."
} ,
2021-02-06 06:02:40 +01:00
{
"name" : "pulldown-cmark" ,
2022-09-24 04:39:21 +02:00
"version" : "0.9.2" ,
2021-02-06 06:02:40 +01:00
"authors" : "Raph Levien <raph.levien@gmail.com>|Marcus Klaas de Vries <mail@marcusklaas.nl>" ,
"repository" : "https://github.com/raphlinus/pulldown-cmark" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A pull parser for CommonMark"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "quote" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.23" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/quote" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Quasi-quoting macro quote!(...)"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "rand" ,
"version" : "0.7.3" ,
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Random number generators and other randomness functionality."
} ,
2021-02-03 11:29:48 +01:00
{
"name" : "rand" ,
2022-02-25 07:30:59 +01:00
"version" : "0.8.5" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Random number generators and other randomness functionality."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "rand_chacha" ,
"version" : "0.2.2" ,
"authors" : "The Rand Project Developers|The Rust Project Developers|The CryptoCorrosion Contributors" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "ChaCha random number generator"
} ,
2021-02-03 11:29:48 +01:00
{
"name" : "rand_chacha" ,
2021-06-16 08:10:57 +02:00
"version" : "0.3.1" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers|The Rust Project Developers|The CryptoCorrosion Contributors" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "ChaCha random number generator"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "rand_core" ,
"version" : "0.5.1" ,
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core random number generator traits and tools for implementation."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "rand_core" ,
2022-09-24 04:39:21 +02:00
"version" : "0.6.4" ,
2021-02-03 11:29:48 +01:00
"authors" : "The Rand Project Developers|The Rust Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Core random number generator traits and tools for implementation."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "rand_hc" ,
"version" : "0.2.0" ,
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "HC128 random number generator"
} ,
{
"name" : "rand_pcg" ,
"version" : "0.2.1" ,
"authors" : "The Rand Project Developers" ,
"repository" : "https://github.com/rust-random/rand" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Selected PCG random number generators"
} ,
2021-03-10 03:14:48 +01:00
{
"name" : "redox_syscall" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.16" ,
2021-02-03 11:29:48 +01:00
"authors" : "Jeremy Soller <jackpot51@gmail.com>" ,
"repository" : "https://gitlab.redox-os.org/redox-os/syscall" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A Rust library to access raw Redox system calls"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "regex" ,
2023-01-18 13:24:29 +01:00
"version" : "1.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/regex" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "An implementation of regular expressions for Rust. This implementation uses finite automata and guarantees linear time matching on all inputs."
} ,
2022-06-01 12:26:16 +02:00
{
"name" : "regex-automata" ,
"version" : "0.1.10" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/regex-automata" ,
"license" : "MIT OR Unlicense" ,
"license_file" : null ,
"description" : "Automata construction and matching using regular expressions."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "regex-syntax" ,
2022-12-07 08:00:14 +01:00
"version" : "0.6.28" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang/regex" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A regular expression parser."
} ,
{
"name" : "remove_dir_all" ,
"version" : "0.5.3" ,
"authors" : "Aaronepower <theaaronepower@gmail.com>" ,
"repository" : "https://github.com/XAMPPRocky/remove_dir_all.git" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A safe, reliable implementation of remove_dir_all for Windows"
} ,
{
"name" : "reqwest" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.11.13" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/reqwest" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "higher level HTTP client library"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "retain_mut" ,
"version" : "0.1.9" ,
"authors" : "Xidorn Quan <me@upsuper.org>" ,
"repository" : "https://github.com/upsuper/retain_mut" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provide retain_mut method that has the same functionality as retain but gives mutable borrow to the predicate."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ring" ,
2021-02-03 11:29:48 +01:00
"version" : "0.16.20" ,
2020-11-12 08:41:47 +01:00
"authors" : "Brian Smith <brian@briansmith.org>" ,
"repository" : "https://github.com/briansmith/ring" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "Safe, fast, small crypto using Rust."
} ,
{
"name" : "rusqlite" ,
2022-09-24 04:39:21 +02:00
"version" : "0.28.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rusqlite developers" ,
"repository" : "https://github.com/rusqlite/rusqlite" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Ergonomic wrapper for SQLite"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "rustc-demangle" ,
"version" : "0.1.21" ,
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
"repository" : "https://github.com/alexcrichton/rustc-demangle" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust compiler symbol demangling."
} ,
2021-02-03 11:29:48 +01:00
{
"name" : "rustc-hash" ,
"version" : "1.1.0" ,
"authors" : "The Rust Project Developers" ,
"repository" : "https://github.com/rust-lang-nursery/rustc-hash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "speed, non-cryptographic hash used in rustc"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "rustix" ,
2023-01-18 13:24:29 +01:00
"version" : "0.36.6" ,
2022-12-07 08:00:14 +01:00
"authors" : "Dan Gohman <dev@sunfishcode.online>|Jakub Konka <kubkon@jakubkonka.com>" ,
"repository" : "https://github.com/bytecodealliance/rustix" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Safe Rust bindings to POSIX/Unix/Linux/Winsock2-like syscalls"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "rustls" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.20.8" ,
"authors" : null ,
"repository" : "https://github.com/rustls/rustls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR ISC OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Rustls is a modern TLS library written in Rust."
} ,
2021-06-18 10:15:41 +02:00
{
"name" : "rustls-native-certs" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.6.2" ,
2021-06-18 10:15:41 +02:00
"authors" : "Joseph Birr-Pixton <jpixton@gmail.com>" ,
"repository" : "https://github.com/ctz/rustls-native-certs" ,
"license" : "Apache-2.0 OR ISC OR MIT" ,
"license_file" : null ,
"description" : "rustls-native-certs allows rustls to use the platform native certificate store"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "rustls-pemfile" ,
"version" : "1.0.2" ,
"authors" : null ,
"repository" : "https://github.com/rustls/pemfile" ,
"license" : "Apache-2.0 OR ISC OR MIT" ,
"license_file" : null ,
"description" : "Basic .pem file parser for keys and certificates"
} ,
2021-10-02 12:42:03 +02:00
{
"name" : "rustversion" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.11" ,
2021-10-02 12:42:03 +02:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/rustversion" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Conditional compilation according to rustc compiler version"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "ryu" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.12" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/ryu" ,
"license" : "Apache-2.0 OR BSL-1.0" ,
"license_file" : null ,
"description" : "Fast floating point to string conversion"
} ,
{
"name" : "schannel" ,
2023-01-18 13:24:29 +01:00
"version" : "0.1.21" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>|Steffen Butzer <steffen.butzer@outlook.com>" ,
"repository" : "https://github.com/steffengy/schannel-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Schannel bindings for rust, allowing SSL/TLS (e.g. https) without openssl"
} ,
{
"name" : "scopeguard" ,
"version" : "1.1.0" ,
"authors" : "bluss" ,
"repository" : "https://github.com/bluss/scopeguard" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A RAII scope guard that will run a given closure when it goes out of scope, even if the code between panics (assuming unwinding panic). Defines the macros `defer!`, `defer_on_unwind!`, `defer_on_success!` as shorthands for guards with one of the implemented strategies."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "scratch" ,
2023-01-18 13:24:29 +01:00
"version" : "1.0.3" ,
2022-12-07 08:00:14 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/scratch" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Compile-time temporary directory shared by multiple crates and erased by `cargo clean`"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "sct" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.7.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Joseph Birr-Pixton <jpixton@gmail.com>" ,
"repository" : "https://github.com/ctz/sct.rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR ISC OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Certificate transparency SCT verification library"
} ,
{
"name" : "security-framework" ,
2022-09-24 04:39:21 +02:00
"version" : "2.7.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>|Kornel <kornel@geekhood.net>" ,
"repository" : "https://github.com/kornelski/rust-security-framework" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Security.framework bindings for macOS and iOS"
} ,
{
"name" : "security-framework-sys" ,
2022-02-25 07:30:59 +01:00
"version" : "2.6.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Fackler <sfackler@gmail.com>|Kornel <kornel@geekhood.net>" ,
"repository" : "https://github.com/kornelski/rust-security-framework" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Apple `Security.framework` low-level FFI bindings"
} ,
2021-10-26 00:16:40 +02:00
{
"name" : "self_cell" ,
2021-12-03 11:04:47 +01:00
"version" : "0.10.2" ,
2021-10-26 00:16:40 +02:00
"authors" : "Lukas Bergdoll <lukas.bergdoll@gmail.com>" ,
"repository" : "https://github.com/Voultapher/self_cell" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "Safe-to-use proc-macro-free self-referential structs in stable Rust."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "serde" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.152" ,
2020-11-12 08:41:47 +01:00
"authors" : "Erick Tryzelaar <erick.tryzelaar@gmail.com>|David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/serde-rs/serde" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A generic serialization/deserialization framework"
} ,
{
"name" : "serde-aux" ,
2022-12-07 08:00:14 +01:00
"version" : "4.1.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Victor Polevoy <maintainer@vpolevoy.com>" ,
"repository" : "https://github.com/vityafx/serde-aux" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A serde crate's auxiliary library"
} ,
{
"name" : "serde_derive" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.152" ,
2020-11-12 08:41:47 +01:00
"authors" : "Erick Tryzelaar <erick.tryzelaar@gmail.com>|David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/serde-rs/serde" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]"
} ,
{
"name" : "serde_json" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.91" ,
2020-11-12 08:41:47 +01:00
"authors" : "Erick Tryzelaar <erick.tryzelaar@gmail.com>|David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/serde-rs/json" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A JSON serialization file format"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "serde_path_to_error" ,
"version" : "0.1.9" ,
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/path-to-error" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Path to the element that failed to deserialize"
} ,
{
"name" : "serde_qs" ,
"version" : "0.8.5" ,
"authors" : "Sam Scott <sam@osohq.com>" ,
"repository" : "https://github.com/samscott89/serde_qs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Querystrings for Serde"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "serde_repr" ,
2023-01-18 13:24:29 +01:00
"version" : "0.1.10" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/serde-repr" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Derive Serialize and Deserialize that delegates to the underlying repr of a C-like enum."
} ,
{
"name" : "serde_tuple" ,
"version" : "0.5.0" ,
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/serde_tuple" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "De/serialize structs with named fields as array of values"
} ,
{
"name" : "serde_tuple_macros" ,
"version" : "0.5.0" ,
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/serde_tuple" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "De/serialize structs with named fields as array of values"
} ,
{
"name" : "serde_urlencoded" ,
2022-02-25 07:30:59 +01:00
"version" : "0.7.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Anthony Ramine <n.oxyde@gmail.com>" ,
"repository" : "https://github.com/nox/serde_urlencoded" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "`x-www-form-urlencoded` meets Serde"
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "sha1" ,
"version" : "0.10.5" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/hashes" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "SHA-1 hash function"
} ,
{
"name" : "sha2" ,
"version" : "0.10.6" ,
"authors" : "RustCrypto Developers" ,
"repository" : "https://github.com/RustCrypto/hashes" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Pure Rust implementation of the SHA-2 hash function family including SHA-224, SHA-256, SHA-384, and SHA-512."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "sharded-slab" ,
"version" : "0.1.4" ,
"authors" : "Eliza Weisman <eliza@buoyant.io>" ,
"repository" : "https://github.com/hawkw/sharded-slab" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A lock-free concurrent slab."
} ,
2021-12-20 06:04:19 +01:00
{
"name" : "signal-hook-registry" ,
"version" : "1.4.0" ,
"authors" : "Michal 'vorner' Vaner <vorner@vorner.cz>|Masaki Hara <ackie.h.gmai@gmail.com>" ,
"repository" : "https://github.com/vorner/signal-hook" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Backend crate for signal-hook"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "siphasher" ,
2022-03-15 07:51:52 +01:00
"version" : "0.3.10" ,
2021-02-06 04:42:38 +01:00
"authors" : "Frank Denis <github@pureftpd.org>" ,
"repository" : "https://github.com/jedisct1/rust-siphash" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "SipHash-2-4, SipHash-1-3 and 128-bit variants in pure Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "slab" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.7" ,
2020-11-12 08:41:47 +01:00
"authors" : "Carl Lerche <me@carllerche.com>" ,
2021-04-27 14:18:12 +02:00
"repository" : "https://github.com/tokio-rs/slab" ,
2020-11-12 08:41:47 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Pre-allocated storage for a uniform data type"
} ,
{
"name" : "smallvec" ,
2022-12-07 08:00:14 +01:00
"version" : "1.10.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/rust-smallvec" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "'Small vector' optimization: store up to a small number of items on the stack"
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "snafu" ,
2023-01-18 13:24:29 +01:00
"version" : "0.7.4" ,
2022-10-21 10:02:12 +02:00
"authors" : "Jake Goulding <jake.goulding@gmail.com>" ,
"repository" : "https://github.com/shepmaster/snafu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An ergonomic error handling library"
} ,
{
"name" : "snafu-derive" ,
2023-01-18 13:24:29 +01:00
"version" : "0.7.4" ,
2022-10-21 10:02:12 +02:00
"authors" : "Jake Goulding <jake.goulding@gmail.com>" ,
"repository" : "https://github.com/shepmaster/snafu" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "An ergonomic error handling library"
} ,
2022-02-10 00:55:43 +01:00
{
"name" : "snowflake" ,
"version" : "1.3.0" ,
"authors" : "Steven Allen <steven@stebalien.com>" ,
"repository" : "https://github.com/Stebalien/snowflake" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A module for generating guaranteed process unique IDs."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "socket2" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.7" ,
2021-04-27 14:18:12 +02:00
"authors" : "Alex Crichton <alex@alexcrichton.com>|Thomas de Zeeuw <thomasdezeeuw@gmail.com>" ,
"repository" : "https://github.com/rust-lang/socket2" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Utilities for handling networking sockets with a maximal amount of configuration possible intended."
} ,
{
"name" : "spin" ,
"version" : "0.5.2" ,
"authors" : "Mathijs van de Nes <git@mathijs.vd-nes.nl>|John Ericson <git@JohnEricson.me>" ,
"repository" : "https://github.com/mvdnes/spin-rs.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Synchronization primitives based on spinning. They may contain data, are usable without `std`, and static initializers are available."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "spin" ,
"version" : "0.9.4" ,
"authors" : "Mathijs van de Nes <git@mathijs.vd-nes.nl>|John Ericson <git@JohnEricson.me>|Joshua Barretto <joshua.s.barretto@gmail.com>" ,
"repository" : "https://github.com/mvdnes/spin-rs.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Spin-based synchronization primitives"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "string_cache" ,
2022-09-24 04:39:21 +02:00
"version" : "0.8.4" ,
2021-02-06 04:42:38 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/string-cache" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A string interning library for Rust, developed as part of the Servo project."
} ,
{
"name" : "string_cache_codegen" ,
2022-09-24 04:39:21 +02:00
"version" : "0.5.2" ,
2021-02-06 04:42:38 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/string-cache" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A codegen library for string-cache, developed as part of the Servo project."
} ,
2021-03-07 10:08:03 +01:00
{
"name" : "strum" ,
2022-09-24 04:39:21 +02:00
"version" : "0.24.1" ,
2021-03-07 10:08:03 +01:00
"authors" : "Peter Glotfelty <peter.glotfelty@microsoft.com>" ,
"repository" : "https://github.com/Peternator7/strum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Helpful macros for working with enums and strings"
} ,
{
"name" : "strum_macros" ,
2022-09-24 04:39:21 +02:00
"version" : "0.24.3" ,
2021-03-07 10:08:03 +01:00
"authors" : "Peter Glotfelty <peter.glotfelty@microsoft.com>" ,
"repository" : "https://github.com/Peternator7/strum" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Helpful macros for working with enums and strings"
} ,
2022-01-15 05:59:43 +01:00
{
"name" : "subtle" ,
"version" : "2.4.1" ,
"authors" : "Isis Lovecruft <isis@patternsinthevoid.net>|Henry de Valence <hdevalence@hdevalence.ca>" ,
"repository" : "https://github.com/dalek-cryptography/subtle" ,
"license" : "BSD-3-Clause" ,
"license_file" : null ,
"description" : "Pure-Rust traits and utilities for constant-time cryptographic implementations."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "syn" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.107" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/syn" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Parser for Rust source code"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "sync_wrapper" ,
"version" : "0.1.1" ,
"authors" : "Actyx AG <developer@actyx.io>" ,
"repository" : "https://github.com/Actyx/sync_wrapper" ,
"license" : "Apache-2.0" ,
"license_file" : null ,
"description" : "A tool for enlisting the compiler’ s help in proving the absence of concurrency"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tempfile" ,
2022-01-15 05:59:43 +01:00
"version" : "3.3.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Steven Allen <steven@stebalien.com>|The Rust Project Developers|Ashley Mannix <ashleymannix@live.com.au>|Jason White <jasonaw0@gmail.com>" ,
"repository" : "https://github.com/Stebalien/tempfile" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library for managing temporary files and directories."
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "tendril" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.3" ,
2021-02-06 04:42:38 +01:00
"authors" : "Keegan McAllister <mcallister.keegan@gmail.com>|Simon Sapin <simon.sapin@exyr.org>|Chris Morgan <me@chrismorgan.info>" ,
"repository" : "https://github.com/servo/tendril" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Compact buffer/string type for zero-copy parsing"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "termcolor" ,
2023-01-18 13:24:29 +01:00
"version" : "1.2.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/termcolor" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A simple cross platform library for writing colored text to a terminal."
} ,
{
"name" : "thiserror" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.38" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/thiserror" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "derive(Error)"
} ,
{
"name" : "thiserror-impl" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.38" ,
2020-11-12 08:41:47 +01:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/thiserror" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Implementation detail of the `thiserror` crate"
} ,
{
"name" : "thread_local" ,
2022-02-25 07:30:59 +01:00
"version" : "1.1.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Amanieu d'Antras <amanieu@gmail.com>" ,
"repository" : "https://github.com/Amanieu/thread_local-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Per-object thread-local storage"
} ,
{
"name" : "time" ,
2022-12-07 08:00:14 +01:00
"version" : "0.3.17" ,
"authors" : "Jacob Pratt <open-source@jhpratt.dev>|Time contributors" ,
2020-11-12 08:41:47 +01:00
"repository" : "https://github.com/time-rs/time" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "Date and time library. Fully interoperable with the standard library. Mostly compatible with #![no_std]."
2020-11-12 08:41:47 +01:00
} ,
2022-02-25 07:30:59 +01:00
{
2022-12-07 08:00:14 +01:00
"name" : "time-core" ,
"version" : "0.1.0" ,
2022-02-25 07:30:59 +01:00
"authors" : "Jacob Pratt <open-source@jhpratt.dev>|Time contributors" ,
"repository" : "https://github.com/time-rs/time" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "This crate is an implementation detail and should not be relied upon directly."
2022-02-25 07:30:59 +01:00
} ,
{
"name" : "time-macros" ,
2022-12-07 08:00:14 +01:00
"version" : "0.2.6" ,
2022-02-25 07:30:59 +01:00
"authors" : "Jacob Pratt <open-source@jhpratt.dev>|Time contributors" ,
"repository" : "https://github.com/time-rs/time" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
2022-12-07 08:00:14 +01:00
"description" : "Procedural macros for the time crate. This crate is an implementation detail and should not be relied upon directly."
2022-02-25 07:30:59 +01:00
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tinystr" ,
2022-12-07 08:00:14 +01:00
"version" : "0.7.0" ,
"authors" : "The ICU4X Project Developers" ,
"repository" : "https://github.com/unicode-org/icu4x" ,
"license" : "Unicode-DFS-2016" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A small ASCII-only bounded length string representation."
} ,
{
"name" : "tinyvec" ,
2022-09-24 04:39:21 +02:00
"version" : "1.6.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Lokathor <zefria@gmail.com>" ,
"repository" : "https://github.com/Lokathor/tinyvec" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT OR Zlib" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "`tinyvec` provides 100% safe vec-like data structures."
} ,
{
"name" : "tinyvec_macros" ,
"version" : "0.1.0" ,
"authors" : "Soveu <marx.tomasz@gmail.com>" ,
"repository" : "https://github.com/Soveu/tinyvec_macros" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT OR Zlib" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Some macros for tiny containers"
} ,
{
"name" : "tokio" ,
2023-01-18 13:24:29 +01:00
"version" : "1.24.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tokio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An event-driven, non-blocking I/O platform for writing asynchronous I/O backed applications."
} ,
2021-07-23 11:39:40 +02:00
{
"name" : "tokio-macros" ,
2022-12-07 08:00:14 +01:00
"version" : "1.8.2" ,
2021-07-23 11:39:40 +02:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tokio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Tokio's proc macros."
} ,
2021-04-27 14:18:12 +02:00
{
"name" : "tokio-native-tls" ,
"version" : "0.3.0" ,
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tls" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "An implementation of TLS/SSL streams for Tokio using native-tls giving an implementation of TLS for nonblocking I/O streams."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tokio-rustls" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.23.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "quininer kel <quininer@live.com>" ,
"repository" : "https://github.com/tokio-rs/tls" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Asynchronous TLS/SSL streams for Tokio using Rustls."
} ,
{
"name" : "tokio-socks" ,
2021-04-27 14:18:12 +02:00
"version" : "0.5.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Yilin Chen <sticnarf@gmail.com>" ,
"repository" : "https://github.com/sticnarf/tokio-socks" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Asynchronous SOCKS proxy support for Rust."
} ,
{
"name" : "tokio-util" ,
2022-09-24 04:39:21 +02:00
"version" : "0.7.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tokio" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Additional utilities for working with Tokio."
} ,
{
"name" : "toml" ,
2023-01-18 13:24:29 +01:00
"version" : "0.5.10" ,
2020-11-12 08:41:47 +01:00
"authors" : "Alex Crichton <alex@alexcrichton.com>" ,
2023-01-18 13:24:29 +01:00
"repository" : "https://github.com/toml-rs/toml" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A native Rust encoder and decoder of TOML-formatted files and streams. Provides implementations of the standard Serialize/Deserialize traits for TOML data to facilitate deserializing and serializing Rust structures."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "tower" ,
"version" : "0.4.13" ,
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Tower is a library of modular and reusable components for building robust clients and servers."
} ,
{
"name" : "tower-http" ,
"version" : "0.3.5" ,
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower-http" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Tower middleware and utilities for HTTP clients and servers"
} ,
{
"name" : "tower-layer" ,
"version" : "0.3.2" ,
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Decorates a `Service` to allow easy composition between `Service`s."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tower-service" ,
2022-09-24 04:39:21 +02:00
"version" : "0.3.2" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tower Maintainers <team@tower-rs.com>" ,
"repository" : "https://github.com/tower-rs/tower" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Trait representing an asynchronous, request / response based, client or server."
} ,
{
"name" : "tracing" ,
2022-12-07 08:00:14 +01:00
"version" : "0.1.37" ,
2020-11-12 08:41:47 +01:00
"authors" : "Eliza Weisman <eliza@buoyant.io>|Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Application-level tracing for Rust."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "tracing-appender" ,
"version" : "0.2.2" ,
"authors" : "Zeki Sherif <zekshi@amazon.com>|Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provides utilities for file appenders and making non-blocking writers."
} ,
{
"name" : "tracing-attributes" ,
"version" : "0.1.23" ,
"authors" : "Tokio Contributors <team@tokio.rs>|Eliza Weisman <eliza@buoyant.io>|David Barsky <dbarsky@amazon.com>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Procedural macro attributes for automatically instrumenting functions."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "tracing-core" ,
2022-12-07 08:00:14 +01:00
"version" : "0.1.30" ,
2020-11-12 08:41:47 +01:00
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Core primitives for application-level tracing."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "tracing-log" ,
"version" : "0.1.3" ,
"authors" : "Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Provides compatibility between `tracing` and the `log` crate."
} ,
{
"name" : "tracing-subscriber" ,
"version" : "0.3.16" ,
"authors" : "Eliza Weisman <eliza@buoyant.io>|David Barsky <me@davidbarsky.com>|Tokio Contributors <team@tokio.rs>" ,
"repository" : "https://github.com/tokio-rs/tracing" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Utilities for implementing and composing `tracing` subscribers."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "try-lock" ,
2023-01-18 13:24:29 +01:00
"version" : "0.2.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/try-lock" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A lightweight atomic lock."
} ,
{
"name" : "type-map" ,
2021-02-03 11:29:48 +01:00
"version" : "0.4.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Jacob Brown <kardeiz@gmail.com>" ,
"repository" : "https://github.com/kardeiz/type-map" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Provides a typemap container with FxHashMap"
} ,
{
"name" : "typenum" ,
2022-12-07 08:00:14 +01:00
"version" : "1.16.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Paho Lurie-Gregg <paho@paholg.com>|Andre Bogus <bogusandre@gmail.com>" ,
"repository" : "https://github.com/paholg/typenum" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2021-03-27 05:47:16 +01:00
"description" : "Typenum is a Rust library for type-level numbers evaluated at compile time. It currently supports bits, unsigned integers, and signed integers. It also provides a type-level array of type-level numbers, but its implementation is incomplete."
2020-11-12 08:41:47 +01:00
} ,
2021-07-17 07:36:43 +02:00
{
"name" : "unic-char-property" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Tools — Character Property taxonomy, contracts and build macros"
} ,
{
"name" : "unic-char-range" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Tools — Character Range and Iteration"
} ,
{
"name" : "unic-common" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Common Utilities"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "unic-langid" ,
2022-12-07 08:00:14 +01:00
"version" : "0.9.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
{
"name" : "unic-langid-impl" ,
2022-12-07 08:00:14 +01:00
"version" : "0.9.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
{
"name" : "unic-langid-macros" ,
2022-12-07 08:00:14 +01:00
"version" : "0.9.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Manish Goregaokar <manishsmail@gmail.com>|Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
{
"name" : "unic-langid-macros-impl" ,
2022-12-07 08:00:14 +01:00
"version" : "0.9.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Manish Goregaokar <manishsmail@gmail.com>|Zibi Braniecki <gandalf@mozilla.com>" ,
"repository" : "https://github.com/zbraniecki/unic-locale" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "API for managing Unicode Language Identifiers"
} ,
2021-07-17 07:36:43 +02:00
{
"name" : "unic-ucd-category" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Database — General Category"
} ,
{
"name" : "unic-ucd-version" ,
"version" : "0.9.0" ,
"authors" : "The UNIC Project Developers" ,
"repository" : "https://github.com/open-i18n/rust-unic/" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "UNIC — Unicode Character Database — Version"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "unicase" ,
"version" : "2.6.0" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/unicase" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A case-insensitive wrapper around strings."
} ,
{
"name" : "unicode-bidi" ,
2022-09-24 04:39:21 +02:00
"version" : "0.3.8" ,
2020-11-12 08:41:47 +01:00
"authors" : "The Servo Project Developers" ,
"repository" : "https://github.com/servo/unicode-bidi" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Implementation of the Unicode Bidirectional Algorithm"
} ,
{
2022-09-24 04:39:21 +02:00
"name" : "unicode-ident" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "1.0.6" ,
2022-09-24 04:39:21 +02:00
"authors" : "David Tolnay <dtolnay@gmail.com>" ,
"repository" : "https://github.com/dtolnay/unicode-ident" ,
"license" : "(MIT OR Apache-2.0) AND Unicode-DFS-2016" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31"
2020-11-12 08:41:47 +01:00
} ,
{
2022-09-24 04:39:21 +02:00
"name" : "unicode-normalization" ,
"version" : "0.1.22" ,
2020-11-12 08:41:47 +01:00
"authors" : "kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/unicode-rs/unicode-normalization" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
2022-09-24 04:39:21 +02:00
"description" : "This crate provides functions for normalization of Unicode strings, including Canonical and Compatible Decomposition and Recomposition, as described in Unicode Standard Annex #15."
2020-11-12 08:41:47 +01:00
} ,
2022-10-21 10:02:12 +02:00
{
"name" : "unicode-segmentation" ,
"version" : "1.10.0" ,
"authors" : "kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-rs/unicode-segmentation" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "This crate provides Grapheme Cluster, Word and Sentence boundaries according to Unicode Standard Annex #29 rules."
} ,
2021-02-06 06:02:40 +01:00
{
"name" : "unicode-width" ,
2022-09-24 04:39:21 +02:00
"version" : "0.1.10" ,
2021-02-06 06:02:40 +01:00
"authors" : "kwantam <kwantam@gmail.com>|Manish Goregaokar <manishsmail@gmail.com>" ,
"repository" : "https://github.com/unicode-rs/unicode-width" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Determine displayed width of `char` and `str` types according to Unicode Standard Annex #11 rules."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "untrusted" ,
"version" : "0.7.1" ,
"authors" : "Brian Smith <brian@briansmith.org>" ,
"repository" : "https://github.com/briansmith/untrusted" ,
"license" : "ISC" ,
"license_file" : null ,
"description" : "Safe, fast, zero-panic, zero-crashing, zero-allocation parsing of untrusted inputs in Rust."
} ,
{
"name" : "url" ,
2022-09-24 04:39:21 +02:00
"version" : "2.3.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "The rust-url developers" ,
"repository" : "https://github.com/servo/rust-url" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "URL library for Rust, based on the WHATWG URL Standard"
} ,
2021-02-06 04:42:38 +01:00
{
"name" : "utf-8" ,
2021-04-27 14:18:12 +02:00
"version" : "0.7.6" ,
2021-02-06 04:42:38 +01:00
"authors" : "Simon Sapin <simon.sapin@exyr.org>" ,
"repository" : "https://github.com/SimonSapin/rust-utf8" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Incremental, zero-copy UTF-8 decoding with error handling"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "utime" ,
"version" : "0.3.1" ,
"authors" : "Hyeon Kim <simnalamburt@gmail.com>" ,
"repository" : "https://github.com/simnalamburt/utime" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "A missing utime function for Rust."
} ,
2022-12-24 01:44:40 +01:00
{
"name" : "valuable" ,
"version" : "0.1.0" ,
"authors" : null ,
"repository" : "https://github.com/tokio-rs/valuable" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Object-safe value inspection, used to pass un-typed structured data across trait-object boundaries."
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "vcpkg" ,
2021-06-25 07:35:25 +02:00
"version" : "0.2.15" ,
2020-11-12 08:41:47 +01:00
"authors" : "Jim McGrath <jimmc2@gmail.com>" ,
"repository" : "https://github.com/mcgoo/vcpkg-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A library to find native dependencies in a vcpkg tree at build time in order to be used in Cargo build scripts."
} ,
{
"name" : "version_check" ,
2022-01-15 05:59:43 +01:00
"version" : "0.9.4" ,
2020-11-12 08:41:47 +01:00
"authors" : "Sergio Benitez <sb@sergio.bz>" ,
"repository" : "https://github.com/SergioBenitez/version_check" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Tiny crate to check the version of the installed/running rustc."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "waker-fn" ,
"version" : "1.1.0" ,
"authors" : "Stjepan Glavina <stjepang@gmail.com>" ,
"repository" : "https://github.com/stjepang/waker-fn" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Convert closures into wakers"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "want" ,
"version" : "0.3.0" ,
"authors" : "Sean McArthur <sean@seanmonstar.com>" ,
"repository" : "https://github.com/seanmonstar/want" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Detect when another Future wants a result."
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "wasi" ,
"version" : "0.9.0+wasi-snapshot-preview1" ,
"authors" : "The Cranelift Project Developers" ,
"repository" : "https://github.com/bytecodealliance/wasi" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Experimental WASI API bindings for Rust"
} ,
2022-02-25 07:30:59 +01:00
{
"name" : "wasi" ,
"version" : "0.11.0+wasi-snapshot-preview1" ,
"authors" : "The Cranelift Project Developers" ,
"repository" : "https://github.com/bytecodealliance/wasi" ,
"license" : "Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT" ,
"license_file" : null ,
"description" : "Experimental WASI API bindings for Rust"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "wasm-bindgen" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.83" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Easy support for interacting between JS and Rust."
} ,
{
"name" : "wasm-bindgen-backend" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.83" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Backend code generation of the wasm-bindgen tool"
} ,
{
"name" : "wasm-bindgen-futures" ,
2022-09-24 04:39:21 +02:00
"version" : "0.4.33" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/futures" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bridging the gap between Rust Futures and JavaScript Promises"
} ,
{
"name" : "wasm-bindgen-macro" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.83" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Definition of the `#[wasm_bindgen]` attribute, an internal dependency"
} ,
{
"name" : "wasm-bindgen-macro-support" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.83" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "The part of the implementation of the `#[wasm_bindgen]` attribute that is not in the shared backend crate"
} ,
{
"name" : "wasm-bindgen-shared" ,
2022-09-24 04:39:21 +02:00
"version" : "0.2.83" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Shared support between wasm-bindgen and wasm-bindgen cli, an internal dependency."
} ,
{
"name" : "web-sys" ,
2022-09-24 04:39:21 +02:00
"version" : "0.3.60" ,
2020-11-12 08:41:47 +01:00
"authors" : "The wasm-bindgen Developers" ,
"repository" : "https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Bindings for all Web APIs, a procedurally generated crate from WebIDL"
} ,
{
"name" : "webpki" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.22.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Brian Smith <brian@briansmith.org>" ,
"repository" : "https://github.com/briansmith/webpki" ,
"license" : null ,
"license_file" : "LICENSE" ,
"description" : "Web PKI X.509 Certificate Verification."
} ,
2020-11-15 05:02:53 +01:00
{
"name" : "webpki-roots" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.22.6" ,
2020-11-15 05:02:53 +01:00
"authors" : "Joseph Birr-Pixton <jpixton@gmail.com>" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"repository" : "https://github.com/rustls/webpki-roots" ,
2020-11-15 05:02:53 +01:00
"license" : "MPL-2.0" ,
"license_file" : null ,
"description" : "Mozilla's CA root certificates for use with webpki"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "which" ,
2022-09-24 04:39:21 +02:00
"version" : "4.3.0" ,
2020-11-12 08:41:47 +01:00
"authors" : "Harry Fei <tiziyuanfang@gmail.com>" ,
"repository" : "https://github.com/harryfei/which-rs.git" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "A Rust equivalent of Unix command \"which\". Locate installed executable in cross platforms."
} ,
{
"name" : "winapi" ,
"version" : "0.3.9" ,
"authors" : "Peter Atashian <retep998@gmail.com>" ,
"repository" : "https://github.com/retep998/winapi-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Raw FFI bindings for all of Windows API."
} ,
{
"name" : "winapi-i686-pc-windows-gnu" ,
"version" : "0.4.0" ,
"authors" : "Peter Atashian <retep998@gmail.com>" ,
"repository" : "https://github.com/retep998/winapi-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Import libraries for the i686-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead."
} ,
{
"name" : "winapi-util" ,
"version" : "0.1.5" ,
"authors" : "Andrew Gallant <jamslam@gmail.com>" ,
"repository" : "https://github.com/BurntSushi/winapi-util" ,
2020-12-15 08:10:25 +01:00
"license" : "MIT OR Unlicense" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "A dumping ground for high level safe wrappers over winapi."
} ,
{
"name" : "winapi-x86_64-pc-windows-gnu" ,
"version" : "0.4.0" ,
"authors" : "Peter Atashian <retep998@gmail.com>" ,
"repository" : "https://github.com/retep998/winapi-rs" ,
2020-12-15 08:10:25 +01:00
"license" : "Apache-2.0 OR MIT" ,
2020-11-12 08:41:47 +01:00
"license_file" : null ,
"description" : "Import libraries for the x86_64-pc-windows-gnu target. Please don't use this crate directly, depend on winapi instead."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "windows-sys" ,
"version" : "0.42.0" ,
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Rust for Windows"
} ,
{
"name" : "windows_aarch64_gnullvm" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-02-28 01:28:39 +01:00
"authors" : "Microsoft" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/microsoft/windows-rs" ,
2022-02-28 01:28:39 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "windows_aarch64_msvc" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-12-07 08:00:14 +01:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
2022-02-28 01:28:39 +01:00
{
"name" : "windows_i686_gnu" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-02-28 01:28:39 +01:00
"authors" : "Microsoft" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/microsoft/windows-rs" ,
2022-02-28 01:28:39 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "windows_i686_msvc" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-02-28 01:28:39 +01:00
"authors" : "Microsoft" ,
2022-09-24 04:39:21 +02:00
"repository" : "https://github.com/microsoft/windows-rs" ,
2022-02-28 01:28:39 +01:00
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "windows_x86_64_gnu" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-12-07 08:00:14 +01:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
{
"name" : "windows_x86_64_gnullvm" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-12-07 08:00:14 +01:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
2022-02-28 01:28:39 +01:00
{
"name" : "windows_x86_64_msvc" ,
2023-01-18 13:24:29 +01:00
"version" : "0.42.1" ,
2022-12-07 08:00:14 +01:00
"authors" : "Microsoft" ,
"repository" : "https://github.com/microsoft/windows-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Code gen support for the windows crate"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "winreg" ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
"version" : "0.10.1" ,
2020-11-12 08:41:47 +01:00
"authors" : "Igor Shaula <gentoo90@gmail.com>" ,
"repository" : "https://github.com/gentoo90/winreg-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Rust bindings to MS Windows Registry API"
} ,
Rework syncing code, and replace local sync server (#2329)
This PR replaces the existing Python-driven sync server with a new one in Rust.
The new server supports both collection and media syncing, and is compatible
with both the new protocol mentioned below, and older clients. A setting has
been added to the preferences screen to point Anki to a local server, and a
similar setting is likely to come to AnkiMobile soon.
Documentation is available here: <https://docs.ankiweb.net/sync-server.html>
In addition to the new server and refactoring, this PR also makes changes to the
sync protocol. The existing sync protocol places payloads and metadata inside a
multipart POST body, which causes a few headaches:
- Legacy clients build the request in a non-deterministic order, meaning the
entire request needs to be scanned to extract the metadata.
- Reqwest's multipart API directly writes the multipart body, without exposing
the resulting stream to us, making it harder to track the progress of the
transfer. We've been relying on a patched version of reqwest for timeouts,
which is a pain to keep up to date.
To address these issues, the metadata is now sent in a HTTP header, with the
data payload sent directly in the body. Instead of the slower gzip, we now
use zstd. The old timeout handling code has been replaced with a new implementation
that wraps the request and response body streams to track progress, allowing us
to drop the git dependencies for reqwest, hyper-timeout and tokio-io-timeout.
The main other change to the protocol is that one-way syncs no longer need to
downgrade the collection to schema 11 prior to sending.
2023-01-18 03:43:46 +01:00
{
"name" : "wiremock" ,
"version" : "0.5.17" ,
"authors" : "Luca Palmieri <rust@lpalmieri.com>" ,
"repository" : "https://github.com/LukeMathWalker/wiremock-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "HTTP mocking to test Rust applications."
} ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
{
"name" : "workspace-hack" ,
"version" : "0.1.0" ,
"authors" : null ,
"repository" : null ,
"license" : null ,
"license_file" : null ,
"description" : "workspace-hack package, managed by hakari"
} ,
2020-11-12 08:41:47 +01:00
{
"name" : "zip" ,
Move away from Bazel (#2202)
(for upgrading users, please see the notes at the bottom)
Bazel brought a lot of nice things to the table, such as rebuilds based on
content changes instead of modification times, caching of build products,
detection of incorrect build rules via a sandbox, and so on. Rewriting the build
in Bazel was also an opportunity to improve on the Makefile-based build we had
prior, which was pretty poor: most dependencies were external or not pinned, and
the build graph was poorly defined and mostly serialized. It was not uncommon
for fresh checkouts to fail due to floating dependencies, or for things to break
when trying to switch to an older commit.
For day-to-day development, I think Bazel served us reasonably well - we could
generally switch between branches while being confident that builds would be
correct and reasonably fast, and not require full rebuilds (except on Windows,
where the lack of a sandbox and the TS rules would cause build breakages when TS
files were renamed/removed).
Bazel achieves that reliability by defining rules for each programming language
that define how source files should be turned into outputs. For the rules to
work with Bazel's sandboxing approach, they often have to reimplement or
partially bypass the standard tools that each programming language provides. The
Rust rules call Rust's compiler directly for example, instead of using Cargo,
and the Python rules extract each PyPi package into a separate folder that gets
added to sys.path.
These separate language rules allow proper declaration of inputs and outputs,
and offer some advantages such as caching of build products and fine-grained
dependency installation. But they also bring some downsides:
- The rules don't always support use-cases/platforms that the standard language
tools do, meaning they need to be patched to be used. I've had to contribute a
number of patches to the Rust, Python and JS rules to unblock various issues.
- The dependencies we use with each language sometimes make assumptions that do
not hold in Bazel, meaning they either need to be pinned or patched, or the
language rules need to be adjusted to accommodate them.
I was hopeful that after the initial setup work, things would be relatively
smooth-sailing. Unfortunately, that has not proved to be the case. Things
frequently broke when dependencies or the language rules were updated, and I
began to get frustrated at the amount of Anki development time I was instead
spending on build system upkeep. It's now about 2 years since switching to
Bazel, and I think it's time to cut losses, and switch to something else that's
a better fit.
The new build system is based on a small build tool called Ninja, and some
custom Rust code in build/. This means that to build Anki, Bazel is no longer
required, but Ninja and Rust need to be installed on your system. Python and
Node toolchains are automatically downloaded like in Bazel.
This new build system should result in faster builds in some cases:
- Because we're using cargo to build now, Rust builds are able to take advantage
of pipelining and incremental debug builds, which we didn't have with Bazel.
It's also easier to override the default linker on Linux/macOS, which can
further improve speeds.
- External Rust crates are now built with opt=1, which improves performance
of debug builds.
- Esbuild is now used to transpile TypeScript, instead of invoking the TypeScript
compiler. This results in faster builds, by deferring typechecking to test/check
time, and by allowing more work to happen in parallel.
As an example of the differences, when testing with the mold linker on Linux,
adding a new message to tags.proto (which triggers a recompile of the bulk of
the Rust and TypeScript code) results in a compile that goes from about 22s on
Bazel to about 7s in the new system. With the standard linker, it's about 9s.
Some other changes of note:
- Our Rust workspace now uses cargo-hakari to ensure all packages agree on
available features, preventing unnecessary rebuilds.
- pylib/anki is now a PEP420 implicit namespace, avoiding the need to merge
source files and generated files into a single folder for running. By telling
VSCode about the extra search path, code completion now works with generated
files without needing to symlink them into the source folder.
- qt/aqt can't use PEP420 as it's difficult to get rid of aqt/__init__.py.
Instead, the generated files are now placed in a separate _aqt package that's
added to the path.
- ts/lib is now exposed as @tslib, so the source code and generated code can be
provided under the same namespace without a merging step.
- MyPy and PyLint are now invoked once for the entire codebase.
- dprint will be used to format TypeScript/json files in the future instead of
the slower prettier (currently turned off to avoid causing conflicts). It can
automatically defer to prettier when formatting Svelte files.
- svelte-check is now used for typechecking our Svelte code, which revealed a
few typing issues that went undetected with the old system.
- The Jest unit tests now work on Windows as well.
If you're upgrading from Bazel, updated usage instructions are in docs/development.md and docs/build.md. A summary of the changes:
- please remove node_modules and .bazel
- install rustup (https://rustup.rs/)
- install rsync if not already installed (on windows, use pacman - see docs/windows.md)
- install Ninja (unzip from https://github.com/ninja-build/ninja/releases/tag/v1.11.1 and
place on your path, or from your distro/homebrew if it's 1.10+)
- update .vscode/settings.json from .vscode.dist
2022-11-27 06:24:20 +01:00
"version" : "0.6.3" ,
2021-04-27 14:18:12 +02:00
"authors" : "Mathijs van de Nes <git@mathijs.vd-nes.nl>|Marli Frost <marli@frost.red>|Ryan Levick <ryan.levick@gmail.com>" ,
"repository" : "https://github.com/zip-rs/zip.git" ,
2020-11-12 08:41:47 +01:00
"license" : "MIT" ,
"license_file" : null ,
"description" : "Library to support the reading and writing of zip files."
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
} ,
{
"name" : "zstd" ,
2022-09-24 04:39:21 +02:00
"version" : "0.11.2+zstd.1.5.2" ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Binding for the zstd compression library."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "zstd" ,
2023-01-18 13:24:29 +01:00
"version" : "0.12.2+zstd.1.5.2" ,
2022-12-07 08:00:14 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "MIT" ,
"license_file" : null ,
"description" : "Binding for the zstd compression library."
} ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
{
"name" : "zstd-safe" ,
2022-09-24 04:39:21 +02:00
"version" : "5.0.2+zstd.1.5.2" ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Safe low-level bindings for the zstd compression library."
} ,
2022-12-07 08:00:14 +01:00
{
"name" : "zstd-safe" ,
"version" : "6.0.2+zstd.1.5.2" ,
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Safe low-level bindings for the zstd compression library."
} ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
{
"name" : "zstd-sys" ,
2023-01-18 13:24:29 +01:00
"version" : "2.0.5+zstd.1.5.2" ,
Backups (#1685)
* Add zstd dep
* Implement backend backup with zstd
* Implement backup thinning
* Write backup meta
* Use new file ending anki21b
* Asynchronously backup on collection close in Rust
* Revert "Add zstd dep"
This reverts commit 3fcb2141d2be15f907269d13275c41971431385c.
* Add zstd again
* Take backup col path from col struct
* Fix formatting
* Implement backup restoring on backend
* Normalize restored media file names
* Refactor `extract_legacy_data()`
A bit cumbersome due to borrowing rules.
* Refactor
* Make thinning calendar-based and gradual
* Consider last kept backups of previous stages
* Import full apkgs and colpkgs with backend
* Expose new backup settings
* Test `BackupThinner` and make it deterministic
* Mark backup_path when closing optional
* Delete leaky timer
* Add progress updates for restoring media
* Write restored collection to tempfile first
* Do collection compression in the background thread
This has us currently storing an uncompressed and compressed copy of
the collection in memory (not ideal), but means the collection can be
closed without waiting for compression to complete. On a large collection,
this takes a close and reopen from about 0.55s to about 0.07s. The old
backup code for comparison: about 0.35s for compression off, about
8.5s for zip compression.
* Use multithreading in zstd compression
On my system, this reduces the compression time of a large collection
from about 0.55s to 0.08s.
* Stream compressed collection data into zip file
* Tweak backup explanation
+ Fix incorrect tab order for ignore accents option
* Decouple restoring backup and full import
In the first case, no profile is opened, unless the new collection
succeeds to load.
In the second case, either the old collection is reloaded or the new one
is loaded.
* Fix number gap in Progress message
* Don't revert backup when media fails but report it
* Tweak error flow
* Remove native BackupLimits enum
* Fix type annotation
* Add thinning test for whole year
* Satisfy linter
* Await async backup to finish
* Move restart disclaimer out of backup tab
Should be visible regardless of the current tab.
* Write restored collection in chunks
* Refactor
* Write media in chunks and refactor
* Log error if removing file fails
* join_backup_task -> await_backup_completion
* Refactor backup.rs
* Refactor backup meta and collection extraction
* Fix wrong error being returned
* Call sync_all() on new collection
* Add ImportError
* Store logger in Backend, instead of creating one on demand
init_backend() accepts a Logger rather than a log file, to allow other
callers to customize the logger if they wish.
In the future we may want to explore using the tracing crate as an
alternative; it's a bit more ergonomic, as a logger doesn't need to be
passed around, and it plays more nicely with async code.
* Sync file contents prior to rename; sync folder after rename.
* Limit backup creation to once per 30 min
* Use zstd::stream::copy_decode
* Make importing abortable
* Don't revert if backup media is aborted
* Set throttle implicitly
* Change force flag to minimum_backup_interval
* Don't attempt to open folders on Windows
* Join last backup thread before starting new one
Also refactor.
* Disable auto sync and backup when restoring again
* Force backup on full download
* Include the reason why a media file import failed, and the file path
- Introduce a FileIoError that contains a string representation of
the underlying I/O error, and an associated path. There are a few
places in the code where we're currently manually including the filename
in a custom error message, and this is a step towards a more consistent
approach (but we may be better served with a more general approach in
the future similar to Anyhow's .context())
- Move the error message into importing.ftl, as it's a bit neater
when error messages live in the same file as the rest of the messages
associated with some functionality.
* Fix importing of media files
* Minor wording tweaks
* Save an allocation
I18n strings with replacements are already strings, so we can skip the
extra allocation. Not that it matters here at all.
* Terminate import if file missing from archive
If a third-party tool is creating invalid archives, the user should know
about it. This should be rare, so I did not attempt to make it
translatable.
* Skip multithreaded compression on small collections
Co-authored-by: Damien Elmes <gpg@ankiweb.net>
2022-03-07 06:11:31 +01:00
"authors" : "Alexandre Bury <alexandre.bury@gmail.com>" ,
"repository" : "https://github.com/gyscos/zstd-rs" ,
"license" : "Apache-2.0 OR MIT" ,
"license_file" : null ,
"description" : "Low-level bindings for the zstd compression library."
2020-11-12 08:41:47 +01:00
}
]