switch failure -> anyhow, parse byte suffix in cache-max-blob-len

This commit is contained in:
phiresky 2020-06-06 12:57:43 +02:00
parent 5d97c2ad5f
commit f2d9393832
19 changed files with 189 additions and 173 deletions

160
Cargo.lock generated
View File

@ -1,14 +1,5 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
[[package]]
name = "addr2line"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "456d75cbb82da1ad150c8a9d97285ffcd21c9931dcb11e995903e7d75141b38b"
dependencies = [
"gimli",
]
[[package]] [[package]]
name = "adler32" name = "adler32"
version = "1.0.4" version = "1.0.4"
@ -33,6 +24,12 @@ dependencies = [
"winapi", "winapi",
] ]
[[package]]
name = "anyhow"
version = "1.0.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85bb70cc08ec97ca5450e6eba421deeea5f172c0fc61f78b5357b2a8e8be195f"
[[package]] [[package]]
name = "arrayref" name = "arrayref"
version = "0.3.6" version = "0.3.6"
@ -62,19 +59,6 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]]
name = "backtrace"
version = "0.3.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0df2f85c8a2abbe3b7d7e748052fdd9b76a0458fdeb16ad4223f5eca78c7c130"
dependencies = [
"addr2line",
"cfg-if",
"libc",
"object",
"rustc-demangle",
]
[[package]] [[package]]
name = "bincode" name = "bincode"
version = "1.2.1" version = "1.2.1"
@ -109,12 +93,13 @@ dependencies = [
[[package]] [[package]]
name = "bzip2-sys" name = "bzip2-sys"
version = "0.1.8+1.0.8" version = "0.1.9+1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05305b41c5034ff0e93937ac64133d109b5a2660114ec45e9760bc6816d83038" checksum = "ad3b39a260062fca31f7b0b12f207e8f2590a67d32ec7d59c20484b07ea7285e"
dependencies = [ dependencies = [
"cc", "cc",
"libc", "libc",
"pkg-config",
] ]
[[package]] [[package]]
@ -125,9 +110,9 @@ checksum = "c06509d1f4ffa658939bd23f076cd929ef218241363796551528e7eec69128c8"
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.0.53" version = "1.0.54"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "404b1fe4f65288577753b17e3b36a04596ee784493ec249bf81c7f2d2acd751c" checksum = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311"
dependencies = [ dependencies = [
"jobserver", "jobserver",
] ]
@ -235,9 +220,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-queue" name = "crossbeam-queue"
version = "0.2.1" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" checksum = "ab6bffe714b6bb07e42f201352c34f51fefd355ace793f9e638ebd52d23f98d2"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"crossbeam-utils", "crossbeam-utils",
@ -254,6 +239,12 @@ dependencies = [
"lazy_static", "lazy_static",
] ]
[[package]]
name = "either"
version = "1.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3"
[[package]] [[package]]
name = "encoding_rs" name = "encoding_rs"
version = "0.8.23" version = "0.8.23"
@ -285,22 +276,12 @@ dependencies = [
"termcolor", "termcolor",
] ]
[[package]]
name = "exitfailure"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ff5bd832af37f366c6c194d813a11cd90ac484f124f079294f28e357ae40515"
dependencies = [
"failure",
]
[[package]] [[package]]
name = "failure" name = "failure"
version = "0.1.8" version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86"
dependencies = [ dependencies = [
"backtrace",
"failure_derive", "failure_derive",
] ]
@ -390,12 +371,6 @@ dependencies = [
"wasi", "wasi",
] ]
[[package]]
name = "gimli"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc8e0c9bce37868955864dbecd2b1ab2bdf967e6f28066d65aaac620444b65c"
[[package]] [[package]]
name = "glob" name = "glob"
version = "0.3.0" version = "0.3.0"
@ -440,6 +415,15 @@ dependencies = [
"unicode-normalization", "unicode-normalization",
] ]
[[package]]
name = "itertools"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
dependencies = [
"either",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "0.4.5" version = "0.4.5"
@ -463,9 +447,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.70" version = "0.2.71"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" checksum = "9457b06509d27052635f90d6466700c65095fdf75409b3fbdd903e988b886f49"
[[package]] [[package]]
name = "libsqlite3-sys" name = "libsqlite3-sys"
@ -651,12 +635,6 @@ dependencies = [
"autocfg 1.0.0", "autocfg 1.0.0",
] ]
[[package]]
name = "object"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9cbca9424c482ee628fa549d9c812e2cd22f1180b9222c9200fdfa6eb31aecb2"
[[package]] [[package]]
name = "ordered-float" name = "ordered-float"
version = "1.0.2" version = "1.0.2"
@ -701,9 +679,9 @@ dependencies = [
[[package]] [[package]]
name = "paste" name = "paste"
version = "0.1.12" version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a229b1c58c692edcaa5b9b0948084f130f55d2dcc15b02fcc5340b2b4521476" checksum = "d508492eeb1e5c38ee696371bf7b9fc33c83d46a7d451606b96458fbbbdc2dec"
dependencies = [ dependencies = [
"paste-impl", "paste-impl",
"proc-macro-hack", "proc-macro-hack",
@ -711,9 +689,9 @@ dependencies = [
[[package]] [[package]]
name = "paste-impl" name = "paste-impl"
version = "0.1.12" version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e0bf239e447e67ff6d16a8bb5e4d4bd2343acf5066061c0e8e06ac5ba8ca68c" checksum = "84f328a6a63192b333fce5fbb4be79db6758a4d518dfac6d54412f1492f72d32"
dependencies = [ dependencies = [
"proc-macro-hack", "proc-macro-hack",
"proc-macro2", "proc-macro2",
@ -751,9 +729,9 @@ checksum = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677"
[[package]] [[package]]
name = "podio" name = "podio"
version = "0.1.6" version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" checksum = "b18befed8bc2b61abc79a457295e7e838417326da1586050b919414073977f19"
[[package]] [[package]]
name = "ppv-lite86" name = "ppv-lite86"
@ -789,15 +767,15 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro-hack" name = "proc-macro-hack"
version = "0.5.15" version = "0.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" checksum = "7e0456befd48169b9f13ef0f0ad46d492cf9d2dbb918bcf38e01eed4ce3ec5e4"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.13" version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639" checksum = "beae6331a816b1f65d04c45b078fd8e6c93e8071771f41b8163255bbd8d7c8fa"
dependencies = [ dependencies = [
"unicode-xid", "unicode-xid",
] ]
@ -981,9 +959,9 @@ checksum = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84"
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.3.7" version = "1.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" checksum = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@ -993,9 +971,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.17" version = "0.6.18"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" checksum = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8"
[[package]] [[package]]
name = "remove_dir_all" name = "remove_dir_all"
@ -1010,6 +988,7 @@ dependencies = [
name = "ripgrep_all" name = "ripgrep_all"
version = "0.9.7-alpha.0" version = "0.9.7-alpha.0"
dependencies = [ dependencies = [
"anyhow",
"bincode", "bincode",
"bzip2", "bzip2",
"cachedir", "cachedir",
@ -1019,8 +998,6 @@ dependencies = [
"encoding_rs", "encoding_rs",
"encoding_rs_io", "encoding_rs_io",
"env_logger", "env_logger",
"exitfailure",
"failure",
"flate2", "flate2",
"glob", "glob",
"lazy_static", "lazy_static",
@ -1079,12 +1056,6 @@ dependencies = [
"time", "time",
] ]
[[package]]
name = "rustc-demangle"
version = "0.1.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783"
[[package]] [[package]]
name = "rustc_version" name = "rustc_version"
version = "0.2.3" version = "0.2.3"
@ -1096,9 +1067,9 @@ dependencies = [
[[package]] [[package]]
name = "ryu" name = "ryu"
version = "1.0.4" version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]] [[package]]
name = "scopeguard" name = "scopeguard"
@ -1123,18 +1094,18 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.110" version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" checksum = "c9124df5b40cbd380080b2cc6ab894c040a3070d995f5c9dc77e18c34a8ae37d"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.110" version = "1.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" checksum = "3f2c3ac8e6ca1e9c80b8be1023940162bf81ae3cffbb1809474152f2ce1eb250"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1209,9 +1180,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.22" version = "1.0.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1425de3c33b0941002740a420b1a906a350b88d08b82b2c8a01035a3f9447bac" checksum = "93a56fabc59dce20fe48b6c832cc249c713e7ed88fa28b0ee0a3bfcaae5fe4e2"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1243,9 +1214,9 @@ dependencies = [
[[package]] [[package]]
name = "tar" name = "tar"
version = "0.4.26" version = "0.4.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b3196bfbffbba3e57481b6ea32249fbaf590396a52505a2615adbb79d9d826d3" checksum = "5c058ad0bd6ccb84faa24cc44d4fc99bee8a5d7ba9ff33aa4d993122d1aeeac2"
dependencies = [ dependencies = [
"filetime", "filetime",
"libc", "libc",
@ -1389,9 +1360,9 @@ checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
[[package]] [[package]]
name = "vcpkg" name = "vcpkg"
version = "0.2.8" version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fc439f2794e98976c88a2a2dafce96b930fe8010b0a256b3c2199a773933168" checksum = "55d1e41d56121e07f1e223db0a4def204e45c85425f6a16d462fd07c8d10d74c"
[[package]] [[package]]
name = "vec_map" name = "vec_map"
@ -1401,9 +1372,9 @@ checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191"
[[package]] [[package]]
name = "version_check" name = "version_check"
version = "0.9.1" version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
[[package]] [[package]]
name = "wasi" name = "wasi"
@ -1475,18 +1446,18 @@ dependencies = [
[[package]] [[package]]
name = "zstd" name = "zstd"
version = "0.5.1+zstd.1.4.4" version = "0.5.2+zstd.1.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c5d978b793ae64375b80baf652919b148f6a496ac8802922d9999f5a553194f" checksum = "644352b10ce7f333d6e0af85bd4f5322dc449416dc1211c6308e95bca8923db4"
dependencies = [ dependencies = [
"zstd-safe", "zstd-safe",
] ]
[[package]] [[package]]
name = "zstd-safe" name = "zstd-safe"
version = "2.0.3+zstd.1.4.4" version = "2.0.4+zstd.1.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bee25eac9753cfedd48133fa1736cbd23b774e253d89badbeac7d12b23848d3f" checksum = "7113c0c9aed2c55181f2d9f5b0a36e7d2c0183b11c058ab40b35987479efe4d7"
dependencies = [ dependencies = [
"libc", "libc",
"zstd-sys", "zstd-sys",
@ -1494,11 +1465,12 @@ dependencies = [
[[package]] [[package]]
name = "zstd-sys" name = "zstd-sys"
version = "1.4.15+zstd.1.4.4" version = "1.4.16+zstd.1.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89719b034dc22d240d5b407fb0a3fe6d29952c181cff9a9f95c0bd40b4f8f7d8" checksum = "c442965efc45353be5a9b9969c9b0872fff6828c7e06d118dda2cb2d0bb11d5a"
dependencies = [ dependencies = [
"cc", "cc",
"glob", "glob",
"itertools",
"libc", "libc",
] ]

View File

@ -17,32 +17,31 @@ exclude = [
[dependencies] [dependencies]
tree_magic = { package = "tree_magic_fork", version = "0.2.2" } tree_magic = { package = "tree_magic_fork", version = "0.2.2" }
regex = "1.3.6" regex = "1.3.9"
rkv = "0.10.4" rkv = "0.10.4"
cachedir = "0.1.1" cachedir = "0.1.1"
path-clean = "0.1.0" path-clean = "0.1.0"
bincode = "1.2.1" bincode = "1.2.1"
serde = { version = "1.0.106", features = ["derive"] } serde = { version = "1.0.111", features = ["derive"] }
zstd = "0.5.1" zstd = "0.5.2"
lazy_static = "1.4.0" lazy_static = "1.4.0"
serde_json = "1.0.51" serde_json = "1.0.53"
failure = "0.1.7"
zip = "0.5.5" zip = "0.5.5"
crossbeam = "0.7.3" crossbeam = "0.7.3"
clap = { version = "2.33.0", features = ["wrap_help"] } clap = { version = "2.33.1", features = ["wrap_help"] }
log = "0.4.8" log = "0.4.8"
env_logger = "0.7.1" env_logger = "0.7.1"
xz2 = "0.1.6" xz2 = "0.1.6"
flate2 = "1.0.14" flate2 = "1.0.14"
bzip2 = "0.3.3" bzip2 = "0.3.3"
tar = "0.4.26" tar = "0.4.28"
chrono = "0.4.11" chrono = "0.4.11"
encoding_rs = "0.8.22" encoding_rs = "0.8.23"
encoding_rs_io = "0.1.7" encoding_rs_io = "0.1.7"
rusqlite = { version = "0.23.1", features = ["vtab", "bundled"] } rusqlite = { version = "0.23.1", features = ["vtab", "bundled"] }
size_format = "1.0.2" size_format = "1.0.2"
structopt = "0.3.12" structopt = "0.3.14"
paste = "0.1.10" paste = "0.1.16"
tempfile = "3.1.0" tempfile = "3.1.0"
glob = "0.3.0" glob = "0.3.0"
exitfailure = "0.5.1" anyhow = "1.0.31"

View File

@ -211,7 +211,7 @@ The following adapters are disabled by default, and can be enabled using '--rga-
> \[default: 12\] > \[default: 12\]
**\--rga-cache-max-blob-len** \<cache-max-blob-len\> **\--rga-cache-max-blob-len**=\<cache-max-blob-len\>
> Max compressed size to cache > Max compressed size to cache
> >

View File

@ -10,7 +10,7 @@ pub mod tesseract;
pub mod zip; pub mod zip;
use crate::matching::*; use crate::matching::*;
use crate::preproc::PreprocConfig; use crate::preproc::PreprocConfig;
use failure::*; use anyhow::*;
use log::*; use log::*;
use regex::Regex; use regex::Regex;
use std::borrow::Cow; use std::borrow::Cow;
@ -58,7 +58,7 @@ pub trait FileAdapter: GetMetadata {
/// adapt a file. /// adapt a file.
/// ///
/// detection_reason is the Matcher that was used to identify this file. Unless --rga-accurate was given, it is always a FastMatcher /// detection_reason is the Matcher that was used to identify this file. Unless --rga-accurate was given, it is always a FastMatcher
fn adapt(&self, a: AdaptInfo, detection_reason: &SlowMatcher) -> Fallible<()>; fn adapt(&self, a: AdaptInfo, detection_reason: &SlowMatcher) -> Result<()>;
} }
pub struct AdaptInfo<'a> { pub struct AdaptInfo<'a> {
/// file path. May not be an actual file on the file system (e.g. in an archive). Used for matching file extensions. /// file path. May not be an actual file on the file system (e.g. in an archive). Used for matching file extensions.
@ -107,7 +107,7 @@ pub fn get_all_adapters() -> AdaptersTuple {
*/ */
pub fn get_adapters_filtered<T: AsRef<str>>( pub fn get_adapters_filtered<T: AsRef<str>>(
adapter_names: &[T], adapter_names: &[T],
) -> Fallible<Vec<Rc<dyn FileAdapter>>> { ) -> Result<Vec<Rc<dyn FileAdapter>>> {
let (def_enabled_adapters, def_disabled_adapters) = get_all_adapters(); let (def_enabled_adapters, def_disabled_adapters) = get_all_adapters();
let adapters = if !adapter_names.is_empty() { let adapters = if !adapter_names.is_empty() {
let adapters_map: HashMap<_, _> = def_enabled_adapters let adapters_map: HashMap<_, _> = def_enabled_adapters

View File

@ -1,6 +1,6 @@
use super::*; use super::*;
use crate::preproc::rga_preproc; use crate::preproc::rga_preproc;
use failure::*; use anyhow::*;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use std::path::PathBuf; use std::path::PathBuf;
@ -46,7 +46,7 @@ impl GetMetadata for DecompressAdapter {
} }
} }
fn decompress_any<'a, R>(reason: &SlowMatcher, inp: &'a mut R) -> Fallible<Box<dyn Read + 'a>> fn decompress_any<'a, R>(reason: &SlowMatcher, inp: &'a mut R) -> Result<Box<dyn Read + 'a>>
where where
R: Read, R: Read,
{ {
@ -91,7 +91,7 @@ fn get_inner_filename(filename: &Path) -> PathBuf {
} }
impl FileAdapter for DecompressAdapter { impl FileAdapter for DecompressAdapter {
fn adapt(&self, ai: AdaptInfo, detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
filepath_hint, filepath_hint,
mut inp, mut inp,

View File

@ -1,6 +1,6 @@
use super::spawning::map_exe_error; use super::spawning::map_exe_error;
use super::*; use super::*;
use failure::*; use anyhow::*;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::io::BufReader; use std::io::BufReader;
@ -48,7 +48,7 @@ struct FFprobeStream {
codec_type: String, // video,audio,subtitle codec_type: String, // video,audio,subtitle
} }
impl FileAdapter for FFmpegAdapter { impl FileAdapter for FFmpegAdapter {
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
is_real_file, is_real_file,
filepath_hint, filepath_hint,

View File

@ -43,7 +43,7 @@ impl GetMetadata for PdfPagesAdapter {
/// A pdf is basically converted to a zip that has Page X.png files. /// A pdf is basically converted to a zip that has Page X.png files.
/// This way, something like tesseract can process the pages individually /// This way, something like tesseract can process the pages individually
impl FileAdapter for PdfPagesAdapter { impl FileAdapter for PdfPagesAdapter {
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
filepath_hint, filepath_hint,
is_real_file, is_real_file,
@ -114,7 +114,7 @@ fn split_by_seq<'a>(
split_seq: &'a [u8], split_seq: &'a [u8],
split_inx: usize, split_inx: usize,
read: &mut Read, read: &mut Read,
) -> Fallible<impl IntoIterator<Item = impl Read> + 'a> { ) -> Result<impl IntoIterator<Item = impl Read> + 'a> {
let regex = split_seq let regex = split_seq
.iter() .iter()
.map(|c| format!("\\x{:0>2x}", c)) .map(|c| format!("\\x{:0>2x}", c))

View File

@ -42,7 +42,7 @@ impl SpawningFileAdapter for PopplerAdapter {
cmd.arg("-").arg("-"); cmd.arg("-").arg("-");
cmd cmd
} }
fn postproc(line_prefix: &str, inp: &mut dyn Read, oup: &mut dyn Write) -> Fallible<()> { fn postproc(line_prefix: &str, inp: &mut dyn Read, oup: &mut dyn Write) -> Result<()> {
// prepend Page X to each line // prepend Page X to each line
let mut page = 1; let mut page = 1;
for line in BufReader::new(inp).lines() { for line in BufReader::new(inp).lines() {

View File

@ -1,6 +1,6 @@
use super::*; use super::*;
use anyhow::*;
use encoding_rs_io::DecodeReaderBytesBuilder; use encoding_rs_io::DecodeReaderBytesBuilder;
use failure::*;
use log::*; use log::*;
use std::io::prelude::*; use std::io::prelude::*;
use std::io::BufReader; use std::io::BufReader;
@ -20,7 +20,7 @@ pub fn postproc_line_prefix(
line_prefix: &str, line_prefix: &str,
inp: &mut dyn Read, inp: &mut dyn Read,
oup: &mut dyn Write, oup: &mut dyn Write,
) -> Fallible<()> { ) -> Result<()> {
// TODO: parse these options from ripgrep's configuration // TODO: parse these options from ripgrep's configuration
let encoding = None; // detect bom but usually assume utf8 let encoding = None; // detect bom but usually assume utf8
let bom_sniffing = true; let bom_sniffing = true;
@ -57,7 +57,7 @@ pub trait SpawningFileAdapter: GetMetadata {
fn get_exe(&self) -> &str; fn get_exe(&self) -> &str;
fn command(&self, filepath_hint: &Path, command: Command) -> Command; fn command(&self, filepath_hint: &Path, command: Command) -> Command;
fn postproc(line_prefix: &str, inp: &mut dyn Read, oup: &mut dyn Write) -> Fallible<()> { fn postproc(line_prefix: &str, inp: &mut dyn Read, oup: &mut dyn Write) -> Result<()> {
postproc_line_prefix(line_prefix, inp, oup) postproc_line_prefix(line_prefix, inp, oup)
} }
} }
@ -78,8 +78,8 @@ pub fn pipe_output(
oup: &mut (dyn Write + Send), oup: &mut (dyn Write + Send),
exe_name: &str, exe_name: &str,
help: &str, help: &str,
cp: fn(line_prefix: &str, &mut dyn Read, &mut dyn Write) -> Fallible<()>, cp: fn(line_prefix: &str, &mut dyn Read, &mut dyn Write) -> Result<()>,
) -> Fallible<()> { ) -> Result<()> {
let mut cmd = cmd let mut cmd = cmd
.stdin(Stdio::piped()) .stdin(Stdio::piped())
.stdout(Stdio::piped()) .stdout(Stdio::piped())
@ -90,7 +90,7 @@ pub fn pipe_output(
// TODO: how to handle this copying better? // TODO: how to handle this copying better?
// do we really need threads for this? // do we really need threads for this?
crossbeam::scope(|s| -> Fallible<()> { crossbeam::scope(|s| -> Result<()> {
s.spawn(|_| cp(line_prefix, &mut stdo, oup).unwrap()); // errors? s.spawn(|_| cp(line_prefix, &mut stdo, oup).unwrap()); // errors?
std::io::copy(inp, &mut stdi)?; std::io::copy(inp, &mut stdi)?;
drop(stdi); // NEEDED! otherwise deadlock drop(stdi); // NEEDED! otherwise deadlock
@ -109,7 +109,7 @@ impl<T> FileAdapter for T
where where
T: SpawningFileAdapter, T: SpawningFileAdapter,
{ {
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
filepath_hint, filepath_hint,
mut inp, mut inp,

View File

@ -1,5 +1,5 @@
use super::*; use super::*;
use failure::*; use anyhow::Result;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use log::*; use log::*;
use rusqlite::types::ValueRef; use rusqlite::types::ValueRef;
@ -58,7 +58,7 @@ fn format_blob(b: ValueRef) -> String {
} }
impl FileAdapter for SqliteAdapter { impl FileAdapter for SqliteAdapter {
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
is_real_file, is_real_file,
filepath_hint, filepath_hint,

View File

@ -1,7 +1,7 @@
use super::*; use super::*;
use crate::preproc::rga_preproc; use crate::preproc::rga_preproc;
use ::tar::EntryType::Regular; use ::tar::EntryType::Regular;
use failure::*; use anyhow::*;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use log::*; use log::*;
use std::path::PathBuf; use std::path::PathBuf;
@ -36,7 +36,7 @@ impl GetMetadata for TarAdapter {
} }
impl FileAdapter for TarAdapter { impl FileAdapter for TarAdapter {
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
filepath_hint, filepath_hint,
mut inp, mut inp,

View File

@ -1,7 +1,7 @@
use super::*; use super::*;
use crate::preproc::rga_preproc; use crate::preproc::rga_preproc;
use ::zip::read::ZipFile; use ::zip::read::ZipFile;
use failure::*; use anyhow::*;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use log::*; use log::*;
@ -47,7 +47,7 @@ fn is_dir(f: &ZipFile) -> bool {
} }
impl FileAdapter for ZipAdapter { impl FileAdapter for ZipAdapter {
fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Fallible<()> { fn adapt(&self, ai: AdaptInfo, _detection_reason: &SlowMatcher) -> Result<()> {
let AdaptInfo { let AdaptInfo {
filepath_hint, filepath_hint,
mut inp, mut inp,

View File

@ -1,16 +1,42 @@
use failure::Fallible; use anyhow::*;
use log::*; use log::*;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::ffi::OsString; use std::ffi::OsString;
use std::iter::IntoIterator; use std::{iter::IntoIterator, str::FromStr};
use structopt::StructOpt; use structopt::StructOpt;
#[derive(Debug, Deserialize, Serialize)]
struct ReadableBytesCount(i64);
fn parse_readable_bytes_str(s: &str) -> Result<i64, Error> {
let suffix = s.chars().last();
if let Some(suffix) = suffix {
match suffix {
'k' | 'M' | 'G' => i64::from_str(s.trim_end_matches(suffix))
.with_context(|| format!("Could not parse int"))
.map(|e| {
e * match suffix {
'k' => 1000,
'M' => 1000_000,
'G' => 1000_000_000,
_ => panic!("impossible"),
}
}),
_ => i64::from_str(s).with_context(|| format!("Could not parse int")),
}
} else {
Err(format_err!("empty byte input"))
}
}
fn is_default<T: Default + PartialEq>(t: &T) -> bool { fn is_default<T: Default + PartialEq>(t: &T) -> bool {
t == &T::default() t == &T::default()
} }
// ugly, but serde and structopt use different methods to define defaults // ugly, but serde and structopt use different methods to define defaults, so need to declare defaults twice
macro_rules! set_default { macro_rules! set_default {
($name:ident, $val:expr, $type:ty) => { ($name:ident, $val:expr, $type:ty) => {
paste::item! { paste::item! {
@ -25,7 +51,7 @@ macro_rules! set_default {
} }
set_default!(cache_compression_level, 12, u32); set_default!(cache_compression_level, 12, u32);
set_default!(cache_max_blob_len, 2000000, u32); set_default!(cache_max_blob_len, 2000000, i64);
set_default!(max_archive_recursion, 4, i32); set_default!(max_archive_recursion, 4, i32);
#[derive(StructOpt, Debug, Deserialize, Serialize)] #[derive(StructOpt, Debug, Deserialize, Serialize)]
@ -83,12 +109,13 @@ pub struct RgaArgs {
long = "--rga-cache-max-blob-len", long = "--rga-cache-max-blob-len",
default_value = "2000000", default_value = "2000000",
hidden_short_help = true, hidden_short_help = true,
require_equals = true require_equals = true,
parse(try_from_str = parse_readable_bytes_str)
)] )]
/// Max compressed size to cache /// Max compressed size to cache
/// ///
/// Longest byte length (after compression) to store in cache. Longer adapter outputs will not be cached and recomputed every time. /// Longest byte length (after compression) to store in cache. Longer adapter outputs will not be cached and recomputed every time. Allowed suffixes: k M G
pub cache_max_blob_len: u32, pub cache_max_blob_len: i64,
#[serde( #[serde(
default = "def_cache_compression_level", default = "def_cache_compression_level",
@ -102,6 +129,8 @@ pub struct RgaArgs {
help = "" help = ""
)] )]
/// ZSTD compression level to apply to adapter outputs before storing in cache db /// ZSTD compression level to apply to adapter outputs before storing in cache db
///
/// Ranges from 1 - 22
pub cache_compression_level: u32, pub cache_compression_level: u32,
#[serde( #[serde(
@ -133,7 +162,7 @@ pub struct RgaArgs {
static RGA_CONFIG: &str = "RGA_CONFIG"; static RGA_CONFIG: &str = "RGA_CONFIG";
pub fn parse_args<I>(args: I) -> Fallible<RgaArgs> pub fn parse_args<I>(args: I) -> Result<RgaArgs>
where where
I: IntoIterator, I: IntoIterator,
I::Item: Into<OsString> + Clone, I::Item: Into<OsString> + Clone,
@ -158,7 +187,7 @@ where
} }
/// Split arguments into the ones we care about and the ones rg cares about /// Split arguments into the ones we care about and the ones rg cares about
pub fn split_args() -> Fallible<(RgaArgs, Vec<OsString>)> { pub fn split_args() -> Result<(RgaArgs, Vec<OsString>)> {
let mut app = RgaArgs::clap(); let mut app = RgaArgs::clap();
app.p.create_help_and_version(); app.p.create_help_and_version();

View File

@ -4,7 +4,7 @@ use ripgrep_all as rga;
use std::fs::File; use std::fs::File;
fn main() -> Result<(), exitfailure::ExitFailure> { fn main() -> anyhow::Result<()> {
env_logger::init(); env_logger::init();
let mut arg_arr: Vec<std::ffi::OsString> = std::env::args_os().collect(); let mut arg_arr: Vec<std::ffi::OsString> = std::env::args_os().collect();
let last = arg_arr.pop().expect("No filename specified"); let last = arg_arr.pop().expect("No filename specified");

View File

@ -1,4 +1,4 @@
use failure::Fallible; use anyhow::Result;
use log::*; use log::*;
use rga::adapters::spawning::map_exe_error; use rga::adapters::spawning::map_exe_error;
use rga::adapters::*; use rga::adapters::*;
@ -9,7 +9,7 @@ use structopt::StructOpt;
use std::process::Command; use std::process::Command;
fn main() -> Result<(), exitfailure::ExitFailure> { fn main() -> anyhow::Result<()> {
env_logger::init(); env_logger::init();
let (args, passthrough_args) = split_args()?; let (args, passthrough_args) = split_args()?;
@ -113,7 +113,7 @@ fn main() -> Result<(), exitfailure::ExitFailure> {
} }
/// add the directory that contains `rga` to PATH, so rga-preproc can find pandoc etc (if we are on Windows where we include dependent binaries) /// add the directory that contains `rga` to PATH, so rga-preproc can find pandoc etc (if we are on Windows where we include dependent binaries)
fn add_exe_to_path() -> Fallible<()> { fn add_exe_to_path() -> Result<()> {
use std::env; use std::env;
let mut exe = env::current_exe().expect("Could not get executable location"); let mut exe = env::current_exe().expect("Could not get executable location");
// let preproc_exe = exe.with_file_name("rga-preproc"); // let preproc_exe = exe.with_file_name("rga-preproc");

View File

@ -1,4 +1,4 @@
use failure::Fallible; use anyhow::Result;
use log::*; use log::*;
use std::io::Write; use std::io::Write;
@ -13,11 +13,7 @@ pub struct CachingWriter<W: Write> {
out: W, out: W,
} }
impl<W: Write> CachingWriter<W> { impl<W: Write> CachingWriter<W> {
pub fn new( pub fn new(out: W, max_cache_size: usize, compression_level: i32) -> Result<CachingWriter<W>> {
out: W,
max_cache_size: usize,
compression_level: i32,
) -> Fallible<CachingWriter<W>> {
Ok(CachingWriter { Ok(CachingWriter {
out, out,
max_cache_size, max_cache_size,

View File

@ -3,7 +3,7 @@
*/ */
use crate::adapters::*; use crate::adapters::*;
use failure::*; use anyhow::*;
use regex::{Regex, RegexSet}; use regex::{Regex, RegexSet};
@ -49,7 +49,7 @@ pub fn extension_to_regex(extension: &str) -> Regex {
pub fn adapter_matcher<T: AsRef<str>>( pub fn adapter_matcher<T: AsRef<str>>(
adapter_names: &[T], adapter_names: &[T],
slow: bool, slow: bool,
) -> Fallible<impl Fn(FileMeta) -> Option<(Rc<dyn FileAdapter>, SlowMatcher)>> { ) -> Result<impl Fn(FileMeta) -> Option<(Rc<dyn FileAdapter>, SlowMatcher)>> {
let adapters = get_adapters_filtered(adapter_names)?; let adapters = get_adapters_filtered(adapter_names)?;
// need order later // need order later
let adapter_names: Vec<String> = adapters.iter().map(|e| e.metadata().name.clone()).collect(); let adapter_names: Vec<String> = adapters.iter().map(|e| e.metadata().name.clone()).collect();

View File

@ -2,7 +2,7 @@ use crate::adapters::*;
use crate::args::RgaArgs; use crate::args::RgaArgs;
use crate::matching::*; use crate::matching::*;
use crate::CachingWriter; use crate::CachingWriter;
use failure::*; use anyhow::*;
use log::*; use log::*;
use path_clean::PathClean; use path_clean::PathClean;
use std::convert::TryInto; use std::convert::TryInto;
@ -22,7 +22,7 @@ pub struct PreprocConfig<'a> {
* If a cache is passed, read/write to it. * If a cache is passed, read/write to it.
* *
*/ */
pub fn rga_preproc(ai: AdaptInfo) -> Fallible<()> { pub fn rga_preproc(ai: AdaptInfo) -> Result<()> {
let AdaptInfo { let AdaptInfo {
filepath_hint, filepath_hint,
is_real_file, is_real_file,
@ -98,7 +98,7 @@ pub fn rga_preproc(ai: AdaptInfo) -> Fallible<()> {
cache.write().unwrap().get_or_run( cache.write().unwrap().get_or_run(
&db_name, &db_name,
&cache_key, &cache_key,
Box::new(|| -> Fallible<Option<Vec<u8>>> { Box::new(|| -> Result<Option<Vec<u8>>> {
// wrapping BufWriter here gives ~10% perf boost // wrapping BufWriter here gives ~10% perf boost
let mut compbuf = BufWriter::new(CachingWriter::new( let mut compbuf = BufWriter::new(CachingWriter::new(
oup, oup,
@ -120,7 +120,7 @@ pub fn rga_preproc(ai: AdaptInfo) -> Fallible<()> {
)?; )?;
let compressed = compbuf let compressed = compbuf
.into_inner() .into_inner()
.map_err(|_| "could not finish zstd") .map_err(|_| "could not finish zstd") // can't use with_context here
.unwrap() .unwrap()
.finish()?; .finish()?;
if let Some(cached) = compressed { if let Some(cached) = compressed {

View File

@ -1,8 +1,11 @@
use failure::{format_err, Fallible}; use anyhow::{format_err, Context, Result};
use log::*; use log::*;
use std::sync::{Arc, RwLock}; use std::{
fmt::Display,
sync::{Arc, RwLock},
};
pub fn open() -> Fallible<Arc<RwLock<dyn PreprocCache>>> { pub fn open() -> Result<Arc<RwLock<dyn PreprocCache>>> {
Ok(Arc::new(RwLock::new(LmdbCache::open()?))) Ok(Arc::new(RwLock::new(LmdbCache::open()?)))
} }
pub trait PreprocCache { pub trait PreprocCache {
@ -11,13 +14,13 @@ pub trait PreprocCache {
&mut self, &mut self,
db_name: &str, db_name: &str,
key: &[u8], key: &[u8],
runner: Box<dyn FnOnce() -> Fallible<Option<Vec<u8>>> + 'a>, runner: Box<dyn FnOnce() -> Result<Option<Vec<u8>>> + 'a>,
callback: Box<dyn FnOnce(&[u8]) -> Fallible<()> + 'a>, callback: Box<dyn FnOnce(&[u8]) -> Result<()> + 'a>,
) -> Fallible<()>; ) -> Result<()>;
} }
/// opens a LMDB cache /// opens a LMDB cache
fn open_cache_db() -> Fallible<std::sync::Arc<std::sync::RwLock<rkv::Rkv>>> { fn open_cache_db() -> Result<std::sync::Arc<std::sync::RwLock<rkv::Rkv>>> {
let app_cache = cachedir::CacheDirConfig::new("rga").get_cache_dir()?; let app_cache = cachedir::CacheDirConfig::new("rga").get_cache_dir()?;
let db_arc = rkv::Manager::singleton() let db_arc = rkv::Manager::singleton()
@ -46,30 +49,42 @@ pub struct LmdbCache {
} }
impl LmdbCache { impl LmdbCache {
pub fn open() -> Fallible<LmdbCache> { pub fn open() -> Result<LmdbCache> {
Ok(LmdbCache { Ok(LmdbCache {
db_arc: open_cache_db()?, db_arc: open_cache_db()?,
}) })
} }
} }
#[derive(Debug)]
struct RkvErrWrap(rkv::StoreError);
impl Display for RkvErrWrap {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl std::error::Error for RkvErrWrap {}
impl PreprocCache for LmdbCache { impl PreprocCache for LmdbCache {
// possible without second lambda? // possible without second lambda?
fn get_or_run<'a>( fn get_or_run<'a>(
&mut self, &mut self,
db_name: &str, db_name: &str,
key: &[u8], key: &[u8],
runner: Box<dyn FnOnce() -> Fallible<Option<Vec<u8>>> + 'a>, runner: Box<dyn FnOnce() -> Result<Option<Vec<u8>>> + 'a>,
callback: Box<dyn FnOnce(&[u8]) -> Fallible<()> + 'a>, callback: Box<dyn FnOnce(&[u8]) -> Result<()> + 'a>,
) -> Fallible<()> { ) -> Result<()> {
let db_env = self.db_arc.read().unwrap(); let db_env = self.db_arc.read().unwrap();
let db = db_env let db = db_env
.open_single(db_name, rkv::store::Options::create()) .open_single(db_name, rkv::store::Options::create())
.map_err(|p| format_err!("could not open db store: {:?}", p))?; .map_err(RkvErrWrap)
.with_context(|| format_err!("could not open cache db store"))?;
let reader = db_env.read().expect("could not get reader"); let reader = db_env.read().expect("could not get reader");
let cached = db let cached = db
.get(&reader, &key) .get(&reader, &key)
.map_err(|p| format_err!("could not read from db: {:?}", p))?; .map_err(RkvErrWrap)
.with_context(|| format_err!("could not read from db"))?;
match cached { match cached {
Some(rkv::Value::Blob(cached)) => { Some(rkv::Value::Blob(cached)) => {
@ -81,12 +96,17 @@ impl PreprocCache for LmdbCache {
debug!("did not get cached"); debug!("did not get cached");
drop(reader); drop(reader);
if let Some(got) = runner()? { if let Some(got) = runner()? {
let mut writer = db_env.write().map_err(|p| { let mut writer = db_env
format_err!("could not open write handle to cache: {:?}", p) .write()
})?; .map_err(RkvErrWrap)
.with_context(|| format_err!("could not open write handle to cache"))?;
db.put(&mut writer, &key, &rkv::Value::Blob(&got)) db.put(&mut writer, &key, &rkv::Value::Blob(&got))
.map_err(|p| format_err!("could not write to cache: {:?}", p))?; .map_err(RkvErrWrap)
writer.commit()?; .with_context(|| format_err!("could not write to cache"))?;
writer
.commit()
.map_err(RkvErrWrap)
.with_context(|| format!("could not write cache"))?;
} }
} }
}; };