From 39694545ae1f29d1c051f7245380ce7938ce2b1b Mon Sep 17 00:00:00 2001 From: pengrunlin Date: Thu, 31 Jul 2025 17:07:29 +0800 Subject: [PATCH 1/3] commit content of bpsf --- .circleci/config.yml | 3 +- .circleci/images/primary/Dockerfile | 2 +- .cirrus.yml | 5 +- .gitattributes | 1 - .github/ISSUE_TEMPLATE/bug_report.md | 4 +- .github/dependabot.yml | 6 + .github/workflows/commit.yml | 89 + .github/workflows/dev-long-tests.yml | 211 +- .github/workflows/dev-short-tests.yml | 414 +- .github/workflows/nightly.yml | 65 + .../workflows/publish-release-artifacts.yml | 11 +- .github/workflows/scorecards.yml | 64 + .github/workflows/windows-artifacts.yml | 58 + .gitignore | 8 +- .travis.yml | 128 - BoostKit-KZstar_1.0.0.zip | Bin 112147 -> 0 bytes CHANGELOG | 120 +- CONTRIBUTING.md | 26 +- LICENSE | 8 +- Makefile | 108 +- README.md | 239 +- SECURITY.md | 15 + TESTING.md | 2 +- appveyor.yml | 205 - bpsf/Makefile | 34 + bpsf/ksal-bpsf-zstd.patch | 631 ++++ bpsf/ksal_bpsf.spec | 23 + bpsf/libksal_bpsf_zstd_so_create.sh | 107 + bpsf/zstd-1.5.6.tar.gz | Bin 0 -> 2406837 bytes bpsf_zstd.patch | 631 ++++ build/VS2008/zstd/zstd.vcproj | 8 + build/VS2010/datagen/datagen.vcxproj | 2 + build/VS2010/libzstd-dll/libzstd-dll.rc | 4 +- build/VS2010/libzstd-dll/libzstd-dll.vcxproj | 1 - build/VS2010/libzstd/libzstd.vcxproj | 1 - build/VS2010/zstd/zstd.rc | 4 +- build/VS2010/zstd/zstd.vcxproj | 7 + build/cmake/CMakeLists.txt | 87 +- .../AddZstdCompilationFlags.cmake | 76 +- build/cmake/CMakeModules/JoinPaths.cmake | 23 + build/cmake/README.md | 38 +- build/cmake/contrib/CMakeLists.txt | 2 +- build/cmake/contrib/gen_html/CMakeLists.txt | 2 +- build/cmake/contrib/pzstd/CMakeLists.txt | 3 +- build/cmake/lib/CMakeLists.txt | 161 +- build/cmake/programs/CMakeLists.txt | 13 +- build/cmake/tests/CMakeLists.txt | 35 +- build/cmake/zstdConfig.cmake | 1 - build/cmake/zstdConfig.cmake.in | 10 + build/meson/contrib/pzstd/meson.build | 3 +- build/meson/lib/meson.build | 36 +- build/meson/meson.build | 27 +- build/meson/meson_options.txt | 2 +- build/meson/programs/meson.build | 37 +- build/meson/tests/meson.build | 67 +- build/meson/tests/valgrindTest.py | 10 +- build/single_file_libs/README.md | 4 +- build/single_file_libs/build_decoder_test.sh | 2 +- build/single_file_libs/build_library_test.sh | 4 +- build/single_file_libs/combine.py | 234 ++ build/single_file_libs/combine.sh | 60 +- .../create_single_file_decoder.sh | 9 +- .../create_single_file_library.sh | 9 +- build/single_file_libs/zstd-in.c | 10 +- build/single_file_libs/zstddeclib-in.c | 10 +- contrib/VS2005/zstd/zstd.vcproj | 4 + contrib/diagnose_corruption/Makefile | 2 +- .../diagnose_corruption/check_flipped_bits.c | 2 +- contrib/docker/Dockerfile | 4 +- contrib/externalSequenceProducer/.gitignore | 2 + contrib/externalSequenceProducer/Makefile | 40 + contrib/externalSequenceProducer/README.md | 14 + contrib/externalSequenceProducer/main.c | 107 + .../sequence_producer.c | 80 + .../sequence_producer.h | 26 + contrib/freestanding_lib/freestanding.py | 33 +- contrib/gen_html/Makefile | 2 +- contrib/gen_html/gen_html.cpp | 2 +- contrib/largeNbDicts/Makefile | 2 +- contrib/largeNbDicts/README.md | 24 +- contrib/largeNbDicts/largeNbDicts.c | 187 +- contrib/linux-kernel/Makefile | 15 +- contrib/linux-kernel/decompress_sources.h | 2 +- contrib/linux-kernel/linux.mk | 22 +- contrib/linux-kernel/linux_zstd.h | 2 +- contrib/linux-kernel/mem.h | 3 +- contrib/linux-kernel/test/Makefile | 3 +- .../test/include/linux/compiler.h | 2 +- .../linux-kernel/test/include/linux/errno.h | 2 +- .../linux-kernel/test/include/linux/kernel.h | 2 +- .../linux-kernel/test/include/linux/limits.h | 2 +- .../linux-kernel/test/include/linux/math64.h | 2 +- .../linux-kernel/test/include/linux/module.h | 4 +- .../linux-kernel/test/include/linux/printk.h | 2 +- .../linux-kernel/test/include/linux/stddef.h | 2 +- .../linux-kernel/test/include/linux/swab.h | 2 +- .../linux-kernel/test/include/linux/types.h | 2 +- .../linux-kernel/test/include/linux/xxhash.h | 4 +- contrib/linux-kernel/test/static_test.c | 2 +- contrib/linux-kernel/test/test.c | 8 +- contrib/linux-kernel/zstd_common_module.c | 29 + contrib/linux-kernel/zstd_compress_module.c | 8 +- contrib/linux-kernel/zstd_decompress_module.c | 4 +- contrib/linux-kernel/zstd_deps.h | 10 +- contrib/match_finders/README.md | 8 +- contrib/match_finders/zstd_edist.c | 24 +- contrib/match_finders/zstd_edist.h | 10 +- contrib/pzstd/ErrorHolder.h | 2 +- contrib/pzstd/Logging.h | 2 +- contrib/pzstd/Makefile | 15 +- contrib/pzstd/Options.cpp | 2 +- contrib/pzstd/Options.h | 2 +- contrib/pzstd/Pzstd.cpp | 11 +- contrib/pzstd/Pzstd.h | 2 +- contrib/pzstd/README.md | 2 +- contrib/pzstd/SkippableFrame.cpp | 2 +- contrib/pzstd/SkippableFrame.h | 2 +- contrib/pzstd/main.cpp | 2 +- contrib/pzstd/test/OptionsTest.cpp | 2 +- contrib/pzstd/test/PzstdTest.cpp | 2 +- contrib/pzstd/test/RoundTrip.h | 2 +- contrib/pzstd/test/RoundTripTest.cpp | 2 +- contrib/pzstd/utils/Buffer.h | 2 +- contrib/pzstd/utils/FileSystem.h | 22 +- contrib/pzstd/utils/Likely.h | 2 +- contrib/pzstd/utils/Portability.h | 16 + contrib/pzstd/utils/Range.h | 4 +- contrib/pzstd/utils/ResourcePool.h | 2 +- contrib/pzstd/utils/ScopeGuard.h | 4 +- contrib/pzstd/utils/ThreadPool.h | 2 +- contrib/pzstd/utils/WorkQueue.h | 2 +- contrib/pzstd/utils/test/BufferTest.cpp | 2 +- contrib/pzstd/utils/test/RangeTest.cpp | 2 +- contrib/pzstd/utils/test/ResourcePoolTest.cpp | 2 +- contrib/pzstd/utils/test/ScopeGuardTest.cpp | 2 +- contrib/pzstd/utils/test/ThreadPoolTest.cpp | 2 +- contrib/pzstd/utils/test/WorkQueueTest.cpp | 2 +- contrib/recovery/Makefile | 2 +- contrib/recovery/recover_directory.c | 2 +- contrib/seekable_format/README.md | 42 + contrib/seekable_format/examples/Makefile | 2 +- .../examples/parallel_compression.c | 4 +- .../examples/parallel_processing.c | 6 +- .../examples/seekable_compression.c | 19 +- .../examples/seekable_decompression.c | 4 +- .../examples/seekable_decompression_mem.c | 2 +- contrib/seekable_format/tests/Makefile | 2 +- .../seekable_format/tests/seekable_tests.c | 169 +- contrib/seekable_format/zstd_seekable.h | 21 +- .../zstd_seekable_compression_format.md | 2 +- contrib/seekable_format/zstdseek_compress.c | 6 +- contrib/seekable_format/zstdseek_decompress.c | 61 +- contrib/seqBench/Makefile | 58 + contrib/seqBench/seqBench.c | 53 + doc/README.md | 5 +- doc/decompressor_errata.md | 148 + doc/decompressor_permissive.md | 60 + doc/educational_decoder/Makefile | 2 +- doc/educational_decoder/harness.c | 2 +- doc/educational_decoder/zstd_decompress.c | 31 +- doc/educational_decoder/zstd_decompress.h | 2 +- doc/images/zstd_logo86.png | Bin 5963 -> 13069 bytes doc/zstd_compression_format.md | 121 +- doc/zstd_manual.html | 514 ++- examples/Makefile | 2 +- examples/common.h | 32 +- examples/dictionary_compression.c | 16 +- examples/dictionary_decompression.c | 2 +- examples/multiple_simple_compression.c | 2 +- examples/multiple_streaming_compression.c | 2 +- examples/simple_compression.c | 2 +- examples/simple_decompression.c | 2 +- examples/streaming_compression.c | 12 +- examples/streaming_compression_thread_pool.c | 2 +- examples/streaming_decompression.c | 2 +- examples/streaming_memory_usage.c | 2 +- ksal-bpsf-zstd.patch | 631 ++++ ksal_bpsf.spec | 23 + kzstar_README.md | 369 -- kzstar_build.sh | 65 - lib/Makefile | 72 +- lib/README.md | 24 +- lib/bpsf.c | 199 + lib/bpsf.h | 60 + lib/common/allocations.h | 55 + lib/common/bits.h | 200 + lib/common/bitstream.h | 153 +- lib/common/compiler.h | 161 +- lib/common/cpu.h | 38 +- lib/common/debug.c | 8 +- lib/common/debug.h | 33 +- lib/common/entropy_common.c | 52 +- lib/common/error_private.c | 11 +- lib/common/error_private.h | 91 +- lib/common/fse.h | 93 +- lib/common/fse_decompress.c | 142 +- lib/common/huf.h | 236 +- lib/common/mem.h | 94 +- lib/common/pool.c | 38 +- lib/common/pool.h | 10 +- lib/common/portability_macros.h | 27 +- lib/common/threading.c | 88 +- lib/common/threading.h | 15 +- lib/common/xxhash.c | 16 +- lib/common/xxhash.h | 3354 ++++++++++++----- lib/common/zstd_common.c | 41 +- lib/common/zstd_deps.h | 2 +- lib/common/zstd_internal.h | 145 +- lib/common/zstd_trace.h | 6 +- lib/compress/clevels.h | 2 +- lib/compress/fse_compress.c | 146 +- lib/compress/hist.c | 2 +- lib/compress/hist.h | 2 +- lib/compress/huf_compress.c | 519 ++- lib/compress/zstd_compress.c | 2184 +++++++---- lib/compress/zstd_compress.h | 44 + lib/compress/zstd_compress_internal.h | 409 +- lib/compress/zstd_compress_literals.c | 154 +- lib/compress/zstd_compress_literals.h | 24 +- lib/compress/zstd_compress_sequences.c | 6 +- lib/compress/zstd_compress_sequences.h | 2 +- lib/compress/zstd_compress_superblock.c | 375 +- lib/compress/zstd_compress_superblock.h | 2 +- lib/compress/zstd_cwksp.h | 220 +- lib/compress/zstd_double_fast.c | 142 +- lib/compress/zstd_double_fast.h | 16 +- lib/compress/zstd_fast.c | 595 ++- lib/compress/zstd_fast.h | 5 +- lib/compress/zstd_lazy.c | 957 ++--- lib/compress/zstd_lazy.h | 137 +- lib/compress/zstd_ldm.c | 20 +- lib/compress/zstd_ldm.h | 2 +- lib/compress/zstd_ldm_geartab.h | 2 +- lib/compress/zstd_opt.c | 496 ++- lib/compress/zstd_opt.h | 40 +- lib/compress/zstdmt_compress.c | 197 +- lib/compress/zstdmt_compress.h | 2 +- lib/decompress/huf_decompress.c | 1040 ++--- lib/decompress/huf_decompress_amd64.S | 126 +- lib/decompress/zstd_ddict.c | 8 +- lib/decompress/zstd_ddict.h | 2 +- lib/decompress/zstd_decompress.c | 424 ++- lib/decompress/zstd_decompress_block.c | 723 ++-- lib/decompress/zstd_decompress_block.h | 9 +- lib/decompress/zstd_decompress_internal.h | 15 +- lib/deprecated/zbuff.h | 2 +- lib/deprecated/zbuff_common.c | 2 +- lib/deprecated/zbuff_compress.c | 2 +- lib/deprecated/zbuff_decompress.c | 4 +- lib/dictBuilder/cover.c | 62 +- lib/dictBuilder/cover.h | 12 +- lib/dictBuilder/fastcover.c | 8 +- lib/dictBuilder/zdict.c | 118 +- lib/dll/example/Makefile | 2 +- lib/dll/example/README.md | 2 +- lib/legacy/zstd_legacy.h | 39 +- lib/legacy/zstd_v01.c | 65 +- lib/legacy/zstd_v01.h | 2 +- lib/legacy/zstd_v02.c | 105 +- lib/legacy/zstd_v02.h | 2 +- lib/legacy/zstd_v03.c | 109 +- lib/legacy/zstd_v03.h | 2 +- lib/legacy/zstd_v04.c | 99 +- lib/legacy/zstd_v04.h | 2 +- lib/legacy/zstd_v05.c | 105 +- lib/legacy/zstd_v05.h | 2 +- lib/legacy/zstd_v06.c | 124 +- lib/legacy/zstd_v06.h | 2 +- lib/legacy/zstd_v07.c | 113 +- lib/legacy/zstd_v07.h | 2 +- lib/libzstd.mk | 101 +- lib/libzstd.pc.in | 6 +- lib/module.modulemap | 16 +- lib/zdict.h | 84 +- lib/zstd.h | 868 ++++- lib/zstd_errors.h | 35 +- libksal_bpsf_zstd_so_create.sh | 107 + programs/.gitignore | 2 + programs/Makefile | 70 +- programs/README.md | 5 +- programs/benchfn.c | 12 +- programs/benchfn.h | 4 +- programs/benchzstd.c | 1244 +++--- programs/benchzstd.h | 65 +- programs/datagen.c | 2 +- programs/datagen.h | 2 +- programs/dibio.c | 31 +- programs/dibio.h | 2 +- programs/fileio.c | 1867 +++++---- programs/fileio.h | 23 +- programs/fileio_asyncio.c | 663 ++++ programs/fileio_asyncio.h | 203 + programs/fileio_common.h | 125 + programs/fileio_types.h | 86 + programs/lorem.c | 285 ++ programs/lorem.h | 32 + programs/platform.h | 23 +- programs/timefn.c | 139 +- programs/timefn.h | 59 +- programs/util.c | 399 +- programs/util.h | 43 +- programs/windres/verrsrc.h | 2 +- programs/windres/zstd.rc | 4 +- programs/zstd.1 | 405 +- programs/zstd.1.md | 563 +-- programs/zstdcli.c | 529 ++- programs/zstdcli_trace.c | 2 +- programs/zstdcli_trace.h | 2 +- programs/zstdgrep.1 | 10 +- programs/zstdgrep.1.md | 10 +- programs/zstdless | 8 +- programs/zstdless.1 | 6 +- programs/zstdless.1.md | 6 +- tests/.gitignore | 4 + tests/DEPRECATED-test-zstd-speed.py | 2 +- tests/Makefile | 190 +- tests/README.md | 6 +- tests/automated_benchmarking.py | 4 +- tests/bigdict.c | 2 +- tests/checkTag.c | 2 +- tests/check_size.py | 31 + tests/cli-tests/.gitignore | 6 + tests/cli-tests/README.md | 258 ++ tests/cli-tests/basic/args.sh | 10 + tests/cli-tests/basic/args.sh.exit | 1 + tests/cli-tests/basic/args.sh.stderr.glob | 28 + tests/cli-tests/basic/help.sh | 10 + tests/cli-tests/basic/help.sh.stdout.glob | 34 + tests/cli-tests/basic/memlimit.sh | 40 + .../cli-tests/basic/memlimit.sh.stderr.exact | 13 + .../cli-tests/basic/memlimit.sh.stdout.exact | 13 + tests/cli-tests/basic/output_dir.sh | 7 + .../basic/output_dir.sh.stderr.exact | 2 + .../basic/output_dir.sh.stdout.exact | 2 + tests/cli-tests/basic/version.sh | 6 + tests/cli-tests/basic/version.sh.stdout.glob | 2 + tests/cli-tests/bin/cmp_size | 44 + tests/cli-tests/bin/datagen | 3 + tests/cli-tests/bin/die | 4 + tests/cli-tests/bin/println | 2 + tests/cli-tests/bin/unzstd | 1 + tests/cli-tests/bin/zstd | 9 + tests/cli-tests/bin/zstdcat | 1 + tests/cli-tests/bin/zstdgrep | 2 + tests/cli-tests/bin/zstdless | 2 + tests/cli-tests/cltools/setup | 6 + tests/cli-tests/cltools/zstdgrep.sh | 8 + tests/cli-tests/cltools/zstdgrep.sh.exit | 1 + .../cltools/zstdgrep.sh.stderr.exact | 1 + .../cli-tests/cltools/zstdgrep.sh.stdout.glob | 4 + tests/cli-tests/cltools/zstdless.sh | 10 + .../cltools/zstdless.sh.stderr.exact | 2 + .../cli-tests/cltools/zstdless.sh.stdout.glob | 5 + tests/cli-tests/common/format.sh | 19 + tests/cli-tests/common/mtime.sh | 13 + tests/cli-tests/common/permissions.sh | 18 + tests/cli-tests/common/platform.sh | 37 + tests/cli-tests/compression/adapt.sh | 14 + tests/cli-tests/compression/basic.sh | 36 + .../compression/compress-literals.sh | 10 + tests/cli-tests/compression/format.sh | 16 + tests/cli-tests/compression/golden.sh | 16 + tests/cli-tests/compression/gzip-compat.sh | 17 + tests/cli-tests/compression/levels.sh | 62 + .../compression/levels.sh.stderr.exact | 69 + .../compression/long-distance-matcher.sh | 7 + tests/cli-tests/compression/multi-threaded.sh | 15 + .../multi-threaded.sh.stderr.exact | 11 + tests/cli-tests/compression/multiple-files.sh | 21 + .../multiple-files.sh.stdout.exact | 12 + .../cli-tests/compression/row-match-finder.sh | 7 + tests/cli-tests/compression/setup | 7 + tests/cli-tests/compression/stream-size.sh | 7 + tests/cli-tests/compression/verbose-wlog.sh | 11 + .../compression/verbose-wlog.sh.stderr.glob | 5 + .../compression/verbose-wlog.sh.stdout.glob | 5 + tests/cli-tests/compression/window-resize.sh | 9 + .../window-resize.sh.stderr.ignore | 0 .../compression/window-resize.sh.stdout.glob | 3 + tests/cli-tests/decompression/detectErrors.sh | 11 + tests/cli-tests/decompression/golden.sh | 7 + tests/cli-tests/decompression/pass-through.sh | 57 + .../pass-through.sh.stderr.exact | 11 + .../pass-through.sh.stdout.exact | 25 + tests/cli-tests/dict-builder/empty-input.sh | 9 + .../dict-builder/empty-input.sh.stderr.exact | 1 + tests/cli-tests/dict-builder/no-inputs.sh | 3 + .../cli-tests/dict-builder/no-inputs.sh.exit | 1 + .../dict-builder/no-inputs.sh.stderr.exact | 5 + .../dictionaries/dictionary-mismatch.sh | 29 + .../dictionary-mismatch.sh.stderr.exact | 7 + tests/cli-tests/dictionaries/golden.sh | 9 + tests/cli-tests/dictionaries/setup | 6 + tests/cli-tests/dictionaries/setup_once | 24 + .../file-handling/directory-mirror.sh | 49 + .../directory-mirror.sh.stderr.exact | 0 .../directory-mirror.sh.stdout.exact | 0 ...compress-file-to-dir-without-write-perm.sh | 12 + ...-to-dir-without-write-perm.sh.stderr.exact | 26 + .../file-stat/compress-file-to-file.sh | 9 + .../compress-file-to-file.sh.stderr.exact | 42 + .../file-stat/compress-file-to-stdout.sh | 8 + .../compress-file-to-stdout.sh.stderr.exact | 24 + .../file-stat/compress-stdin-to-file.sh | 8 + .../compress-stdin-to-file.sh.stderr.exact | 24 + .../file-stat/compress-stdin-to-stdout.sh | 8 + .../compress-stdin-to-stdout.sh.stderr.exact | 18 + .../file-stat/decompress-file-to-file.sh | 8 + .../decompress-file-to-file.sh.stderr.exact | 38 + .../file-stat/decompress-file-to-stdout.sh | 7 + .../decompress-file-to-stdout.sh.stderr.exact | 18 + .../file-stat/decompress-stdin-to-file.sh | 7 + .../decompress-stdin-to-file.sh.stderr.exact | 20 + .../file-stat/decompress-stdin-to-stdout.sh | 7 + ...decompress-stdin-to-stdout.sh.stderr.exact | 14 + tests/cli-tests/progress/no-progress.sh | 46 + .../progress/no-progress.sh.stderr.glob | 96 + tests/cli-tests/progress/progress.sh | 41 + .../progress/progress.sh.stderr.glob | 62 + tests/cli-tests/run.py | 731 ++++ tests/cli-tests/zstd-symlinks/setup | 6 + tests/cli-tests/zstd-symlinks/zstdcat.sh | 12 + .../zstd-symlinks/zstdcat.sh.stdout.exact | 8 + tests/datagencli.c | 193 +- tests/decodecorpus.c | 67 +- tests/external_matchfinder.c | 140 + tests/external_matchfinder.h | 39 + tests/fullbench.c | 41 +- tests/fuzz/Makefile | 101 +- tests/fuzz/README.md | 60 + tests/fuzz/block_decompress.c | 8 +- tests/fuzz/block_round_trip.c | 6 +- tests/fuzz/decompress_cross_format.c | 130 + tests/fuzz/decompress_dstSize_tooSmall.c | 6 +- tests/fuzz/dictionary_decompress.c | 6 +- tests/fuzz/dictionary_loader.c | 7 +- tests/fuzz/dictionary_round_trip.c | 18 +- tests/fuzz/dictionary_stream_round_trip.c | 5 +- tests/fuzz/fse_read_ncount.c | 2 +- tests/fuzz/fuzz.h | 10 +- tests/fuzz/fuzz.py | 33 +- tests/fuzz/fuzz_data_producer.c | 13 +- tests/fuzz/fuzz_data_producer.h | 3 +- tests/fuzz/fuzz_helpers.c | 18 +- tests/fuzz/fuzz_helpers.h | 9 +- tests/fuzz/fuzz_third_party_seq_prod.h | 116 + tests/fuzz/generate_sequences.c | 88 + tests/fuzz/huf_decompress.c | 20 +- tests/fuzz/huf_round_trip.c | 31 +- tests/fuzz/raw_dictionary_round_trip.c | 8 +- tests/fuzz/regression_driver.c | 5 +- tests/fuzz/seekable_roundtrip.c | 2 +- tests/fuzz/seq_prod_fuzz_example/Makefile | 16 + tests/fuzz/seq_prod_fuzz_example/README.md | 12 + .../seq_prod_fuzz_example/example_seq_prod.c | 52 + tests/fuzz/sequence_compression_api.c | 292 +- tests/fuzz/simple_compress.c | 8 +- tests/fuzz/simple_decompress.c | 22 +- tests/fuzz/simple_round_trip.c | 60 +- tests/fuzz/stream_decompress.c | 10 +- tests/fuzz/stream_round_trip.c | 47 +- tests/fuzz/zstd_frame_info.c | 2 +- tests/fuzz/zstd_helpers.c | 64 +- tests/fuzz/zstd_helpers.h | 7 +- tests/fuzzer.c | 982 ++++- .../PR-3517-block-splitter-corruption-test | 1 + .../large-literal-and-match-lengths | Bin 0 -> 199998 bytes tests/golden-decompression-errors/.gitignore | 1 + .../golden-decompression-errors/off0.bin.zst | Bin 0 -> 17 bytes .../zeroSeq_extraneous.zst | Bin 0 -> 27 bytes tests/golden-decompression/block-128k.zst | Bin 0 -> 131081 bytes tests/golden-decompression/empty-block.zst | Bin 0 -> 11 bytes tests/golden-decompression/zeroSeq_2B.zst | Bin 0 -> 25 bytes tests/gzip/Makefile | 2 +- tests/gzip/gzip-env.sh | 2 +- tests/gzip/helin-segv.sh | 2 +- tests/gzip/help-version.sh | 2 +- tests/gzip/hufts.sh | 2 +- tests/gzip/init.sh | 2 +- tests/gzip/keep.sh | 2 +- tests/gzip/list.sh | 2 +- tests/gzip/memcpy-abuse.sh | 2 +- tests/gzip/mixed.sh | 2 +- tests/gzip/null-suffix-clobber.sh | 2 +- tests/gzip/stdin.sh | 2 +- tests/gzip/test-driver.sh | 2 +- tests/gzip/trailing-nul.sh | 2 +- tests/gzip/unpack-invalid.sh | 2 +- tests/gzip/z-suffix.sh | 2 +- tests/gzip/zdiff.sh | 2 +- tests/gzip/zgrep-context.sh | 2 +- tests/gzip/zgrep-f.sh | 2 +- tests/gzip/zgrep-signal.sh | 2 +- tests/gzip/znew-k.sh | 2 +- tests/invalidDictionaries.c | 2 +- tests/legacy.c | 2 +- tests/longmatch.c | 35 +- tests/loremOut.c | 50 + tests/loremOut.h | 15 + tests/paramgrill.c | 42 +- tests/playTests.sh | 379 +- tests/poolTests.c | 2 +- tests/rateLimiter.py | 2 +- tests/regression/.gitignore | 1 + tests/regression/Makefile | 2 +- tests/regression/config.c | 6 +- tests/regression/config.h | 2 +- tests/regression/data.c | 2 +- tests/regression/data.h | 2 +- tests/regression/levels.h | 2 +- tests/regression/method.c | 2 +- tests/regression/method.h | 2 +- tests/regression/result.c | 2 +- tests/regression/result.h | 2 +- tests/regression/results.csv | 1464 +++---- tests/regression/test.c | 2 +- tests/roundTripCrash.c | 2 +- tests/seqgen.c | 2 +- tests/seqgen.h | 2 +- tests/test-license.py | 6 +- tests/test-zstd-versions.py | 161 +- tests/zstreamtest.c | 881 ++++- zlibWrapper/Makefile | 7 +- zlibWrapper/README.md | 4 +- zlibWrapper/examples/example.c | 93 +- zlibWrapper/examples/example_original.c | 75 +- zlibWrapper/examples/minigzip.c | 103 +- zlibWrapper/examples/zwrapbench.c | 32 +- zlibWrapper/gzclose.c | 6 +- zlibWrapper/gzcompatibility.h | 16 +- zlibWrapper/gzguts.h | 20 +- zlibWrapper/gzlib.c | 99 +- zlibWrapper/gzread.c | 95 +- zlibWrapper/gzwrite.c | 86 +- zlibWrapper/zstd_zlibwrapper.c | 90 +- zlibWrapper/zstd_zlibwrapper.h | 5 +- 536 files changed, 28426 insertions(+), 12164 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/commit.yml create mode 100644 .github/workflows/nightly.yml create mode 100644 .github/workflows/scorecards.yml create mode 100644 .github/workflows/windows-artifacts.yml delete mode 100644 .travis.yml delete mode 100644 BoostKit-KZstar_1.0.0.zip create mode 100644 SECURITY.md delete mode 100644 appveyor.yml create mode 100644 bpsf/Makefile create mode 100644 bpsf/ksal-bpsf-zstd.patch create mode 100644 bpsf/ksal_bpsf.spec create mode 100644 bpsf/libksal_bpsf_zstd_so_create.sh create mode 100644 bpsf/zstd-1.5.6.tar.gz create mode 100644 bpsf_zstd.patch create mode 100644 build/cmake/CMakeModules/JoinPaths.cmake delete mode 100644 build/cmake/zstdConfig.cmake create mode 100644 build/cmake/zstdConfig.cmake.in create mode 100644 build/single_file_libs/combine.py create mode 100644 contrib/externalSequenceProducer/.gitignore create mode 100644 contrib/externalSequenceProducer/Makefile create mode 100644 contrib/externalSequenceProducer/README.md create mode 100644 contrib/externalSequenceProducer/main.c create mode 100644 contrib/externalSequenceProducer/sequence_producer.c create mode 100644 contrib/externalSequenceProducer/sequence_producer.h create mode 100644 contrib/linux-kernel/zstd_common_module.c create mode 100644 contrib/pzstd/utils/Portability.h create mode 100644 contrib/seekable_format/README.md create mode 100644 contrib/seqBench/Makefile create mode 100644 contrib/seqBench/seqBench.c create mode 100644 doc/decompressor_errata.md create mode 100644 doc/decompressor_permissive.md create mode 100644 ksal-bpsf-zstd.patch create mode 100644 ksal_bpsf.spec delete mode 100644 kzstar_README.md delete mode 100644 kzstar_build.sh create mode 100644 lib/bpsf.c create mode 100644 lib/bpsf.h create mode 100644 lib/common/allocations.h create mode 100644 lib/common/bits.h create mode 100644 lib/compress/zstd_compress.h create mode 100644 libksal_bpsf_zstd_so_create.sh create mode 100644 programs/fileio_asyncio.c create mode 100644 programs/fileio_asyncio.h create mode 100644 programs/fileio_common.h create mode 100644 programs/fileio_types.h create mode 100644 programs/lorem.c create mode 100644 programs/lorem.h create mode 100644 tests/check_size.py create mode 100644 tests/cli-tests/.gitignore create mode 100644 tests/cli-tests/README.md create mode 100644 tests/cli-tests/basic/args.sh create mode 100644 tests/cli-tests/basic/args.sh.exit create mode 100644 tests/cli-tests/basic/args.sh.stderr.glob create mode 100644 tests/cli-tests/basic/help.sh create mode 100644 tests/cli-tests/basic/help.sh.stdout.glob create mode 100644 tests/cli-tests/basic/memlimit.sh create mode 100644 tests/cli-tests/basic/memlimit.sh.stderr.exact create mode 100644 tests/cli-tests/basic/memlimit.sh.stdout.exact create mode 100644 tests/cli-tests/basic/output_dir.sh create mode 100644 tests/cli-tests/basic/output_dir.sh.stderr.exact create mode 100644 tests/cli-tests/basic/output_dir.sh.stdout.exact create mode 100644 tests/cli-tests/basic/version.sh create mode 100644 tests/cli-tests/basic/version.sh.stdout.glob create mode 100644 tests/cli-tests/bin/cmp_size create mode 100644 tests/cli-tests/bin/datagen create mode 100644 tests/cli-tests/bin/die create mode 100644 tests/cli-tests/bin/println create mode 100644 tests/cli-tests/bin/unzstd create mode 100644 tests/cli-tests/bin/zstd create mode 100644 tests/cli-tests/bin/zstdcat create mode 100644 tests/cli-tests/bin/zstdgrep create mode 100644 tests/cli-tests/bin/zstdless create mode 100644 tests/cli-tests/cltools/setup create mode 100644 tests/cli-tests/cltools/zstdgrep.sh create mode 100644 tests/cli-tests/cltools/zstdgrep.sh.exit create mode 100644 tests/cli-tests/cltools/zstdgrep.sh.stderr.exact create mode 100644 tests/cli-tests/cltools/zstdgrep.sh.stdout.glob create mode 100644 tests/cli-tests/cltools/zstdless.sh create mode 100644 tests/cli-tests/cltools/zstdless.sh.stderr.exact create mode 100644 tests/cli-tests/cltools/zstdless.sh.stdout.glob create mode 100644 tests/cli-tests/common/format.sh create mode 100644 tests/cli-tests/common/mtime.sh create mode 100644 tests/cli-tests/common/permissions.sh create mode 100644 tests/cli-tests/common/platform.sh create mode 100644 tests/cli-tests/compression/adapt.sh create mode 100644 tests/cli-tests/compression/basic.sh create mode 100644 tests/cli-tests/compression/compress-literals.sh create mode 100644 tests/cli-tests/compression/format.sh create mode 100644 tests/cli-tests/compression/golden.sh create mode 100644 tests/cli-tests/compression/gzip-compat.sh create mode 100644 tests/cli-tests/compression/levels.sh create mode 100644 tests/cli-tests/compression/levels.sh.stderr.exact create mode 100644 tests/cli-tests/compression/long-distance-matcher.sh create mode 100644 tests/cli-tests/compression/multi-threaded.sh create mode 100644 tests/cli-tests/compression/multi-threaded.sh.stderr.exact create mode 100644 tests/cli-tests/compression/multiple-files.sh create mode 100644 tests/cli-tests/compression/multiple-files.sh.stdout.exact create mode 100644 tests/cli-tests/compression/row-match-finder.sh create mode 100644 tests/cli-tests/compression/setup create mode 100644 tests/cli-tests/compression/stream-size.sh create mode 100644 tests/cli-tests/compression/verbose-wlog.sh create mode 100644 tests/cli-tests/compression/verbose-wlog.sh.stderr.glob create mode 100644 tests/cli-tests/compression/verbose-wlog.sh.stdout.glob create mode 100644 tests/cli-tests/compression/window-resize.sh create mode 100644 tests/cli-tests/compression/window-resize.sh.stderr.ignore create mode 100644 tests/cli-tests/compression/window-resize.sh.stdout.glob create mode 100644 tests/cli-tests/decompression/detectErrors.sh create mode 100644 tests/cli-tests/decompression/golden.sh create mode 100644 tests/cli-tests/decompression/pass-through.sh create mode 100644 tests/cli-tests/decompression/pass-through.sh.stderr.exact create mode 100644 tests/cli-tests/decompression/pass-through.sh.stdout.exact create mode 100644 tests/cli-tests/dict-builder/empty-input.sh create mode 100644 tests/cli-tests/dict-builder/empty-input.sh.stderr.exact create mode 100644 tests/cli-tests/dict-builder/no-inputs.sh create mode 100644 tests/cli-tests/dict-builder/no-inputs.sh.exit create mode 100644 tests/cli-tests/dict-builder/no-inputs.sh.stderr.exact create mode 100644 tests/cli-tests/dictionaries/dictionary-mismatch.sh create mode 100644 tests/cli-tests/dictionaries/dictionary-mismatch.sh.stderr.exact create mode 100644 tests/cli-tests/dictionaries/golden.sh create mode 100644 tests/cli-tests/dictionaries/setup create mode 100644 tests/cli-tests/dictionaries/setup_once create mode 100644 tests/cli-tests/file-handling/directory-mirror.sh create mode 100644 tests/cli-tests/file-handling/directory-mirror.sh.stderr.exact create mode 100644 tests/cli-tests/file-handling/directory-mirror.sh.stdout.exact create mode 100644 tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh create mode 100644 tests/cli-tests/file-stat/compress-file-to-dir-without-write-perm.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/compress-file-to-file.sh create mode 100644 tests/cli-tests/file-stat/compress-file-to-file.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/compress-file-to-stdout.sh create mode 100644 tests/cli-tests/file-stat/compress-file-to-stdout.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/compress-stdin-to-file.sh create mode 100644 tests/cli-tests/file-stat/compress-stdin-to-file.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/compress-stdin-to-stdout.sh create mode 100644 tests/cli-tests/file-stat/compress-stdin-to-stdout.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/decompress-file-to-file.sh create mode 100644 tests/cli-tests/file-stat/decompress-file-to-file.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/decompress-file-to-stdout.sh create mode 100644 tests/cli-tests/file-stat/decompress-file-to-stdout.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/decompress-stdin-to-file.sh create mode 100644 tests/cli-tests/file-stat/decompress-stdin-to-file.sh.stderr.exact create mode 100644 tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh create mode 100644 tests/cli-tests/file-stat/decompress-stdin-to-stdout.sh.stderr.exact create mode 100644 tests/cli-tests/progress/no-progress.sh create mode 100644 tests/cli-tests/progress/no-progress.sh.stderr.glob create mode 100644 tests/cli-tests/progress/progress.sh create mode 100644 tests/cli-tests/progress/progress.sh.stderr.glob create mode 100644 tests/cli-tests/run.py create mode 100644 tests/cli-tests/zstd-symlinks/setup create mode 100644 tests/cli-tests/zstd-symlinks/zstdcat.sh create mode 100644 tests/cli-tests/zstd-symlinks/zstdcat.sh.stdout.exact create mode 100644 tests/external_matchfinder.c create mode 100644 tests/external_matchfinder.h create mode 100644 tests/fuzz/decompress_cross_format.c create mode 100644 tests/fuzz/fuzz_third_party_seq_prod.h create mode 100644 tests/fuzz/generate_sequences.c create mode 100644 tests/fuzz/seq_prod_fuzz_example/Makefile create mode 100644 tests/fuzz/seq_prod_fuzz_example/README.md create mode 100644 tests/fuzz/seq_prod_fuzz_example/example_seq_prod.c create mode 100644 tests/golden-compression/PR-3517-block-splitter-corruption-test create mode 100644 tests/golden-compression/large-literal-and-match-lengths create mode 100644 tests/golden-decompression-errors/.gitignore create mode 100644 tests/golden-decompression-errors/off0.bin.zst create mode 100644 tests/golden-decompression-errors/zeroSeq_extraneous.zst create mode 100644 tests/golden-decompression/block-128k.zst create mode 100644 tests/golden-decompression/empty-block.zst create mode 100644 tests/golden-decompression/zeroSeq_2B.zst create mode 100644 tests/loremOut.c create mode 100644 tests/loremOut.h diff --git a/.circleci/config.yml b/.circleci/config.yml index f2eab6807..621ac49ff 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,8 +7,6 @@ jobs: # preinstalled to reduce installation time. docker: - image: fbopensource/zstd-circleci-primary:0.0.1 - # TODO: Re-enable aarch64 build: - # make aarch64build && make clean steps: - checkout - run: @@ -36,6 +34,7 @@ jobs: make ppc64build V=1; make clean make ppcbuild V=1; make clean make armbuild V=1; make clean + make aarch64build V=1; make clean make -C tests test-legacy test-longmatch; make clean make -C lib libzstd-nomt; make clean # This step should only be run in a cron job diff --git a/.circleci/images/primary/Dockerfile b/.circleci/images/primary/Dockerfile index dd8004152..4b77032b6 100644 --- a/.circleci/images/primary/Dockerfile +++ b/.circleci/images/primary/Dockerfile @@ -1,4 +1,4 @@ -FROM circleci/buildpack-deps:bionic +FROM circleci/buildpack-deps@sha256:f6f10c11b7b8ccfd4f4a5b830c3256803604ce61292b60cb22e26b12f62b0e8c RUN sudo dpkg --add-architecture i386 RUN sudo apt-get -y -qq update diff --git a/.cirrus.yml b/.cirrus.yml index fe17aacea..bf3f0c415 100644 --- a/.cirrus.yml +++ b/.cirrus.yml @@ -2,9 +2,8 @@ task: name: FreeBSD (shortest) freebsd_instance: matrix: - image_family: freebsd-12-2 - # The stable 11.3 image causes "Agent is not responding" so use a snapshot - image_family: freebsd-11-3-snap + image_family: freebsd-14-0 + image_family: freebsd-13-2 install_script: pkg install -y gmake coreutils script: | MOREFLAGS="-Werror" gmake -j all diff --git a/.gitattributes b/.gitattributes index 19c59b71e..6212bd405 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8,7 +8,6 @@ # Denote files that should not be modified. *.odt binary *.png binary -*.zip binary # Visual Studio *.sln text eol=crlf diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bacdac27b..755a46af1 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,8 +26,8 @@ If applicable, add screenshots and charts to help explain your problem. **Desktop (please complete the following information):** - OS: [e.g. Mac] - Version [e.g. 22] - - Compiler [e.g gcc] - - Flags [e.g O2] + - Compiler [e.g. gcc] + - Flags [e.g. O2] - Other relevant hardware specs [e.g. Dual-core] - Build system [e.g. Makefile] diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..5ace4600a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/commit.yml b/.github/workflows/commit.yml new file mode 100644 index 000000000..25d8c52f9 --- /dev/null +++ b/.github/workflows/commit.yml @@ -0,0 +1,89 @@ +name: facebook/zstd/commit +on: + push: + branches: + - dev +permissions: read-all +jobs: + short-tests-0: + runs-on: ubuntu-latest + services: + docker: + image: fbopensource/zstd-circleci-primary:0.0.1 + options: --entrypoint /bin/bash + steps: + - uses: actions/checkout@v4 + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install libcurl4-gnutls-dev + - name: Test + run: | + ./tests/test-license.py + cc -v + CFLAGS="-O0 -Werror -pedantic" make allmost; make clean + make c99build; make clean + make c11build; make clean + make -j regressiontest; make clean + make shortest; make clean + make cxxtest; make clean + short-tests-1: + runs-on: ubuntu-latest + services: + docker: + image: fbopensource/zstd-circleci-primary:0.0.1 + options: --entrypoint /bin/bash + steps: + - uses: actions/checkout@v4 + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install gcc-powerpc-linux-gnu gcc-arm-linux-gnueabi gcc-aarch64-linux-gnu libc6-dev-ppc64-powerpc-cross libcurl4-gnutls-dev lib64gcc-11-dev-powerpc-cross + - name: Test + run: |- + make gnu90build; make clean + make gnu99build; make clean + make ppc64build V=1; make clean + make ppcbuild V=1; make clean + make armbuild V=1; make clean + make aarch64build V=1; make clean + make -C tests test-legacy test-longmatch; make clean + make -C lib libzstd-nomt; make clean + regression-test: + runs-on: ubuntu-latest + services: + docker: + image: fbopensource/zstd-circleci-primary:0.0.1 + options: --entrypoint /bin/bash + env: + CIRCLE_ARTIFACTS: "/tmp/circleci-artifacts" + steps: + - uses: actions/checkout@v4 + - name: restore_cache + uses: actions/cache@v4 + with: + key: regression-cache-{{ checksum "tests/regression/data.c" }}-v0 + path: tests/regression/cache + restore-keys: regression-cache-{{ checksum "tests/regression/data.c" }}-v0 + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install libcurl4-gnutls-dev + - name: Regression Test + run: | + make -C programs zstd + make -C tests/regression test + mkdir -p $CIRCLE_ARTIFACTS + ./tests/regression/test \ + --cache tests/regression/cache \ + --output $CIRCLE_ARTIFACTS/results.csv \ + --zstd programs/zstd + echo "NOTE: The new results.csv is uploaded as an artifact to this job" + echo " If this fails, go to the Artifacts pane in CircleCI, " + echo " download /tmp/circleci-artifacts/results.csv, and if they " + echo " are still good, copy it into the repo and commit it." + echo "> diff tests/regression/results.csv $CIRCLE_ARTIFACTS/results.csv" + diff tests/regression/results.csv $CIRCLE_ARTIFACTS/results.csv + - uses: actions/upload-artifact@v4 + with: + path: "/tmp/circleci-artifacts" diff --git a/.github/workflows/dev-long-tests.yml b/.github/workflows/dev-long-tests.yml index 7a94fb666..eb8f40a9a 100644 --- a/.github/workflows/dev-long-tests.yml +++ b/.github/workflows/dev-long-tests.yml @@ -9,11 +9,13 @@ on: pull_request: branches: [ dev, release, actionsTest ] +permissions: read-all + jobs: make-all: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: make all run: make all @@ -24,7 +26,7 @@ jobs: DEVNULLRIGHTS: 1 READFROMBLOCKDEVICE: 1 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: make test run: make test @@ -32,49 +34,91 @@ jobs: make-test-osx: runs-on: macos-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: OS-X test run: make test # make -c lib all doesn't work because of the fact that it's not a tty + # lasts ~24mn + make-test-32bit: + runs-on: ubuntu-latest + env: + DEVNULLRIGHTS: 1 + READFROMBLOCKDEVICE: 1 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: make test + run: | + sudo apt-get -qqq update + make libc6install + CFLAGS="-m32" make test + no-intrinsics-fuzztest: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: no intrinsics fuzztest run: MOREFLAGS="-DZSTD_NO_INTRINSICS" make -C tests fuzztest tsan-zstreamtest: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: thread sanitizer zstreamtest run: CC=clang ZSTREAM_TESTTIME=-T3mn make tsan-test-zstream + ubsan-zstreamtest: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: undefined behavior sanitizer zstreamtest + run: CC=clang make uasan-test-zstream + # lasts ~15mn tsan-fuzztest: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: thread sanitizer fuzztest run: CC=clang make tsan-fuzztest + + big-tests-zstreamtest32: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: zstream tests in 32bit mode, with big tests + run: | + sudo apt-get -qqq update + make libc6install + CC=clang make -C tests test-zstream32 FUZZER_FLAGS="--big-tests" + # lasts ~23mn gcc-8-asan-ubsan-testzstd: - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: gcc-8 + ASan + UBSan + Test Zstd + # See https://askubuntu.com/a/1428822 run: | + echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu focal main universe" | sudo tee -a /etc/apt/sources.list sudo apt-get -qqq update make gcc8install CC=gcc-8 make -j uasan-test-zstd - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v142 - /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} - - visual-2015: - # only GH actions windows-2016 contains VS 2015 - runs-on: windows-2016 - strategy: - matrix: - platform: [x64, Win32] - configuration: [Debug, Release] - steps: - - uses: actions/checkout@v2 - - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1.0.2 - - name: Build + msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=${{matrix.toolset}} + /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} /warnaserror + - name: Build ${{matrix.name}} working-directory: ${{env.GITHUB_WORKSPACE}} + # See https://docs.microsoft.com/visualstudio/msbuild/msbuild-command-line-reference + if: ${{ matrix.arch != '' }} run: > - msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=v140 - /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} + msbuild "build\VS2010\zstd.sln" /m /verbosity:minimal /property:PlatformToolset=${{matrix.toolset}} + /t:Clean,Build /p:Platform=${{matrix.platform}} /p:Configuration=${{matrix.configuration}} /warnaserror + /p:InstructionSet=${{matrix.arch}} + + # This tests that we don't accidentally grow the size too much. + # If the size grows intentionally, you can raise these numbers. + # But we do need to think about binary size, since it is a concern. + libzstd-size: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: libzstd size test + run: | + make clean && make -j -C lib libzstd && ./tests/check_size.py lib/libzstd.so 1100000 + make clean && make -j -C lib libzstd ZSTD_LIB_COMPRESSION=0 ZSTD_LIB_DICTBUILDER=0 && ./tests/check_size.py lib/libzstd.so 400000 + make clean && make -j -C lib libzstd ZSTD_LIB_MINIFY=1 && ./tests/check_size.py lib/libzstd.so 300000 + make clean && make -j -C lib libzstd ZSTD_LIB_MINIFY=1 ZSTD_LIB_COMPRESSION=0 ZSTD_LIB_DICTBUILDER=0 && ./tests/check_size.py lib/libzstd.so 80000 minimal-decompressor-macros: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: minimal decompressor macros run: | make clean && make -j all ZSTD_LIB_MINIFY=1 MOREFLAGS="-Werror" @@ -245,11 +344,13 @@ jobs: make clean && make check MOREFLAGS="-Werror -DHUF_FORCE_DECOMPRESS_X2 -DZSTD_FORCE_DECOMPRESS_SEQUENCES_LONG" make clean && make -j all MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS" make clean && make check MOREFLAGS="-Werror -DZSTD_NO_INLINE -DZSTD_STRIP_ERROR_STRINGS" + make clean && make check ZSTD_LIB_EXCLUDE_COMPRESSORS_DFAST_AND_UP=1 MOREFLAGS="-Werror" + make clean && make check ZSTD_LIB_EXCLUDE_COMPRESSORS_GREEDY_AND_UP=1 MOREFLAGS="-Werror" dynamic-bmi2: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: dynamic bmi2 tests run: | make clean && make -j check MOREFLAGS="-O0 -Werror -mbmi2" @@ -261,16 +362,15 @@ jobs: test-variants: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: make all variants & validate run: | make -j -C programs allVariants MOREFLAGS=-O0 ./tests/test-variants.sh - qemu-consistency: name: QEMU ${{ matrix.name }} - runs-on: ubuntu-latest + runs-on: ubuntu-20.04 strategy: fail-fast: false # 'false' means Don't stop matrix workflows even if some matrix failed. matrix: @@ -281,13 +381,15 @@ jobs: { name: PPC64LE, xcc_pkg: gcc-powerpc64le-linux-gnu, xcc: powerpc64le-linux-gnu-gcc, xemu_pkg: qemu-system-ppc, xemu: qemu-ppc64le-static }, { name: S390X, xcc_pkg: gcc-s390x-linux-gnu, xcc: s390x-linux-gnu-gcc, xemu_pkg: qemu-system-s390x, xemu: qemu-s390x-static }, { name: MIPS, xcc_pkg: gcc-mips-linux-gnu, xcc: mips-linux-gnu-gcc, xemu_pkg: qemu-system-mips, xemu: qemu-mips-static }, + { name: RISC-V, xcc_pkg: gcc-riscv64-linux-gnu, xcc: riscv64-linux-gnu-gcc, xemu_pkg: qemu-system-riscv64,xemu: qemu-riscv64-static }, { name: M68K, xcc_pkg: gcc-m68k-linux-gnu, xcc: m68k-linux-gnu-gcc, xemu_pkg: qemu-system-m68k, xemu: qemu-m68k-static }, + { name: SPARC, xcc_pkg: gcc-sparc64-linux-gnu, xcc: sparc64-linux-gnu-gcc, xemu_pkg: qemu-system-sparc, xemu: qemu-sparc64-static }, ] env: # Set environment variables XCC: ${{ matrix.xcc }} XEMU: ${{ matrix.xemu }} steps: - - uses: actions/checkout@v2 # https://github.com/actions/checkout + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: apt update & install run: | sudo apt-get update @@ -307,6 +409,7 @@ jobs: - name: ARM64 if: ${{ matrix.name == 'ARM64' }} run: | + LDFLAGS="-static -z force-bti" MOREFLAGS="-mbranch-protection=standard" CC=$XCC QEMU_SYS=$XEMU make clean check LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: PPC if: ${{ matrix.name == 'PPC' }} @@ -324,47 +427,61 @@ jobs: if: ${{ matrix.name == 'MIPS' }} run: | LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: RISC-V + if: ${{ matrix.name == 'RISC-V' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check - name: M68K if: ${{ matrix.name == 'M68K' }} run: | LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check + - name: SPARC + if: ${{ matrix.name == 'SPARC' }} + run: | + LDFLAGS="-static" CC=$XCC QEMU_SYS=$XEMU make clean check mingw-short-test: runs-on: windows-latest strategy: - fail-fast: false + fail-fast: false # 'false' means Don't stop matrix workflows even if some matrix failed. matrix: include: [ - { compiler: gcc, platform: x64, script: "CFLAGS=-Werror make -j allzstd DEBUGLEVEL=2"}, - { compiler: gcc, platform: x86, script: "CFLAGS=-Werror make -j allzstd"}, - { compiler: clang, platform: x64, script: "CFLAGS='--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion' make -j allzstd V=1"}, + { compiler: gcc, msystem: MINGW32, cflags: "-Werror"}, + { compiler: gcc, msystem: MINGW64, cflags: "-Werror"}, + { compiler: clang, msystem: MINGW64, cflags: "--target=x86_64-w64-mingw32 -Werror -Wconversion -Wno-sign-conversion -Wno-unused-command-line-argument"}, ] + defaults: + run: + shell: msys2 {0} steps: - - uses: actions/checkout@v2 - - name: Mingw short test - run: | - ECHO "Building ${{matrix.compiler}} ${{matrix.platform}}" - $env:PATH_ORIGINAL = $env:PATH - $env:PATH_MINGW32 = "C:\msys64\mingw32\bin" - $env:PATH_MINGW64 = "C:\msys64\mingw64\bin" - COPY C:\msys64\usr\bin\make.exe C:\msys64\mingw32\bin\make.exe - COPY C:\msys64\usr\bin\make.exe C:\msys64\mingw64\bin\make.exe - IF ("${{matrix.platform}}" -eq "x64") - { - $env:PATH = $env:PATH_MINGW64 + ";" + $env:PATH_ORIGINAL - } - ELSEIF ("${{matrix.platform}}" -eq "x86") - { - $env:PATH = $env:PATH_MINGW32 + ";" + $env:PATH_ORIGINAL - } + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - uses: msys2/setup-msys2@cc11e9188b693c2b100158c3322424c4cc1dadea # tag=v2.22.0 + with: + msystem: ${{ matrix.msystem }} + install: make diffutils + update: true + # Based on https://ariya.io/2020/07/on-github-actions-with-msys2 + - name: install mingw gcc i686 + if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'gcc') }} + run: pacman --noconfirm -S mingw-w64-i686-gcc + - name: install mingw gcc x86_64 + if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'gcc') }} + run: pacman --noconfirm -S mingw-w64-x86_64-gcc + - name: install mingw clang i686 + if: ${{ (matrix.msystem == 'MINGW32') && (matrix.compiler == 'clang') }} + run: pacman --noconfirm -S mingw-w64-i686-clang + - name: install mingw clang x86_64 + if: ${{ (matrix.msystem == 'MINGW64') && (matrix.compiler == 'clang') }} + run: pacman --noconfirm -S mingw-w64-x86_64-clang + - name: run mingw tests + run: | make -v - sh -c "${{matrix.compiler}} -v" - $env:CC = "${{matrix.compiler}}" - sh -c "${{matrix.script}}" - ECHO "Testing ${{matrix.compiler}} ${{matrix.platform}}" + export CC=${{ matrix.compiler }} + $CC --version + CFLAGS="${{ matrix.cflags }}" make -j allzstd + echo "Testing $CC ${{ matrix.msystem }}" make clean - make check - + MSYS="" make check visual-runtime-tests: runs-on: windows-latest @@ -373,9 +490,9 @@ jobs: platform: [x64, Win32] configuration: [Release] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 - name: Add MSBuild to PATH - uses: microsoft/setup-msbuild@v1.0.2 + uses: microsoft/setup-msbuild@6fb02220983dee41ce7ae257b6f4d8f9bf5ed4ce # tag=v2.0.0 - name: Build and run tests working-directory: ${{env.GITHUB_WORKSPACE}} env: @@ -387,25 +504,114 @@ jobs: COPY build\VS2010\bin\${{matrix.platform}}_${{matrix.configuration}}\*.exe tests\ CD tests sh -e playTests.sh - DIR .\fuzzer.exe -T2m -# This test currently fails on Github Actions specifically. -# Possible reason : TTY emulation. -# Note that the same test works fine locally and on travisCI. -# This will have to be fixed before transferring the test to GA. -# versions-compatibility: -# runs-on: ubuntu-latest -# steps: -# - uses: actions/checkout@v2 -# - name: Versions Compatibility Test -# run: | -# make -C tests versionsTest + # Following instructions at: https://github.com/marketplace/actions/install-cygwin-action + cygwin-tests: + runs-on: windows-latest + steps: + - run: git config --global core.autocrlf input + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - uses: cygwin/cygwin-install-action@006ad0b0946ca6d0a3ea2d4437677fa767392401 # tag=master + with: + platform: x86_64 + packages: >- + autoconf, + automake, + gcc-g++, + make, + mingw64-x86_64-gcc-g++, + patch, + perl + - name: cygwin tests + shell: C:\cygwin\bin\bash.exe --noprofile --norc -eo pipefail '{0}' + run: >- + export PATH=/usr/bin:$(cygpath ${SYSTEMROOT})/system32 && + export CFLAGS="-Werror -O1" && + ls && + make -j allzstd && + make -C tests fuzzer && + ./tests/fuzzer.exe -v -T1m + + pkg-config: + runs-on: ubuntu-latest + container: + image: debian:testing + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: Install dependencies + run: | + apt -y update + apt -y install --no-install-recommends gcc libc6-dev make pkg-config + - name: Build and install + run: make -C lib install + - name: Test pkg-config + run: | + cc -Wall -Wextra -Wpedantic -Werror -o simple examples/simple_compression.c $(pkg-config --cflags --libs libzstd) + ./simple LICENSE + + versions-compatibility: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: Versions Compatibility Test + run: | + make -C tests versionsTest + + clangbuild: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: make clangbuild + run: | + make clangbuild + + clang-pgo: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: Build PGO Zstd with Clang + env: + CC: clang-14 + LLVM_PROFDATA: llvm-profdata-14 + run: | + make -C programs zstd-pgo + ./programs/zstd -b + + gcc-pgo: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: Build PGO Zstd with GCC + env: + CC: gcc + run: | + make -C programs zstd-pgo + ./programs/zstd -b + + intel-cet-compatibility: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 + - name: Build Zstd + run: | + make -j zstd V=1 + readelf -n zstd + - name: Get Intel SDE + run: | + curl -LO https://downloadmirror.intel.com/813591/sde-external-9.33.0-2024-01-07-lin.tar.xz + tar xJvf sde-external-9.33.0-2024-01-07-lin.tar.xz + - name: Configure Permissions + run: | + echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope + - name: Run Under SDE + run: | + sde-external-9.33.0-2024-01-07-lin/sde -cet -cet-raise 0 -cet-endbr-exe -cet-stderr -cet-abort -- ./zstd -b3 + +# Failing tests, for reference -# For reference : icc tests # icc tests are currently failing on Github Actions, likely to issues during installation stage -# To be fixed later # # icc: # name: icc-check @@ -421,7 +627,7 @@ jobs: # sudo add-apt-repository "deb https://apt.repos.intel.com/oneapi all main" # sudo apt-get update # sudo apt-get install -y intel-basekit intel-hpckit -# - uses: actions/checkout@v2 +# - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v4.1.1 # - name: make check # run: | # make CC=/opt/intel/oneapi/compiler/latest/linux/bin/intel64/icc check diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml new file mode 100644 index 000000000..704e78922 --- /dev/null +++ b/.github/workflows/nightly.yml @@ -0,0 +1,65 @@ +name: facebook/zstd/nightly +on: + schedule: + - cron: 0 0 * * * + push: + branches: + - release + - dev + - master +permissions: read-all +jobs: + regression-test: + runs-on: ubuntu-latest + services: + docker: + image: fbopensource/zstd-circleci-primary:0.0.1 + options: --entrypoint /bin/bash + env: + CIRCLE_ARTIFACTS: "/tmp/circleci-artifacts" + steps: + - uses: actions/checkout@v4 + - uses: actions/cache@v4 + with: + key: regression-cache-{{ checksum "tests/regression/data.c" }}-v0 + path: tests/regression/cache + restore-keys: regression-cache-{{ checksum "tests/regression/data.c" }}-v0 + - uses: actions/upload-artifact@v4 + with: + path: "/tmp/circleci-artifacts" + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install libcurl4-gnutls-dev + - name: Regression Test + run: | + make -C programs zstd + make -C tests/regression test + mkdir -p $CIRCLE_ARTIFACTS + ./tests/regression/test \ + --cache tests/regression/cache \ + --output $CIRCLE_ARTIFACTS/results.csv \ + --zstd programs/zstd + echo "NOTE: The new results.csv is uploaded as an artifact to this job" + echo " If this fails, go to the Artifacts pane in CircleCI, " + echo " download /tmp/circleci-artifacts/results.csv, and if they " + echo " are still good, copy it into the repo and commit it." + echo "> diff tests/regression/results.csv $CIRCLE_ARTIFACTS/results.csv" + diff tests/regression/results.csv $CIRCLE_ARTIFACTS/results.csv + +# Longer tests + #- make -C tests test-zstd-nolegacy && make clean + #- pyenv global 3.4.4; make -C tests versionsTest && make clean + #- make zlibwrapper && make clean + #- gcc -v; make -C tests test32 MOREFLAGS="-I/usr/include/x86_64-linux-gnu" && make clean + #- make uasan && make clean + #- make asan32 && make clean + #- make -C tests test32 CC=clang MOREFLAGS="-g -fsanitize=address -I/usr/include/x86_64-linux-gnu" +# Valgrind tests + #- CFLAGS="-O1 -g" make -C zlibWrapper valgrindTest && make clean + #- make -C tests valgrindTest && make clean +# ARM, AArch64, PowerPC, PowerPC64 tests + #- make ppctest && make clean + #- make ppc64test && make clean + #- make armtest && make clean + #- make aarch64test && make clean diff --git a/.github/workflows/publish-release-artifacts.yml b/.github/workflows/publish-release-artifacts.yml index 952cb26b7..f7af27914 100644 --- a/.github/workflows/publish-release-artifacts.yml +++ b/.github/workflows/publish-release-artifacts.yml @@ -3,16 +3,21 @@ name: publish-release-artifacts on: release: types: - - created + - published + +permissions: read-all jobs: publish-release-artifacts: + permissions: + contents: write # to fetch code and upload artifacts + runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout - uses: actions/checkout@v2 + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v3 - name: Archive env: @@ -61,7 +66,7 @@ jobs: fi - name: Publish - uses: skx/github-action-publish-binaries@release-1.3 + uses: skx/github-action-publish-binaries@b9ca5643b2f1d7371a6cba7f35333f1461bbc703 # tag=release-2.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml new file mode 100644 index 000000000..a5d5f02a3 --- /dev/null +++ b/.github/workflows/scorecards.yml @@ -0,0 +1,64 @@ +name: Scorecards supply-chain security +on: + # Only the default branch is supported. + branch_protection_rule: + schedule: + - cron: '22 21 * * 2' + push: + # TODO: Add release branch when supported? + branches: [ "dev" ] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecards analysis + if: github.repository == 'facebook/zstd' + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Used to receive a badge. + id-token: write + # Needs for private repositories. + contents: read + actions: read + + steps: + - name: "Checkout code" + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v3 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@0864cf19026789058feabb7e87baa5f140aac736 # tag=v2.3.1 + with: + results_file: results.sarif + results_format: sarif + # (Optional) Read-only PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecards on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_READ_TOKEN }} + + # Publish the results for public repositories to enable scorecard badges. For more details, see + # https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories, `publish_results` will automatically be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # tag=v4.3.1 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@3ab4101902695724f9365a384f86c1074d94e18c # tag=v3.24.7 + with: + sarif_file: results.sarif diff --git a/.github/workflows/windows-artifacts.yml b/.github/workflows/windows-artifacts.yml new file mode 100644 index 000000000..52bc90a49 --- /dev/null +++ b/.github/workflows/windows-artifacts.yml @@ -0,0 +1,58 @@ +name: windows-artifacts + +on: + push: + branches: [ test_artifacts, win_artifacts ] + release: + types: + - published + +permissions: read-all + +jobs: + windows-artifacts: + # see https://ariya.io/2020/07/on-github-actions-with-msys2 + runs-on: windows-latest + # see https://github.com/msys2/setup-msys2 + strategy: + matrix: + include: + - { msystem: mingw64, env: x86_64, ziparch: win64 } + - { msystem: mingw32, env: i686, ziparch: win32 } + defaults: + run: + shell: msys2 {0} + steps: + - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # tag=v3 + - uses: msys2/setup-msys2@5beef6d11f48bba68b9eb503e3adc60b23c0cc36 # tag=v2 + with: + msystem: ${{ matrix.msystem }} + install: make zlib git p7zip mingw-w64-${{matrix.env}}-gcc + update: true + + - name: display versions + run: | + make -v + cc -v + + - name: Building zlib to static link + run: | + git clone --depth 1 --branch v1.2.11 https://github.com/madler/zlib + make -C zlib -f win32/Makefile.gcc libz.a + + - name: Building zstd programs + run: | + CPPFLAGS=-I../zlib LDFLAGS=../zlib/libz.a make -j allzstd MOREFLAGS=-static V=1 + + - name: Create artifacts + run: | + ./lib/dll/example/build_package.bat + mv bin/ zstd-${{ github.ref_name }}-${{matrix.ziparch}}/ + 7z a -tzip -mx9 zstd-${{ github.ref_name }}-${{matrix.ziparch}}.zip zstd-${{ github.ref_name }}-${{matrix.ziparch}}/ + cd .. + + - name: Publish zstd-$VERSION-${{matrix.ziparch}}.zip + uses: actions/upload-artifact@5d5d22a31266ced268874388b861e4b58bb5c2f3 # tag=v4.3.1 + with: + path: ${{ github.workspace }}/zstd-${{ github.ref_name }}-${{matrix.ziparch}}.zip + name: zstd-${{ github.ref_name }}-${{matrix.ziparch}}.zip diff --git a/.gitignore b/.gitignore index a136ea394..34e18b443 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,8 @@ tmp* dictionary. dictionary NUL +cmakebuild/ +install/ # Build artefacts contrib/linux-kernel/linux/ @@ -37,11 +39,15 @@ buck-out/ build-* *.gcda +# IDE +.clang_complete +compile_flags.txt +.clang-format + # Other files .directory _codelite/ _zstdbench/ -.clang_complete *.idea *.swp .DS_Store diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 6a1295b4c..000000000 --- a/.travis.yml +++ /dev/null @@ -1,128 +0,0 @@ -# Travis CI is used to test platforms that github-actions currently doesn't support -# without either self-hosting or some finnicky work-around. Also, some tests -# are troublesome to migrate since GH Actions runs tests not in a tty. -language: c - -git: - depth: 1 - -branches: - only: - - dev - - release - - master - - travisTest - -addons: - apt: - update: true - -env: - global: - - FUZZERTEST=-T1mn - ZSTREAM_TESTTIME=-T1mn - DECODECORPUS_TESTTIME=-T1mn - -matrix: - fast_finish: true - include: - - name: S390X (big endian) + Fuzz test - dist: trusty - arch: s390x - script: - - FUZZER_FLAGS=--no-big-tests make -C tests fuzztest - - - name: S390X (big endian) + Fuzz test + no intrinsics - dist: trusty - arch: s390x - script: - - MOREFLAGS="-DZSTD_NO_INTRINSICS" FUZZER_FLAGS=--no-big-tests make -C tests fuzztest - - - name: arm64 # ~2.5 mn - os: linux - arch: arm64 - script: - - make check - - - name: arm64fuzz - os: linux - arch: arm64 - script: - - make -C tests fuzztest - - # TODO: migrate to GH Actions once newest clang staticanalyze warnings are fixed - - name: static analyzer scanbuild # ~8mn - dist: trusty # note : it's important to pin down a version of static analyzer, since different versions report different false positives - script: - - make staticAnalyze - - # GH actions can't run this command on OS-X, non-tty issues - - name: OS-X make all lib - os: osx - script: - - make -C lib all - - # Introduced to check compat with old toolchains, to prevent e.g. #1872 - - name: ARM Build Test (on Trusty) - dist: trusty - script: - - make arminstall - - make armbuild - - # check release number (release/new tag only) - - name: Tag-Specific Test - if: tag =~ ^v[0-9]\.[0-9] - script: - - make -C tests checkTag - - tests/checkTag "$TRAVIS_BRANCH" - - - name: PPC64LE + Fuzz test # ~13mn - arch: ppc64le - env: - - FUZZER_FLAGS=--no-big-tests - - MOREFLAGS="-static" - script: - - cat /proc/cpuinfo - - make -C tests fuzztest - - # This test currently fails on GA specifically, for no obvious reason - # (it works fine on travisCI, and on local test platforms). - - name: Versions Compatibility Test # ~6mn - script: - - make -C tests versionsTest - - # meson dedicated test - - name: Xenial (Meson + clang) # ~15mn - dist: bionic - language: cpp - compiler: clang - install: - - sudo apt-get install -qq liblz4-dev valgrind tree - - | - travis_retry curl -o ~/ninja.zip -L 'https://github.com/ninja-build/ninja/releases/download/v1.9.0/ninja-linux.zip' && - unzip ~/ninja.zip -d ~/.local/bin - - | - travis_retry curl -o ~/get-pip.py -L 'https://bootstrap.pypa.io/get-pip.py' && - python3 ~/get-pip.py --user && - pip3 install --user meson - script: - - | - meson setup \ - --buildtype=debugoptimized \ - -Db_lundef=false \ - -Dauto_features=enabled \ - -Dbin_programs=true \ - -Dbin_tests=true \ - -Dbin_contrib=true \ - -Ddefault_library=both \ - build/meson builddir - - pushd builddir - - ninja - - meson test --verbose --no-rebuild - - DESTDIR=./staging ninja install - - tree ./staging - after_failure: - - cat "$TRAVIS_BUILD_DIR"/builddir/meson-logs/testlog.txt - - allow_failures: - - env: ALLOW_FAILURES=true diff --git a/BoostKit-KZstar_1.0.0.zip b/BoostKit-KZstar_1.0.0.zip deleted file mode 100644 index 33b20baed1c660160ac77dd58a679a7442c29ea9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112147 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