summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorChristian Hesse2020-02-26 09:12:21 +0100
committerJason A. Donenfeld2020-03-12 19:56:39 -0600
commit892ba8c3cc0617d2087a2337d8c6e71524d7b49c (patch)
tree9f230da21b5cb0443a3058da543da6b13c959f71
parentcc230bf04456cc0ca82c6251b1624425eb7a7153 (diff)
downloadcgit-892ba8c3cc0617d2087a2337d8c6e71524d7b49c.tar.gz
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>
-rw-r--r--cgitrc.5.txt9
-rwxr-xr-xtests/setup.sh2
-rwxr-xr-xtests/t0107-snapshot.sh42
-rw-r--r--ui-snapshot.c7
4 files changed, 56 insertions, 4 deletions
diff --git a/cgitrc.5.txt b/cgitrc.5.txt
index 4ad3e64..33a6a8c 100644
--- a/cgitrc.5.txt
+++ b/cgitrc.5.txt
@@ -407,9 +407,12 @@ side-by-side-diffs::
snapshots::
Text which specifies the default set of snapshot formats that cgit
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
- "zip". The special value "all" enables all snapshot formats.
- Default value: none.
+ more of the values "tar", "tar.gz", "tar.bz2", "tar.lz", "tar.xz",
+ "tar.zst" and "zip". The special value "all" enables all snapshot
+ 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::
Specifies a command which will be invoked to format plaintext blobs
diff --git a/tests/setup.sh b/tests/setup.sh
index 334cca6..5879348 100755
--- a/tests/setup.sh
+++ b/tests/setup.sh
@@ -104,7 +104,7 @@ virtual-root=/
cache-root=$PWD/cache
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-linecount=1
summary-log=5
diff --git a/tests/t0107-snapshot.sh b/tests/t0107-snapshot.sh
index 84995d1..c164d3e 100755
--- a/tests/t0107-snapshot.sh
+++ b/tests/t0107-snapshot.sh
@@ -122,6 +122,48 @@ test_expect_success XZ 'verify untarred 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' '
cgit_url "foo/snapshot/master.zip" >tmp
'
diff --git a/ui-snapshot.c b/ui-snapshot.c
index 92cde42..556d3ed 100644
--- a/ui-snapshot.c
+++ b/ui-snapshot.c
@@ -91,6 +91,12 @@ static int write_tar_xz_archive(const char *hex, const char *prefix)
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[] = {
/* .tar must remain the 0 index */
{ ".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.lz", "application/x-lzip", write_tar_lzip_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 },
{ NULL }
};