From ec983f016b0492356661c43647493a103ed1b56c Mon Sep 17 00:00:00 2001 From: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com> Date: Fri, 23 Oct 2026 06:02:01 -0400 Subject: [PATCH 1/6] small cleanup --- build.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.zig b/build.zig index 0eb7fb3..256a456 100644 --- a/build.zig +++ b/build.zig @@ -455,7 +455,7 @@ pub fn build(b: *std.Build) !void { examples_step.dependOn(&example_run.step); } - const test_step = b.step("test", "Run core unit tests (requires python)"); + const test_step = b.step("test", "Run core unit tests (requires python3)"); { const gen_cmd = b.addSystemCommand(&.{"python3"}); gen_cmd.addFileArg(libgit_src.path("tests/clar/generate.py")); From 9653a37e94d85fd45e5c360a7d5440499477fd45 Mon Sep 17 00:00:00 2001 From: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com> Date: Fri, 23 Oct 2026 06:28:10 -0400 Subject: [PATCH 2/6] move source paths into zon file --- build.zig | 732 +--------------------------------------------- build/sources.zon | 703 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 717 insertions(+), 718 deletions(-) create mode 100644 build/sources.zon diff --git a/build.zig b/build.zig index 256a456..a523acc 100644 --- a/build.zig +++ b/build.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const sources = @import("build/sources.zon"); pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); @@ -98,7 +99,7 @@ pub fn build(b: *std.Build) !void { mod.addWin32ResourceFile(.{ .file = libgit_src.path("src/libgit2/git2.rc") }); mod.addCSourceFiles(.{ .root = libgit_root, - .files = &util_win32_sources, + .files = &sources.util_win32, .flags = &flags, }); } else { @@ -187,7 +188,7 @@ pub fn build(b: *std.Build) !void { }); ntlm.addCSourceFiles(.{ .root = libgit_root, - .files = &ntlm_sources, + .files = &sources.ntlm, .flags = &(ntlm_cflags ++ .{"-Wno-deprecated"}), }); @@ -202,7 +203,7 @@ pub fn build(b: *std.Build) !void { mod.addCSourceFiles(.{ .root = libgit_root, - .files = &util_unix_sources, + .files = &sources.util_unix, .flags = &flags, }); mod.addCSourceFiles(.{ @@ -219,7 +220,7 @@ pub fn build(b: *std.Build) !void { // SHA1 collisiondetect mod.addCSourceFiles(.{ .root = libgit_root, - .files = &util_sha1dc_sources, + .files = &sources.util_sha1dc, .flags = &(flags ++ .{ "-DSHA1DC_NO_STANDARD_INCLUDES", "-DSHA1DC_CUSTOM_INCLUDE_SHA1_C=\"git2_util.h\"", @@ -270,7 +271,7 @@ pub fn build(b: *std.Build) !void { llhttp.addIncludePath(libgit_src.path("deps/llhttp")); llhttp.addCSourceFiles(.{ .root = libgit_root, - .files = &llhttp_sources, + .files = &sources.llhttp, .flags = &.{ "-Wno-unused-parameter", "-Wno-missing-declarations" }, }); @@ -306,7 +307,7 @@ pub fn build(b: *std.Build) !void { pcre.addIncludePath(libgit_src.path("deps/pcre")); pcre.addCSourceFiles(.{ .root = libgit_root, - .files = &pcre_sources, + .files = &sources.pcre, .flags = &.{ "-Wno-unused-function", "-Wno-implicit-fallthrough", @@ -338,7 +339,7 @@ pub fn build(b: *std.Build) !void { // just add the source files directly instead of making a static lib step. mod.addCSourceFiles(.{ .root = libgit_root, - .files = &xdiff_sources, + .files = &sources.xdiff, .flags = &.{ "-Wno-sign-compare", "-Wno-unused-parameter" }, }); mod.addIncludePath(libgit_src.path("deps/xdiff")); @@ -358,12 +359,12 @@ pub fn build(b: *std.Build) !void { mod.addCSourceFiles(.{ .root = libgit_root, - .files = &libgit_sources, + .files = &sources.libgit2, .flags = &flags, }); mod.addCSourceFiles(.{ .root = libgit_root, - .files = &util_sources, + .files = &sources.util, .flags = &flags, }); @@ -397,7 +398,7 @@ pub fn build(b: *std.Build) !void { cli.linkLibrary(lib); cli.addCSourceFiles(.{ .root = libgit_root, - .files = &cli_sources, + .files = &sources.cli, // @Todo: see above // .flags = &.{"-std=c90"}, }); @@ -437,7 +438,7 @@ pub fn build(b: *std.Build) !void { lg2.addIncludePath(libgit_src.path("examples")); lg2.addCSourceFiles(.{ .root = libgit_root, - .files = &example_sources, + .files = &sources.example, .flags = &.{ // "-std=c90", "-DGIT_DEPRECATE_HARD", @@ -502,12 +503,12 @@ pub fn build(b: *std.Build) !void { }; runner.addCSourceFiles(.{ .root = libgit_src.path("tests/libgit2/"), - .files = &libgit2_test_sources, + .files = &sources.libgit2_test, .flags = runner_flags, }); runner.addCSourceFiles(.{ .root = clar_src, - .files = &clar_sources, + .files = &sources.clar, .flags = runner_flags, }); @@ -680,708 +681,3 @@ fn maybeAddTlsIncludes( compile.addIncludePath(tls.artifact(name).getEmittedIncludeTree()); } } - -const libgit_sources = [_][]const u8{ - "src/libgit2/annotated_commit.c", - "src/libgit2/apply.c", - "src/libgit2/attr.c", - "src/libgit2/attr_file.c", - "src/libgit2/attrcache.c", - "src/libgit2/blame.c", - "src/libgit2/blame_git.c", - "src/libgit2/blob.c", - "src/libgit2/branch.c", - "src/libgit2/buf.c", - "src/libgit2/cache.c", - "src/libgit2/checkout.c", - "src/libgit2/cherrypick.c", - "src/libgit2/clone.c", - "src/libgit2/commit.c", - "src/libgit2/commit_graph.c", - "src/libgit2/commit_list.c", - "src/libgit2/config.c", - "src/libgit2/config_cache.c", - "src/libgit2/config_file.c", - "src/libgit2/config_list.c", - "src/libgit2/config_mem.c", - "src/libgit2/config_parse.c", - "src/libgit2/config_snapshot.c", - "src/libgit2/crlf.c", - "src/libgit2/delta.c", - "src/libgit2/describe.c", - "src/libgit2/diff.c", - "src/libgit2/diff_driver.c", - "src/libgit2/diff_file.c", - "src/libgit2/diff_generate.c", - "src/libgit2/diff_parse.c", - "src/libgit2/diff_print.c", - "src/libgit2/diff_stats.c", - "src/libgit2/diff_tform.c", - "src/libgit2/diff_xdiff.c", - "src/libgit2/email.c", - "src/libgit2/fetch.c", - "src/libgit2/fetchhead.c", - "src/libgit2/filter.c", - "src/libgit2/grafts.c", - "src/libgit2/graph.c", - "src/libgit2/hashsig.c", - "src/libgit2/ident.c", - "src/libgit2/ignore.c", - "src/libgit2/index.c", - "src/libgit2/index_map.c", - "src/libgit2/indexer.c", - "src/libgit2/iterator.c", - "src/libgit2/libgit2.c", - "src/libgit2/mailmap.c", - "src/libgit2/merge.c", - "src/libgit2/merge_driver.c", - "src/libgit2/merge_file.c", - "src/libgit2/message.c", - "src/libgit2/midx.c", - "src/libgit2/mwindow.c", - "src/libgit2/notes.c", - "src/libgit2/object.c", - "src/libgit2/object_api.c", - "src/libgit2/odb.c", - "src/libgit2/odb_loose.c", - "src/libgit2/odb_mempack.c", - "src/libgit2/odb_pack.c", - "src/libgit2/oid.c", - "src/libgit2/oidarray.c", - "src/libgit2/pack-objects.c", - "src/libgit2/pack.c", - "src/libgit2/parse.c", - "src/libgit2/patch.c", - "src/libgit2/patch_generate.c", - "src/libgit2/patch_parse.c", - "src/libgit2/path.c", - "src/libgit2/pathspec.c", - "src/libgit2/proxy.c", - "src/libgit2/push.c", - "src/libgit2/reader.c", - "src/libgit2/rebase.c", - "src/libgit2/refdb.c", - "src/libgit2/refdb_fs.c", - "src/libgit2/reflog.c", - "src/libgit2/refs.c", - "src/libgit2/refspec.c", - "src/libgit2/remote.c", - "src/libgit2/repository.c", - "src/libgit2/reset.c", - "src/libgit2/revert.c", - "src/libgit2/revparse.c", - "src/libgit2/revwalk.c", - "src/libgit2/settings.c", - "src/libgit2/signature.c", - "src/libgit2/stash.c", - "src/libgit2/status.c", - "src/libgit2/strarray.c", - "src/libgit2/streams/mbedtls.c", - "src/libgit2/streams/openssl.c", - "src/libgit2/streams/openssl_dynamic.c", - "src/libgit2/streams/openssl_legacy.c", - "src/libgit2/streams/registry.c", - "src/libgit2/streams/schannel.c", - "src/libgit2/streams/socket.c", - "src/libgit2/streams/stransport.c", - "src/libgit2/streams/tls.c", - "src/libgit2/submodule.c", - "src/libgit2/sysdir.c", - "src/libgit2/tag.c", - "src/libgit2/trace.c", - "src/libgit2/trailer.c", - "src/libgit2/transaction.c", - "src/libgit2/transport.c", - "src/libgit2/transports/auth.c", - "src/libgit2/transports/auth_gssapi.c", - "src/libgit2/transports/auth_ntlmclient.c", - "src/libgit2/transports/auth_sspi.c", - "src/libgit2/transports/credential.c", - "src/libgit2/transports/credential_helpers.c", - "src/libgit2/transports/git.c", - "src/libgit2/transports/http.c", - "src/libgit2/transports/httpclient.c", - "src/libgit2/transports/httpparser.c", - "src/libgit2/transports/local.c", - "src/libgit2/transports/smart.c", - "src/libgit2/transports/smart_pkt.c", - "src/libgit2/transports/smart_protocol.c", - "src/libgit2/transports/ssh.c", - "src/libgit2/transports/ssh_exec.c", - "src/libgit2/transports/ssh_libssh2.c", - "src/libgit2/transports/winhttp.c", - "src/libgit2/tree-cache.c", - "src/libgit2/tree.c", - "src/libgit2/worktree.c", -}; - -const util_sources = [_][]const u8{ - "src/util/alloc.c", - "src/util/allocators/debugalloc.c", - "src/util/allocators/failalloc.c", - "src/util/allocators/stdalloc.c", - "src/util/allocators/win32_leakcheck.c", - "src/util/date.c", - "src/util/errors.c", - "src/util/filebuf.c", - "src/util/fs_path.c", - "src/util/futils.c", - "src/util/hash.c", - "src/util/net.c", - "src/util/pool.c", - "src/util/posix.c", - "src/util/pqueue.c", - "src/util/rand.c", - "src/util/regexp.c", - "src/util/runtime.c", - "src/util/sortedcache.c", - "src/util/str.c", - "src/util/strlist.c", - "src/util/thread.c", - "src/util/tsort.c", - "src/util/utf8.c", - "src/util/util.c", - "src/util/varint.c", - "src/util/vector.c", - "src/util/wildmatch.c", - "src/util/zstream.c", -}; - -const util_unix_sources = [_][]const u8{ - "src/util/unix/map.c", - "src/util/unix/process.c", - "src/util/unix/realpath.c", -}; - -const util_win32_sources = [_][]const u8{ - "src/util/win32/dir.c", - "src/util/win32/error.c", - "src/util/win32/map.c", - "src/util/win32/path_w32.c", - "src/util/win32/posix_w32.c", - "src/util/win32/precompiled.c", - "src/util/win32/process.c", - "src/util/win32/thread.c", - "src/util/win32/utf-conv.c", - "src/util/win32/w32_buffer.c", - "src/util/win32/w32_leakcheck.c", - "src/util/win32/w32_util.c", - - "src/util/hash/win32.c", -}; - -const util_sha1dc_sources = [_][]const u8{ - "src/util/hash/collisiondetect.c", - "src/util/hash/sha1dc/sha1.c", - "src/util/hash/sha1dc/ubc_check.c", -}; - -const llhttp_sources = [_][]const u8{ - "deps/llhttp/api.c", - "deps/llhttp/http.c", - "deps/llhttp/llhttp.c", -}; - -const pcre_sources = [_][]const u8{ - "deps/pcre/pcre_byte_order.c", - "deps/pcre/pcre_chartables.c", - "deps/pcre/pcre_compile.c", - "deps/pcre/pcre_config.c", - "deps/pcre/pcre_dfa_exec.c", - "deps/pcre/pcre_exec.c", - "deps/pcre/pcre_fullinfo.c", - "deps/pcre/pcre_get.c", - "deps/pcre/pcre_globals.c", - "deps/pcre/pcre_jit_compile.c", - "deps/pcre/pcre_maketables.c", - "deps/pcre/pcre_newline.c", - "deps/pcre/pcre_ord2utf8.c", - "deps/pcre/pcre_printint.c", - "deps/pcre/pcre_refcount.c", - "deps/pcre/pcre_string_utils.c", - "deps/pcre/pcre_study.c", - "deps/pcre/pcre_tables.c", - "deps/pcre/pcre_ucd.c", - "deps/pcre/pcre_valid_utf8.c", - "deps/pcre/pcre_version.c", - "deps/pcre/pcre_xclass.c", - "deps/pcre/pcreposix.c", -}; - -const xdiff_sources = [_][]const u8{ - "deps/xdiff/xdiffi.c", - "deps/xdiff/xemit.c", - "deps/xdiff/xhistogram.c", - "deps/xdiff/xmerge.c", - "deps/xdiff/xpatience.c", - "deps/xdiff/xprepare.c", - "deps/xdiff/xutils.c", -}; - -const ntlm_sources = [_][]const u8{ - "deps/ntlmclient/ntlm.c", - "deps/ntlmclient/unicode_builtin.c", - "deps/ntlmclient/util.c", -}; - -const cli_sources = [_][]const u8{ - "src/cli/cmd.c", - "src/cli/cmd_blame.c", - "src/cli/cmd_cat_file.c", - "src/cli/cmd_clone.c", - "src/cli/cmd_config.c", - "src/cli/cmd_hash_object.c", - "src/cli/cmd_help.c", - "src/cli/cmd_index_pack.c", - "src/cli/cmd_init.c", - "src/cli/common.c", - "src/cli/main.c", - "src/cli/opt.c", - "src/cli/opt_usage.c", - "src/cli/progress.c", -}; - -const example_sources = [_][]const u8{ - "examples/add.c", - "examples/args.c", - "examples/blame.c", - "examples/cat-file.c", - "examples/checkout.c", - "examples/clone.c", - "examples/commit.c", - "examples/common.c", - "examples/config.c", - "examples/describe.c", - "examples/diff.c", - "examples/fetch.c", - "examples/for-each-ref.c", - "examples/general.c", - "examples/index-pack.c", - "examples/init.c", - "examples/lg2.c", - "examples/log.c", - "examples/ls-files.c", - "examples/ls-remote.c", - "examples/merge.c", - "examples/push.c", - "examples/remote.c", - "examples/rev-list.c", - "examples/rev-parse.c", - "examples/show-index.c", - "examples/stash.c", - "examples/status.c", - "examples/tag.c", -}; - -const clar_sources = [_][]const u8{ - "clar.c", - "clar_libgit2.c", - "clar_libgit2_alloc.c", - "clar_libgit2_timer.c", - "clar_libgit2_trace.c", - "main.c", -}; - -const libgit2_test_sources = [_][]const u8{ - "apply/apply_helpers.c", - "apply/both.c", - "apply/callbacks.c", - "apply/check.c", - "apply/fromdiff.c", - "apply/fromfile.c", - "apply/index.c", - "apply/partial.c", - "apply/tree.c", - "apply/workdir.c", - "attr/file.c", - "attr/flags.c", - "attr/lookup.c", - "attr/macro.c", - "attr/repo.c", - "blame/blame_helpers.c", - "blame/buffer.c", - "blame/getters.c", - "blame/harder.c", - "blame/simple.c", - "checkout/binaryunicode.c", - "checkout/checkout_helpers.c", - "checkout/conflict.c", - "checkout/crlf.c", - "checkout/head.c", - "checkout/icase.c", - "checkout/index.c", - "checkout/nasty.c", - "checkout/tree.c", - "checkout/typechange.c", - "cherrypick/bare.c", - "cherrypick/workdir.c", - "clone/empty.c", - "clone/local.c", - "clone/nonetwork.c", - "clone/transport.c", - "commit/commit.c", - "commit/create.c", - "commit/parent.c", - "commit/parse.c", - "commit/signature.c", - "commit/write.c", - "config/add.c", - "config/backend.c", - "config/conditionals.c", - "config/config_helpers.c", - "config/configlevel.c", - "config/find.c", - "config/global.c", - "config/include.c", - "config/memory.c", - "config/multivar.c", - "config/new.c", - "config/read.c", - "config/readonly.c", - "config/rename.c", - "config/snapshot.c", - "config/stress.c", - "config/validkeyname.c", - "config/write.c", - "core/buf.c", - "core/env.c", - "core/features.c", - "core/hashsig.c", - "core/oid.c", - "core/oidarray.c", - "core/opts.c", - "core/pool.c", - "core/structinit.c", - "core/useragent.c", - "core/version.c", - "date/date.c", - "date/rfc2822.c", - "delta/apply.c", - "describe/describe.c", - "describe/describe_helpers.c", - "describe/t6120.c", - "diff/binary.c", - "diff/blob.c", - "diff/diff_helpers.c", - "diff/diffiter.c", - "diff/drivers.c", - "diff/externalmodifications.c", - "diff/format_email.c", - "diff/header.c", - "diff/index.c", - "diff/notify.c", - "diff/parse.c", - "diff/patch.c", - "diff/patchid.c", - "diff/pathspec.c", - "diff/racediffiter.c", - "diff/rename.c", - "diff/stats.c", - "diff/submodules.c", - "diff/tree.c", - "diff/userdiff.c", - "diff/workdir.c", - "email/create.c", - "fetch/local.c", - "fetchhead/nonetwork.c", - "filter/bare.c", - "filter/blob.c", - "filter/crlf.c", - "filter/custom.c", - "filter/custom_helpers.c", - "filter/file.c", - "filter/ident.c", - "filter/query.c", - "filter/stream.c", - "filter/systemattrs.c", - "filter/wildcard.c", - "grafts/basic.c", - "grafts/parse.c", - "grafts/shallow.c", - "graph/ahead_behind.c", - "graph/commitgraph.c", - "graph/descendant_of.c", - "graph/reachable_from_any.c", - "ignore/path.c", - "ignore/status.c", - "index/add.c", - "index/addall.c", - "index/bypath.c", - "index/cache.c", - "index/collision.c", - "index/conflicts.c", - "index/crlf.c", - "index/filemodes.c", - "index/inmemory.c", - "index/names.c", - "index/nsec.c", - "index/racy.c", - "index/read_index.c", - "index/read_tree.c", - "index/rename.c", - "index/reuc.c", - "index/splitindex.c", - "index/stage.c", - "index/tests.c", - "index/tests256.c", - "index/version.c", - "iterator/index.c", - "iterator/iterator_helpers.c", - "iterator/tree.c", - "iterator/workdir.c", - "mailmap/basic.c", - "mailmap/blame.c", - "mailmap/parsing.c", - "merge/analysis.c", - "merge/annotated_commit.c", - "merge/driver.c", - "merge/files.c", - "merge/merge_helpers.c", - "merge/trees/automerge.c", - "merge/trees/commits.c", - "merge/trees/modeconflict.c", - "merge/trees/recursive.c", - "merge/trees/renames.c", - "merge/trees/treediff.c", - "merge/trees/trivial.c", - "merge/trees/whitespace.c", - "merge/workdir/dirty.c", - "merge/workdir/recursive.c", - "merge/workdir/renames.c", - "merge/workdir/setup.c", - "merge/workdir/simple.c", - "merge/workdir/submodules.c", - "merge/workdir/trivial.c", - "message/trailer.c", - "network/cred.c", - "network/fetchlocal.c", - "network/refspecs.c", - "network/remote/defaultbranch.c", - "network/remote/delete.c", - "network/remote/isvalidname.c", - "network/remote/local.c", - "network/remote/push.c", - "network/remote/remotes.c", - "network/remote/rename.c", - "network/remote/tag.c", - "notes/notes.c", - "notes/notesref.c", - "object/blob/filter.c", - "object/blob/fromstream.c", - "object/blob/write.c", - "object/cache.c", - "object/commit/commitstagedfile.c", - "object/commit/parse.c", - "object/lookup.c", - "object/lookup256.c", - "object/lookupbypath.c", - "object/message.c", - "object/peel.c", - "object/raw/chars.c", - "object/raw/compare.c", - "object/raw/convert.c", - "object/raw/fromstr.c", - "object/raw/hash.c", - "object/raw/short.c", - "object/raw/size.c", - "object/raw/type2string.c", - "object/raw/write.c", - "object/shortid.c", - "object/tag/list.c", - "object/tag/parse.c", - "object/tag/peel.c", - "object/tag/read.c", - "object/tag/write.c", - "object/tree/attributes.c", - "object/tree/duplicateentries.c", - "object/tree/frompath.c", - "object/tree/parse.c", - "object/tree/read.c", - "object/tree/update.c", - "object/tree/walk.c", - "object/tree/write.c", - "object/validate.c", - "odb/alternates.c", - "odb/backend/backend_helpers.c", - "odb/backend/loose.c", - "odb/backend/mempack.c", - "odb/backend/multiple.c", - "odb/backend/nobackend.c", - "odb/backend/nonrefreshing.c", - "odb/backend/refreshing.c", - "odb/backend/simple.c", - "odb/emptyobjects.c", - "odb/foreach.c", - "odb/freshen.c", - "odb/largefiles.c", - "odb/loose.c", - "odb/mixed.c", - "odb/open.c", - "odb/packed.c", - "odb/packed256.c", - "odb/packedone.c", - "odb/packedone256.c", - "odb/sorting.c", - "odb/streamwrite.c", - "online/badssl.c", - "online/clone.c", - "online/customcert.c", - "online/fetch.c", - "online/fetchhead.c", - "online/push.c", - "online/push_util.c", - "online/remotes.c", - "online/shallow.c", - "pack/filelimit.c", - "pack/indexer.c", - "pack/midx.c", - "pack/packbuilder.c", - "pack/sharing.c", - "pack/threadsafety.c", - "patch/parse.c", - "patch/print.c", - "path/validate.c", - "perf/helper__perf__do_merge.c", - "perf/helper__perf__timer.c", - "perf/merge.c", - "precompiled.c", - "rebase/abort.c", - "rebase/inmemory.c", - "rebase/iterator.c", - "rebase/merge.c", - "rebase/setup.c", - "rebase/sign.c", - "rebase/submodule.c", - "refs/basic.c", - "refs/branches/checkedout.c", - "refs/branches/create.c", - "refs/branches/delete.c", - "refs/branches/ishead.c", - "refs/branches/iterator.c", - "refs/branches/lookup.c", - "refs/branches/move.c", - "refs/branches/name.c", - "refs/branches/remote.c", - "refs/branches/upstream.c", - "refs/branches/upstreamname.c", - "refs/crashes.c", - "refs/create.c", - "refs/delete.c", - "refs/dup.c", - "refs/foreachglob.c", - "refs/isvalidname.c", - "refs/iterator.c", - "refs/list.c", - "refs/listall.c", - "refs/lookup.c", - "refs/namespaces.c", - "refs/normalize.c", - "refs/overwrite.c", - "refs/pack.c", - "refs/peel.c", - "refs/races.c", - "refs/read.c", - "refs/ref_helpers.c", - "refs/reflog/drop.c", - "refs/reflog/messages.c", - "refs/reflog/reflog.c", - "refs/reflog/reflog_helpers.c", - "refs/rename.c", - "refs/revparse.c", - "refs/setter.c", - "refs/shorthand.c", - "refs/tags/name.c", - "refs/transactions.c", - "refs/unicode.c", - "refs/update.c", - "remote/create.c", - "remote/fetch.c", - "remote/httpproxy.c", - "remote/insteadof.c", - "remote/list.c", - "repo/config.c", - "repo/discover.c", - "repo/env.c", - "repo/extensions.c", - "repo/getters.c", - "repo/hashfile.c", - "repo/head.c", - "repo/headtree.c", - "repo/init.c", - "repo/message.c", - "repo/new.c", - "repo/objectformat.c", - "repo/open.c", - "repo/pathspec.c", - "repo/repo_helpers.c", - "repo/reservedname.c", - "repo/setters.c", - "repo/shallow.c", - "repo/state.c", - "repo/template.c", - "reset/default.c", - "reset/hard.c", - "reset/mixed.c", - "reset/reset_helpers.c", - "reset/soft.c", - "revert/bare.c", - "revert/rename.c", - "revert/workdir.c", - "revwalk/basic.c", - "revwalk/hidecb.c", - "revwalk/mergebase.c", - "revwalk/signatureparsing.c", - "revwalk/simplify.c", - "stash/apply.c", - "stash/drop.c", - "stash/foreach.c", - "stash/save.c", - "stash/stash_helpers.c", - "stash/submodules.c", - "status/renames.c", - "status/single.c", - "status/status_helpers.c", - "status/submodules.c", - "status/worktree.c", - "status/worktree_init.c", - "stream/deprecated.c", - "stream/registration.c", - "stress/diff.c", - "submodule/add.c", - "submodule/escape.c", - "submodule/init.c", - "submodule/inject_option.c", - "submodule/lookup.c", - "submodule/modify.c", - "submodule/nosubs.c", - "submodule/open.c", - "submodule/repository_init.c", - "submodule/status.c", - "submodule/submodule_helpers.c", - "submodule/update.c", - "threads/atomic.c", - "threads/basic.c", - "threads/diff.c", - "threads/iterator.c", - "threads/refdb.c", - "threads/thread_helpers.c", - "threads/tlsdata.c", - "trace/trace.c", - "trace/windows/stacktrace.c", - "transport/register.c", - "transport/ssh_exec.c", - "transports/smart/packet.c", - "win32/forbidden.c", - "win32/longpath.c", - "win32/systemdir.c", - "worktree/bare.c", - "worktree/config.c", - "worktree/merge.c", - "worktree/open.c", - "worktree/reflog.c", - "worktree/refs.c", - "worktree/repository.c", - "worktree/submodule.c", - "worktree/worktree.c", - "worktree/worktree_helpers.c", -}; diff --git a/build/sources.zon b/build/sources.zon new file mode 100644 index 0000000..a7780df --- /dev/null +++ b/build/sources.zon @@ -0,0 +1,703 @@ +.{ + .libgit2 = .{ + "src/libgit2/annotated_commit.c", + "src/libgit2/apply.c", + "src/libgit2/attr.c", + "src/libgit2/attr_file.c", + "src/libgit2/attrcache.c", + "src/libgit2/blame.c", + "src/libgit2/blame_git.c", + "src/libgit2/blob.c", + "src/libgit2/branch.c", + "src/libgit2/buf.c", + "src/libgit2/cache.c", + "src/libgit2/checkout.c", + "src/libgit2/cherrypick.c", + "src/libgit2/clone.c", + "src/libgit2/commit.c", + "src/libgit2/commit_graph.c", + "src/libgit2/commit_list.c", + "src/libgit2/config.c", + "src/libgit2/config_cache.c", + "src/libgit2/config_file.c", + "src/libgit2/config_list.c", + "src/libgit2/config_mem.c", + "src/libgit2/config_parse.c", + "src/libgit2/config_snapshot.c", + "src/libgit2/crlf.c", + "src/libgit2/delta.c", + "src/libgit2/describe.c", + "src/libgit2/diff.c", + "src/libgit2/diff_driver.c", + "src/libgit2/diff_file.c", + "src/libgit2/diff_generate.c", + "src/libgit2/diff_parse.c", + "src/libgit2/diff_print.c", + "src/libgit2/diff_stats.c", + "src/libgit2/diff_tform.c", + "src/libgit2/diff_xdiff.c", + "src/libgit2/email.c", + "src/libgit2/fetch.c", + "src/libgit2/fetchhead.c", + "src/libgit2/filter.c", + "src/libgit2/grafts.c", + "src/libgit2/graph.c", + "src/libgit2/hashsig.c", + "src/libgit2/ident.c", + "src/libgit2/ignore.c", + "src/libgit2/index.c", + "src/libgit2/index_map.c", + "src/libgit2/indexer.c", + "src/libgit2/iterator.c", + "src/libgit2/libgit2.c", + "src/libgit2/mailmap.c", + "src/libgit2/merge.c", + "src/libgit2/merge_driver.c", + "src/libgit2/merge_file.c", + "src/libgit2/message.c", + "src/libgit2/midx.c", + "src/libgit2/mwindow.c", + "src/libgit2/notes.c", + "src/libgit2/object.c", + "src/libgit2/object_api.c", + "src/libgit2/odb.c", + "src/libgit2/odb_loose.c", + "src/libgit2/odb_mempack.c", + "src/libgit2/odb_pack.c", + "src/libgit2/oid.c", + "src/libgit2/oidarray.c", + "src/libgit2/pack-objects.c", + "src/libgit2/pack.c", + "src/libgit2/parse.c", + "src/libgit2/patch.c", + "src/libgit2/patch_generate.c", + "src/libgit2/patch_parse.c", + "src/libgit2/path.c", + "src/libgit2/pathspec.c", + "src/libgit2/proxy.c", + "src/libgit2/push.c", + "src/libgit2/reader.c", + "src/libgit2/rebase.c", + "src/libgit2/refdb.c", + "src/libgit2/refdb_fs.c", + "src/libgit2/reflog.c", + "src/libgit2/refs.c", + "src/libgit2/refspec.c", + "src/libgit2/remote.c", + "src/libgit2/repository.c", + "src/libgit2/reset.c", + "src/libgit2/revert.c", + "src/libgit2/revparse.c", + "src/libgit2/revwalk.c", + "src/libgit2/settings.c", + "src/libgit2/signature.c", + "src/libgit2/stash.c", + "src/libgit2/status.c", + "src/libgit2/strarray.c", + "src/libgit2/streams/mbedtls.c", + "src/libgit2/streams/openssl.c", + "src/libgit2/streams/openssl_dynamic.c", + "src/libgit2/streams/openssl_legacy.c", + "src/libgit2/streams/registry.c", + "src/libgit2/streams/schannel.c", + "src/libgit2/streams/socket.c", + "src/libgit2/streams/stransport.c", + "src/libgit2/streams/tls.c", + "src/libgit2/submodule.c", + "src/libgit2/sysdir.c", + "src/libgit2/tag.c", + "src/libgit2/trace.c", + "src/libgit2/trailer.c", + "src/libgit2/transaction.c", + "src/libgit2/transport.c", + "src/libgit2/transports/auth.c", + "src/libgit2/transports/auth_gssapi.c", + "src/libgit2/transports/auth_ntlmclient.c", + "src/libgit2/transports/auth_sspi.c", + "src/libgit2/transports/credential.c", + "src/libgit2/transports/credential_helpers.c", + "src/libgit2/transports/git.c", + "src/libgit2/transports/http.c", + "src/libgit2/transports/httpclient.c", + "src/libgit2/transports/httpparser.c", + "src/libgit2/transports/local.c", + "src/libgit2/transports/smart.c", + "src/libgit2/transports/smart_pkt.c", + "src/libgit2/transports/smart_protocol.c", + "src/libgit2/transports/ssh.c", + "src/libgit2/transports/ssh_exec.c", + "src/libgit2/transports/ssh_libssh2.c", + "src/libgit2/transports/winhttp.c", + "src/libgit2/tree-cache.c", + "src/libgit2/tree.c", + "src/libgit2/worktree.c", + }, + + .util = .{ + "src/util/alloc.c", + "src/util/allocators/debugalloc.c", + "src/util/allocators/failalloc.c", + "src/util/allocators/stdalloc.c", + "src/util/allocators/win32_leakcheck.c", + "src/util/date.c", + "src/util/errors.c", + "src/util/filebuf.c", + "src/util/fs_path.c", + "src/util/futils.c", + "src/util/hash.c", + "src/util/net.c", + "src/util/pool.c", + "src/util/posix.c", + "src/util/pqueue.c", + "src/util/rand.c", + "src/util/regexp.c", + "src/util/runtime.c", + "src/util/sortedcache.c", + "src/util/str.c", + "src/util/strlist.c", + "src/util/thread.c", + "src/util/tsort.c", + "src/util/utf8.c", + "src/util/util.c", + "src/util/varint.c", + "src/util/vector.c", + "src/util/wildmatch.c", + "src/util/zstream.c", + }, + .util_unix = .{ + "src/util/unix/map.c", + "src/util/unix/process.c", + "src/util/unix/realpath.c", + }, + .util_win32 = .{ + "src/util/win32/dir.c", + "src/util/win32/error.c", + "src/util/win32/map.c", + "src/util/win32/path_w32.c", + "src/util/win32/posix_w32.c", + "src/util/win32/precompiled.c", + "src/util/win32/process.c", + "src/util/win32/thread.c", + "src/util/win32/utf-conv.c", + "src/util/win32/w32_buffer.c", + "src/util/win32/w32_leakcheck.c", + "src/util/win32/w32_util.c", + + "src/util/hash/win32.c", + }, + .util_sha1dc = .{ + "src/util/hash/collisiondetect.c", + "src/util/hash/sha1dc/sha1.c", + "src/util/hash/sha1dc/ubc_check.c", + }, + + .llhttp = .{ + "deps/llhttp/api.c", + "deps/llhttp/http.c", + "deps/llhttp/llhttp.c", + }, + + .pcre = .{ + "deps/pcre/pcre_byte_order.c", + "deps/pcre/pcre_chartables.c", + "deps/pcre/pcre_compile.c", + "deps/pcre/pcre_config.c", + "deps/pcre/pcre_dfa_exec.c", + "deps/pcre/pcre_exec.c", + "deps/pcre/pcre_fullinfo.c", + "deps/pcre/pcre_get.c", + "deps/pcre/pcre_globals.c", + "deps/pcre/pcre_jit_compile.c", + "deps/pcre/pcre_maketables.c", + "deps/pcre/pcre_newline.c", + "deps/pcre/pcre_ord2utf8.c", + "deps/pcre/pcre_printint.c", + "deps/pcre/pcre_refcount.c", + "deps/pcre/pcre_string_utils.c", + "deps/pcre/pcre_study.c", + "deps/pcre/pcre_tables.c", + "deps/pcre/pcre_ucd.c", + "deps/pcre/pcre_valid_utf8.c", + "deps/pcre/pcre_version.c", + "deps/pcre/pcre_xclass.c", + "deps/pcre/pcreposix.c", + }, + + .xdiff = .{ + "deps/xdiff/xdiffi.c", + "deps/xdiff/xemit.c", + "deps/xdiff/xhistogram.c", + "deps/xdiff/xmerge.c", + "deps/xdiff/xpatience.c", + "deps/xdiff/xprepare.c", + "deps/xdiff/xutils.c", + }, + + .ntlm = .{ + "deps/ntlmclient/ntlm.c", + "deps/ntlmclient/unicode_builtin.c", + "deps/ntlmclient/util.c", + }, + + .cli = .{ + "src/cli/cmd.c", + "src/cli/cmd_blame.c", + "src/cli/cmd_cat_file.c", + "src/cli/cmd_clone.c", + "src/cli/cmd_config.c", + "src/cli/cmd_hash_object.c", + "src/cli/cmd_help.c", + "src/cli/cmd_index_pack.c", + "src/cli/cmd_init.c", + "src/cli/common.c", + "src/cli/main.c", + "src/cli/opt.c", + "src/cli/opt_usage.c", + "src/cli/progress.c", + }, + + .example = .{ + "examples/add.c", + "examples/args.c", + "examples/blame.c", + "examples/cat-file.c", + "examples/checkout.c", + "examples/clone.c", + "examples/commit.c", + "examples/common.c", + "examples/config.c", + "examples/describe.c", + "examples/diff.c", + "examples/fetch.c", + "examples/for-each-ref.c", + "examples/general.c", + "examples/index-pack.c", + "examples/init.c", + "examples/lg2.c", + "examples/log.c", + "examples/ls-files.c", + "examples/ls-remote.c", + "examples/merge.c", + "examples/push.c", + "examples/remote.c", + "examples/rev-list.c", + "examples/rev-parse.c", + "examples/show-index.c", + "examples/stash.c", + "examples/status.c", + "examples/tag.c", + }, + + .clar = .{ + "clar.c", + "clar_libgit2.c", + "clar_libgit2_alloc.c", + "clar_libgit2_timer.c", + "clar_libgit2_trace.c", + "main.c", + }, + + .libgit2_test = .{ + "apply/apply_helpers.c", + "apply/both.c", + "apply/callbacks.c", + "apply/check.c", + "apply/fromdiff.c", + "apply/fromfile.c", + "apply/index.c", + "apply/partial.c", + "apply/tree.c", + "apply/workdir.c", + "attr/file.c", + "attr/flags.c", + "attr/lookup.c", + "attr/macro.c", + "attr/repo.c", + "blame/blame_helpers.c", + "blame/buffer.c", + "blame/getters.c", + "blame/harder.c", + "blame/simple.c", + "checkout/binaryunicode.c", + "checkout/checkout_helpers.c", + "checkout/conflict.c", + "checkout/crlf.c", + "checkout/head.c", + "checkout/icase.c", + "checkout/index.c", + "checkout/nasty.c", + "checkout/tree.c", + "checkout/typechange.c", + "cherrypick/bare.c", + "cherrypick/workdir.c", + "clone/empty.c", + "clone/local.c", + "clone/nonetwork.c", + "clone/transport.c", + "commit/commit.c", + "commit/create.c", + "commit/parent.c", + "commit/parse.c", + "commit/signature.c", + "commit/write.c", + "config/add.c", + "config/backend.c", + "config/conditionals.c", + "config/config_helpers.c", + "config/configlevel.c", + "config/find.c", + "config/global.c", + "config/include.c", + "config/memory.c", + "config/multivar.c", + "config/new.c", + "config/read.c", + "config/readonly.c", + "config/rename.c", + "config/snapshot.c", + "config/stress.c", + "config/validkeyname.c", + "config/write.c", + "core/buf.c", + "core/env.c", + "core/features.c", + "core/hashsig.c", + "core/oid.c", + "core/oidarray.c", + "core/opts.c", + "core/pool.c", + "core/structinit.c", + "core/useragent.c", + "core/version.c", + "date/date.c", + "date/rfc2822.c", + "delta/apply.c", + "describe/describe.c", + "describe/describe_helpers.c", + "describe/t6120.c", + "diff/binary.c", + "diff/blob.c", + "diff/diff_helpers.c", + "diff/diffiter.c", + "diff/drivers.c", + "diff/externalmodifications.c", + "diff/format_email.c", + "diff/header.c", + "diff/index.c", + "diff/notify.c", + "diff/parse.c", + "diff/patch.c", + "diff/patchid.c", + "diff/pathspec.c", + "diff/racediffiter.c", + "diff/rename.c", + "diff/stats.c", + "diff/submodules.c", + "diff/tree.c", + "diff/userdiff.c", + "diff/workdir.c", + "email/create.c", + "fetch/local.c", + "fetchhead/nonetwork.c", + "filter/bare.c", + "filter/blob.c", + "filter/crlf.c", + "filter/custom.c", + "filter/custom_helpers.c", + "filter/file.c", + "filter/ident.c", + "filter/query.c", + "filter/stream.c", + "filter/systemattrs.c", + "filter/wildcard.c", + "grafts/basic.c", + "grafts/parse.c", + "grafts/shallow.c", + "graph/ahead_behind.c", + "graph/commitgraph.c", + "graph/descendant_of.c", + "graph/reachable_from_any.c", + "ignore/path.c", + "ignore/status.c", + "index/add.c", + "index/addall.c", + "index/bypath.c", + "index/cache.c", + "index/collision.c", + "index/conflicts.c", + "index/crlf.c", + "index/filemodes.c", + "index/inmemory.c", + "index/names.c", + "index/nsec.c", + "index/racy.c", + "index/read_index.c", + "index/read_tree.c", + "index/rename.c", + "index/reuc.c", + "index/splitindex.c", + "index/stage.c", + "index/tests.c", + "index/tests256.c", + "index/version.c", + "iterator/index.c", + "iterator/iterator_helpers.c", + "iterator/tree.c", + "iterator/workdir.c", + "mailmap/basic.c", + "mailmap/blame.c", + "mailmap/parsing.c", + "merge/analysis.c", + "merge/annotated_commit.c", + "merge/driver.c", + "merge/files.c", + "merge/merge_helpers.c", + "merge/trees/automerge.c", + "merge/trees/commits.c", + "merge/trees/modeconflict.c", + "merge/trees/recursive.c", + "merge/trees/renames.c", + "merge/trees/treediff.c", + "merge/trees/trivial.c", + "merge/trees/whitespace.c", + "merge/workdir/dirty.c", + "merge/workdir/recursive.c", + "merge/workdir/renames.c", + "merge/workdir/setup.c", + "merge/workdir/simple.c", + "merge/workdir/submodules.c", + "merge/workdir/trivial.c", + "message/trailer.c", + "network/cred.c", + "network/fetchlocal.c", + "network/refspecs.c", + "network/remote/defaultbranch.c", + "network/remote/delete.c", + "network/remote/isvalidname.c", + "network/remote/local.c", + "network/remote/push.c", + "network/remote/remotes.c", + "network/remote/rename.c", + "network/remote/tag.c", + "notes/notes.c", + "notes/notesref.c", + "object/blob/filter.c", + "object/blob/fromstream.c", + "object/blob/write.c", + "object/cache.c", + "object/commit/commitstagedfile.c", + "object/commit/parse.c", + "object/lookup.c", + "object/lookup256.c", + "object/lookupbypath.c", + "object/message.c", + "object/peel.c", + "object/raw/chars.c", + "object/raw/compare.c", + "object/raw/convert.c", + "object/raw/fromstr.c", + "object/raw/hash.c", + "object/raw/short.c", + "object/raw/size.c", + "object/raw/type2string.c", + "object/raw/write.c", + "object/shortid.c", + "object/tag/list.c", + "object/tag/parse.c", + "object/tag/peel.c", + "object/tag/read.c", + "object/tag/write.c", + "object/tree/attributes.c", + "object/tree/duplicateentries.c", + "object/tree/frompath.c", + "object/tree/parse.c", + "object/tree/read.c", + "object/tree/update.c", + "object/tree/walk.c", + "object/tree/write.c", + "object/validate.c", + "odb/alternates.c", + "odb/backend/backend_helpers.c", + "odb/backend/loose.c", + "odb/backend/mempack.c", + "odb/backend/multiple.c", + "odb/backend/nobackend.c", + "odb/backend/nonrefreshing.c", + "odb/backend/refreshing.c", + "odb/backend/simple.c", + "odb/emptyobjects.c", + "odb/foreach.c", + "odb/freshen.c", + "odb/largefiles.c", + "odb/loose.c", + "odb/mixed.c", + "odb/open.c", + "odb/packed.c", + "odb/packed256.c", + "odb/packedone.c", + "odb/packedone256.c", + "odb/sorting.c", + "odb/streamwrite.c", + "online/badssl.c", + "online/clone.c", + "online/customcert.c", + "online/fetch.c", + "online/fetchhead.c", + "online/push.c", + "online/push_util.c", + "online/remotes.c", + "online/shallow.c", + "pack/filelimit.c", + "pack/indexer.c", + "pack/midx.c", + "pack/packbuilder.c", + "pack/sharing.c", + "pack/threadsafety.c", + "patch/parse.c", + "patch/print.c", + "path/validate.c", + "perf/helper__perf__do_merge.c", + "perf/helper__perf__timer.c", + "perf/merge.c", + "precompiled.c", + "rebase/abort.c", + "rebase/inmemory.c", + "rebase/iterator.c", + "rebase/merge.c", + "rebase/setup.c", + "rebase/sign.c", + "rebase/submodule.c", + "refs/basic.c", + "refs/branches/checkedout.c", + "refs/branches/create.c", + "refs/branches/delete.c", + "refs/branches/ishead.c", + "refs/branches/iterator.c", + "refs/branches/lookup.c", + "refs/branches/move.c", + "refs/branches/name.c", + "refs/branches/remote.c", + "refs/branches/upstream.c", + "refs/branches/upstreamname.c", + "refs/crashes.c", + "refs/create.c", + "refs/delete.c", + "refs/dup.c", + "refs/foreachglob.c", + "refs/isvalidname.c", + "refs/iterator.c", + "refs/list.c", + "refs/listall.c", + "refs/lookup.c", + "refs/namespaces.c", + "refs/normalize.c", + "refs/overwrite.c", + "refs/pack.c", + "refs/peel.c", + "refs/races.c", + "refs/read.c", + "refs/ref_helpers.c", + "refs/reflog/drop.c", + "refs/reflog/messages.c", + "refs/reflog/reflog.c", + "refs/reflog/reflog_helpers.c", + "refs/rename.c", + "refs/revparse.c", + "refs/setter.c", + "refs/shorthand.c", + "refs/tags/name.c", + "refs/transactions.c", + "refs/unicode.c", + "refs/update.c", + "remote/create.c", + "remote/fetch.c", + "remote/httpproxy.c", + "remote/insteadof.c", + "remote/list.c", + "repo/config.c", + "repo/discover.c", + "repo/env.c", + "repo/extensions.c", + "repo/getters.c", + "repo/hashfile.c", + "repo/head.c", + "repo/headtree.c", + "repo/init.c", + "repo/message.c", + "repo/new.c", + "repo/objectformat.c", + "repo/open.c", + "repo/pathspec.c", + "repo/repo_helpers.c", + "repo/reservedname.c", + "repo/setters.c", + "repo/shallow.c", + "repo/state.c", + "repo/template.c", + "reset/default.c", + "reset/hard.c", + "reset/mixed.c", + "reset/reset_helpers.c", + "reset/soft.c", + "revert/bare.c", + "revert/rename.c", + "revert/workdir.c", + "revwalk/basic.c", + "revwalk/hidecb.c", + "revwalk/mergebase.c", + "revwalk/signatureparsing.c", + "revwalk/simplify.c", + "stash/apply.c", + "stash/drop.c", + "stash/foreach.c", + "stash/save.c", + "stash/stash_helpers.c", + "stash/submodules.c", + "status/renames.c", + "status/single.c", + "status/status_helpers.c", + "status/submodules.c", + "status/worktree.c", + "status/worktree_init.c", + "stream/deprecated.c", + "stream/registration.c", + "stress/diff.c", + "submodule/add.c", + "submodule/escape.c", + "submodule/init.c", + "submodule/inject_option.c", + "submodule/lookup.c", + "submodule/modify.c", + "submodule/nosubs.c", + "submodule/open.c", + "submodule/repository_init.c", + "submodule/status.c", + "submodule/submodule_helpers.c", + "submodule/update.c", + "threads/atomic.c", + "threads/basic.c", + "threads/diff.c", + "threads/iterator.c", + "threads/refdb.c", + "threads/thread_helpers.c", + "threads/tlsdata.c", + "trace/trace.c", + "trace/windows/stacktrace.c", + "transport/register.c", + "transport/ssh_exec.c", + "transports/smart/packet.c", + "win32/forbidden.c", + "win32/longpath.c", + "win32/systemdir.c", + "worktree/bare.c", + "worktree/config.c", + "worktree/merge.c", + "worktree/open.c", + "worktree/reflog.c", + "worktree/refs.c", + "worktree/repository.c", + "worktree/submodule.c", + "worktree/worktree.c", + "worktree/worktree_helpers.c", + }, +} From b6e0ee9758bdfc69f390f9f328d3b5578b9ddbce Mon Sep 17 00:00:00 2001 From: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com> Date: Fri, 23 Oct 2026 20:48:41 -0400 Subject: [PATCH 3/6] remove redundant path prefixes Save some bytes by only writing the path prefix once or twice. --- build.zig | 53 +++-- build/sources.zon | 527 +++++++++++++++++++++++----------------------- 2 files changed, 294 insertions(+), 286 deletions(-) diff --git a/build.zig b/build.zig index a523acc..e81af8f 100644 --- a/build.zig +++ b/build.zig @@ -6,7 +6,6 @@ pub fn build(b: *std.Build) !void { const optimize = b.standardOptimizeOption(.{}); const libgit_src = b.dependency("libgit2", .{}); - const libgit_root = libgit_src.path("."); const mod = b.createModule(.{ .target = target, @@ -98,7 +97,7 @@ pub fn build(b: *std.Build) !void { mod.addWin32ResourceFile(.{ .file = libgit_src.path("src/libgit2/git2.rc") }); mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/util"), .files = &sources.util_win32, .flags = &flags, }); @@ -178,16 +177,16 @@ pub fn build(b: *std.Build) !void { }, }; ntlm.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("deps/ntlmclient"), .files = switch (tls_backend) { - .openssl => &.{"deps/ntlmclient/crypt_openssl.c"}, - .mbedtls => &.{ "deps/ntlmclient/crypt_mbedtls.c", "deps/ntlmclient/crypt_builtin_md4.c" }, - .securetransport => &.{"deps/ntlmclient/crypt_commoncrypto.c"}, + .openssl => &.{"crypt_openssl.c"}, + .mbedtls => &.{ "crypt_mbedtls.c", "crypt_builtin_md4.c" }, + .securetransport => &.{"crypt_commoncrypto.c"}, }, .flags = &ntlm_cflags, }); ntlm.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("deps/ntlmclient"), .files = &sources.ntlm, .flags = &(ntlm_cflags ++ .{"-Wno-deprecated"}), }); @@ -202,16 +201,16 @@ pub fn build(b: *std.Build) !void { } mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/util"), .files = &sources.util_unix, .flags = &flags, }); mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/util"), .files = switch (tls_backend) { - .openssl => &.{"src/util/hash/openssl.c"}, - .mbedtls => &.{"src/util/hash/mbedtls.c"}, - .securetransport => &.{"src/util/hash/common_crypto.c"}, + .openssl => &.{"hash/openssl.c"}, + .mbedtls => &.{"hash/mbedtls.c"}, + .securetransport => &.{"hash/common_crypto.c"}, }, .flags = &flags, }); @@ -219,7 +218,7 @@ pub fn build(b: *std.Build) !void { // SHA1 collisiondetect mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/util"), .files = &sources.util_sha1dc, .flags = &(flags ++ .{ "-DSHA1DC_NO_STANDARD_INCLUDES", @@ -270,7 +269,7 @@ pub fn build(b: *std.Build) !void { }); llhttp.addIncludePath(libgit_src.path("deps/llhttp")); llhttp.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("deps/llhttp"), .files = &sources.llhttp, .flags = &.{ "-Wno-unused-parameter", "-Wno-missing-declarations" }, }); @@ -306,7 +305,7 @@ pub fn build(b: *std.Build) !void { )); pcre.addIncludePath(libgit_src.path("deps/pcre")); pcre.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("deps/pcre"), .files = &sources.pcre, .flags = &.{ "-Wno-unused-function", @@ -338,7 +337,7 @@ pub fn build(b: *std.Build) !void { // Bundled xdiff dependency relies on libgit2 headers & utils, so we // just add the source files directly instead of making a static lib step. mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("deps/xdiff"), .files = &sources.xdiff, .flags = &.{ "-Wno-sign-compare", "-Wno-unused-parameter" }, }); @@ -358,12 +357,12 @@ pub fn build(b: *std.Build) !void { mod.addIncludePath(libgit_src.path("include")); mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/libgit2"), .files = &sources.libgit2, .flags = &flags, }); mod.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/util"), .files = &sources.util, .flags = &flags, }); @@ -397,17 +396,17 @@ pub fn build(b: *std.Build) !void { cli.linkLibrary(lib); cli.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/cli"), .files = &sources.cli, // @Todo: see above // .flags = &.{"-std=c90"}, }); cli.addCSourceFiles(.{ - .root = libgit_root, + .root = libgit_src.path("src/cli"), .files = if (target.result.os.tag == .windows) - &.{"src/cli/win32/sighandler.c"} + &.{"win32/sighandler.c"} else - &.{"src/cli/unix/sighandler.c"}, + &.{"unix/sighandler.c"}, }); // independent install step so you can easily access the binary @@ -437,8 +436,8 @@ pub fn build(b: *std.Build) !void { lg2.addIncludePath(libgit_src.path("examples")); lg2.addCSourceFiles(.{ - .root = libgit_root, - .files = &sources.example, + .root = libgit_src.path("examples"), + .files = &sources.examples, .flags = &.{ // "-std=c90", "-DGIT_DEPRECATE_HARD", @@ -502,7 +501,7 @@ pub fn build(b: *std.Build) !void { "-DGIT_DEPRECATE_HARD", }; runner.addCSourceFiles(.{ - .root = libgit_src.path("tests/libgit2/"), + .root = libgit_src.path("tests/libgit2"), .files = &sources.libgit2_test, .flags = runner_flags, }); @@ -513,7 +512,7 @@ pub fn build(b: *std.Build) !void { }); const resources_dir = switch (@import("builtin").os.tag) { - .windows => libgit_src.path("tests/resources/"), + .windows => libgit_src.path("tests/resources"), else => dir: { // Fix the test fixture file permissions. This is necessary because Zig does // not respect the execute permission on arbitrary files it extracts from dependencies. @@ -521,7 +520,7 @@ pub fn build(b: *std.Build) !void { // run successfully, we need to patch them before we bake them into the // test executable. const resources_dir = b.addWriteFiles().addCopyDirectory( - libgit_root.path(b, "tests/resources/"), + libgit_src.path("tests/resources/"), "test_resources", .{}, ); diff --git a/build/sources.zon b/build/sources.zon index a7780df..5c728a2 100644 --- a/build/sources.zon +++ b/build/sources.zon @@ -1,293 +1,301 @@ .{ + // src/libgit2 .libgit2 = .{ - "src/libgit2/annotated_commit.c", - "src/libgit2/apply.c", - "src/libgit2/attr.c", - "src/libgit2/attr_file.c", - "src/libgit2/attrcache.c", - "src/libgit2/blame.c", - "src/libgit2/blame_git.c", - "src/libgit2/blob.c", - "src/libgit2/branch.c", - "src/libgit2/buf.c", - "src/libgit2/cache.c", - "src/libgit2/checkout.c", - "src/libgit2/cherrypick.c", - "src/libgit2/clone.c", - "src/libgit2/commit.c", - "src/libgit2/commit_graph.c", - "src/libgit2/commit_list.c", - "src/libgit2/config.c", - "src/libgit2/config_cache.c", - "src/libgit2/config_file.c", - "src/libgit2/config_list.c", - "src/libgit2/config_mem.c", - "src/libgit2/config_parse.c", - "src/libgit2/config_snapshot.c", - "src/libgit2/crlf.c", - "src/libgit2/delta.c", - "src/libgit2/describe.c", - "src/libgit2/diff.c", - "src/libgit2/diff_driver.c", - "src/libgit2/diff_file.c", - "src/libgit2/diff_generate.c", - "src/libgit2/diff_parse.c", - "src/libgit2/diff_print.c", - "src/libgit2/diff_stats.c", - "src/libgit2/diff_tform.c", - "src/libgit2/diff_xdiff.c", - "src/libgit2/email.c", - "src/libgit2/fetch.c", - "src/libgit2/fetchhead.c", - "src/libgit2/filter.c", - "src/libgit2/grafts.c", - "src/libgit2/graph.c", - "src/libgit2/hashsig.c", - "src/libgit2/ident.c", - "src/libgit2/ignore.c", - "src/libgit2/index.c", - "src/libgit2/index_map.c", - "src/libgit2/indexer.c", - "src/libgit2/iterator.c", - "src/libgit2/libgit2.c", - "src/libgit2/mailmap.c", - "src/libgit2/merge.c", - "src/libgit2/merge_driver.c", - "src/libgit2/merge_file.c", - "src/libgit2/message.c", - "src/libgit2/midx.c", - "src/libgit2/mwindow.c", - "src/libgit2/notes.c", - "src/libgit2/object.c", - "src/libgit2/object_api.c", - "src/libgit2/odb.c", - "src/libgit2/odb_loose.c", - "src/libgit2/odb_mempack.c", - "src/libgit2/odb_pack.c", - "src/libgit2/oid.c", - "src/libgit2/oidarray.c", - "src/libgit2/pack-objects.c", - "src/libgit2/pack.c", - "src/libgit2/parse.c", - "src/libgit2/patch.c", - "src/libgit2/patch_generate.c", - "src/libgit2/patch_parse.c", - "src/libgit2/path.c", - "src/libgit2/pathspec.c", - "src/libgit2/proxy.c", - "src/libgit2/push.c", - "src/libgit2/reader.c", - "src/libgit2/rebase.c", - "src/libgit2/refdb.c", - "src/libgit2/refdb_fs.c", - "src/libgit2/reflog.c", - "src/libgit2/refs.c", - "src/libgit2/refspec.c", - "src/libgit2/remote.c", - "src/libgit2/repository.c", - "src/libgit2/reset.c", - "src/libgit2/revert.c", - "src/libgit2/revparse.c", - "src/libgit2/revwalk.c", - "src/libgit2/settings.c", - "src/libgit2/signature.c", - "src/libgit2/stash.c", - "src/libgit2/status.c", - "src/libgit2/strarray.c", - "src/libgit2/streams/mbedtls.c", - "src/libgit2/streams/openssl.c", - "src/libgit2/streams/openssl_dynamic.c", - "src/libgit2/streams/openssl_legacy.c", - "src/libgit2/streams/registry.c", - "src/libgit2/streams/schannel.c", - "src/libgit2/streams/socket.c", - "src/libgit2/streams/stransport.c", - "src/libgit2/streams/tls.c", - "src/libgit2/submodule.c", - "src/libgit2/sysdir.c", - "src/libgit2/tag.c", - "src/libgit2/trace.c", - "src/libgit2/trailer.c", - "src/libgit2/transaction.c", - "src/libgit2/transport.c", - "src/libgit2/transports/auth.c", - "src/libgit2/transports/auth_gssapi.c", - "src/libgit2/transports/auth_ntlmclient.c", - "src/libgit2/transports/auth_sspi.c", - "src/libgit2/transports/credential.c", - "src/libgit2/transports/credential_helpers.c", - "src/libgit2/transports/git.c", - "src/libgit2/transports/http.c", - "src/libgit2/transports/httpclient.c", - "src/libgit2/transports/httpparser.c", - "src/libgit2/transports/local.c", - "src/libgit2/transports/smart.c", - "src/libgit2/transports/smart_pkt.c", - "src/libgit2/transports/smart_protocol.c", - "src/libgit2/transports/ssh.c", - "src/libgit2/transports/ssh_exec.c", - "src/libgit2/transports/ssh_libssh2.c", - "src/libgit2/transports/winhttp.c", - "src/libgit2/tree-cache.c", - "src/libgit2/tree.c", - "src/libgit2/worktree.c", + "annotated_commit.c", + "apply.c", + "attr.c", + "attr_file.c", + "attrcache.c", + "blame.c", + "blame_git.c", + "blob.c", + "branch.c", + "buf.c", + "cache.c", + "checkout.c", + "cherrypick.c", + "clone.c", + "commit.c", + "commit_graph.c", + "commit_list.c", + "config.c", + "config_cache.c", + "config_file.c", + "config_list.c", + "config_mem.c", + "config_parse.c", + "config_snapshot.c", + "crlf.c", + "delta.c", + "describe.c", + "diff.c", + "diff_driver.c", + "diff_file.c", + "diff_generate.c", + "diff_parse.c", + "diff_print.c", + "diff_stats.c", + "diff_tform.c", + "diff_xdiff.c", + "email.c", + "fetch.c", + "fetchhead.c", + "filter.c", + "grafts.c", + "graph.c", + "hashsig.c", + "ident.c", + "ignore.c", + "index.c", + "index_map.c", + "indexer.c", + "iterator.c", + "libgit2.c", + "mailmap.c", + "merge.c", + "merge_driver.c", + "merge_file.c", + "message.c", + "midx.c", + "mwindow.c", + "notes.c", + "object.c", + "object_api.c", + "odb.c", + "odb_loose.c", + "odb_mempack.c", + "odb_pack.c", + "oid.c", + "oidarray.c", + "pack-objects.c", + "pack.c", + "parse.c", + "patch.c", + "patch_generate.c", + "patch_parse.c", + "path.c", + "pathspec.c", + "proxy.c", + "push.c", + "reader.c", + "rebase.c", + "refdb.c", + "refdb_fs.c", + "reflog.c", + "refs.c", + "refspec.c", + "remote.c", + "repository.c", + "reset.c", + "revert.c", + "revparse.c", + "revwalk.c", + "settings.c", + "signature.c", + "stash.c", + "status.c", + "strarray.c", + "streams/mbedtls.c", + "streams/openssl.c", + "streams/openssl_dynamic.c", + "streams/openssl_legacy.c", + "streams/registry.c", + "streams/schannel.c", + "streams/socket.c", + "streams/stransport.c", + "streams/tls.c", + "submodule.c", + "sysdir.c", + "tag.c", + "trace.c", + "trailer.c", + "transaction.c", + "transport.c", + "transports/auth.c", + "transports/auth_gssapi.c", + "transports/auth_ntlmclient.c", + "transports/auth_sspi.c", + "transports/credential.c", + "transports/credential_helpers.c", + "transports/git.c", + "transports/http.c", + "transports/httpclient.c", + "transports/httpparser.c", + "transports/local.c", + "transports/smart.c", + "transports/smart_pkt.c", + "transports/smart_protocol.c", + "transports/ssh.c", + "transports/ssh_exec.c", + "transports/ssh_libssh2.c", + "transports/winhttp.c", + "tree-cache.c", + "tree.c", + "worktree.c", }, + // src/util .util = .{ - "src/util/alloc.c", - "src/util/allocators/debugalloc.c", - "src/util/allocators/failalloc.c", - "src/util/allocators/stdalloc.c", - "src/util/allocators/win32_leakcheck.c", - "src/util/date.c", - "src/util/errors.c", - "src/util/filebuf.c", - "src/util/fs_path.c", - "src/util/futils.c", - "src/util/hash.c", - "src/util/net.c", - "src/util/pool.c", - "src/util/posix.c", - "src/util/pqueue.c", - "src/util/rand.c", - "src/util/regexp.c", - "src/util/runtime.c", - "src/util/sortedcache.c", - "src/util/str.c", - "src/util/strlist.c", - "src/util/thread.c", - "src/util/tsort.c", - "src/util/utf8.c", - "src/util/util.c", - "src/util/varint.c", - "src/util/vector.c", - "src/util/wildmatch.c", - "src/util/zstream.c", + "alloc.c", + "allocators/debugalloc.c", + "allocators/failalloc.c", + "allocators/stdalloc.c", + "allocators/win32_leakcheck.c", + "date.c", + "errors.c", + "filebuf.c", + "fs_path.c", + "futils.c", + "hash.c", + "net.c", + "pool.c", + "posix.c", + "pqueue.c", + "rand.c", + "regexp.c", + "runtime.c", + "sortedcache.c", + "str.c", + "strlist.c", + "thread.c", + "tsort.c", + "utf8.c", + "util.c", + "varint.c", + "vector.c", + "wildmatch.c", + "zstream.c", }, .util_unix = .{ - "src/util/unix/map.c", - "src/util/unix/process.c", - "src/util/unix/realpath.c", + "unix/map.c", + "unix/process.c", + "unix/realpath.c", }, .util_win32 = .{ - "src/util/win32/dir.c", - "src/util/win32/error.c", - "src/util/win32/map.c", - "src/util/win32/path_w32.c", - "src/util/win32/posix_w32.c", - "src/util/win32/precompiled.c", - "src/util/win32/process.c", - "src/util/win32/thread.c", - "src/util/win32/utf-conv.c", - "src/util/win32/w32_buffer.c", - "src/util/win32/w32_leakcheck.c", - "src/util/win32/w32_util.c", + "win32/dir.c", + "win32/error.c", + "win32/map.c", + "win32/path_w32.c", + "win32/posix_w32.c", + "win32/precompiled.c", + "win32/process.c", + "win32/thread.c", + "win32/utf-conv.c", + "win32/w32_buffer.c", + "win32/w32_leakcheck.c", + "win32/w32_util.c", - "src/util/hash/win32.c", + "hash/win32.c", }, .util_sha1dc = .{ - "src/util/hash/collisiondetect.c", - "src/util/hash/sha1dc/sha1.c", - "src/util/hash/sha1dc/ubc_check.c", + "hash/collisiondetect.c", + "hash/sha1dc/sha1.c", + "hash/sha1dc/ubc_check.c", }, + // deps/llhttp .llhttp = .{ - "deps/llhttp/api.c", - "deps/llhttp/http.c", - "deps/llhttp/llhttp.c", + "api.c", + "http.c", + "llhttp.c", }, + // deps/pcre .pcre = .{ - "deps/pcre/pcre_byte_order.c", - "deps/pcre/pcre_chartables.c", - "deps/pcre/pcre_compile.c", - "deps/pcre/pcre_config.c", - "deps/pcre/pcre_dfa_exec.c", - "deps/pcre/pcre_exec.c", - "deps/pcre/pcre_fullinfo.c", - "deps/pcre/pcre_get.c", - "deps/pcre/pcre_globals.c", - "deps/pcre/pcre_jit_compile.c", - "deps/pcre/pcre_maketables.c", - "deps/pcre/pcre_newline.c", - "deps/pcre/pcre_ord2utf8.c", - "deps/pcre/pcre_printint.c", - "deps/pcre/pcre_refcount.c", - "deps/pcre/pcre_string_utils.c", - "deps/pcre/pcre_study.c", - "deps/pcre/pcre_tables.c", - "deps/pcre/pcre_ucd.c", - "deps/pcre/pcre_valid_utf8.c", - "deps/pcre/pcre_version.c", - "deps/pcre/pcre_xclass.c", - "deps/pcre/pcreposix.c", + "pcre_byte_order.c", + "pcre_chartables.c", + "pcre_compile.c", + "pcre_config.c", + "pcre_dfa_exec.c", + "pcre_exec.c", + "pcre_fullinfo.c", + "pcre_get.c", + "pcre_globals.c", + "pcre_jit_compile.c", + "pcre_maketables.c", + "pcre_newline.c", + "pcre_ord2utf8.c", + "pcre_printint.c", + "pcre_refcount.c", + "pcre_string_utils.c", + "pcre_study.c", + "pcre_tables.c", + "pcre_ucd.c", + "pcre_valid_utf8.c", + "pcre_version.c", + "pcre_xclass.c", + "pcreposix.c", }, .xdiff = .{ - "deps/xdiff/xdiffi.c", - "deps/xdiff/xemit.c", - "deps/xdiff/xhistogram.c", - "deps/xdiff/xmerge.c", - "deps/xdiff/xpatience.c", - "deps/xdiff/xprepare.c", - "deps/xdiff/xutils.c", + "xdiffi.c", + "xemit.c", + "xhistogram.c", + "xmerge.c", + "xpatience.c", + "xprepare.c", + "xutils.c", }, + // deps/ntlmclient .ntlm = .{ - "deps/ntlmclient/ntlm.c", - "deps/ntlmclient/unicode_builtin.c", - "deps/ntlmclient/util.c", + "ntlm.c", + "unicode_builtin.c", + "util.c", }, + // src/cli .cli = .{ - "src/cli/cmd.c", - "src/cli/cmd_blame.c", - "src/cli/cmd_cat_file.c", - "src/cli/cmd_clone.c", - "src/cli/cmd_config.c", - "src/cli/cmd_hash_object.c", - "src/cli/cmd_help.c", - "src/cli/cmd_index_pack.c", - "src/cli/cmd_init.c", - "src/cli/common.c", - "src/cli/main.c", - "src/cli/opt.c", - "src/cli/opt_usage.c", - "src/cli/progress.c", + "cmd.c", + "cmd_blame.c", + "cmd_cat_file.c", + "cmd_clone.c", + "cmd_config.c", + "cmd_hash_object.c", + "cmd_help.c", + "cmd_index_pack.c", + "cmd_init.c", + "common.c", + "main.c", + "opt.c", + "opt_usage.c", + "progress.c", }, - .example = .{ - "examples/add.c", - "examples/args.c", - "examples/blame.c", - "examples/cat-file.c", - "examples/checkout.c", - "examples/clone.c", - "examples/commit.c", - "examples/common.c", - "examples/config.c", - "examples/describe.c", - "examples/diff.c", - "examples/fetch.c", - "examples/for-each-ref.c", - "examples/general.c", - "examples/index-pack.c", - "examples/init.c", - "examples/lg2.c", - "examples/log.c", - "examples/ls-files.c", - "examples/ls-remote.c", - "examples/merge.c", - "examples/push.c", - "examples/remote.c", - "examples/rev-list.c", - "examples/rev-parse.c", - "examples/show-index.c", - "examples/stash.c", - "examples/status.c", - "examples/tag.c", + // examples + .examples = .{ + "add.c", + "args.c", + "blame.c", + "cat-file.c", + "checkout.c", + "clone.c", + "commit.c", + "common.c", + "config.c", + "describe.c", + "diff.c", + "fetch.c", + "for-each-ref.c", + "general.c", + "index-pack.c", + "init.c", + "lg2.c", + "log.c", + "ls-files.c", + "ls-remote.c", + "merge.c", + "push.c", + "remote.c", + "rev-list.c", + "rev-parse.c", + "show-index.c", + "stash.c", + "status.c", + "tag.c", }, + // tests/clar .clar = .{ "clar.c", "clar_libgit2.c", @@ -297,6 +305,7 @@ "main.c", }, + // tests/libgit2 .libgit2_test = .{ "apply/apply_helpers.c", "apply/both.c", From 92da7d75e22bbdf3b4ec9292d1a1f151e49f34d4 Mon Sep 17 00:00:00 2001 From: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com> Date: Sat, 24 Oct 2026 05:28:04 -0400 Subject: [PATCH 4/6] fix test compile errors on windows The macro configuration for file stats in `tests/clar/clar.c` is bugged when targeting mingw-w64, and ends up mismatching the functions and types. See the upstream patch for more info: https://github.com/clar-test/clar/commit/02104ca0f81ef4105cf0c4a558ad7d24c8fe97c4 `build/clar_fix.zig` has been refactored to apply this patch when building tests on a windows machine. This fix should be removed after updating our upstream to a version including the patch. --- build.zig | 5 ++ build/clar_fix.zig | 162 ++++++++++++++++++++++++++++++--------------- 2 files changed, 113 insertions(+), 54 deletions(-) diff --git a/build.zig b/build.zig index e81af8f..55c674d 100644 --- a/build.zig +++ b/build.zig @@ -546,6 +546,10 @@ pub fn build(b: *std.Build) !void { // This path isn't known at configure-time, so we have to create a dedicated build step. // This step replaces *reads* of the `CLAR_FIXTURE_PATH` macro in a local-cache copy of the source code // (see clar_src). Thankfully the macro is only read by `tests/clar/clar/fixture.h` once. + // + // Additionally fixes a bug in tests/clar/clar.c where the stat type macros can be + // mismatched when targeting windows (specifically mingw-w64), causing compile errors on zig 0.17.0. + // @Todo remove this patch when updating upstream to 1.9.1 or later const clar_fix = b.addExecutable(.{ .name = "clar_fix", .root_module = b.createModule(.{ @@ -555,6 +559,7 @@ pub fn build(b: *std.Build) !void { }); const run_fix = b.addRunArtifact(clar_fix); + run_fix.addFileArg(clar_src.path(b, "clar.c")); run_fix.addFileArg(clar_src.path(b, "clar/fixtures.h")); run_fix.addDirectoryArg(resources_dir); runner_exe.step.dependOn(&run_fix.step); diff --git a/build/clar_fix.zig b/build/clar_fix.zig index bc29c93..618d56a 100644 --- a/build/clar_fix.zig +++ b/build/clar_fix.zig @@ -1,69 +1,123 @@ -//! Usage: clar_fix -//! Replaces *reads* of the CLAR_FIXTURE_PATH macro definition in `src-file` with -//! the absolute path of `fixtures-dir`. `#ifdef`s are not affected. +//! Usage: clar_fix +//! Replaces *reads* of the `CLAR_FIXTURE_PATH` macro definition in `clar/fixture.h` with +//! the absolute path of ``. `#ifdef`s are not affected. +//! Also applies a patch to `clar.c` fixing a bad `stat` definition on Windows. const std = @import("std"); -const fixture_var_name = "CLAR_FIXTURE_PATH"; - pub fn main(init: std.process.Init) !void { const io = init.io; const arena = init.arena.allocator(); var args = try init.minimal.args.iterateAllocator(arena); - _ = args.skip(); + std.debug.assert(args.skip()); + + const clar_c_path = args.next() orelse fatal("expected path to `clar.c` file", .{}); + const fixture_h_path = args.next() orelse fatal("expected path to `clar/fixture.h` file", .{}); + const fixture_dir_path = args.next() orelse fatal("expected path to test resources directory", .{}); + + fix_fixture_path: { + const fixture_var_name = "CLAR_FIXTURE_PATH"; + + const clean_fixture_path: []const u8 = blk: { + const rec_dir = try std.Io.Dir.cwd().openDir(io, fixture_dir_path, .{}); + defer rec_dir.close(io); + + var cleaned_path: std.ArrayList(u8) = try .initCapacity(arena, std.fs.max_path_bytes + 2); + cleaned_path.appendAssumeCapacity('"'); // add string quotes + const abs_path_len = try rec_dir.realPath(io, cleaned_path.unusedCapacitySlice()); + cleaned_path.items.len += abs_path_len; + cleaned_path.appendAssumeCapacity('"'); + + // clar expects the fixture path to only have posix seperators or else some tests will break + for (cleaned_path.items) |*c| { + if (c.* == '\\') c.* = '/'; + } + break :blk cleaned_path.items; + }; + + const file = try std.Io.Dir.cwd().openFile(io, fixture_h_path, .{ .mode = .read_write }); + defer file.close(io); + + const to_add = clean_fixture_path.len -| fixture_var_name.len; + var src = try readIntoArraylist(io, arena, file, to_add); + + const i = std.mem.indexOf( + u8, + src.items, + "return fixture_path(CLAR_FIXTURE_PATH, fixture_name);", + ) orelse break :fix_fixture_path; // @Todo disambiguate whether patch was already applied or doesn't apply + + const start = i + "return fixture_path(".len; + src.replaceRangeAssumeCapacity(start, fixture_var_name.len, clean_fixture_path); + + var writer = file.writer(io, &.{}); + try writer.seekTo(0); + try writer.interface.writeAll(src.items); + try writer.end(); + } + + // Patch bad stat declaration in clar.c + // (See https://github.com/clar-test/clar/commit/02104ca0f81ef4105cf0c4a558ad7d24c8fe97c4) + patch_stat: { + // This fix only applies to windows builds. + if (@import("builtin").target.os.tag != .windows) break :patch_stat; + + const file = try std.Io.Dir.cwd().openFile(io, clar_c_path, .{ .mode = .read_write }); + defer file.close(io); + var src = try readIntoArraylist(io, arena, file, 0); + + const to_remove = + "#\tif defined(_MSC_VER) || defined(__MINGW32__)\n" ++ + "\ttypedef struct stat STAT_T;\n" ++ + "#\telse\n" ++ + "\ttypedef struct _stat STAT_T;\n" ++ + "#\tendif\n"; + + const to_add = + "\t\ttypedef struct _stat STAT_T;\n" ++ + "#\telse\n" ++ + "\t\ttypedef struct stat STAT_T;\n"; + + comptime std.debug.assert(to_remove.len >= to_add.len); + + { + const i = std.mem.indexOf(u8, src.items, to_remove) orelse break :patch_stat; // @Todo disambiguate whether patch was already applied or doesn't apply + src.replaceRangeAssumeCapacity(i, to_remove.len, ""); + } + { + const match = + "#\tifndef stat\n" ++ + "#\t\tdefine stat(path, st) _stat(path, st)\n" ++ + "#\tendif\n"; + const i = std.mem.indexOf(u8, src.items, match) orelse break :patch_stat; // @Todo disambiguate whether patch was already applied or doesn't apply - const clar_fixture_h = args.next() orelse fatal("expected path to 'clar/fixtures.h' file", .{}); - const fixture_path: []const u8 = blk: { - const path_arg = args.next() orelse fatal("expected path to test resources directory", .{}); + const start = i + ("#\tifndef stat\n" ++ + "#\t\tdefine stat(path, st) _stat(path, st)\n").len; - var cleaned_path: std.ArrayList(u8) = try .initCapacity(arena, std.fs.max_path_bytes + 2); - cleaned_path.appendAssumeCapacity('"'); // add string quotes - const rec_dir = try std.Io.Dir.cwd().openDir(io, path_arg, .{}); - defer rec_dir.close(io); + src.insertSliceAssumeCapacity(start, to_add); + } - const abs_path_len = try rec_dir.realPath(io, cleaned_path.unusedCapacitySlice()); - cleaned_path.items.len += abs_path_len; - cleaned_path.appendAssumeCapacity('"'); + var writer = file.writer(io, &.{}); + try writer.seekTo(0); + try writer.interface.writeAll(src.items); + try writer.end(); + } +} - // clar expects the fixture path to only have posix seperators or else some tests will break - for (cleaned_path.items) |*c| { - if (c.* == '\\') c.* = '/'; - } - break :blk cleaned_path.items; - }; - - const file = try std.Io.Dir.cwd().openFile( - io, - clar_fixture_h, - .{ .mode = .read_write }, - ); - defer file.close(io); - - var buf: [1024]u8 = undefined; - var src: std.ArrayList(u8) = src: { - var file_reader = file.reader(io, &buf); - - const file_size = try file_reader.getSize(); - const to_add = fixture_path.len -| fixture_var_name.len; - var src: std.Io.Writer.Allocating = try .initCapacity(arena, file_size + to_add); - - _ = try file_reader.interface.streamRemaining(&src.writer); - break :src src.toArrayList(); - }; - - const i = std.mem.indexOf( - u8, - src.items, - "return fixture_path(CLAR_FIXTURE_PATH, fixture_name);", - ) orelse return; - - const start = i + "return fixture_path(".len; - src.replaceRangeAssumeCapacity(start, fixture_var_name.len, fixture_path); - - var writer = file.writer(io, &buf); // buf is safe to reuse since file_reader is out of scope - try writer.interface.writeAll(src.items); - try writer.end(); +fn readIntoArraylist( + io: std.Io, + gpa: std.mem.Allocator, + file: std.Io.File, + additional_capacity: usize, +) !std.ArrayList(u8) { + var file_reader = file.reader(io, &.{}); + const file_size: usize = @intCast(try file_reader.getSize()); + var buf: std.Io.Writer.Allocating = try .initCapacity(gpa, file_size + additional_capacity); + errdefer buf.deinit(); + + _ = try file_reader.interface.streamRemaining(&buf.writer); + return buf.toArrayList(); } fn fatal(comptime fmt: []const u8, args: anytype) noreturn { From 13bbcfb45c67c67bda52062cb0e68bec6dfc30c8 Mon Sep 17 00:00:00 2001 From: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com> Date: Sun, 25 Oct 2026 05:53:30 -0400 Subject: [PATCH 5/6] report test progress and errors Test progress is reported through the build system via `std.Progress`. We can only report progress at the suite level since clar's TAP output only reports individual tests after they've been ran. clar also doesn't report how many tests are expected to run, so we can't provide an estimate either. We could get this info by parsing the runner's --list output and applying test filters manually, but that's more effort than it's worth. Failures are printed to stderr on suite completion. --- build.zig | 1 + build.zig.zon | 2 +- build/clar_parser.zig | 109 +++++++++++++++++++++++++++--------------- 3 files changed, 72 insertions(+), 40 deletions(-) diff --git a/build.zig b/build.zig index 55c674d..2041fb7 100644 --- a/build.zig +++ b/build.zig @@ -598,6 +598,7 @@ pub fn build(b: *std.Build) !void { const clar = self.b.addRunArtifact(self.clar_parser); self.top_level_step.dependOn(&clar.step); clar.setName(self.b.fmt("test-{s}", .{name})); + clar.addArg(name); clar.addArtifactArg(self.runner); return clar; } diff --git a/build.zig.zon b/build.zig.zon index 46bb675..738dab3 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -31,8 +31,8 @@ }, }, .paths = .{ + "build/", "build.zig", - "build", "build.zig.zon", "README.md", "LICENSE", diff --git a/build/clar_parser.zig b/build/clar_parser.zig index 0842309..3038844 100644 --- a/build/clar_parser.zig +++ b/build/clar_parser.zig @@ -1,6 +1,5 @@ //! Runs a Clar test and lightly parses it's [TAP](https://testanything.org/) stream, //! reporting progress/errors to the build system. -// @Todo report progress/errors to the build system const std = @import("std"); const mem = std.mem; @@ -11,15 +10,18 @@ pub fn main(init: std.process.Init) !u8 { const arena = init.arena.allocator(); const args = (try init.minimal.args.toSlice(arena))[1..]; - if (args.len < 1) { - std.log.err("expected at least one argument", .{}); + if (args.len < 2) { + std.log.err("expected at least 2 arguments, got: {d}", .{args.len}); return error.InvalidArgs; } + const parent_progress_node = std.Progress.start(io, .{ .root_name = args[0] }); + defer parent_progress_node.end(); + var argv_list: std.ArrayList([]const u8) = try .initCapacity(arena, args.len + 1); - argv_list.appendAssumeCapacity(args[0]); // test runner executable + argv_list.appendAssumeCapacity(args[1]); // test runner executable argv_list.appendAssumeCapacity("-t"); // force TAP output - argv_list.appendSliceAssumeCapacity(args[1..]); // test runner args + argv_list.appendSliceAssumeCapacity(args[2..]); // test runner args var runner = try std.process.spawn(io, .{ .argv = argv_list.items, @@ -33,28 +35,39 @@ pub fn main(init: std.process.Init) !u8 { const r = &file_reader.interface; var parser: TapParser = .default; - var errors: std.ArrayList([]const u8) = .empty; + var errors: std.ArrayList(TapParser.Result.Failure) = .empty; + // not all tests belong to a suite, so start_suite isn't guaranteed to + // occur before tests start running. var suite: ?[]const u8 = null; + var node: ?std.Progress.Node = null; + defer if (node) |n| n.end(); + + // @Todo track number of tests passed/failed/skipped? var error_found: bool = false; while (r.takeDelimiter('\n')) |line| { switch (try parser.parseLine(arena, line orelse break)) { .start_suite => |s| { - // @Todo integrate with build progress nodes instead + if (node) |n| n.end(); + node = parent_progress_node.start(s, 0); + + try report_errors(io, errors.items, suite); + errors.clearRetainingCapacity(); if (suite) |last_suite| { - if (try check_errors(io, errors.items, last_suite)) { - error_found = true; - } + // in the common case there are many suite names and few errors, + // so suite will likely be the most recent allocation. arena.free(last_suite); - errors.clearRetainingCapacity(); } suite = s; }, - .ok => {}, + .ok => { + if (node) |n| n.completeOne(); + }, .failure => |fail| { - try errors.append(arena, fail.description.items); - try errors.appendSlice(arena, fail.reasons.items); - try errors.append(arena, "\n"); + error_found = true; + std.Progress.setStatus(.failure_working); + if (node) |n| n.completeOne(); + try errors.append(arena, fail); parser.reset(); }, .feed_line => {}, @@ -65,28 +78,41 @@ pub fn main(init: std.process.Init) !u8 { } _ = try runner.wait(io); // @Todo report term? - if (try check_errors(io, errors.items, suite)) { - error_found = true; - } - + try report_errors(io, errors.items, suite); return @intFromBool(error_found); } -pub fn check_errors(io: std.Io, errors: []const []const u8, suite: ?[]const u8) !bool { - if (errors.len > 0) { - const stderr = std.Io.File.stderr(); - var stderr_buf: [1024]u8 = undefined; - var stderr_writer = stderr.writerStreaming(io, &stderr_buf); - - try stderr_writer.interface.print("errors in suite: {?s}\n", .{suite}); - for (errors) |err| { - try stderr_writer.interface.writeAll(err); - try stderr_writer.interface.writeByte('\n'); +fn report_errors( + io: std.Io, + failures: []const TapParser.Result.Failure, + suite: ?[]const u8, +) !void { + if (failures.len > 0) { + var stderr_buf: [256]u8 = undefined; + const term = (try io.lockStderr(&stderr_buf, null)).terminal(); + defer io.unlockStderr(); // flushes stderr + + try term.setColor(.red); + try term.writer.writeAll("errors"); + try term.setColor(.reset); + try term.writer.print(" in suite: {?s}\n\n", .{suite}); + for (failures) |fail| { + try term.setColor(.red); + try term.writer.writeAll("test failure: "); + try term.setColor(.reset); + try term.writer.writeAll(fail.description.test_name); + try term.writer.writeAll(": "); + try term.setColor(.dim); + try term.writer.writeAll(fail.description.file_path_and_line.items); + try term.setColor(.reset); + try term.writer.writeByte('\n'); + for (fail.reasons.items) |reason| { + try term.writer.writeAll(reason); + try term.writer.writeByte('\n'); + } + try term.writer.writeByte('\n'); } - try stderr_writer.flush(); - return true; } - return false; } const TapParser = struct { @@ -100,7 +126,10 @@ const TapParser = struct { feed_line, const Failure = struct { - description: std.ArrayList(u8), + description: struct { + test_name: []const u8, + file_path_and_line: std.ArrayList(u8), + }, reasons: std.ArrayList([]const u8), }; }; @@ -147,8 +176,7 @@ const TapParser = struct { .desc => { const name_start = skip(line, keyword.spacer1, keyword.not_ok.len) orelse @panic("expected spacer"); const name = mem.trim(u8, line[name_start..], &std.ascii.whitespace); - try p.wip_failure.description.appendSlice(arena, name); - try p.wip_failure.description.appendSlice(arena, ": "); + p.wip_failure.description.test_name = try arena.dupe(u8, name); p.state = .yaml_start; }, .yaml_start => { @@ -170,14 +198,14 @@ const TapParser = struct { .file => { const file_start = skip(line, keyword.file, 0) orelse @panic("expected file"); const file = mem.trim(u8, line[file_start..], std.ascii.whitespace ++ "'"); - try p.wip_failure.description.appendSlice(arena, file); - try p.wip_failure.description.append(arena, ':'); + try p.wip_failure.description.file_path_and_line.appendSlice(arena, file); p.state = .line; }, .line => { const line_start = skip(line, keyword.line, 0) orelse @panic("expected line"); const fail_line = mem.trim(u8, line[line_start..], &std.ascii.whitespace); - try p.wip_failure.description.appendSlice(arena, fail_line); + try p.wip_failure.description.file_path_and_line.append(arena, ':'); + try p.wip_failure.description.file_path_and_line.appendSlice(arena, fail_line); p.state = .start; return .{ .failure = p.wip_failure }; }, @@ -194,7 +222,10 @@ const TapParser = struct { const default: TapParser = .{ .state = .start, .wip_failure = .{ - .description = .empty, + .description = .{ + .test_name = &.{}, + .file_path_and_line = .empty, + }, .reasons = .empty, }, }; From 92488f786dd3ce9fb396b6b542a2646a6f29abca Mon Sep 17 00:00:00 2001 From: Parzival-3141 <29632054+Parzival-3141@users.noreply.github.com> Date: Mon, 26 Oct 2026 21:05:42 -0400 Subject: [PATCH 6/6] print line that failed test Silently drops the line if parsing or openFile fails, though that's unlikely since clar itself would probably have failed too. --- build/clar_parser.zig | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/build/clar_parser.zig b/build/clar_parser.zig index 3038844..0445687 100644 --- a/build/clar_parser.zig +++ b/build/clar_parser.zig @@ -106,7 +106,40 @@ fn report_errors( try term.writer.writeAll(fail.description.file_path_and_line.items); try term.setColor(.reset); try term.writer.writeByte('\n'); + + print_line: { + const sep_idx = std.mem.findScalar(u8, fail.description.file_path_and_line.items, ':').?; + const path = fail.description.file_path_and_line.items[0..sep_idx]; + const line = std.fmt.parseUnsigned( + usize, + fail.description.file_path_and_line.items[sep_idx + 1 ..], + 0, + ) catch { + @branchHint(.unlikely); + break :print_line; + }; + + // print the offending line + if (std.Io.Dir.cwd().openFile(io, path, .{})) |file| { + defer file.close(io); + var buf: [256]u8 = undefined; + var freader = file.reader(io, &buf); + + for (0..line -| 1) |_| { + _ = freader.interface.discardDelimiterInclusive('\n') catch break; + } + _ = try freader.interface.streamDelimiterEnding(term.writer, '\n'); + try term.writer.writeByte('\n'); + } else |_| { + @branchHint(.unlikely); + break :print_line; + } + } + for (fail.reasons.items) |reason| { + try term.setColor(.bright_cyan); + try term.writer.writeAll("reason: "); + try term.setColor(.reset); try term.writer.writeAll(reason); try term.writer.writeByte('\n'); }