Skip to content

Commit

Permalink
Merge branch 'ps/zlib-ng' into seen
Browse files Browse the repository at this point in the history
The code paths to interact with zlib has been cleaned up in
preparation for building with zlib-ng.

* ps/zlib-ng:
  ci: make "linux-musl" job use zlib-ng
  ci: switch linux-musl to use Meson
  compat/zlib: allow use of zlib-ng as backend
  git-zlib: cast away potential constness of `next_in` pointer
  compat/zlib: provide stubs for `deflateSetHeader()`
  compat/zlib: provide `deflateBound()` shim centrally
  git-compat-util: move include of "compat/zlib.h" into "git-zlib.h"
  compat: introduce new "zlib.h" header
  git-compat-util: drop `z_const` define
  compat: drop `uncompress2()` compatibility shim
  • Loading branch information
gitster committed Jan 14, 2025
2 parents c5ac9dd + 4610af0 commit 1cd5d1b
Show file tree
Hide file tree
Showing 20 changed files with 100 additions and 140 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ jobs:
- jobname: linux-meson
image: ubuntu:rolling
cc: gcc
- jobname: linux-musl
- jobname: linux-musl-meson
image: alpine:latest
# Supported until 2025-04-02.
- jobname: linux32
Expand Down
2 changes: 1 addition & 1 deletion .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ test:linux:
CC: clang
- jobname: pedantic
image: fedora:latest
- jobname: linux-musl
- jobname: linux-musl-meson
image: alpine:latest
- jobname: linux32
image: i386/ubuntu:20.04
Expand Down
21 changes: 15 additions & 6 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,8 @@ include shared.mak
# byte-order mark (BOM) when writing UTF-16 or UTF-32 and always writes in
# big-endian format.
#
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound.
# Define NO_DEFLATE_BOUND if your zlib does not have deflateBound. Define
# ZLIB_NG if you want to use zlib-ng instead of zlib.
#
# Define NO_NORETURN if using buggy versions of gcc 4.6+ and profile feedback,
# as the compiler can crash (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49299)
Expand Down Expand Up @@ -986,7 +987,6 @@ LIB_OBJS += commit.o
LIB_OBJS += compat/nonblock.o
LIB_OBJS += compat/obstack.o
LIB_OBJS += compat/terminal.o
LIB_OBJS += compat/zlib-uncompress2.o
LIB_OBJS += config.o
LIB_OBJS += connect.o
LIB_OBJS += connected.o
Expand Down Expand Up @@ -1695,11 +1695,20 @@ else
endif
IMAP_SEND_LDFLAGS += $(OPENSSL_LINK) $(OPENSSL_LIBSSL) $(LIB_4_CRYPTO)

ifdef ZLIB_PATH
BASIC_CFLAGS += -I$(ZLIB_PATH)/include
EXTLIBS += $(call libpath_template,$(ZLIB_PATH)/$(lib))
ifdef ZLIB_NG
BASIC_CFLAGS += -DHAVE_ZLIB_NG
ifdef ZLIB_NG_PATH
BASIC_CFLAGS += -I$(ZLIB_NG_PATH)/include
EXTLIBS += $(call libpath_template,$(ZLIB_NG_PATH)/$(lib))
endif
EXTLIBS += -lz-ng
else
ifdef ZLIB_PATH
BASIC_CFLAGS += -I$(ZLIB_PATH)/include
EXTLIBS += $(call libpath_template,$(ZLIB_PATH)/$(lib))
endif
EXTLIBS += -lz
endif
EXTLIBS += -lz

ifndef NO_OPENSSL
OPENSSL_LIBSSL = -lssl
Expand Down
4 changes: 0 additions & 4 deletions archive-tar.c
Original file line number Diff line number Diff line change
Expand Up @@ -473,9 +473,7 @@ static const char internal_gzip_command[] = "git archive gzip";
static int write_tar_filter_archive(const struct archiver *ar,
struct archiver_args *args)
{
#if ZLIB_VERNUM >= 0x1221
struct gz_header_s gzhead = { .os = 3 }; /* Unix, for reproducibility */
#endif
struct strbuf cmd = STRBUF_INIT;
struct child_process filter = CHILD_PROCESS_INIT;
int r;
Expand All @@ -486,10 +484,8 @@ static int write_tar_filter_archive(const struct archiver *ar,
if (!strcmp(ar->filter_command, internal_gzip_command)) {
write_block = tgz_write_block;
git_deflate_init_gzip(&gzstream, args->compression_level);
#if ZLIB_VERNUM >= 0x1221
if (deflateSetHeader(&gzstream.z, &gzhead) != Z_OK)
BUG("deflateSetHeader() called too late");
#endif
gzstream.next_out = outbuf;
gzstream.avail_out = sizeof(outbuf);

Expand Down
1 change: 1 addition & 0 deletions archive.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "convert.h"
#include "environment.h"
#include "gettext.h"
#include "git-zlib.h"
#include "hex.h"
#include "object-name.h"
#include "path.h"
Expand Down
4 changes: 2 additions & 2 deletions ci/install-dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ fi

case "$distro" in
alpine-*)
apk add --update shadow sudo build-base curl-dev openssl-dev expat-dev gettext \
pcre2-dev python3 musl-libintl perl-utils ncurses \
apk add --update shadow sudo meson ninja-build gcc libc-dev curl-dev openssl-dev expat-dev gettext \
zlib-ng-dev pcre2-dev python3 musl-libintl perl-utils ncurses \
apache2 apache2-http2 apache2-proxy apache2-ssl apache2-webdav apr-util-dbd_sqlite3 \
bash cvs gnupg perl-cgi perl-dbd-sqlite perl-io-tty >/dev/null
;;
Expand Down
5 changes: 1 addition & 4 deletions ci/lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -349,10 +349,7 @@ linux32)
CC=gcc
;;
linux-musl)
CC=gcc
MAKEFLAGS="$MAKEFLAGS PYTHON_PATH=/usr/bin/python3 USE_LIBPCRE2=Yes"
MAKEFLAGS="$MAKEFLAGS NO_REGEX=Yes ICONV_OMITS_BOM=Yes"
MAKEFLAGS="$MAKEFLAGS GIT_TEST_UTF8_LOCALE=C.UTF-8"
MESONFLAGS="$MESONFLAGS -DGIT_TEST_UTF8_LOCALE=C.UTF-8"
;;
linux-leaks|linux-reftable-leaks)
export SANITIZE=leak
Expand Down
3 changes: 2 additions & 1 deletion ci/run-build-and-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,8 @@ case "$jobname" in
--fatal-meson-warnings \
--warnlevel 2 --werror \
--wrap-mode nofallback \
-Dfuzzers=true
-Dfuzzers=true \
$MESONFLAGS
group "Build" meson compile -C build --
if test -n "$run_tests"
then
Expand Down
47 changes: 47 additions & 0 deletions compat/zlib-compat.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#ifndef COMPAT_ZLIB_H
#define COMPAT_ZLIB_H

#ifdef HAVE_ZLIB_NG
# include <zlib-ng.h>

# define z_stream zng_stream
#define gz_header_s zng_gz_header_s

# define crc32(crc, buf, len) zng_crc32(crc, buf, len)

# define inflate(strm, bits) zng_inflate(strm, bits)
# define inflateEnd(strm) zng_inflateEnd(strm)
# define inflateInit(strm) zng_inflateInit(strm)
# define inflateInit2(strm, bits) zng_inflateInit2(strm, bits)
# define inflateReset(strm) zng_inflateReset(strm)

# define deflate(strm, flush) zng_deflate(strm, flush)
# define deflateBound(strm, source_len) zng_deflateBound(strm, source_len)
# define deflateEnd(strm) zng_deflateEnd(strm)
# define deflateInit(strm, level) zng_deflateInit(strm, level)
# define deflateInit2(stream, level, method, window_bits, mem_level, strategy) zng_deflateInit2(stream, level, method, window_bits, mem_level, strategy)
# define deflateReset(strm) zng_deflateReset(strm)
# define deflateSetHeader(strm, head) zng_deflateSetHeader(strm, head)

#else
# include <zlib.h>

# if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
# define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
# endif

# if ZLIB_VERNUM < 0x1221
struct gz_header_s {
int os;
};

static int deflateSetHeader(z_streamp strm, struct gz_header_s *head)
{
(void)(strm);
(void)(head);
return Z_OK;
}
# endif
#endif /* HAVE_ZLIB_NG */

#endif /* COMPAT_ZLIB_H */
96 changes: 0 additions & 96 deletions compat/zlib-uncompress2.c

This file was deleted.

1 change: 1 addition & 0 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "convert.h"
#include "environment.h"
#include "gettext.h"
#include "git-zlib.h"
#include "ident.h"
#include "repository.h"
#include "lockfile.h"
Expand Down
3 changes: 2 additions & 1 deletion csum-file.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,10 @@
#define USE_THE_REPOSITORY_VARIABLE

#include "git-compat-util.h"
#include "progress.h"
#include "csum-file.h"
#include "git-zlib.h"
#include "hash.h"
#include "progress.h"

static void verify_buffer_or_die(struct hashfile *f,
const void *buf,
Expand Down
1 change: 1 addition & 0 deletions environment.c
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "convert.h"
#include "environment.h"
#include "gettext.h"
#include "git-zlib.h"
#include "repository.h"
#include "config.h"
#include "refs.h"
Expand Down
12 changes: 0 additions & 12 deletions git-compat-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -1557,18 +1557,6 @@ int cmd_main(int, const char **);
int common_exit(const char *file, int line, int code);
#define exit(code) exit(common_exit(__FILE__, __LINE__, (code)))

#define z_const
#include <zlib.h>

#if ZLIB_VERNUM < 0x1290
/*
* This is uncompress2, which is only available in zlib >= 1.2.9
* (released as of early 2017). See compat/zlib-uncompress2.c.
*/
int uncompress2(Bytef *dest, uLongf *destLen, const Bytef *source,
uLong *sourceLen);
#endif

/*
* This include must come after system headers, since it introduces macros that
* replace system names.
Expand Down
6 changes: 1 addition & 5 deletions git-zlib.c
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ static void zlib_post_call(git_zstream *s)

s->total_out = s->z.total_out;
s->total_in = s->z.total_in;
s->next_in = s->z.next_in;
s->next_in = (unsigned char *) s->z.next_in;
s->next_out = s->z.next_out;
s->avail_in -= bytes_consumed;
s->avail_out -= bytes_produced;
Expand Down Expand Up @@ -147,10 +147,6 @@ int git_inflate(git_zstream *strm, int flush)
return status;
}

#if defined(NO_DEFLATE_BOUND) || ZLIB_VERNUM < 0x1200
#define deflateBound(c,s) ((s) + (((s) + 7) >> 3) + (((s) + 63) >> 6) + 11)
#endif

unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
{
return deflateBound(&strm->z, size);
Expand Down
2 changes: 2 additions & 0 deletions git-zlib.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#ifndef GIT_ZLIB_H
#define GIT_ZLIB_H

#include "compat/zlib-compat.h"

typedef struct git_zstream {
z_stream z;
unsigned long avail_in;
Expand Down
24 changes: 18 additions & 6 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,6 @@ libgit_sources = [
'compat/nonblock.c',
'compat/obstack.c',
'compat/terminal.c',
'compat/zlib-uncompress2.c',
'config.c',
'connect.c',
'connected.c',
Expand Down Expand Up @@ -668,7 +667,7 @@ build_options_config.set('GIT_TEST_CMP_USE_COPIED_CONTEXT', '')
build_options_config.set('GIT_TEST_INDEX_VERSION', '')
build_options_config.set('GIT_TEST_OPTS', '')
build_options_config.set('GIT_TEST_PERL_FATAL_WARNINGS', '')
build_options_config.set('GIT_TEST_UTF8_LOCALE', '')
build_options_config.set_quoted('GIT_TEST_UTF8_LOCALE', get_option('test_utf8_locale'))
build_options_config.set_quoted('LOCALEDIR', fs.as_posix(get_option('prefix') / get_option('localedir')))
build_options_config.set('GITWEBDIR', fs.as_posix(get_option('prefix') / get_option('datadir') / 'gitweb'))

Expand Down Expand Up @@ -802,11 +801,23 @@ else
build_options_config.set('NO_PERL_CPAN_FALLBACKS', '')
endif

zlib = dependency('zlib', default_options: ['default_library=static', 'tests=disabled'])
if zlib.version().version_compare('<1.2.0')
libgit_c_args += '-DNO_DEFLATE_BOUND'
zlib_backend = get_option('zlib_backend')
if zlib_backend in ['auto', 'zlib-ng']
zlib_ng = dependency('zlib-ng', required: zlib_backend == 'zlib-ng')
if zlib_ng.found()
zlib_backend = 'zlib-ng'
libgit_c_args += '-DHAVE_ZLIB_NG'
libgit_dependencies += zlib_ng
endif
endif
if zlib_backend in ['auto', 'zlib']
zlib = dependency('zlib', default_options: ['default_library=static', 'tests=disabled'])
if zlib.version().version_compare('<1.2.0')
libgit_c_args += '-DNO_DEFLATE_BOUND'
endif
zlib_backend = 'zlib'
libgit_dependencies += zlib
endif
libgit_dependencies += zlib

threads = dependency('threads', required: false)
if threads.found()
Expand Down Expand Up @@ -2013,4 +2024,5 @@ summary({
'sha1': sha1_backend,
'sha1_unsafe': sha1_unsafe_backend,
'sha256': sha256_backend,
'zlib': zlib_backend,
}, section: 'Backends')
Loading

0 comments on commit 1cd5d1b

Please sign in to comment.