Compare commits

...

27 Commits

Author SHA1 Message Date
phiresky 424e293942 chore: Release ripgrep_all version 0.10.6 4 months ago
phiresky d84604f2ad add missing fzf binary to release 4 months ago
phiresky f244b2d217 chore: Release ripgrep_all version 0.10.5 4 months ago
phiresky bb505b06ca return exit status of rg (fixes #139) 4 months ago
phiresky 2fcf565dbd chore: Release ripgrep_all version 0.10.4 4 months ago
phiresky 44fc7d7e71 add rga-no-prefix-filenames flag (fixes #154) 4 months ago
phiresky 3b94d93b7c chore: Release ripgrep_all version 0.10.3 4 months ago
phiresky 28d1f014aa disable typos because they keep checking exampledir 4 months ago
phiresky 89c47ebe1f clippy fix 4 months ago
phiresky f0619516c4 readme 4 months ago
phiresky 5d40305f2c output known adatpers on err 4 months ago
phiresky af81f221d5 Merge branch 'FliegendeWurst:mail-adapter' 4 months ago
phiresky 24859510c0 update flake lock 4 months ago
phiresky cb6c8ddf2a
Merge pull request #192 from aliesbelik/scoop-note
Add Scoop installation note
4 months ago
phiresky fbe85e415a change 4 months ago
phiresky 46998a8c69 0.10.0 4 months ago
phiresky bc9108ee5f silently exclude Thumbs.db 4 months ago
phiresky 1e93a36cb5 read+discard on archive recursion 4 months ago
phiresky dd2d2b7784 pragmas individually 4 months ago
phiresky 5397636910 fixes 4 months ago
Aliaksandr Belik ebb9613926 Move Windows installation note for better visibility 6 months ago
Aliaksandr Belik 9379901013 Add Scoop installation note 6 months ago
FliegendeWurst f72e6733d3 Recognize files starting with 'From ' as mbox
Seems tree_magic does not know about this format
10 months ago
FliegendeWurst 780aa3b134 Drop not needed deps 10 months ago
FliegendeWurst 6ae1fb3f6b Extend mailbox adapter to eml files 10 months ago
FliegendeWurst 2259730c67 Merge remote-tracking branch 'upstream/master' into mbox-extractor 10 months ago
FliegendeWurst 9642552fa3 Initial work on mbox extractor 10 months ago

@ -21,6 +21,7 @@ on:
- "v[0-9]+.[0-9]+.[0-9]+*"
jobs:
create-release:
permissions: write-all
name: create-release
runs-on: ubuntu-latest
# env:
@ -101,7 +102,7 @@ jobs:
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
fetch-depth: 1
@ -157,7 +158,9 @@ jobs:
- name: Strip release binary (linux and macos)
if: matrix.build == 'linux' || matrix.build == 'macos'
run: |
strip "target/${{ matrix.target }}/release/rga" "target/${{ matrix.target }}/release/rga-preproc"
strip "target/${{ matrix.target }}/release/rga" \
"target/${{ matrix.target }}/release/rga-preproc" \
"target/${{ matrix.target }}/release/rga-fzf"
- name: Strip release binary (arm)
if: matrix.build == 'linux-arm'
@ -167,7 +170,8 @@ jobs:
rustembedded/cross:arm-unknown-linux-gnueabihf \
arm-linux-gnueabihf-strip \
/target/arm-unknown-linux-gnueabihf/release/rga \
/target/arm-unknown-linux-gnueabihf/release/rga-preproc
/target/arm-unknown-linux-gnueabihf/release/rga-preproc \
/target/arm-unknown-linux-gnueabihf/release/rga-fzf
- name: Build archive
shell: bash
@ -181,11 +185,13 @@ jobs:
if [ "${{ matrix.os }}" = "windows-2019" ]; then
cp "target/${{ matrix.target }}/release/rga.exe" "$staging/"
cp "target/${{ matrix.target }}/release/rga-preproc.exe" "$staging/"
cp "target/${{ matrix.target }}/release/rga-fzf.exe" "$staging/"
7z a "$staging.zip" "$staging"
echo "ASSET=$staging.zip" >> $GITHUB_ENV
else
cp "target/${{ matrix.target }}/release/rga" "$staging/"
cp "target/${{ matrix.target }}/release/rga-preproc" "$staging/"
cp "target/${{ matrix.target }}/release/rga-fzf" "$staging/"
tar czf "$staging.tar.gz" "$staging"
echo "ASSET=$staging.tar.gz" >> $GITHUB_ENV
fi

158
.vscode/launch.json vendored

@ -1,78 +1,84 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'rga'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=rga"],
"filter": {
"name": "rga",
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'rga'",
"cargo": {
"args": ["build", "--bin=rga", "--package=rga"],
"filter": {
"name": "rga",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'rga'",
"cargo": {
"args": ["test", "--no-run", "--bin=rga", "--package=rga"],
"filter": {
"name": "rga",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'rga-preproc'",
"cargo": {
"args": ["build", "--bin=rga-preproc", "--package=rga"],
"filter": {
"name": "rga-preproc",
"kind": "bin"
}
},
"args": ["exampledir/short.pdf"],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'rga-preproc'",
"cargo": {
"args": ["test", "--no-run", "--bin=rga-preproc", "--package=rga"],
"filter": {
"name": "rga-preproc",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "lldb",
"request": "attach",
"name": "Attach",
"program": "${workspaceFolder}/target/release/rga-preproc"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in library 'rga'",
"cargo": {
"args": ["test", "--no-run", "--lib", "--package=rga"],
"filter": {
"name": "rga",
"kind": "lib"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'rga'",
"cargo": {
"args": ["build", "--bin=rga"],
"filter": {
"name": "rga",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'rga'",
"cargo": {
"args": ["test", "--no-run", "--bin=rga", "--package=ripgrep-all"],
"filter": {
"name": "rga",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug executable 'rga-preproc'",
"cargo": {
"args": ["build", "--bin=rga-preproc"],
"filter": {
"name": "rga-preproc",
"kind": "bin"
}
},
"args": ["exampledir/tar/test.tar.bz2"],
"cwd": "${workspaceFolder}"
},
{
"type": "lldb",
"request": "launch",
"name": "Debug unit tests in executable 'rga-preproc'",
"cargo": {
"args": ["test", "--no-run", "--bin=rga-preproc", "--package=rga"],
"filter": {
"name": "rga-preproc",
"kind": "bin"
}
},
"args": [],
"cwd": "${workspaceFolder}"
}
]
}

@ -1,13 +1,30 @@
# 1.0.0 (unreleased)
# 0.10.5 (2024-01-16)
- return the same exit status as rg
# 0.10.4 (2024-01-16)
- add `--rga-no-prefix-filenames` flag (https://github.com/phiresky/ripgrep-all/issues/154)
# 0.10.3 (2024-01-15)
This was originally supposed to be version 1.0.0, but I don't feel confident enough in the stability to call it that.
Highlights:
- rga is now configurable via a config file (~/.config/ripgrep-all/config.jsonc) that is generated on first use, including schema.
- Custom subprocess-spawning adapters can be defined via config file. See https://github.com/phiresky/ripgrep-all/wiki
- External adapters can be shared with the community at https://github.com/phiresky/ripgrep-all/discussions
Others:
- mbox adapter (@FliegendeWurst https://github.com/phiresky/ripgrep-all/pull/104)
- auto generate parts of the readme
- add loads of debug logs and performance timings when `--debug` is used
- better error messages via `anyhow`
- add cross-platform rga-fzf binary
- add a config file (~/.config/ripgrep-all/config.jsonc) that is generated on first use, including schema
- change whole code base to be async
- change adapter interface from `(&Read, &Write) -> ()` to `AsyncRead -> AsyncRead` to allow chaining of adapters
- allow custom subprocess-spawning adapters defined via config file
# 0.9.6 (2020-05-19)

920
Cargo.lock generated

File diff suppressed because it is too large Load Diff

@ -11,7 +11,7 @@ license = "AGPL-3.0-or-later"
name = "ripgrep_all"
readme = "README.md"
repository = "https://github.com/phiresky/ripgrep-all"
version = "1.0.0-alpha.5"
version = "0.10.6"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
@ -37,12 +37,14 @@ glob = "0.3.1"
json_comments = "0.2.1"
lazy_static = "1.4.0"
log = "0.4.17"
mailparse = "0.14.0"
memchr = "2.5.0"
mime2ext = "0.1.52"
paste = "1.0.12"
path-clean = "1.0.1"
pretty-bytes = "0.2.2"
regex = "1.8.2"
rusqlite = {version = "0.29.0", features = ["vtab", "bundled"]}
rusqlite = {version = "0.30.0", features = ["vtab", "bundled"]}
schemars = {version = "0.8.12", features = ["preserve_order"]}
serde = {version = "1.0.163", features = ["derive"]}
serde_json = "1.0.96"
@ -50,7 +52,7 @@ size_format = "1.0.2"
structopt = "0.3.26"
tempfile = "3.5.0"
tokio = {version = "1.28.1", features = ["full"]}
tokio-rusqlite = "0.4.0"
tokio-rusqlite = "0.5.0"
tokio-stream = {version = "0.1.14", features = ["io-util", "tokio-util"]}
tokio-tar = { git = "https://github.com/vorot93/tokio-tar", version = "0.3.0" }
tokio-util = {version = "0.7.8", features = ["io", "full"]}
@ -62,3 +64,7 @@ ctor = "0.2.0"
pretty_assertions = "1.3.0"
tempfile = "3.5.0"
tokio-test = "0.4.2"
[profile.release]
debug = true
split-debuginfo = "packed"

@ -45,7 +45,7 @@ Linux x64, macOS and Windows binaries are available [in GitHub Releases][latestr
#### Arch Linux
`pacman -S ripgrep-all`.
`pacman -S ripgrep-all`
#### Nix
@ -63,15 +63,21 @@ rga will search for all binaries it calls in \$PATH and the directory itself is
### Windows
Install ripgrep-all via [Chocolatey](https://chocolatey.org/packages/ripgrep-all):
Note that installing via [chocolatey](https://chocolatey.org/packages/ripgrep-all) or [scoop](https://github.com/ScoopInstaller/Main/blob/master/bucket/rga.json) is the only supported download method. If you download the binary from releases manually, you will not get the dependencies (for example pdftotext from poppler).
If you get an error like `VCRUNTIME140.DLL could not be found`, you need to install [vc_redist.x64.exe](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
#### Chocolatey
```
choco install ripgrep-all
```
Note that installing via chocolatey or scoop is the only supported download method. If you download the binary from releases manually, you will not get the dependencies (for example pdftotext from poppler).
#### Scoop
If you get an error like `VCRUNTIME140.DLL could not be found`, you need to install [vc_redist.x64.exe](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads).
```
scoop install rga
```
### Homebrew/Linuxbrew
@ -85,12 +91,12 @@ To install the dependencies that are each not strictly necessary but very useful
### Compile from source
rga should compile with stable Rust (v1.36.0+, check with `rustc --version`). To build it, run the following (or the equivalent in your OS):
rga should compile with stable Rust (v1.75.0+, check with `rustc --version`). To build it, run the following (or the equivalent in your OS):
```
~$ apt install build-essential pandoc poppler-utils ffmpeg ripgrep cargo
~$ cargo install --locked ripgrep_all
~$ rga --version # this should work now
~$ apt install build-essential pandoc poppler-utils ffmpeg ripgrep cargo
~$ cargo install --locked ripgrep_all
~$ rga --version # this should work now
```
## Available Adapters
@ -110,7 +116,7 @@ Adapters:
- **pandoc**
Uses pandoc to convert binary/unreadable text documents to plain markdown-like text
Runs: pandoc --from= --to=plain --wrap=none --markdown-headings=atx
Extensions: .epub, .odt, .docx, .fb2, .ipynb
Extensions: .epub, .odt, .docx, .fb2, .ipynb, .html, .htm
- **poppler**
Uses pdftotext (from poppler-utils) to extract plain text from PDF files
@ -134,7 +140,7 @@ Adapters:
- **decompress**
Reads compressed file as a stream and runs a different extractor on the contents.
Extensions: .tgz, .tbz, .tbz2, .gz, .bz2, .xz, .zst
Extensions: .als, .bz2, .gz, .tbz, .tbz2, .tgz, .xz, .zst
Mime Types: application/gzip, application/x-bzip, application/x-xz, application/zstd
- **tar**
@ -148,6 +154,11 @@ Adapters:
The following adapters are disabled by default, and can be enabled using '--rga-adapters=+foo,bar':
- **mail**
Reads mailbox/mail files and runs extractors on the contents and attachments.
Extensions: .mbox, .mbx, .eml
Mime Types: application/mbox, message/rfc822
## USAGE:
> rga \[RGA OPTIONS\] \[RG OPTIONS\] PATTERN \[PATH \...\]
@ -157,7 +168,7 @@ The following adapters are disabled by default, and can be enabled using '--rga-
**\--rga-accurate**
> Use more accurate but slower matching by mime type
>
> By default, rga will match files using file extensions. Some programs,
> such as sqlite3, don\'t care about the file extension at all, so users
> sometimes use any or no extension at all. With this flag, rga will try
@ -169,10 +180,10 @@ The following adapters are disabled by default, and can be enabled using '--rga-
**\--rga-no-cache**
> Disable caching of results
>
> By default, rga caches the extracted text, if it is small enough, to a
> database in \${XDG*CACHE_DIR-\~/.cache}/ripgrep-all on Linux,
> *\~/Library/Caches/ripgrep-all\_ on macOS, or
> database in \${XDG_CACHE_DIR-\~/.cache}/ripgrep-all on Linux,
> _\~/Library/Caches/ripgrep-all_ on macOS, or
> C:\\Users\\username\\AppData\\Local\\ripgrep-all on Windows. This way,
> repeated searches on the same set of files will be much faster. If you
> pass this flag, all caching will be disabled.
@ -206,7 +217,7 @@ The following adapters are disabled by default, and can be enabled using '--rga-
**\--rga-adapters=**\<adapters\>\...
> Change which adapters to use and in which priority order (descending)
>
> \"foo,bar\" means use only adapters foo and bar. \"-bar,baz\" means
> use all default adapters except for bar and baz. \"+bar,baz\" means
> use all default adapters and also bar and baz.
@ -215,22 +226,22 @@ The following adapters are disabled by default, and can be enabled using '--rga-
> ZSTD compression level to apply to adapter outputs before storing in
> cache db
>
> Ranges from 1 - 22 \[default: 12\]
**\--rga-config-file=**\<config-file-path\>
**\--rga-max-archive-recursion=**\<max-archive-recursion\>
> Maximum nestedness of archives to recurse into \[default: 4\]
> Maximum nestedness of archives to recurse into \[default: 5\]
**\--rga-cache-max-blob-len=**\<max-blob-len\>
> 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.
>
> Allowed suffixes on command line: k M G \[default: 2000000\]
**\--rga-cache-path=**\<path\>

@ -0,0 +1,217 @@
To: submit.t4eseGWSvG1JST3r@spam.spamcop.net
From: 2012gdwu <2012gdwu@posteo.de>
Subject: Postbank Spam
Autocrypt: addr=2012gdwu@posteo.de; keydata=
mDMEXXjwiRYJKwYBBAHaRw8BAQdAmjXRazNXXy5tK05Dwl5mSRbdth9JkQq92V/QVyqjdgm0
I0FybmUgS2VsbGVyIDxhcm5lLmtlbGxlckBwb3N0ZW8uZGU+iJYEExYIAD4WIQR2UN3HoAGx
KI0B7Eih+UCxBQvPLgUCXXjwiQIbAwUJCWYBgAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAK
CRCh+UCxBQvPLpPfAP4gs6Oky3+UO2LU2XxweeQO+YEWXK0QtM2+ajzrGaF3HAD+LBfmyB9+
Wom2KP0CwxUzI4d6zmiAMSKOnGGgzd65igm4OARdePCJEgorBgEEAZdVAQUBAQdAncxZ3Rox
wmvm+/qCkCm9+PU2HmWr08M3qdqkf2L4IngDAQgHiH4EGBYIACYWIQR2UN3HoAGxKI0B7Eih
+UCxBQvPLgUCXXjwiQIbDAUJCWYBgAAKCRCh+UCxBQvPLpQkAQCgYOlOftMNi+sfn+XQvfOc
ULQWp+cgOBMcyVCdpJEQCwD9HBuwuHobl8FPm0PbRtlCn/7GY4WK+Hh4+3BKmhRn8wU=
Message-ID: <1530ae05-33a7-fa40-9473-ca625a14385a@posteo.de>
Date: Mon, 20 Jul 2020 07:35:55 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101
Thunderbird/68.10.0
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="------------6670F92201FB126ED9472803"
Content-Language: de-DE
This is a multi-part message in MIME format.
--------------6670F92201FB126ED9472803
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: 7bit
here you go
--------------6670F92201FB126ED9472803
Content-Type: message/rfc822;
name="postbank.eml"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="postbank.eml"
Return-Path: <gxnwgddl@carcarry.de>
Delivered-To: arne.keller@posteo.de
Received: from proxy02.posteo.name ([127.0.0.1])
by dovecot12 (Dovecot) with LMTP id EaKBGxv9FF+9mwEAJesNpQ
for <arne.keller@posteo.de>; Mon, 20 Jul 2020 04:15:27 +0200
Received: from proxy02.posteo.de ([127.0.0.1])
by proxy02.posteo.name (Dovecot) with LMTP id 31UFGtHsFF+T4gMAGFAyLg
; Mon, 20 Jul 2020 04:15:27 +0200
Received: from mailin05.posteo.de (unknown [10.0.1.5])
by proxy02.posteo.de (Postfix) with ESMTPS id 4B950v2JYGz11fk
for <arne.keller@posteo.de>; Mon, 20 Jul 2020 04:15:27 +0200 (CEST)
Received: from mx03.posteo.de (mailin05.posteo.de [127.0.0.1])
by mailin05.posteo.de (Postfix) with ESMTPS id 4270120F15
for <arne.keller@posteo.de>; Mon, 20 Jul 2020 04:15:27 +0200 (CEST)
X-Virus-Scanned: amavisd-new at posteo.de
X-Spam-Flag: NO
X-Spam-Score: 2.639
X-Spam-Level: **
X-Spam-Status: No, score=2.639 tagged_above=-1000 required=8
tests=[AV:Heuristics.Phishing.Email.SpoofedDomain=0.1, ALL_TRUSTED=-1,
FROM_LOCAL_NOVOWEL=0.5, HK_RANDOM_ENVFROM=0.626, HK_RANDOM_FROM=0.999,
HTML_FONT_LOW_CONTRAST=0.001, HTML_IMAGE_ONLY_24=1.282,
HTML_MESSAGE=0.001, HTTPS_HTTP_MISMATCH=0.1, POSTEO_GENERICS_IO=0.01,
T_FILL_THIS_FORM_SHORT=0.01, T_REMOTE_IMAGE=0.01] autolearn=disabled
Received: from mout.web.de (mout.web.de [212.227.15.14])
by mx03.posteo.de (Postfix) with ESMTPS id 4B950t696Mz10nB
for <arne.keller@posteo.de>; Mon, 20 Jul 2020 04:15:26 +0200 (CEST)
Authentication-Results: mx03.posteo.de; dmarc=none (p=none dis=none) header.from=carcarry.de
Received: from [212.227.15.17] ([212.227.15.17]) by mx-ha.web.de (mxweb010
[212.227.15.17]) with ESMTPS (Nemesis) id 1MRloE-1kQNT22I4w-00T9hm for
<arne.keller@posteo.de>; Mon, 20 Jul 2020 04:15:26 +0200
Received: from mout.kundenserver.de ([212.227.17.24]) by mx-ha.web.de
(mxweb010 [212.227.15.17]) with ESMTPS (Nemesis) id 1MINbE-1k0aRm2Hzw-00EOVM
for <2012gdwu@web.de>; Mon, 20 Jul 2020 04:15:26 +0200
Received: from 217.160.251.109 ([217.160.251.109]) by mrelayeu.kundenserver.de
(mreue107 [212.227.15.183]) with ESMTPSA (Nemesis) id
1MPoPd-1kBHRt0o2F-00MqkS for <2012gdwu@web.de>; Mon, 20 Jul 2020 04:15:26
+0200
From: "=?utf-8?B?UE9TVEJBTs2fS82f?=" <gxnwgddl@carcarry.de>
Subject: BsetSign App : Y7P32-HTXU2-FRDG7
To: "2012gdwu" <2012gdwu@web.de>
Content-Type: multipart/alternative; boundary="QHebeB08yNTYquFAhtQnxv=_cOW4Xd528c"
MIME-Version: 1.0
Date: Mon, 20 Jul 2020 02:15:26 +0000
Message-ID: <1M3lHZ-1jyAPt0pTn-000u1I@mrelayeu.kundenserver.de>
X-Provags-ID: V03:K1:68TECBVA88ZKh8HcSl/N+ElwlecL1tc+1AuDDyqm9em66WO295R
IfuHqA9uG7+Vlyr99v+OneGltnr43KfsgRKj9GgOpDj2QelHphKFGPILAvvsQ8vOq6ucC2W
BW3NEOh3JhitB6o4xLEmj+dbivC0ie728/cPMcjj6TwyBzw5nT1or8mBZWoEMSF/zcu+PIr
gGpFY2puzzURN4oKX82/w==
X-Spam-Flag: NO
X-UI-Out-Filterresults: notjunk:1;V03:K0:c01ZANnvlk8=:ouSMGue72FUx2PJOSNnmEW
qI8A89gf6q3aAdJBhLX1Bhd70xio64ljpha9X5ArOYg6Q2RH1JYyvfBSMoTo3HMy37H3L8kaq
ReRCdSPOMD8+llZ/rRpPLl+7PofGOv+Hu3UO7gzgm9v0YqwLZIwh9P2w9TIu+GqVJWeDdmxrs
RDPeHY8lsRL+8AFeSGNiWBYMEHDxKofTqS5Zh7mal1Bm4JbgEEIP36V4oL3c6V1olMHQZzEH9
7D0T8U6LyLyfSbuu5M6QN2FZ+F6IDJNDUG1uwNt9K12ESY6TweMR3xInFabiZ9fMPmrjPaNwW
hlyKg67tDYL2lfk2fpa/LbhLnlfKEDqSvkgK54CZh+xbIQetju66cZUEFQyCIcGdAOWI8+nty
FdbNUzxhNpZTPBrA7H95gRuc0u2GJBfZZsxdp46jpBwG65yqmJ32pkJrATo8CNbBO9A6hpdyL
UNu5bavZBJp9dsyY6Cnm6vMOIjJ8qMy/vNkrtRXNWBrnVHhuQZ3B+osG8XWLiyq7s4hFOwDxY
WLRgjKL6HgIj+2DLParwiuSsX8TVy5+WhxDUou0UJDzD3C1JmYiryTlo4Vu4CIZFXkgAuAsEq
c55M6L2eUmD3xQNaqgMEJFksT2qXWaSb2Qw6HM7mtLBbSUhuWtSv2oeVrNwgx8XWexWYYZYFv
KAZzICpkVhxpYIntoKRiDtQZxBDejPwGmne2iG81rn34pGJwOOYojf9dFghodE5bZEqVh6KbA
f/38x9FIoYewzA2WuyngX/bXTdkLQM49W1vdlF5DQOlgYuM8Ni7NeJG888VhDZxcUn6vIIJs3
xH0jOWrWCUz0gK9uyyagjcfdXr54Zv1E7i936CTlRq5QnDKN2C9jQFH5ymD4G1W5zX6Xj/05O
M7VaU9Y3mvOM/+82zsKc5zJOFOf9MoI5JBhnPjHWeqaJgpYhNoKgGvPo3QfZFwzk/MHH2PgB1
PLGvjSE8u/cpYeGhJdzTXM00J9ai5yGRNFD71zHoHBOFGCpmZVnJJ8SD+qUd4K4BfSD+DJ5Qd
t1wsCpH5bgodnXgMcN6Zj0q3P/ODk3dnah1hsYMyIWDBFZ0cTlp2QkYhAKZh1HM5WcfSc5UwU
SrcK9HHiG7BKOFYA1r6Rx5YYqwGWeGxr9mlH7MLyfCwI8PlWtfeB7Pj4eEI1hLy9GMnHBCJDj
W8o1yDeE54rgWHR7CtIF6w+qF+quA3ZdwVSPOHwQeH7vS4OaJjeEyeeT4YOJdIMI7UknEasAG
LfMS/PKWx7+YcUNaz0xvO70NwZj1FKJuWqDS6ZTciMSvGkEFTWVOqn5nPlHi8hDbBTVn70aPa
BQi3U68hgdDpJIHlVLLvRcaCYYly3L60NQBgJroag4fRiIvDUSXfDatrDYOv+L4xBYdB3GP+s
wqtsPY82YOwXP5KlRMPVEZcuWX5tWiOuaNjePbEkXpE2iQZUqfkDQTYNUGZR+TTBqHOWjO7R3
hORQB0gOwe85gZv80G1EL32EtRjVxJxQfrHGPCGXb8HRXbvGGV3Xu3wZEE8iuJngBUJtWeDBq
q61rYwZxVuml72lfRM6Lo+OGLAsyqvobxujY9BHpokZH4FNlUstjUoPANTGoAhM+MyQb0fSAV
8HA/r6n0oJh0B8+2AxJvVokbhEbL/RlJIZIYpCeRceeA+jjBaR7EvuglUoLN3CcB9CrdDH/qz
ymHzEjPVnFar3/sqRjeKyIk71z4yotOKCPQcdD1gTbYWehZiIJwAlDFSpfPdFTQLOJMWd3wuD
0mHLep6tLtCY+hjhCYWlTyKKQ8CWiBWPTql21bPp7XVWCfc+4u8kZi5Y3dg3pvpSwwmcyRisX
+7+8a+pBzN4VOEuX+dzglKDrNd6h2OL0tBMnk1yqAV27dX9cMRrO941IvtiaZO90BjZtV92oP
XkGxvKnGQuynHus/3yblaw==
This is a multi-part message in MIME format
--QHebeB08yNTYquFAhtQnxv=_cOW4Xd528c
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
Sehr geehrter Herr / Frau =E2=80=A6,
Ab dem 20. Jul 2020 aktualisiert die Postbank alle BestSign-Anwendung=
en.
=C3=96ffnen Sie den unten stehenden Aktivierungslink, um am Upgrade t=
eilzunehmen. Verkn=C3=BCpfung
https://meine.postbank.de/#/login
Wir empfehlen dringend, dieses Upgrade durchzuf=C3=BChren.
Reundliche Gr=C3=BC=C3=9Fe,
=C2=A9 2020 Postbank=E2=80=93 eine Niederlassung der Deutsche Bank AG=
Hypnotiseur/zertifizierter Hypnosecoach (DVH)
Burnoutpr=C3=A4ventionscoach
Modeberater f=C3=BCr Ma=C3=9Fhemden/Ma=C3=9Fblusen
Kurs/Seminarleiter Waldbaden/Waldcoach
Am Wiesengrund 5
24980 Schafflund
Tel.: 04639-98475
Mob.: 015117317305
Home : www.hypnosepraxis-im-norden.de
Home : www.masshemden-im-norden.de
Home : www.waldbaden-zwischen-den-meeren.de
--QHebeB08yNTYquFAhtQnxv=_cOW4Xd528c
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
<html><head></head><body><p><img width=3D"174" height=3D"51" alt=3D"" =
src=3D"https://upload.wikimedia.org/wikipedia/commons/thumb/d/d1/Postb=
ank-Logo.svg/1200px-Postbank-Logo.svg.png"></p><p><br></p>
<div>
<div>&nbsp;Sehr geehrter Herr / Frau =E2=80=A6,</div>
<div>&nbsp;Ab dem 20. Jul 2020 aktualisiert die Postbank alle BestSign=
-Anwendungen.<br><br></div>
<div>&nbsp;=C3=96ffnen Sie den unten stehenden Aktivierungslink, um am=
Upgrade teilzunehmen. Verkn=C3=BCpfung</div><div><br></div>
<div>&nbsp;<a href=3D"https://www.astcdubai.com/.well-known/.re/">http=
s://meine.postbank.de/#/login</a></div><div><br></div>
<div>&nbsp;Wir empfehlen dringend, dieses Upgrade durchzuf=C3=BChren.<=
/div>
<div>&nbsp;Reundliche Gr=C3=BC=C3=9Fe,</div>
<div>&nbsp;<strong>=C2=A9</strong> 2020 <strong>Postbank</strong>=E2=80=
=93 eine Niederlassung der Deutsche Bank AG<br><br> <span style=3D"col=
or: rgb(255, 255, 255);">Hypnotiseur/zertifizierter Hypnosecoach (DVH)=
</span><br><span style=3D"color: rgb(255, 255, 255);"> Burnoutpr=C3=A4=
ventionscoach</span><br><span style=3D"color: rgb(255, 255, 255);"> Mo=
deberater f=C3=BCr Ma=C3=9Fhemden/Ma=C3=9Fblusen</span><br><span style=
=3D"color: rgb(255, 255, 255);"> Kurs/Seminarleiter Waldbaden/Waldcoac=
h</span><br><span style=3D"color: rgb(255, 255, 255);"> Am Wiesengrund=
5</span><br><span style=3D"color: rgb(255, 255, 255);"> 24980 Schaffl=
und</span><br><span style=3D"color: rgb(255, 255, 255);"> Tel.: 04639-=
98475</span><br><span style=3D"color: rgb(255, 255, 255);"> Mob.: 0151=
17317305</span><br><span style=3D"color: rgb(255, 255, 255);"> Home : =
<a style=3D"color: rgb(255, 255, 255);" href=3D"https://deref-gmx.net/=
mail/client/Pk7kcpLwLpI/dereferrer/?redirectUrl=3Dhttp%3A%2F%2Fwww.hyp=
nosepraxis-im-norden.de" target=3D"_blank" rel=3D"noopener">www.hypnos=
epraxis-im-norden.de</a></span><br><span style=3D"color: rgb(255, 255,=
255);"> Home : <a style=3D"color: rgb(255, 255, 255);" href=3D"https:=
//deref-gmx.net/mail/client/KR0VAuy5YPo/dereferrer/?redirectUrl=3Dhttp=
%3A%2F%2Fwww.masshemden-im-norden.de" target=3D"_blank" rel=3D"noopene=
r">www.masshemden-im-norden.de</a></span><br><span style=3D"color: rgb=
(255, 255, 255);"> Home : <a style=3D"color: rgb(255, 255, 255);" href=
=3D"https://deref-gmx.net/mail/client/QTybHixMVsI/dereferrer/?redirect=
Url=3Dhttp%3A%2F%2Fwww.waldbaden-zwischen-den-meeren.de" target=3D"_bl=
ank" rel=3D"noopener">www.waldbaden-zwischen-den-meeren.de</a></span><=
/div>
</div></body></html>
--QHebeB08yNTYquFAhtQnxv=_cOW4Xd528c--
--------------6670F92201FB126ED9472803--

File diff suppressed because it is too large Load Diff

@ -0,0 +1,69 @@
Return-Path: <noreply@github.com>
Date: Mon, 31 Jul 2023 01:34:57 -0700
From: "github-actions[bot]" <notifications@github.com>
To: KeYProject/key <key@noreply.github.com>
In-Reply-To: <KeYProject/key/pull/3232@github.com>
References: <KeYProject/key/pull/3232@github.com>
Subject: Re: [KeYProject/key] Fix more UI bugs (PR #3232)
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="--==_mimepart_64c77231630fb_12bafdd0c012685";
charset=UTF-8
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: github-actions[bot]
X-GitHub-Recipient: FliegendeWurst
X-GitHub-Reason: author
List-ID: KeYProject/key <key.KeYProject.github.com>
List-Archive: https://github.com/KeYProject/key
X-Auto-Response-Suppress: All
destinations: 2012gdwu+github@posteo.de
X-GitHub-Recipient-Address: 2012gdwu+github@posteo.de
----==_mimepart_64c77231630fb_12bafdd0c012685
Content-Type: text/plain;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Thank you for your contribution.
The test artifacts are available on [Artiweb](https://keyproject.github.io/artiweb/3232/).
The newest artifact is [here](https://keyproject.github.io/artiweb/3232/833812796/).
--
Reply to this email directly or view it on GitHub:
https://github.com/KeYProject/key/pull/3232#issuecomment-1657918122
You are receiving this because you authored the thread.
Message ID: <KeYProject/key/pull/3232/c1657918122@github.com>
----==_mimepart_64c77231630fb_12bafdd0c012685
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
<p></p>
<p dir="auto">Thank you for your contribution.</p>
<p dir="auto">The test artifacts are available on <a href="https://keyproject.github.io/artiweb/3232/" rel="nofollow">Artiweb</a>.<br>
The newest artifact is <a href="https://keyproject.github.io/artiweb/3232/833812796/" rel="nofollow">here</a>.</p>
<p style="font-size:small;-webkit-text-size-adjust:none;color:#666;">&mdash;<br />Reply to this email directly, <a href="https://github.com/KeYProject/key/pull/3232#issuecomment-1657918122">view it on GitHub</a>, or <a href="https://github.com/notifications/unsubscribe-auth/AC72QTN2XK2D42XVPNPMTXLXS5U3DANCNFSM6AAAAAA25Y7T4M">unsubscribe</a>.<br />You are receiving this because you authored the thread.<img src="https://github.com/notifications/beacon/AC72QTNZM6RAGMF7TAEUEL3XS5U3DA5CNFSM6AAAAAA25Y7T4OWGG33NNVSW45C7OR4XAZNMJFZXG5LFINXW23LFNZ2KUY3PNVWWK3TUL5UWJTTC2HJKU.gif" height="1" width="1" alt="" /><span style="color: transparent; font-size: 0; display: none; visibility: hidden; overflow: hidden; opacity: 0; width: 0; height: 0; max-width: 0; max-height: 0; mso-hide: all">Message ID: <span>&lt;KeYProject/key/pull/3232/c1657918122</span><span>@</span><span>github</span><span>.</span><span>com&gt;</span></span></p>
<script type="application/ld+json">[
{
"@context": "http://schema.org",
"@type": "EmailMessage",
"potentialAction": {
"@type": "ViewAction",
"target": "https://github.com/KeYProject/key/pull/3232#issuecomment-1657918122",
"url": "https://github.com/KeYProject/key/pull/3232#issuecomment-1657918122",
"name": "View Pull Request"
},
"description": "View this Pull Request on GitHub",
"publisher": {
"@type": "Organization",
"name": "GitHub",
"url": "https://github.com"
}
}
]</script>
----==_mimepart_64c77231630fb_12bafdd0c012685--

@ -0,0 +1,984 @@
From - Mon Jul 31 15:15:47 2023
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:
Content-Type: multipart/mixed;
boundary="------------4qicfcop0idtQJYkG05sMt93"
Message-ID: <68b5f6c4-8de4-02e9-fd09-8157d8ccd29b@student.kit.edu>
Date: Mon, 31 Jul 2023 15:15:41 +0200
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
Thunderbird/102.13.0
From: Arne Keller <uskyk@student.kit.edu>
Content-Language: de-DE
To: <recipient@gmail.com>
Subject: Subject line
X-Enigmail-Draft-Status: N00200
X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0;
attachmentreminder=0; deliveryformat=0
X-Identity-Key: id6
Fcc: imap://KIT%5Cuskyk@imap.kit.edu/Sent
MIME-Version: 1.0
--------------4qicfcop0idtQJYkG05sMt93
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: 7bit
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title></title>
</head>
<body>
<p>regular text<br>
</p>
</body>
</html>
--------------4qicfcop0idtQJYkG05sMt93
Content-Type: application/pdf; name="short.pdf"
Content-Disposition: attachment; filename="short.pdf"
Content-Transfer-Encoding: base64
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
zhUtk8I7g3h4jsfChVS2tUNJq1N+OJE3vqwROtkY10wlDXg14G1wP75PSZe7tp6tNH8Qb+UYvCMB
AW2GfhBJF0GzzkP2fLXAtiXFVbHWVESLFCUAFDmT0UmoY/olFaeqgN3iKY9Ito12a5ztA9xS08bb
Haoda/mb9xVo+p2oQFGrMVQVWp5bbbhgjmPXQYxxH/WJFm1JTrYz+51bGnBdgvFPabjN9V9kzTKM
NwgepRzRkUONVYg2xRHgncX1zyxtAR88djaeW4WduN9op/OGhbHlWGeIrXVKVo8rH+CUmhy1JxrE
huS88JI+ePYKOu6ZtjH4ASJA586XTmBClwFaXgAM0lVW3k6l+XD4p57ebrYyYXJjfC5bHeeIzFMQ
9X4JyOmZZZGQn76lOUFQHih+P4JPSok/9KyVuKbIvCVRwOK6EeY3DG8pKWxsfGRf+ybNpKVRzubu
dZG5jBFGP3otS07e3LP6bana84rPRFTwkBYey2m56oWHb5m82mRPF5Bf7be+vreENpasmU3WmvhF
j4xaMX7sPdujePleVw5ip9GiYgYVih2wl52dzKppK9xhbKvWbcmtbCDr4jO12xw5umWLLFCgVrub
WU2lZXgWrQeds9LbyzO46E5/f+5x5doy3mRNgZ1Sr+3tiNNEtOd7qvEA3KiTU3KOsOYKVtIR0kpD
gCeHDXVViUURH3pzPN/QkfIaqYvzaIQJCy7TPKlww2I77PGRqMgz3/v6V6yNyVcncLOW5PPXLJkL
yf2UzDXu3KqgObOOuzA83eRUWckXYZkpc51+ptNhgFM0PL97j1XhokJBlCcZ/P8AhORPCgplbmRz
dHJlYW0KZW5kb2JqCjMxIDAgb2JqCjw8Ci9BdXRob3IoKS9UaXRsZSgpL1N1YmplY3QoKS9DcmVh
dG9yKFwzNzZcMzc3XDAwMExcMDAwYVwwMDBUXDAwMGVcMDAwWFwwMDBcMDQwXDAwMHZcMDAwaVww
MDBhXDAwMFwwNDBcMDAwcFwwMDBhXDAwMG5cMDAwZFwwMDBvXDAwMGMpL1Byb2R1Y2VyKHBkZlRl
WC0xLjQwLjE5KS9LZXl3b3JkcygpCi9DcmVhdGlvbkRhdGUgKEQ6MjAxOTA2MDUxNTA5MjArMDIn
MDAnKQovTW9kRGF0ZSAoRDoyMDE5MDYwNTE1MDkyMCswMicwMCcpCi9UcmFwcGVkIC9GYWxzZQov
UFRFWC5GdWxsYmFubmVyIChUaGlzIGlzIHBkZlRlWCwgVmVyc2lvbiAzLjE0MTU5MjY1LTIuNi0x
LjQwLjE5IChUZVggTGl2ZSAyMDE4L0FyY2ggTGludXgpIGtwYXRoc2VhIHZlcnNpb24gNi4zLjAp
Cj4+CmVuZG9iagoyIDAgb2JqCjw8Ci9UeXBlIC9PYmpTdG0KL04gMjUKL0ZpcnN0IDE3OAovTGVu
Z3RoIDExMjkgICAgICAKL0ZpbHRlciAvRmxhdGVEZWNvZGUKPj4Kc3RyZWFtCnjarVZtc9s2DP6u
X4GP8XYWxXfyrtc7J667rEnaS7Kua5IPms3a2imWT5Iv7b8fIMmW7cxd9vLBNAk+APEAIAUOCUiQ
HAxwwcECNxIciMSAB6E8KBBeAFcgbYKboBIO3IGyScQ9aJMgFryyIBCVaFJCSw7V0KImIdq0ijZR
Dw1yjhoJLgQIriVwCUImJhJoQiqHSmgCjxfohdIIRpPaoo94kvYyevUK2A2wt8VtAWwMdxIZXAOb
ZPUDvH6N2xG7/bYKwD6k8xCxs2JZh2VdgSZcxK5DVazLaaiQWSO4DLMsPS2+wl2CAoNuWS8eIlQv
UY/cI1hnuT/v02+fcU/E1jiwiY7R4+U6zx+OIWWDNMbG3Lv/G2p1zM0BdILEgYI1wQTxpIsSZhAT
0M4x38iW5qjCPpTF9CbUcIeRG0+A3YavNXTW9iJ+UoVpnRXLH2I+IM2Te2kN/uw9pnVBQ6Ah3w4F
DfeJSuj/aSspt4DZILpTWElYBrEFmmnOY96te6nQOtbguI0dVp6IRYdrR0IowQmbuNiDxOxgIu+E
bfBYci/9tRrtaJ+NytLJnUQnmH0XS7CikRqJJxuXxAaMFoRwCj0inDStr4RotY3Q4Lnp9jtZo9tZ
l4Y0kLXZ2CecpnyK7fGaqpZM90S7Wauok52dVqaUwkDuzmVC8x7RanRS0YfDYcnJDtOjW4T0FHzp
G3uOUtDsYgqIKBHHW6ywZJvk6Ya+5DTrpJ7GVuKl7RA9tt1X2uNaNRqqRzV7jnQfdt4AugTjUE3L
bFUXZXsprtJH3Ln6+eOby/MfLy6vi8d0ycXwtMhnCMjTOT4NLfK0eRaGyhoYCodPl7b4mHFp8XkY
VVN6HoxD7Fm6+ilk80W3pANpb8g9rs7rNM+mo+U8D5BE7KYOjx8xfz5inzolzADaWKQlXb8TNmOB
LVjOClayp0HrySRDbcF3n6K/I3h+dT2+erclmAyvw3ydp+URjvi8DoXHylL0YHOxx9Hvc/Qv4mh2
KUq+SzFFghn7gxXLwFahzIoZq1jN1nts5T9hOxp9fns+3mHbunSErHYdWenoPRT635IdcrWhq81R
uoHY7XHTz7m9WU6LWbac43HZly8BPz70kcJ3sYsQKE/xAm9ZivWTUJ3gv2pDiTPHcuTCWYGjwtpp
Iopzz54enocR3V7/XjdLEqK/p2kVmo/G0buxF3364Dcf0ElWVjWRJa8idpFuVhxD92s2qxcV9QgN
dkOSuoK/zO733PpORR94pg49U2bPMbt1DHuY/+7Y8eI78Ms8jxjfc8z0jrkXOEYtTkU9zpo6lYi9
y2ZV1yEcpPz9us6zJYGbw6nLaszT2dvFxs5GM6uxVnnn9IiawGbWdUZizyG6hnj2ybiYDm/qtKwH
0OzDySLkeTF8Ksp8NgDXylboOLUPpl3udhS+9Z5dZI9ZfWBxF9j3RKFCnHDPw3OWYh6KedTGadPK
bWOxYdD5LvyG3jxcFrPAfqlCH7b3q7AcNYfD9hn+E7Q51S0KZW5kc3RyZWFtCmVuZG9iagozMiAw
IG9iago8PAovVHlwZSAvWFJlZgovSW5kZXggWzAgMzNdCi9TaXplIDMzCi9XIFsxIDIgMV0KL1Jv
b3QgMzAgMCBSCi9JbmZvIDMxIDAgUgovSUQgWzxCMjE4QUE3ODgwNDhGMjQ0QjUyRUNDMkJCRjdG
REUzNz4gPEIyMThBQTc4ODA0OEYyNDRCNTJFQ0MyQkJGN0ZERTM3Pl0KL0xlbmd0aCA4OSAgICAg
ICAgCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp42hXLyQGCUBRD0eShjMqkIG3Rg+3Y
iKXohhrowTXevzhJNpF0hEL+vsgwcqtLO5DhhDN6DBhxQ4EJJTpUqNHYRfpfvO6pr37/Ure4Y8YD
iz+St6f+7n0I1gplbmRzdHJlYW0KZW5kb2JqCnN0YXJ0eHJlZgo1MzM0OAolJUVPRgo=
--------------4qicfcop0idtQJYkG05sMt93--

@ -0,0 +1,86 @@
From
Message-ID: <55a23774-4da7-057c-77a7-ec390fed487b@posteo.de>
Date: Mon, 27 Feb 2023 12:05:46 +0100
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
Thunderbird/102.8.0
From: Arne Keller <2012gdwu@web.de>
Subject: From encoding test
To: arne.keller@posteo.de
Content-Language: de-DE
X-Enigmail-Draft-Status: N00200
X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0;
attachmentreminder=0; deliveryformat=0
X-Identity-Key: id2
Fcc: imap://2012gdwu@imap.web.de/Gesendet
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>&gt;From</p>
<p>Another word &gt;From<br>
</p>
</body>
</html>
From
Message-ID: <55a23774-4da7-057c-77a7-ec390fed487b@posteo.de>
Date: Mon, 27 Feb 2023 12:06:56 +0100
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
Thunderbird/102.8.0
From: Arne Keller <2012gdwu@web.de>
Subject: From encoding test
To: arne.keller@posteo.de
Content-Language: de-DE
X-Enigmail-Draft-Status: N00200
X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0;
attachmentreminder=0; deliveryformat=1
X-Identity-Key: id2
Fcc: imap://2012gdwu@imap.web.de/Gesendet
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>&gt;From</p>
<p>Another word &gt;From<br>
</p>
</body>
</html>
From - Mon Feb 27 12:06:57 2023
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Message-ID: <55a23774-4da7-057c-77a7-ec390fed487b@posteo.de>
Date: Mon, 27 Feb 2023 12:06:56 +0100
MIME-Version: 1.0
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101
Thunderbird/102.8.0
From: Arne Keller <2012gdwu@web.de>
Subject: From encoding test
To: arne.keller@posteo.de
Content-Language: de-DE
X-Enigmail-Draft-Status: N00200
X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0;
attachmentreminder=0; deliveryformat=1
X-Identity-Key: id2
Fcc: imap://2012gdwu@imap.web.de/Gesendet
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>&gt;From</p>
<p>Another word &gt;From<br>
</p>
</body>
</html>

@ -3,11 +3,11 @@
"advisory-db": {
"flake": false,
"locked": {
"lastModified": 1685821301,
"narHash": "sha256-4XRcnSboLJw1XKjDpg2jBU70jEw/8Bgx4nUmnq3kXbY=",
"lastModified": 1705203771,
"narHash": "sha256-2SApzyw9lm1Dfq+mxLf6JsEVb1hJ5pwR5osd58dj0aQ=",
"owner": "rustsec",
"repo": "advisory-db",
"rev": "af3f3d503f82056785841bee49997bae65eba1c0",
"rev": "826f71c4027a6db6ecf870fdd541814041fc8e1e",
"type": "github"
},
"original": {
@ -18,19 +18,16 @@
},
"crane": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
],
"rust-overlay": "rust-overlay"
]
},
"locked": {
"lastModified": 1693787605,
"narHash": "sha256-rwq5U8dy+a9JFny/73L0SJu1GfWwATMPMTp7D+mjHy8=",
"lastModified": 1704819371,
"narHash": "sha256-oFUfPWrWGQTZaCM3byxwYwrMLwshDxVGOrMH5cVP/X8=",
"owner": "ipetkov",
"repo": "crane",
"rev": "8b4f7a4dab2120cf41e7957a28a853f45016bd9d",
"rev": "5c234301a1277e4cc759c23a2a7a00a06ddd7111",
"type": "github"
},
"original": {
@ -42,27 +39,11 @@
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-compat_2": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
@ -76,29 +57,11 @@
"systems": "systems"
},
"locked": {
"lastModified": 1692799911,
"narHash": "sha256-3eihraek4qL744EvQXsK1Ha6C3CR7nnT8X2qWap4RNk=",
"lastModified": 1705309234,
"narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "f9e7cf818399d17d347f847525c5a5a8032e4e44",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1685518550,
"narHash": "sha256-o2d0KcvaXzTrPRIo0kOLV0/QXHhDQ5DTi+OxcjO8xqY=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "a1720a10a6cfe8234c0e93907ffe81be440f4cef",
"rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26",
"type": "github"
},
"original": {
@ -115,11 +78,11 @@
]
},
"locked": {
"lastModified": 1660459072,
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
"lastModified": 1703887061,
"narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
"rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5",
"type": "github"
},
"original": {
@ -130,11 +93,11 @@
},
"nixpkgs": {
"locked": {
"lastModified": 1685860998,
"narHash": "sha256-ZexAPe8yvJaLvn5aVgjW0vY41RnmJGbgOdGBJk1yDIE=",
"lastModified": 1705358780,
"narHash": "sha256-bhyKNLV2XW1H1QTAqTcqdDiIkWV2lBUHvx3A5lrlG+E=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "45d47b647d7bbaede5121d731cbee78f6093b6d6",
"rev": "005862f60d11a2949b696191d67315b8ee69d8fa",
"type": "github"
},
"original": {
@ -145,23 +108,23 @@
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1685801374,
"narHash": "sha256-otaSUoFEMM+LjBI1XL/xGB5ao6IwnZOXc47qhIgJe8U=",
"lastModified": 1704874635,
"narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "c37ca420157f4abc31e26f436c1145f8951ff373",
"rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-23.05",
"ref": "nixos-23.11",
"repo": "nixpkgs",
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat_2",
"flake-compat": "flake-compat",
"flake-utils": [
"flake-utils"
],
@ -172,11 +135,11 @@
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1694364351,
"narHash": "sha256-oadhSCqopYXxURwIA6/Anpe5IAG11q2LhvTJNP5zE6o=",
"lastModified": 1705229514,
"narHash": "sha256-itILy0zimR/iyUGq5Dgg0fiW8plRDyxF153LWGsg3Cw=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "4f883a76282bc28eb952570afc3d8a1bf6f481d7",
"rev": "ffa9a5b90b0acfaa03b1533b83eaf5dead819a05",
"type": "github"
},
"original": {
@ -189,52 +152,27 @@
"inputs": {
"advisory-db": "advisory-db",
"crane": "crane",
"flake-utils": "flake-utils_2",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": "pre-commit-hooks",
"rust-overlay": "rust-overlay_2"
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"flake-utils": [
"crane",
"flake-utils"
],
"nixpkgs": [
"crane",
"nixpkgs"
]
},
"locked": {
"lastModified": 1693707092,
"narHash": "sha256-HR1EnynBSPqbt+04/yxxqsG1E3n6uXrOl7SPco/UnYo=",
"lastModified": 1705285102,
"narHash": "sha256-e7uridAdtZOiUZD7fjrWkUB6qr1HM2thQpDRRgJfLNc=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "98ccb73e6eefc481da6039ee57ad8818d1ca8d56",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"rust-overlay_2": {
"inputs": {
"flake-utils": [
"flake-utils"
],
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1685846256,
"narHash": "sha256-G4aYK4VqlMHImvZ0lUnLHw1A+Cx28T0sBMvAKZBcGpk=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "1ef3c6de6127a1cba94cc5492cdde52e33d06ea4",
"rev": "d681ac8a92a1cce066df1d3a5a7f7c909688f4be",
"type": "github"
},
"original": {
@ -257,21 +195,6 @@
"repo": "default",
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",

@ -114,11 +114,7 @@
hooks = {
nixfmt.enable = true;
rustfmt.enable = true;
typos = {
enable = true;
types = [ "text" ];
excludes = [ "exampledir/.*" ];
};
typos.enable = false;
};
};
};

@ -1,6 +1,7 @@
pub mod custom;
pub mod decompress;
pub mod ffmpeg;
pub mod mbox;
pub mod postproc;
use std::sync::Arc;
pub mod sqlite;
@ -122,6 +123,7 @@ pub fn get_all_adapters(custom_adapters: Option<Vec<CustomAdapterConfig>>) -> Ad
Arc::new(ffmpeg::FFmpegAdapter::new()),
Arc::new(zip::ZipAdapter::new()),
Arc::new(decompress::DecompressAdapter::new()),
Arc::new(mbox::MboxAdapter::new()),
Arc::new(tar::TarAdapter::new()),
Arc::new(sqlite::SqliteAdapter::new()),
];
@ -174,12 +176,22 @@ pub fn get_adapters_filtered<T: AsRef<str>>(
let inx = adapters
.iter()
.position(|a| a.metadata().name == name)
.ok_or_else(|| format_err!("Could not remove {}: Not in list", name))?;
.ok_or_else(|| format_err!("Could not remove adapter {}: Not in list", name))?;
adapters.remove(inx);
} else {
let adapter = adapters_map
.get(name)
.ok_or_else(|| format_err!("Unknown adapter: \"{}\"", name))?
.ok_or_else(|| {
format_err!(
"Unknown adapter: \"{}\". Known adapters: {}",
name,
adapters_map
.keys()
.map(|e| e.as_ref())
.collect::<Vec<&str>>()
.join(", ")
)
})?
.clone();
if additive {
adapters.insert(0, adapter);

@ -100,7 +100,7 @@ lazy_static! {
name: "pandoc".to_string(),
description: "Uses pandoc to convert binary/unreadable text documents to plain markdown-like text".to_string(),
version: 3,
extensions: strs(&["epub", "odt", "docx", "fb2", "ipynb"]),
extensions: strs(&["epub", "odt", "docx", "fb2", "ipynb", "html", "htm"]),
binary: "pandoc".to_string(),
mimetypes: None,
// simpler markown (with more information loss but plainer text)

@ -0,0 +1,238 @@
use super::*;
use anyhow::Result;
use async_stream::stream;
use lazy_static::lazy_static;
use mime2ext::mime2ext;
use regex::bytes::Regex;
use tokio::io::AsyncReadExt;
use std::{collections::VecDeque, io::Cursor};
static EXTENSIONS: &[&str] = &["mbox", "mbx", "eml"];
static MIME_TYPES: &[&str] = &["application/mbox", "message/rfc822"];
lazy_static! {
static ref METADATA: AdapterMeta = AdapterMeta {
name: "mail".to_owned(),
version: 1,
description:
"Reads mailbox/mail files and runs extractors on the contents and attachments."
.to_owned(),
recurses: true,
fast_matchers: EXTENSIONS
.iter()
.map(|s| FastFileMatcher::FileExtension(s.to_string()))
.collect(),
slow_matchers: Some(
MIME_TYPES
.iter()
.map(|s| FileMatcher::MimeType(s.to_string()))
.collect()
),
disabled_by_default: true,
keep_fast_matchers_if_accurate: true
};
static ref FROM_REGEX: Regex = Regex::new("\r?\nFrom [^\n]+\n").unwrap();
}
#[derive(Default)]
pub struct MboxAdapter;
impl MboxAdapter {
pub fn new() -> MboxAdapter {
MboxAdapter
}
}
impl GetMetadata for MboxAdapter {
fn metadata(&self) -> &AdapterMeta {
&METADATA
}
}
#[async_trait]
impl FileAdapter for MboxAdapter {
async fn adapt(
&self,
ai: AdaptInfo,
_detection_reason: &FileMatcher,
) -> Result<AdaptedFilesIterBox> {
let AdaptInfo {
filepath_hint,
mut inp,
line_prefix,
archive_recursion_depth,
config,
postprocess,
..
} = ai;
let mut content = Vec::new();
let s = stream! {
inp.read_to_end(&mut content).await?;
let mut ais = vec![];
for mail_bytes in FROM_REGEX.splitn(&content, usize::MAX) {
let mail_content = mail_bytes.splitn(2, |x| *x == b'\n').nth(1).unwrap();
let mail = mailparse::parse_mail(mail_content);
if mail.is_err() {
continue;
}
let mail = mail.unwrap();
let mut todos = VecDeque::new();
todos.push_back(mail);
while let Some(mail) = todos.pop_front() {
let mut path = filepath_hint.clone();
let filename = mail.get_content_disposition().params.get("filename").cloned();
match &*mail.ctype.mimetype {
x if x.starts_with("multipart/") => {
todos.extend(mail.subparts);
continue;
}
mime => {
if let Some(name) = filename {
path.push(name);
} else if let Some(extension) = mime2ext(mime) {
path.push(format!("data.{extension}"));
} else {
path.push("data");
}
}
}
let mut config = config.clone();
config.accurate = true;
let raw_body = mail.get_body_raw();
if raw_body.is_err() {
continue;
}
let ai2: AdaptInfo = AdaptInfo {
filepath_hint: path,
is_real_file: false,
archive_recursion_depth: archive_recursion_depth + 1,
inp: Box::pin(Cursor::new(raw_body.unwrap())),
line_prefix: line_prefix.to_string(),
config,
postprocess,
};
ais.push(ai2);
}
}
for a in ais {
yield(Ok(a));
}
};
Ok(Box::pin(s))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::preproc::loop_adapt;
use crate::test_utils::*;
use pretty_assertions::assert_eq;
use tokio::fs::File;
use tokio_stream::StreamExt;
#[tokio::test]
async fn mail_simple() -> Result<()> {
let adapter = MboxAdapter;
let filepath = test_data_dir().join("github_email.eml");
let (a, d) = simple_adapt_info(&filepath, Box::pin(File::open(&filepath).await?));
let mut r = adapter.adapt(a, &d).await?;
let mut count = 0;
while let Some(file) = r.next().await {
let mut file = file?;
let mut buf = Vec::new();
file.inp.read_to_end(&mut buf).await?;
match file
.filepath_hint
.components()
.last()
.unwrap()
.as_os_str()
.to_str()
.unwrap()
{
"data.txt" | "data.html" => {
assert!(String::from_utf8(buf)?.contains("Thank you for your contribution"));
}
x => panic!("unexpected filename {x:?}"),
}
count += 1;
}
assert_eq!(2, count);
Ok(())
}
#[tokio::test]
async fn mbox_simple() -> Result<()> {
let adapter = MboxAdapter;
let filepath = test_data_dir().join("test.mbx");
let (a, d) = simple_adapt_info(&filepath, Box::pin(File::open(&filepath).await?));
let mut r = adapter.adapt(a, &d).await?;
let mut count = 0;
while let Some(file) = r.next().await {
let mut file = file?;
assert_eq!(
"data.html",
file.filepath_hint.components().last().unwrap().as_os_str()
);
let mut buf = Vec::new();
file.inp.read_to_end(&mut buf).await?;
assert_eq!("<html>\r\n <head>\r\n <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">\r\n </head>\r\n <body>\r\n <p>&gt;From</p>\r\n <p>Another word &gt;From<br>\r\n </p>\r\n </body>\r\n</html>", String::from_utf8(buf)?.trim());
count += 1;
}
assert_eq!(3, count);
Ok(())
}
#[tokio::test]
async fn mbox_attachment() -> Result<()> {
init_logging();
let adapter = MboxAdapter;
let filepath = test_data_dir().join("mail_with_attachment.mbox");
let (a, d) = simple_adapt_info(&filepath, Box::pin(File::open(&filepath).await?));
let mut r = loop_adapt(&adapter, d, a).await?;
let mut count = 0;
while let Some(file) = r.next().await {
let mut file = file?;
let path = file
.filepath_hint
.components()
.last()
.unwrap()
.as_os_str()
.to_str()
.unwrap();
let mut buf = Vec::new();
file.inp.read_to_end(&mut buf).await?;
match path {
"data.html.txt" => {
assert_eq!(
"PREFIX:regular text\nPREFIX:\n",
String::from_utf8(buf).unwrap_or("err".to_owned())
);
}
"short.pdf.txt" => {
assert_eq!("PREFIX:Page 1: hello world\nPREFIX:Page 1: this is just a test.\nPREFIX:Page 1: \nPREFIX:Page 1: 1\nPREFIX:Page 1: \nPREFIX:Page 1: \n", String::from_utf8(buf).unwrap_or("err".to_owned()));
}
_ => {
panic!("unrelated {path:?}");
}
}
count += 1;
}
assert_eq!(2, count); // one message + one attachment
Ok(())
}
}

@ -183,7 +183,6 @@ impl FileAdapter for PostprocPageBreaks {
// keep adapt info (filename etc) except replace inp
let ai = AdaptInfo {
inp: Box::pin(read),
postprocess: true,
archive_recursion_depth: a.archive_recursion_depth + 1,
filepath_hint: a
.filepath_hint

@ -122,6 +122,10 @@ impl WritingFileAdapter for SqliteAdapter {
_detection_reason: &FileMatcher,
oup: Pin<Box<dyn AsyncWrite + Send>>,
) -> Result<()> {
if ai.filepath_hint.file_name().and_then(|e| e.to_str()) == Some("Thumbs.db") {
// skip windows thumbnail cache
return Ok(());
}
let oup_sync = SyncIoBridge::new(oup);
tokio::task::spawn_blocking(|| synchronous_dump_sqlite(ai, oup_sync))
.await?

@ -103,7 +103,9 @@ impl FileAdapter for ZipAdapter {
let mut zip = ZipFileReader::new(inp);
let s = stream! {
trace!("begin zip");
while let Some(mut entry) = zip.next_entry().await? {
trace!("zip next entry");
let file = entry.entry();
if file.filename().ends_with('/') {
zip = entry.skip().await?;
@ -143,6 +145,7 @@ impl FileAdapter for ZipAdapter {
zip = entry.done().await.context("going to next file in zip but entry was not read fully")?;
}
trace!("zip over");
};
Ok(Box::pin(s))

@ -30,7 +30,7 @@ async fn main() -> anyhow::Result<()> {
is_real_file: true,
line_prefix: "".to_string(),
archive_recursion_depth: 0,
postprocess: true,
postprocess: !config.no_prefix_filenames,
config,
};

@ -133,9 +133,12 @@ fn main() -> anyhow::Result<()> {
.spawn()
.map_err(|e| map_exe_error(e, "rg", "Please make sure you have ripgrep installed."))?;
child.wait()?;
let result = child.wait()?;
log::debug!("running rg took {}", print_dur(before));
if !result.success() {
std::process::exit(result.code().unwrap_or(1));
}
Ok(())
}

@ -33,6 +33,7 @@ pub fn async_read_and_write_to_cache<'a>(
let s = stream! {
let mut stream = ReaderStream::new(inp);
while let Some(bytes) = stream.next().await {
trace!("read bytes: {:?}", bytes);
if let Ok(bytes) = &bytes {
if let Some(writer) = zstd_writer.as_mut() {
writer.write_all(bytes).await?;
@ -48,14 +49,18 @@ pub fn async_read_and_write_to_cache<'a>(
}
yield bytes;
}
trace!("eof");
// EOF, call on_finish
let finish = {
if let Some(mut writer) = zstd_writer.take() {
writer.shutdown().await?;
let res = writer.into_inner();
trace!("EOF");
if res.len() <= max_cache_size {
trace!("writing {} bytes to cache", res.len());
(bytes_written, Some(res))
} else {
trace!("cache longer than max, dropping");
(bytes_written, None)
}
} else {

@ -38,7 +38,7 @@ impl ToString for MaxArchiveRecursion {
}
impl Default for MaxArchiveRecursion {
fn default() -> Self {
MaxArchiveRecursion(4)
MaxArchiveRecursion(5)
}
}
@ -144,6 +144,9 @@ pub struct RgaConfig {
pub cache: CacheConfig,
/// Maximum nestedness of archives to recurse into
///
/// When searching in archives, rga will recurse into archives inside archives.
/// This option limits the depth.
#[serde(default, skip_serializing_if = "is_default")]
#[structopt(
default_value,
@ -153,6 +156,14 @@ pub struct RgaConfig {
)]
pub max_archive_recursion: MaxArchiveRecursion,
/// Don't prefix lines of files within archive with the path inside the archive.
///
/// Inside archives, by default rga prefixes the content of each file with the file path within the archive.
/// This is usually useful, but can cause problems because then the inner path is also searched for the pattern.
#[serde(default, skip_serializing_if = "is_default")]
#[structopt(long = "--rga-no-prefix-filenames")]
pub no_prefix_filenames: bool,
//////////////////////////////////////////
//////////////////////////// Config file only
//////////////////////////////////////////

@ -20,9 +20,9 @@ use std::io::Cursor;
use std::path::Path;
use std::pin::Pin;
use std::sync::Arc;
use tokio::io::AsyncBufRead;
use tokio::io::AsyncBufReadExt;
use tokio::io::BufReader;
use tokio::io::{AsyncBufRead, AsyncReadExt};
pub type ActiveAdapters = Vec<Arc<dyn FileAdapter>>;
@ -41,9 +41,13 @@ async fn choose_adapter(
let mimetype = if config.accurate {
let buf = inp.fill_buf().await?; // fill but do not consume!
let mimetype = tree_magic::from_u8(buf);
debug!("mimetype: {:?}", mimetype);
Some(mimetype)
if buf.starts_with(b"From \x0d") || buf.starts_with(b"From -") {
Some("application/mbox")
} else {
let mimetype = tree_magic::from_u8(buf);
debug!("mimetype: {:?}", mimetype);
Some(mimetype)
}
} else {
None
};
@ -149,7 +153,12 @@ async fn adapt_caching(
};
let mut cache = cache.context("No cache?")?;
let cache_key = CacheKey::new(&ai.filepath_hint, adapter.as_ref(), &active_adapters)?;
let cache_key = CacheKey::new(
ai.postprocess,
&ai.filepath_hint,
adapter.as_ref(),
&active_adapters,
)?;
// let dbg_ctx = format!("adapter {}", &adapter.metadata().name);
let cached = cache.get(&cache_key).await.context("cache.get")?;
match cached {
@ -185,6 +194,17 @@ async fn adapt_caching(
}
}
async fn read_discard(mut x: ReadBox) -> Result<()> {
let mut buf = [0u8; 1 << 16];
loop {
let n = x.read(&mut buf).await?;
if n == 0 {
break;
}
}
Ok(())
}
pub fn loop_adapt(
adapter: &dyn FileAdapter,
detection_reason: FileMatcher,
@ -213,9 +233,12 @@ pub async fn loop_adapt_inner(
};
let s = stream! {
for await file in inp {
trace!("next file");
match buf_choose_adapter(file?).await? {
Ret::Recurse(ai, adapter, detection_reason, _active_adapters) => {
if ai.archive_recursion_depth >= ai.config.max_archive_recursion.0 {
// some adapters (esp. zip) assume that the entry is read fully and might hang otherwise
read_discard(ai.inp).await?;
let s = format!("{}[rga: max archive recursion reached ({})]\n", ai.line_prefix, ai.archive_recursion_depth).into_bytes();
yield Ok(AdaptInfo {
inp: Box::pin(Cursor::new(s)),
@ -241,7 +264,9 @@ pub async fn loop_adapt_inner(
yield Ok(ai);
}
}
trace!("done with files");
}
trace!("stream ended");
};
Ok(Box::pin(s))
}

@ -1,12 +1,15 @@
use crate::{adapters::FileAdapter, preproc::ActiveAdapters};
use anyhow::{Context, Result};
use log::warn;
use path_clean::PathClean;
use rusqlite::{named_params, OptionalExtension};
use std::{path::Path, time::UNIX_EPOCH};
use tokio_rusqlite::Connection;
static SCHEMA_VERSION: i32 = 3;
#[derive(Clone)]
pub struct CacheKey {
config_hash: String,
adapter: String,
adapter_version: i32,
active_adapters: String,
@ -15,6 +18,7 @@ pub struct CacheKey {
}
impl CacheKey {
pub fn new(
postprocess: bool,
filepath_hint: &Path,
adapter: &dyn FileAdapter,
active_adapters: &ActiveAdapters,
@ -34,6 +38,11 @@ impl CacheKey {
"null".to_string()
};
Ok(CacheKey {
config_hash: if postprocess {
"a41e2e9".to_string()
} else {
"f1502a3".to_string()
}, // todo: when we add more config options that affect caching, create a struct and actually hash it
adapter: adapter.metadata().name.clone(),
adapter_version: adapter.metadata().version,
file_path: filepath_hint.clean().to_string_lossy().to_string(),
@ -55,57 +64,58 @@ async fn connect_pragmas(db: &Connection) -> Result<()> {
//db.execute(&format!("pragma page_size = {};", want_page_size))
// .context("setup pragma 1")?;
db.call(|db| {
db.execute_batch(
"
pragma journal_mode = WAL;
pragma foreign_keys = on;
pragma temp_store = memory;
pragma synchronous = off; -- integrity isn't very important here
pragma mmap_size = 30000000000;
// db.busy_timeout(Duration::from_secs(10))?;
db.pragma_update(None, "journal_mode", "wal")?;
db.pragma_update(None, "foreign_keys", "on")?;
db.pragma_update(None, "temp_store", "memory")?;
db.pragma_update(None, "synchronous", "off")?; // integrity isn't very important here
db.pragma_update(None, "mmap_size", "2000000000")?;
db.execute("
create table if not exists preproc_cache (
config_hash text not null,
adapter text not null,
adapter_version integer not null,
created_unix_ms integer not null default (unixepoch() * 1000),
active_adapters text not null, -- 'null' if adapter cannot recurse
file_path text not null,
file_mtime_unix_ms integer not null,
text_content_zstd blob not null
) strict", []
)?;
create table if not exists preproc_cache (
adapter text not null,
adapter_version integer not null,
created_unix_ms integer not null default (unixepoch() * 1000),
active_adapters text not null, -- 'null' if adapter cannot recurse
file_path text not null,
file_mtime_unix_ms integer not null,
text_content_zstd blob not null
) strict;
create unique index if not exists preproc_cache_idx on preproc_cache (adapter, adapter_version, file_path, active_adapters);
",
)
db.execute("create unique index if not exists preproc_cache_idx on preproc_cache (config_hash, adapter, adapter_version, file_path, active_adapters)", [])?;
Ok(())
})
.await.context("connect_pragmas")?;
let jm: i64 = db
.call(|db| db.pragma_query_value(None, "application_id", |r| r.get(0)))
.call(|db| Ok(db.pragma_query_value(None, "application_id", |r| r.get(0))?))
.await?;
if jm != 924716026 {
// (probably) newly created db
create_pragmas(db).await.context("create_pragmas")?;
db.call(|db| Ok(db.pragma_update(None, "application_id", "924716026")?))
.await?;
}
Ok(())
}
async fn create_pragmas(db: &Connection) -> Result<()> {
db.call(|db| {
db.execute_batch(
"
pragma application_id = 924716026;
pragma user_version = 2; -- todo: on upgrade clear db if version is unexpected
",
)
})
.await?;
Ok(())
}
struct SqliteCache {
db: Connection,
}
impl SqliteCache {
async fn new(path: &Path) -> Result<SqliteCache> {
let db = Connection::open(path.join("cache.sqlite3")).await?;
db.call(|db| {
let schema_version: i32 = db.pragma_query_value(None, "user_version", |r| r.get(0))?;
if schema_version != SCHEMA_VERSION {
warn!("Cache schema version mismatch, clearing cache");
db.execute("drop table if exists preproc_cache", [])?;
db.pragma_update(None, "user_version", format!("{SCHEMA_VERSION}"))?;
}
Ok(())
})
.await?;
connect_pragmas(&db).await?;
Ok(SqliteCache { db })
@ -119,24 +129,27 @@ impl PreprocCache for SqliteCache {
Ok(self
.db
.call(move |db| {
db.query_row(
"select text_content_zstd from preproc_cache where
Ok(db
.query_row(
"select text_content_zstd from preproc_cache where
adapter = :adapter
and config_hash = :config_hash
and adapter_version = :adapter_version
and active_adapters = :active_adapters
and file_path = :file_path
and file_mtime_unix_ms = :file_mtime_unix_ms
",
named_params! {
":adapter": &key.adapter,
":adapter_version": &key.adapter_version,
":active_adapters": &key.active_adapters,
":file_path": &key.file_path,
":file_mtime_unix_ms": &key.file_mtime_unix_ms
},
|r| r.get::<_, Vec<u8>>(0),
)
.optional()
named_params! {
":config_hash": &key.config_hash,
":adapter": &key.adapter,
":adapter_version": &key.adapter_version,
":active_adapters": &key.active_adapters,
":file_path": &key.file_path,
":file_mtime_unix_ms": &key.file_mtime_unix_ms
},
|r| r.get::<_, Vec<u8>>(0),
)
.optional()?)
})
.await
.context("reading from cache")?)
@ -144,25 +157,32 @@ impl PreprocCache for SqliteCache {
async fn set(&mut self, key: &CacheKey, value: Vec<u8>) -> Result<()> {
let key = (*key).clone(); // todo: without cloning
log::trace!(
"Writing to cache: {}, {}, {} byte",
key.adapter,
key.file_path,
value.len()
);
Ok(self
.db
.call(move |db| {
db.execute(
"insert into preproc_cache (adapter, adapter_version, active_adapters, file_path, file_mtime_unix_ms, text_content_zstd) values
(:adapter, :adapter_version, :active_adapters, :file_path, :file_mtime_unix_ms, :text_content_zstd)
on conflict (adapter, adapter_version, active_adapters, file_path) do update set
"insert into preproc_cache (config_hash, adapter, adapter_version, active_adapters, file_path, file_mtime_unix_ms, text_content_zstd) values
(:config_hash, :adapter, :adapter_version, :active_adapters, :file_path, :file_mtime_unix_ms, :text_content_zstd)
on conflict (config_hash, adapter, adapter_version, active_adapters, file_path) do update set
file_mtime_unix_ms = :file_mtime_unix_ms,
created_unix_ms = unixepoch() * 1000,
text_content_zstd = :text_content_zstd",
named_params! {
":config_hash": &key.config_hash,
":adapter": &key.adapter,
":adapter_version": &key.adapter_version,
":active_adapters": &key.active_adapters,
":file_path": &key.file_path,
":file_mtime_unix_ms": &key.file_mtime_unix_ms,
":text_content_zstd": value
}
).map(|_| ())
})?;
Ok(())
})
.await?)
}

@ -46,7 +46,11 @@ pub fn simple_adapt_info_full(
postprocess: true,
},
FastFileMatcher::FileExtension(
filepath.extension().unwrap().to_string_lossy().into_owned(),
filepath
.extension()
.unwrap_or_default()
.to_string_lossy()
.into_owned(),
)
.into(),
)
@ -68,3 +72,8 @@ pub fn poppler_adapter() -> CustomSpawningFileAdapter {
adapter.to_adapter()
}
#[cfg(test)]
pub fn init_logging() {
let _ = env_logger::builder().is_test(true).try_init();
}

Loading…
Cancel
Save