tigerbeetle 0.0.34 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/ext/tb_client/extconf.rb +13 -13
- data/ext/tb_client/tigerbeetle/LICENSE +177 -0
- data/ext/tb_client/tigerbeetle/build.zig +2327 -0
- data/ext/tb_client/tigerbeetle/src/aof.zig +1000 -0
- data/ext/tb_client/tigerbeetle/src/build_multiversion.zig +808 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/protocol.zig +1283 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/spec.zig +1704 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp/types.zig +341 -0
- data/ext/tb_client/tigerbeetle/src/cdc/amqp.zig +1450 -0
- data/ext/tb_client/tigerbeetle/src/cdc/runner.zig +1659 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/samples/main.c +406 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/context.zig +1084 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/echo_client.zig +286 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/packet.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal.zig +229 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client/signal_fuzz.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_exports.zig +281 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header.zig +312 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/tb_client_header_test.zig +138 -0
- data/ext/tb_client/tigerbeetle/src/clients/c/test.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_samples.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/clients/docs_types.zig +90 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/ci.zig +203 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/docs.zig +79 -0
- data/ext/tb_client/tigerbeetle/src/clients/dotnet/dotnet_bindings.zig +542 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/ci.zig +109 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/docs.zig +86 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/go_bindings.zig +370 -0
- data/ext/tb_client/tigerbeetle/src/clients/go/pkg/native/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/ci.zig +167 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/docs.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/java_bindings.zig +996 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/client.zig +748 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni.zig +3238 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_tests.zig +1718 -0
- data/ext/tb_client/tigerbeetle/src/clients/java/src/jni_thread_cleaner.zig +190 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/ci.zig +104 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/docs.zig +75 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node.zig +522 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/node_bindings.zig +267 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/c.zig +3 -0
- data/ext/tb_client/tigerbeetle/src/clients/node/src/translate.zig +379 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/ci.zig +131 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/docs.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/clients/python/python_bindings.zig +588 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/assets/tb_client.h +386 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/ci.zig +73 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/docs.zig +106 -0
- data/ext/tb_client/tigerbeetle/src/clients/rust/rust_bindings.zig +305 -0
- data/ext/tb_client/tigerbeetle/src/config.zig +296 -0
- data/ext/tb_client/tigerbeetle/src/constants.zig +790 -0
- data/ext/tb_client/tigerbeetle/src/copyhound.zig +202 -0
- data/ext/tb_client/tigerbeetle/src/counting_allocator.zig +72 -0
- data/ext/tb_client/tigerbeetle/src/direction.zig +11 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/build.zig +158 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/content.zig +156 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/docs.zig +252 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/file_checker.zig +313 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/html.zig +87 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/page_writer.zig +63 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/redirects.zig +47 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/search_index_writer.zig +28 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/service_worker_writer.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/single_page_writer.zig +169 -0
- data/ext/tb_client/tigerbeetle/src/docs_website/src/website.zig +46 -0
- data/ext/tb_client/tigerbeetle/src/ewah.zig +445 -0
- data/ext/tb_client/tigerbeetle/src/ewah_benchmark.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/ewah_fuzz.zig +171 -0
- data/ext/tb_client/tigerbeetle/src/fuzz_tests.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/integration_tests.zig +662 -0
- data/ext/tb_client/tigerbeetle/src/io/common.zig +155 -0
- data/ext/tb_client/tigerbeetle/src/io/darwin.zig +1093 -0
- data/ext/tb_client/tigerbeetle/src/io/linux.zig +1880 -0
- data/ext/tb_client/tigerbeetle/src/io/test.zig +1005 -0
- data/ext/tb_client/tigerbeetle/src/io/windows.zig +1598 -0
- data/ext/tb_client/tigerbeetle/src/io.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/iops.zig +134 -0
- data/ext/tb_client/tigerbeetle/src/list.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search.zig +848 -0
- data/ext/tb_client/tigerbeetle/src/lsm/binary_search_benchmark.zig +179 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map.zig +424 -0
- data/ext/tb_client/tigerbeetle/src/lsm/cache_map_fuzz.zig +420 -0
- data/ext/tb_client/tigerbeetle/src/lsm/compaction.zig +2117 -0
- data/ext/tb_client/tigerbeetle/src/lsm/composite_key.zig +182 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest.zig +1119 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_fuzz.zig +1102 -0
- data/ext/tb_client/tigerbeetle/src/lsm/forest_table_iterator.zig +200 -0
- data/ext/tb_client/tigerbeetle/src/lsm/groove.zig +1495 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge.zig +739 -0
- data/ext/tb_client/tigerbeetle/src/lsm/k_way_merge_benchmark.zig +166 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest.zig +754 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level.zig +1294 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_level_fuzz.zig +510 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log.zig +1263 -0
- data/ext/tb_client/tigerbeetle/src/lsm/manifest_log_fuzz.zig +628 -0
- data/ext/tb_client/tigerbeetle/src/lsm/node_pool.zig +247 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_buffer.zig +116 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_builder.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_fuzz.zig +938 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_lookup.zig +293 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_merge.zig +362 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_range.zig +99 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_state.zig +17 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scan_tree.zig +1036 -0
- data/ext/tb_client/tigerbeetle/src/lsm/schema.zig +617 -0
- data/ext/tb_client/tigerbeetle/src/lsm/scratch_memory.zig +84 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array.zig +1500 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_benchmark.zig +149 -0
- data/ext/tb_client/tigerbeetle/src/lsm/segmented_array_fuzz.zig +7 -0
- data/ext/tb_client/tigerbeetle/src/lsm/set_associative_cache.zig +865 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table.zig +607 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_memory.zig +843 -0
- data/ext/tb_client/tigerbeetle/src/lsm/table_value_iterator.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/lsm/timestamp_range.zig +40 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree.zig +630 -0
- data/ext/tb_client/tigerbeetle/src/lsm/tree_fuzz.zig +933 -0
- data/ext/tb_client/tigerbeetle/src/lsm/zig_zag_merge.zig +557 -0
- data/ext/tb_client/tigerbeetle/src/message_buffer.zig +469 -0
- data/ext/tb_client/tigerbeetle/src/message_bus.zig +1214 -0
- data/ext/tb_client/tigerbeetle/src/message_bus_fuzz.zig +936 -0
- data/ext/tb_client/tigerbeetle/src/message_pool.zig +343 -0
- data/ext/tb_client/tigerbeetle/src/multiversion.zig +2195 -0
- data/ext/tb_client/tigerbeetle/src/queue.zig +390 -0
- data/ext/tb_client/tigerbeetle/src/repl/completion.zig +201 -0
- data/ext/tb_client/tigerbeetle/src/repl/parser.zig +1356 -0
- data/ext/tb_client/tigerbeetle/src/repl/terminal.zig +496 -0
- data/ext/tb_client/tigerbeetle/src/repl.zig +1034 -0
- data/ext/tb_client/tigerbeetle/src/scripts/amqp.zig +973 -0
- data/ext/tb_client/tigerbeetle/src/scripts/cfo.zig +1866 -0
- data/ext/tb_client/tigerbeetle/src/scripts/changelog.zig +304 -0
- data/ext/tb_client/tigerbeetle/src/scripts/ci.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/scripts/client_readmes.zig +658 -0
- data/ext/tb_client/tigerbeetle/src/scripts/devhub.zig +466 -0
- data/ext/tb_client/tigerbeetle/src/scripts/release.zig +1058 -0
- data/ext/tb_client/tigerbeetle/src/scripts.zig +105 -0
- data/ext/tb_client/tigerbeetle/src/shell.zig +1195 -0
- data/ext/tb_client/tigerbeetle/src/stack.zig +260 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/auditor.zig +911 -0
- data/ext/tb_client/tigerbeetle/src/state_machine/workload.zig +2079 -0
- data/ext/tb_client/tigerbeetle/src/state_machine.zig +4872 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_fuzz.zig +288 -0
- data/ext/tb_client/tigerbeetle/src/state_machine_tests.zig +3128 -0
- data/ext/tb_client/tigerbeetle/src/static_allocator.zig +82 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bit_set.zig +157 -0
- data/ext/tb_client/tigerbeetle/src/stdx/bounded_array.zig +292 -0
- data/ext/tb_client/tigerbeetle/src/stdx/debug.zig +65 -0
- data/ext/tb_client/tigerbeetle/src/stdx/flags.zig +1414 -0
- data/ext/tb_client/tigerbeetle/src/stdx/mlock.zig +92 -0
- data/ext/tb_client/tigerbeetle/src/stdx/prng.zig +677 -0
- data/ext/tb_client/tigerbeetle/src/stdx/radix.zig +336 -0
- data/ext/tb_client/tigerbeetle/src/stdx/ring_buffer.zig +511 -0
- data/ext/tb_client/tigerbeetle/src/stdx/sort_test.zig +112 -0
- data/ext/tb_client/tigerbeetle/src/stdx/stdx.zig +1160 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/low_level_hash_vectors.zig +142 -0
- data/ext/tb_client/tigerbeetle/src/stdx/testing/snaptest.zig +361 -0
- data/ext/tb_client/tigerbeetle/src/stdx/time_units.zig +275 -0
- data/ext/tb_client/tigerbeetle/src/stdx/unshare.zig +295 -0
- data/ext/tb_client/tigerbeetle/src/stdx/vendored/aegis.zig +436 -0
- data/ext/tb_client/tigerbeetle/src/stdx/windows.zig +48 -0
- data/ext/tb_client/tigerbeetle/src/stdx/zipfian.zig +402 -0
- data/ext/tb_client/tigerbeetle/src/storage.zig +489 -0
- data/ext/tb_client/tigerbeetle/src/storage_fuzz.zig +180 -0
- data/ext/tb_client/tigerbeetle/src/testing/bench.zig +146 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/grid_checker.zig +53 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/journal_checker.zig +61 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/manifest_checker.zig +76 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/message_bus.zig +110 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/network.zig +412 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/state_checker.zig +331 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster/storage_checker.zig +458 -0
- data/ext/tb_client/tigerbeetle/src/testing/cluster.zig +1198 -0
- data/ext/tb_client/tigerbeetle/src/testing/exhaustigen.zig +128 -0
- data/ext/tb_client/tigerbeetle/src/testing/fixtures.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/testing/fuzz.zig +144 -0
- data/ext/tb_client/tigerbeetle/src/testing/id.zig +97 -0
- data/ext/tb_client/tigerbeetle/src/testing/io.zig +317 -0
- data/ext/tb_client/tigerbeetle/src/testing/marks.zig +126 -0
- data/ext/tb_client/tigerbeetle/src/testing/packet_simulator.zig +533 -0
- data/ext/tb_client/tigerbeetle/src/testing/reply_sequence.zig +154 -0
- data/ext/tb_client/tigerbeetle/src/testing/state_machine.zig +389 -0
- data/ext/tb_client/tigerbeetle/src/testing/storage.zig +1247 -0
- data/ext/tb_client/tigerbeetle/src/testing/table.zig +249 -0
- data/ext/tb_client/tigerbeetle/src/testing/time.zig +98 -0
- data/ext/tb_client/tigerbeetle/src/testing/tmp_tigerbeetle.zig +212 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/constants.zig +26 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/faulty_network.zig +580 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/java_driver/ci.zig +39 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/logged_process.zig +214 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/rust_driver/ci.zig +34 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/supervisor.zig +766 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/workload.zig +543 -0
- data/ext/tb_client/tigerbeetle/src/testing/vortex/zig_driver.zig +181 -0
- data/ext/tb_client/tigerbeetle/src/tidy.zig +1448 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_driver.zig +227 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/benchmark_load.zig +1069 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/cli.zig +1422 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect.zig +1658 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/inspect_integrity.zig +518 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/libtb_client.zig +36 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle/main.zig +646 -0
- data/ext/tb_client/tigerbeetle/src/tigerbeetle.zig +958 -0
- data/ext/tb_client/tigerbeetle/src/time.zig +236 -0
- data/ext/tb_client/tigerbeetle/src/trace/event.zig +745 -0
- data/ext/tb_client/tigerbeetle/src/trace/statsd.zig +462 -0
- data/ext/tb_client/tigerbeetle/src/trace.zig +556 -0
- data/ext/tb_client/tigerbeetle/src/unit_tests.zig +321 -0
- data/ext/tb_client/tigerbeetle/src/vopr.zig +1785 -0
- data/ext/tb_client/tigerbeetle/src/vortex.zig +101 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checkpoint_trailer.zig +473 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum.zig +208 -0
- data/ext/tb_client/tigerbeetle/src/vsr/checksum_benchmark.zig +43 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client.zig +768 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_replies.zig +532 -0
- data/ext/tb_client/tigerbeetle/src/vsr/client_sessions.zig +338 -0
- data/ext/tb_client/tigerbeetle/src/vsr/clock.zig +1019 -0
- data/ext/tb_client/tigerbeetle/src/vsr/fault_detector.zig +279 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set.zig +1381 -0
- data/ext/tb_client/tigerbeetle/src/vsr/free_set_fuzz.zig +315 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid.zig +1460 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_blocks_missing.zig +757 -0
- data/ext/tb_client/tigerbeetle/src/vsr/grid_scrubber.zig +797 -0
- data/ext/tb_client/tigerbeetle/src/vsr/journal.zig +2586 -0
- data/ext/tb_client/tigerbeetle/src/vsr/marzullo.zig +308 -0
- data/ext/tb_client/tigerbeetle/src/vsr/message_header.zig +1777 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch.zig +715 -0
- data/ext/tb_client/tigerbeetle/src/vsr/multi_batch_fuzz.zig +185 -0
- data/ext/tb_client/tigerbeetle/src/vsr/repair_budget.zig +333 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica.zig +12355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_format.zig +416 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_reformat.zig +165 -0
- data/ext/tb_client/tigerbeetle/src/vsr/replica_test.zig +2910 -0
- data/ext/tb_client/tigerbeetle/src/vsr/routing.zig +1075 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock.zig +1603 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_fuzz.zig +484 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums.zig +405 -0
- data/ext/tb_client/tigerbeetle/src/vsr/superblock_quorums_fuzz.zig +355 -0
- data/ext/tb_client/tigerbeetle/src/vsr/sync.zig +29 -0
- data/ext/tb_client/tigerbeetle/src/vsr.zig +1727 -0
- data/lib/tb_client/shared_lib.rb +12 -5
- data/lib/tigerbeetle/client.rb +1 -1
- data/lib/tigerbeetle/platforms.rb +9 -0
- data/lib/tigerbeetle/version.rb +2 -2
- data/tigerbeetle.gemspec +22 -5
- metadata +242 -3
- data/ext/tb_client/pkg.tar.gz +0 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const assert = std.debug.assert;
|
|
3
|
+
const Website = @import("website.zig").Website;
|
|
4
|
+
const Html = @import("html.zig").Html;
|
|
5
|
+
|
|
6
|
+
const page_template = @embedFile("html/page.html");
|
|
7
|
+
const search_box_template = @embedFile("html/search-box.html");
|
|
8
|
+
const search_results_template = @embedFile("html/search-results.html");
|
|
9
|
+
const search_script_template = "<script src=\"$url_prefix/js/search.js\"></script>";
|
|
10
|
+
const page_script = @embedFile("js/page-script.js");
|
|
11
|
+
|
|
12
|
+
pub fn main() !void {
|
|
13
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
14
|
+
const allocator = arena.allocator();
|
|
15
|
+
const args = try std.process.argsAlloc(allocator);
|
|
16
|
+
assert(args.len == 9);
|
|
17
|
+
const title = args[1];
|
|
18
|
+
const author = args[2];
|
|
19
|
+
const url_prefix = args[3];
|
|
20
|
+
const page_path = args[4];
|
|
21
|
+
const include_search = std.mem.eql(u8, args[5], "true");
|
|
22
|
+
const nav = args[6];
|
|
23
|
+
const source_file_path = args[7];
|
|
24
|
+
const target_file_path = args[8];
|
|
25
|
+
|
|
26
|
+
var script = try Html.create(allocator);
|
|
27
|
+
try script.write(page_script, .{ .url_prefix = url_prefix });
|
|
28
|
+
|
|
29
|
+
var script_hash: [32]u8 = undefined;
|
|
30
|
+
std.crypto.hash.sha2.Sha256.hash(script.string(), &script_hash, .{});
|
|
31
|
+
const b64_encoder = std.base64.standard.Encoder;
|
|
32
|
+
var script_hash_b64_buf: [b64_encoder.calcSize(script_hash.len)]u8 = undefined;
|
|
33
|
+
const script_hash_b64 = b64_encoder.encode(&script_hash_b64_buf, &script_hash);
|
|
34
|
+
|
|
35
|
+
const content = try std.fs.cwd().readFileAlloc(
|
|
36
|
+
allocator,
|
|
37
|
+
source_file_path,
|
|
38
|
+
Website.file_size_max,
|
|
39
|
+
);
|
|
40
|
+
var html = try Html.create(allocator);
|
|
41
|
+
var search_box = try html.child();
|
|
42
|
+
var search_results = try html.child();
|
|
43
|
+
var search_script = try html.child();
|
|
44
|
+
if (include_search) {
|
|
45
|
+
try search_box.write(search_box_template, .{});
|
|
46
|
+
try search_results.write(search_results_template, .{ .url_prefix = url_prefix });
|
|
47
|
+
try search_script.write(search_script_template, .{ .url_prefix = url_prefix });
|
|
48
|
+
}
|
|
49
|
+
try html.write(page_template, .{
|
|
50
|
+
.page_script_hash = script_hash_b64,
|
|
51
|
+
.title = title,
|
|
52
|
+
.author = author,
|
|
53
|
+
.url_prefix = url_prefix,
|
|
54
|
+
.page_path = page_path,
|
|
55
|
+
.nav = nav,
|
|
56
|
+
.search_box = search_box,
|
|
57
|
+
.search_results = search_results,
|
|
58
|
+
.content = content,
|
|
59
|
+
.page_script = script,
|
|
60
|
+
.search_script = search_script,
|
|
61
|
+
});
|
|
62
|
+
try std.fs.cwd().writeFile(.{ .sub_path = target_file_path, .data = html.string() });
|
|
63
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
const Website = @import("website.zig").Website;
|
|
4
|
+
|
|
5
|
+
const Redirect = struct {
|
|
6
|
+
old: []const u8,
|
|
7
|
+
new: []const u8,
|
|
8
|
+
|
|
9
|
+
const all: []const Redirect = &.{
|
|
10
|
+
.{ .old = "quick-start/", .new = "start/" },
|
|
11
|
+
.{ .old = "about/", .new = "concepts/" },
|
|
12
|
+
.{ .old = "about/vopr/", .new = "concepts/safety/" },
|
|
13
|
+
.{ .old = "about/oltp/", .new = "concepts/oltp/" },
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
pub fn build(b: *std.Build, content: *std.Build.Step.WriteFile, website: Website) !void {
|
|
18
|
+
for (Redirect.all) |redirect| {
|
|
19
|
+
try build_redirect(b, content, website, redirect);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
fn build_redirect(
|
|
24
|
+
b: *std.Build,
|
|
25
|
+
content: *std.Build.Step.WriteFile,
|
|
26
|
+
website: Website,
|
|
27
|
+
redirect: Redirect,
|
|
28
|
+
) !void {
|
|
29
|
+
const path = b.pathJoin(&.{ redirect.old, "index.html" });
|
|
30
|
+
const url = b.fmt("{s}/{s}", .{ website.url_prefix, redirect.new });
|
|
31
|
+
const html_redirect = b.fmt(
|
|
32
|
+
\\<!DOCTYPE html>
|
|
33
|
+
\\<html lang="en">
|
|
34
|
+
\\ <meta charset="utf-8">
|
|
35
|
+
\\ <title>Redirecting…</title>
|
|
36
|
+
\\ <link rel="canonical" href="{[url]s}">
|
|
37
|
+
\\ <script>location="{[url]s}"</script>
|
|
38
|
+
\\ <meta http-equiv="refresh" content="0; url={[url]s}">
|
|
39
|
+
\\ <meta name="robots" content="noindex">
|
|
40
|
+
\\ <h1>Redirecting…</h1>
|
|
41
|
+
\\ <a href="{[url]s}">Click here if you are not redirected.</a>
|
|
42
|
+
\\</html>
|
|
43
|
+
\\
|
|
44
|
+
, .{ .url = url });
|
|
45
|
+
|
|
46
|
+
_ = content.add(path, html_redirect);
|
|
47
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const Website = @import("website.zig").Website;
|
|
3
|
+
|
|
4
|
+
const Entry = struct {
|
|
5
|
+
path: []const u8,
|
|
6
|
+
html: []const u8,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
pub fn main() !void {
|
|
10
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
11
|
+
const allocator = arena.allocator();
|
|
12
|
+
|
|
13
|
+
var args = std.process.args();
|
|
14
|
+
_ = args.skip();
|
|
15
|
+
|
|
16
|
+
var entries = std.ArrayList(Entry).init(allocator);
|
|
17
|
+
while (args.next()) |path| {
|
|
18
|
+
const html = args.next().?;
|
|
19
|
+
const entry = Entry{
|
|
20
|
+
.path = path,
|
|
21
|
+
.html = try std.fs.cwd().readFileAlloc(allocator, html, Website.file_size_max),
|
|
22
|
+
};
|
|
23
|
+
try entries.append(entry);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const json_string = try std.json.stringifyAlloc(allocator, entries.items, .{});
|
|
27
|
+
try std.io.getStdOut().writer().print("{s}\n", .{json_string});
|
|
28
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const Html = @import("html.zig").Html;
|
|
3
|
+
|
|
4
|
+
pub fn main() !void {
|
|
5
|
+
var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
|
|
6
|
+
const allocator = arena.allocator();
|
|
7
|
+
var args = std.process.args();
|
|
8
|
+
_ = args.skip();
|
|
9
|
+
const url_prefix = args.next().?;
|
|
10
|
+
const cache_name = args.next().?;
|
|
11
|
+
const search_path = args.next().?;
|
|
12
|
+
|
|
13
|
+
const file_paths = try collect_files(allocator, url_prefix, search_path);
|
|
14
|
+
try write_service_worker(allocator, cache_name, file_paths);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
fn collect_files(
|
|
18
|
+
arena: std.mem.Allocator,
|
|
19
|
+
url_prefix: []const u8,
|
|
20
|
+
search_path: []const u8,
|
|
21
|
+
) ![]const []const u8 {
|
|
22
|
+
var file_paths = std.ArrayList([]const u8).init(arena);
|
|
23
|
+
|
|
24
|
+
var dir = try std.fs.cwd().openDir(search_path, .{ .iterate = true });
|
|
25
|
+
defer dir.close();
|
|
26
|
+
|
|
27
|
+
var walker = try dir.walk(arena);
|
|
28
|
+
defer walker.deinit();
|
|
29
|
+
|
|
30
|
+
while (try walker.next()) |entry| {
|
|
31
|
+
if (entry.kind == .file) {
|
|
32
|
+
// Normalize requests by using directory with trailing slash instead of index.html.
|
|
33
|
+
if (std.mem.endsWith(u8, entry.path, "index.html")) {
|
|
34
|
+
const stripped = entry.path[0 .. entry.path.len - "index.html".len];
|
|
35
|
+
try file_paths.append(try std.mem.join(arena, "/", &.{ url_prefix, stripped }));
|
|
36
|
+
} else {
|
|
37
|
+
try file_paths.append(try std.mem.join(arena, "/", &.{ url_prefix, entry.path }));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return file_paths.toOwnedSlice();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
fn write_service_worker(
|
|
46
|
+
arena: std.mem.Allocator,
|
|
47
|
+
cache_name: []const u8,
|
|
48
|
+
file_paths: []const []const u8,
|
|
49
|
+
) !void {
|
|
50
|
+
const template = @embedFile("js/service-worker.js");
|
|
51
|
+
|
|
52
|
+
const file_paths_json = try std.json.stringifyAlloc(arena, file_paths, .{});
|
|
53
|
+
|
|
54
|
+
var html = try Html.create(arena);
|
|
55
|
+
try html.write(template, .{
|
|
56
|
+
.cache_name = cache_name,
|
|
57
|
+
.files_to_cache = file_paths_json,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
try std.io.getStdOut().writer().print("{s}", .{html.string()});
|
|
61
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
pub fn main() !void {
|
|
4
|
+
var args = std.process.args();
|
|
5
|
+
_ = args.skip();
|
|
6
|
+
|
|
7
|
+
var file_buffer: [150 * 1024]u8 = undefined;
|
|
8
|
+
var stdout = std.io.getStdOut().writer();
|
|
9
|
+
|
|
10
|
+
while (args.next()) |page_path| {
|
|
11
|
+
const html_path = args.next().?;
|
|
12
|
+
const html = try read_file(std.fs.cwd(), html_path, &file_buffer);
|
|
13
|
+
|
|
14
|
+
// Clear links following h1 tags.
|
|
15
|
+
var clear_h1_link = false;
|
|
16
|
+
|
|
17
|
+
var it = AttributeIterator.init(html);
|
|
18
|
+
while (it.next()) |attribute| {
|
|
19
|
+
try stdout.writeAll(attribute.prefix);
|
|
20
|
+
|
|
21
|
+
if (std.mem.eql(u8, attribute.tag, "use")) {
|
|
22
|
+
// Don't alter.
|
|
23
|
+
try stdout.writeAll(attribute.value);
|
|
24
|
+
} else {
|
|
25
|
+
// Rewrite attribute values.
|
|
26
|
+
const is_h1 = std.mem.eql(u8, attribute.tag, "h1");
|
|
27
|
+
defer clear_h1_link = is_h1;
|
|
28
|
+
|
|
29
|
+
const value = if (is_h1 or clear_h1_link) "" else attribute.value;
|
|
30
|
+
try switch (attribute.typ) {
|
|
31
|
+
.link => rewrite_link(value, page_path, stdout),
|
|
32
|
+
.id => rewrite_id(value, page_path, stdout),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const remaining = it.html[it.position..];
|
|
37
|
+
try stdout.print("{s}\n", .{remaining});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
fn rewrite_link(link: []const u8, page_path: []const u8, writer: anytype) !void {
|
|
42
|
+
if (std.mem.startsWith(u8, link, "http") // external link.
|
|
43
|
+
or std.mem.startsWith(u8, link, "mailto:") // email.
|
|
44
|
+
or std.mem.startsWith(u8, link, "#cb") // code block link.
|
|
45
|
+
) {
|
|
46
|
+
return try writer.writeAll(link);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
var base: []const u8 = link;
|
|
50
|
+
var fragment: ?[]const u8 = null;
|
|
51
|
+
if (std.mem.lastIndexOfScalar(u8, link, '#')) |index| {
|
|
52
|
+
base = link[0..index];
|
|
53
|
+
fragment = link[index + 1 ..];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
var buffer: [200]u8 = undefined;
|
|
57
|
+
var fba = std.heap.FixedBufferAllocator.init(&buffer);
|
|
58
|
+
const allocator = fba.allocator();
|
|
59
|
+
|
|
60
|
+
var path = if (base.len > 0 and base[0] == '/')
|
|
61
|
+
base[1..]
|
|
62
|
+
else
|
|
63
|
+
try std.fs.path.resolvePosix(allocator, &.{ page_path, base });
|
|
64
|
+
if (std.mem.eql(u8, path, ".")) path = "";
|
|
65
|
+
path = std.mem.trimRight(u8, path, "/");
|
|
66
|
+
|
|
67
|
+
const slug = try path2slug(allocator, path);
|
|
68
|
+
if (fragment) |frag| {
|
|
69
|
+
if (slug.len > 0) {
|
|
70
|
+
try writer.print("#{s}-{s}", .{ slug, frag });
|
|
71
|
+
} else {
|
|
72
|
+
try writer.print("#{s}", .{frag});
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
try writer.print("#{s}", .{slug});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
fn rewrite_id(id: []const u8, page_path: []const u8, writer: anytype) !void {
|
|
80
|
+
if (std.mem.startsWith(u8, id, "cb") // code block lines.
|
|
81
|
+
) {
|
|
82
|
+
return try writer.writeAll(id);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (page_path.len > 0) {
|
|
86
|
+
var buffer: [200]u8 = undefined;
|
|
87
|
+
var fba = std.heap.FixedBufferAllocator.init(&buffer);
|
|
88
|
+
const allocator = fba.allocator();
|
|
89
|
+
const slug = try path2slug(allocator, page_path);
|
|
90
|
+
if (id.len > 0) {
|
|
91
|
+
try writer.print("{s}-{s}", .{ slug, id });
|
|
92
|
+
} else {
|
|
93
|
+
try writer.writeAll(slug);
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
try writer.writeAll(id);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
fn path2slug(allocator: std.mem.Allocator, path: []const u8) ![]const u8 {
|
|
101
|
+
const slug = try allocator.dupe(u8, path);
|
|
102
|
+
std.mem.replaceScalar(u8, slug, '/', '-');
|
|
103
|
+
return slug;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const AttributeIterator = struct {
|
|
107
|
+
const Attribute = struct {
|
|
108
|
+
const Type = enum { link, id };
|
|
109
|
+
|
|
110
|
+
typ: Type,
|
|
111
|
+
tag: []const u8,
|
|
112
|
+
prefix: []const u8,
|
|
113
|
+
value: []const u8,
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const link_prefix = "href=\"";
|
|
117
|
+
const id_prefix = "id=\"";
|
|
118
|
+
|
|
119
|
+
html: []const u8,
|
|
120
|
+
position: usize = 0,
|
|
121
|
+
|
|
122
|
+
fn init(html: []const u8) AttributeIterator {
|
|
123
|
+
return .{ .html = html };
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
fn next(self: *AttributeIterator) ?Attribute {
|
|
127
|
+
var first_index: ?usize = null;
|
|
128
|
+
var typ: Attribute.Type = undefined;
|
|
129
|
+
|
|
130
|
+
// Find the first link or id attribute.
|
|
131
|
+
const remaining = self.html[self.position..];
|
|
132
|
+
if (std.mem.indexOf(u8, remaining, link_prefix)) |link_index| {
|
|
133
|
+
first_index = link_index + link_prefix.len;
|
|
134
|
+
typ = .link;
|
|
135
|
+
}
|
|
136
|
+
if (std.mem.indexOf(u8, remaining, id_prefix)) |id_index| {
|
|
137
|
+
if (first_index) |index| {
|
|
138
|
+
if (id_index < index) {
|
|
139
|
+
first_index = id_index + id_prefix.len;
|
|
140
|
+
typ = .id;
|
|
141
|
+
}
|
|
142
|
+
} else {
|
|
143
|
+
first_index = id_index + id_prefix.len;
|
|
144
|
+
typ = .id;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const value_start = first_index orelse return null;
|
|
149
|
+
const value_len = std.mem.indexOfScalar(u8, remaining[value_start..], '"').?;
|
|
150
|
+
|
|
151
|
+
const prefix = remaining[0..value_start];
|
|
152
|
+
const value = remaining[value_start..][0..value_len];
|
|
153
|
+
self.position += value_start + value_len;
|
|
154
|
+
|
|
155
|
+
// Find the associated tag.
|
|
156
|
+
const tag_slice = self.html[0 .. self.position - value_len];
|
|
157
|
+
const tag_index = std.mem.lastIndexOfScalar(u8, tag_slice, '<').? + 1;
|
|
158
|
+
const tag_len = std.mem.indexOfAny(u8, tag_slice[tag_index..], " \n").?;
|
|
159
|
+
const tag = tag_slice[tag_index..][0..tag_len];
|
|
160
|
+
|
|
161
|
+
return .{ .typ = typ, .tag = tag, .prefix = prefix, .value = value };
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
fn read_file(dir: std.fs.Dir, path: []const u8, page_buffer: []u8) ![]const u8 {
|
|
166
|
+
const result = try dir.readFile(path, page_buffer);
|
|
167
|
+
if (result.len == page_buffer.len) return error.FileToLarge;
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
const LazyPath = std.Build.LazyPath;
|
|
3
|
+
const Compile = std.Build.Step.Compile;
|
|
4
|
+
|
|
5
|
+
pub const Website = @This();
|
|
6
|
+
|
|
7
|
+
pub const file_size_max = 2 << 20; // 1 MiB
|
|
8
|
+
|
|
9
|
+
url_prefix: []const u8,
|
|
10
|
+
pandoc_bin: LazyPath,
|
|
11
|
+
|
|
12
|
+
page_writer_exe: *Compile,
|
|
13
|
+
|
|
14
|
+
pub fn init(b: *std.Build, url_prefix: []const u8, pandoc_bin: LazyPath) Website {
|
|
15
|
+
return .{
|
|
16
|
+
.url_prefix = url_prefix,
|
|
17
|
+
.pandoc_bin = pandoc_bin,
|
|
18
|
+
.page_writer_exe = b.addExecutable(.{
|
|
19
|
+
.name = "page_writer",
|
|
20
|
+
.root_source_file = b.path("src/page_writer.zig"),
|
|
21
|
+
.target = b.graph.host,
|
|
22
|
+
}),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
pub fn write_page(self: Website, options: struct {
|
|
27
|
+
title: []const u8 = "TigerBeetle",
|
|
28
|
+
author: []const u8 = "TigerBeetle Team",
|
|
29
|
+
page_path: []const u8,
|
|
30
|
+
include_search: bool = true,
|
|
31
|
+
nav: []const u8,
|
|
32
|
+
content: LazyPath,
|
|
33
|
+
}) LazyPath {
|
|
34
|
+
const b = self.page_writer_exe.step.owner;
|
|
35
|
+
const page_writer_run = b.addRunArtifact(self.page_writer_exe);
|
|
36
|
+
page_writer_run.addArgs(&.{
|
|
37
|
+
options.title,
|
|
38
|
+
options.author,
|
|
39
|
+
self.url_prefix,
|
|
40
|
+
options.page_path,
|
|
41
|
+
if (options.include_search) "true" else "false",
|
|
42
|
+
options.nav,
|
|
43
|
+
});
|
|
44
|
+
page_writer_run.addFileArg(options.content);
|
|
45
|
+
return page_writer_run.addOutputFileArg("page.html");
|
|
46
|
+
}
|