diff options
author | Christian Hesse | 2020-02-26 09:12:21 +0100 |
---|---|---|
committer | Jason A. Donenfeld | 2020-03-12 19:56:39 -0600 |
commit | 892ba8c3cc0617d2087a2337d8c6e71524d7b49c (patch) | |
tree | 9f230da21b5cb0443a3058da543da6b13c959f71 | |
parent | tests: add tests for xz compressed snapshots (diff) | |
download | cgit-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.txt | 9 | ||||
-rwxr-xr-x | tests/setup.sh | 2 | ||||
-rwxr-xr-x | tests/t0107-snapshot.sh | 42 | ||||
-rw-r--r-- | ui-snapshot.c | 7 |
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:: | |||
407 | snapshots:: | 407 | snapshots:: |
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 | ||
414 | source-filter:: | 417 | source-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=/ | |||
104 | cache-root=$PWD/cache | 104 | cache-root=$PWD/cache |
105 | 105 | ||
106 | cache-size=1021 | 106 | cache-size=1021 |
107 | snapshots=tar.gz tar.bz tar.lz tar.xz zip | 107 | snapshots=tar.gz tar.bz tar.lz tar.xz tar.zst zip |
108 | enable-log-filecount=1 | 108 | enable-log-filecount=1 |
109 | enable-log-linecount=1 | 109 | enable-log-linecount=1 |
110 | summary-log=5 | 110 | 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' ' | |||
122 | test_line_count = 1 master/file-5 | 122 | test_line_count = 1 master/file-5 |
123 | ' | 123 | ' |
124 | 124 | ||
125 | if test -n "$(which zstd 2>/dev/null)"; then | ||
126 | test_set_prereq ZSTD | ||
127 | else | ||
128 | say 'Skipping ZSTD validation tests: zstd not found' | ||
129 | fi | ||
130 | |||
131 | test_expect_success ZSTD 'get foo/snapshot/master.tar.zst' ' | ||
132 | cgit_url "foo/snapshot/master.tar.zst" >tmp | ||
133 | ' | ||
134 | |||
135 | test_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 | |||
143 | test_expect_success ZSTD 'strip off the header lines' ' | ||
144 | strip_headers <tmp >master.tar.zst | ||
145 | ' | ||
146 | |||
147 | test_expect_success ZSTD 'verify zstd format' ' | ||
148 | zstd --test master.tar.zst && | ||
149 | cp master.tar.zst /tmp/. | ||
150 | ' | ||
151 | |||
152 | test_expect_success ZSTD 'untar' ' | ||
153 | rm -rf master && | ||
154 | tar --zstd -xf master.tar.zst | ||
155 | ' | ||
156 | |||
157 | test_expect_success ZSTD 'count files' ' | ||
158 | ls master/ >output && | ||
159 | test_line_count = 5 output | ||
160 | ' | ||
161 | |||
162 | test_expect_success ZSTD 'verify untarred file-5' ' | ||
163 | grep "^5$" master/file-5 && | ||
164 | test_line_count = 1 master/file-5 | ||
165 | ' | ||
166 | |||
125 | test_expect_success 'get foo/snapshot/master.zip' ' | 167 | test_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 | ||
94 | static 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 | |||
94 | const struct cgit_snapshot_format cgit_snapshot_formats[] = { | 100 | const 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 | }; |