ui-snapshot: add support for zstd compression

This patch adds support for zstd [0] compressed snapshots (*.tar.zst).
We enable multiple working threads (-T0), but keep default compression
level. The latter can be influenced by environment variable.

[0] https://www.zstd.net/

Signed-off-by: Christian Hesse <mail@eworm.de>
This commit is contained in:
Christian Hesse 2020-02-26 09:12:21 +01:00 committed by Jason A. Donenfeld
parent cc230bf044
commit 892ba8c3cc
4 changed files with 56 additions and 4 deletions

View File

@ -407,9 +407,12 @@ side-by-side-diffs::
snapshots:: snapshots::
Text which specifies the default set of snapshot formats that cgit Text which specifies the default set of snapshot formats that cgit
generates links for. The value is a space-separated list of zero or generates links for. The value is a space-separated list of zero or
more of the values "tar", "tar.gz", "tar.bz2", "tar.xz", "tar.lz" and more of the values "tar", "tar.gz", "tar.bz2", "tar.lz", "tar.xz",
"zip". The special value "all" enables all snapshot formats. "tar.zst" and "zip". The special value "all" enables all snapshot
Default value: none. formats. Default value: none.
All compressors use default settings. Some settings can be influenced
with environment variables, for example set ZSTD_CLEVEL=10 in web
server environment for higher (but slower) zstd compression.
source-filter:: source-filter::
Specifies a command which will be invoked to format plaintext blobs Specifies a command which will be invoked to format plaintext blobs

View File

@ -104,7 +104,7 @@ virtual-root=/
cache-root=$PWD/cache cache-root=$PWD/cache
cache-size=1021 cache-size=1021
snapshots=tar.gz tar.bz tar.lz tar.xz zip snapshots=tar.gz tar.bz tar.lz tar.xz tar.zst zip
enable-log-filecount=1 enable-log-filecount=1
enable-log-linecount=1 enable-log-linecount=1
summary-log=5 summary-log=5

View File

@ -122,6 +122,48 @@ test_expect_success XZ 'verify untarred file-5' '
test_line_count = 1 master/file-5 test_line_count = 1 master/file-5
' '
if test -n "$(which zstd 2>/dev/null)"; then
test_set_prereq ZSTD
else
say 'Skipping ZSTD validation tests: zstd not found'
fi
test_expect_success ZSTD 'get foo/snapshot/master.tar.zst' '
cgit_url "foo/snapshot/master.tar.zst" >tmp
'
test_expect_success ZSTD 'check html headers' '
head -n 1 tmp |
grep "Content-Type: application/x-zstd" &&
head -n 2 tmp |
grep "Content-Disposition: inline; filename=.master.tar.zst."
'
test_expect_success ZSTD 'strip off the header lines' '
strip_headers <tmp >master.tar.zst
'
test_expect_success ZSTD 'verify zstd format' '
zstd --test master.tar.zst &&
cp master.tar.zst /tmp/.
'
test_expect_success ZSTD 'untar' '
rm -rf master &&
tar --zstd -xf master.tar.zst
'
test_expect_success ZSTD 'count files' '
ls master/ >output &&
test_line_count = 5 output
'
test_expect_success ZSTD 'verify untarred file-5' '
grep "^5$" master/file-5 &&
test_line_count = 1 master/file-5
'
test_expect_success 'get foo/snapshot/master.zip' ' test_expect_success 'get foo/snapshot/master.zip' '
cgit_url "foo/snapshot/master.zip" >tmp cgit_url "foo/snapshot/master.zip" >tmp
' '

View File

@ -91,6 +91,12 @@ static int write_tar_xz_archive(const char *hex, const char *prefix)
return write_compressed_tar_archive(hex, prefix, argv); return write_compressed_tar_archive(hex, prefix, argv);
} }
static int write_tar_zstd_archive(const char *hex, const char *prefix)
{
char *argv[] = { "zstd", "-T0", NULL };
return write_compressed_tar_archive(hex, prefix, argv);
}
const struct cgit_snapshot_format cgit_snapshot_formats[] = { const struct cgit_snapshot_format cgit_snapshot_formats[] = {
/* .tar must remain the 0 index */ /* .tar must remain the 0 index */
{ ".tar", "application/x-tar", write_tar_archive }, { ".tar", "application/x-tar", write_tar_archive },
@ -98,6 +104,7 @@ const struct cgit_snapshot_format cgit_snapshot_formats[] = {
{ ".tar.bz2", "application/x-bzip2", write_tar_bzip2_archive }, { ".tar.bz2", "application/x-bzip2", write_tar_bzip2_archive },
{ ".tar.lz", "application/x-lzip", write_tar_lzip_archive }, { ".tar.lz", "application/x-lzip", write_tar_lzip_archive },
{ ".tar.xz", "application/x-xz", write_tar_xz_archive }, { ".tar.xz", "application/x-xz", write_tar_xz_archive },
{ ".tar.zst", "application/x-zstd", write_tar_zstd_archive },
{ ".zip", "application/x-zip", write_zip_archive }, { ".zip", "application/x-zip", write_zip_archive },
{ NULL } { NULL }
}; };