about summary refs log tree commit diff stats
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
parenttests: add tests for xz compressed snapshots (diff)
downloadcgit-892ba8c3cc0617d2087a2337d8c6e71524d7b49c.tar.gz
cgit-892ba8c3cc0617d2087a2337d8c6e71524d7b49c.zip
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::
407snapshots:: 407snapshots::
408 Text which specifies the default set of snapshot formats that cgit 408 Text which specifies the default set of snapshot formats that cgit
409 generates links for. The value is a space-separated list of zero or 409 generates links for. The value is a space-separated list of zero or
410 more of the values "tar", "tar.gz", "tar.bz2", "tar.xz", "tar.lz" and 410 more of the values "tar", "tar.gz", "tar.bz2", "tar.lz", "tar.xz",
411 "zip". The special value "all" enables all snapshot formats. 411 "tar.zst" and "zip". The special value "all" enables all snapshot
412 Default value: none. 412 formats. Default value: none.
413 All compressors use default settings. Some settings can be influenced
414 with environment variables, for example set ZSTD_CLEVEL=10 in web
415 server environment for higher (but slower) zstd compression.
413 416
414source-filter:: 417source-filter::
415 Specifies a command which will be invoked to format plaintext blobs 418 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=/
104cache-root=$PWD/cache 104cache-root=$PWD/cache
105 105
106cache-size=1021 106cache-size=1021
107snapshots=tar.gz tar.bz tar.lz tar.xz zip 107snapshots=tar.gz tar.bz tar.lz tar.xz tar.zst zip
108enable-log-filecount=1 108enable-log-filecount=1
109enable-log-linecount=1 109enable-log-linecount=1
110summary-log=5 110summary-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' '
122 test_line_count = 1 master/file-5 122 test_line_count = 1 master/file-5
123' 123'
124 124
125if test -n "$(which zstd 2>/dev/null)"; then
126 test_set_prereq ZSTD
127else
128 say 'Skipping ZSTD validation tests: zstd not found'
129fi
130
131test_expect_success ZSTD 'get foo/snapshot/master.tar.zst' '
132 cgit_url "foo/snapshot/master.tar.zst" >tmp
133'
134
135test_expect_success ZSTD 'check html headers' '
136 head -n 1 tmp |
137 grep "Content-Type: application/x-zstd" &&
138
139 head -n 2 tmp |
140 grep "Content-Disposition: inline; filename=.master.tar.zst."
141'
142
143test_expect_success ZSTD 'strip off the header lines' '
144 strip_headers <tmp >master.tar.zst
145'
146
147test_expect_success ZSTD 'verify zstd format' '
148 zstd --test master.tar.zst &&
149 cp master.tar.zst /tmp/.
150'
151
152test_expect_success ZSTD 'untar' '
153 rm -rf master &&
154 tar --zstd -xf master.tar.zst
155'
156
157test_expect_success ZSTD 'count files' '
158 ls master/ >output &&
159 test_line_count = 5 output
160'
161
162test_expect_success ZSTD 'verify untarred file-5' '
163 grep "^5$" master/file-5 &&
164 test_line_count = 1 master/file-5
165'
166
125test_expect_success 'get foo/snapshot/master.zip' ' 167test_expect_success 'get foo/snapshot/master.zip' '
126 cgit_url "foo/snapshot/master.zip" >tmp 168 cgit_url "foo/snapshot/master.zip" >tmp
127' 169'
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)
91 return write_compressed_tar_archive(hex, prefix, argv); 91 return write_compressed_tar_archive(hex, prefix, argv);
92} 92}
93 93
94static int write_tar_zstd_archive(const char *hex, const char *prefix)
95{
96 char *argv[] = { "zstd", "-T0", NULL };
97 return write_compressed_tar_archive(hex, prefix, argv);
98}
99
94const struct cgit_snapshot_format cgit_snapshot_formats[] = { 100const struct cgit_snapshot_format cgit_snapshot_formats[] = {
95 /* .tar must remain the 0 index */ 101 /* .tar must remain the 0 index */
96 { ".tar", "application/x-tar", write_tar_archive }, 102 { ".tar", "application/x-tar", write_tar_archive },
@@ -98,6 +104,7 @@ const struct cgit_snapshot_format cgit_snapshot_formats[] = {
98 { ".tar.bz2", "application/x-bzip2", write_tar_bzip2_archive }, 104 { ".tar.bz2", "application/x-bzip2", write_tar_bzip2_archive },
99 { ".tar.lz", "application/x-lzip", write_tar_lzip_archive }, 105 { ".tar.lz", "application/x-lzip", write_tar_lzip_archive },
100 { ".tar.xz", "application/x-xz", write_tar_xz_archive }, 106 { ".tar.xz", "application/x-xz", write_tar_xz_archive },
107 { ".tar.zst", "application/x-zstd", write_tar_zstd_archive },
101 { ".zip", "application/x-zip", write_zip_archive }, 108 { ".zip", "application/x-zip", write_zip_archive },
102 { NULL } 109 { NULL }
103}; 110};