diff --git a/build.zig b/build.zig index 0eb7fb3..2041fb7 100644 --- a/build.zig +++ b/build.zig @@ -1,11 +1,11 @@ const std = @import("std"); +const sources = @import("build/sources.zon"); pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const libgit_src = b.dependency("libgit2", .{}); - const libgit_root = libgit_src.path("."); const mod = b.createModule(.{ .target = target, @@ -97,8 +97,8 @@ 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, + .root = libgit_src.path("src/util"), + .files = &sources.util_win32, .flags = &flags, }); } else { @@ -177,17 +177,17 @@ 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, - .files = &ntlm_sources, + .root = libgit_src.path("deps/ntlmclient"), + .files = &sources.ntlm, .flags = &(ntlm_cflags ++ .{"-Wno-deprecated"}), }); @@ -201,16 +201,16 @@ pub fn build(b: *std.Build) !void { } mod.addCSourceFiles(.{ - .root = libgit_root, - .files = &util_unix_sources, + .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, }); @@ -218,8 +218,8 @@ pub fn build(b: *std.Build) !void { // SHA1 collisiondetect mod.addCSourceFiles(.{ - .root = libgit_root, - .files = &util_sha1dc_sources, + .root = libgit_src.path("src/util"), + .files = &sources.util_sha1dc, .flags = &(flags ++ .{ "-DSHA1DC_NO_STANDARD_INCLUDES", "-DSHA1DC_CUSTOM_INCLUDE_SHA1_C=\"git2_util.h\"", @@ -269,8 +269,8 @@ pub fn build(b: *std.Build) !void { }); llhttp.addIncludePath(libgit_src.path("deps/llhttp")); llhttp.addCSourceFiles(.{ - .root = libgit_root, - .files = &llhttp_sources, + .root = libgit_src.path("deps/llhttp"), + .files = &sources.llhttp, .flags = &.{ "-Wno-unused-parameter", "-Wno-missing-declarations" }, }); @@ -305,8 +305,8 @@ pub fn build(b: *std.Build) !void { )); pcre.addIncludePath(libgit_src.path("deps/pcre")); pcre.addCSourceFiles(.{ - .root = libgit_root, - .files = &pcre_sources, + .root = libgit_src.path("deps/pcre"), + .files = &sources.pcre, .flags = &.{ "-Wno-unused-function", "-Wno-implicit-fallthrough", @@ -337,8 +337,8 @@ 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, - .files = &xdiff_sources, + .root = libgit_src.path("deps/xdiff"), + .files = &sources.xdiff, .flags = &.{ "-Wno-sign-compare", "-Wno-unused-parameter" }, }); mod.addIncludePath(libgit_src.path("deps/xdiff")); @@ -357,13 +357,13 @@ pub fn build(b: *std.Build) !void { mod.addIncludePath(libgit_src.path("include")); mod.addCSourceFiles(.{ - .root = libgit_root, - .files = &libgit_sources, + .root = libgit_src.path("src/libgit2"), + .files = &sources.libgit2, .flags = &flags, }); mod.addCSourceFiles(.{ - .root = libgit_root, - .files = &util_sources, + .root = libgit_src.path("src/util"), + .files = &sources.util, .flags = &flags, }); @@ -396,17 +396,17 @@ pub fn build(b: *std.Build) !void { cli.linkLibrary(lib); cli.addCSourceFiles(.{ - .root = libgit_root, - .files = &cli_sources, + .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 @@ -436,8 +436,8 @@ pub fn build(b: *std.Build) !void { lg2.addIncludePath(libgit_src.path("examples")); lg2.addCSourceFiles(.{ - .root = libgit_root, - .files = &example_sources, + .root = libgit_src.path("examples"), + .files = &sources.examples, .flags = &.{ // "-std=c90", "-DGIT_DEPRECATE_HARD", @@ -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")); @@ -501,18 +501,18 @@ pub fn build(b: *std.Build) !void { "-DGIT_DEPRECATE_HARD", }; runner.addCSourceFiles(.{ - .root = libgit_src.path("tests/libgit2/"), - .files = &libgit2_test_sources, + .root = libgit_src.path("tests/libgit2"), + .files = &sources.libgit2_test, .flags = runner_flags, }); runner.addCSourceFiles(.{ .root = clar_src, - .files = &clar_sources, + .files = &sources.clar, .flags = runner_flags, }); 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. @@ -520,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", .{}, ); @@ -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); @@ -593,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; } @@ -680,708 +686,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.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_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 { diff --git a/build/clar_parser.zig b/build/clar_parser.zig index 0842309..0445687 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,74 @@ 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); +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'); - 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'); + 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'); + } + try term.writer.writeByte('\n'); } - try stderr_writer.flush(); - return true; } - return false; } const TapParser = struct { @@ -100,7 +159,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 +209,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 +231,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 +255,10 @@ const TapParser = struct { const default: TapParser = .{ .state = .start, .wip_failure = .{ - .description = .empty, + .description = .{ + .test_name = &.{}, + .file_path_and_line = .empty, + }, .reasons = .empty, }, }; diff --git a/build/sources.zon b/build/sources.zon new file mode 100644 index 0000000..5c728a2 --- /dev/null +++ b/build/sources.zon @@ -0,0 +1,712 @@ +.{ + // src/libgit2 + .libgit2 = .{ + "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 = .{ + "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 = .{ + "unix/map.c", + "unix/process.c", + "unix/realpath.c", + }, + .util_win32 = .{ + "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", + + "hash/win32.c", + }, + .util_sha1dc = .{ + "hash/collisiondetect.c", + "hash/sha1dc/sha1.c", + "hash/sha1dc/ubc_check.c", + }, + + // deps/llhttp + .llhttp = .{ + "api.c", + "http.c", + "llhttp.c", + }, + + // deps/pcre + .pcre = .{ + "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 = .{ + "xdiffi.c", + "xemit.c", + "xhistogram.c", + "xmerge.c", + "xpatience.c", + "xprepare.c", + "xutils.c", + }, + + // deps/ntlmclient + .ntlm = .{ + "ntlm.c", + "unicode_builtin.c", + "util.c", + }, + + // src/cli + .cli = .{ + "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", + }, + + // 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", + "clar_libgit2_alloc.c", + "clar_libgit2_timer.c", + "clar_libgit2_trace.c", + "main.c", + }, + + // tests/libgit2 + .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", + }, +}