Skip to content

Feat/ssh submodules and core 2.6.0 - #6

Merged
singaraiona merged 2 commits into
masterfrom
feat/ssh-submodules-and-core-2.6.0
Sep 3, 2026
Merged

singaraiona merged 2 commits into
masterfrom
feat/ssh-submodules-and-core-2.6.0

Conversation

@vbanas

@vbanas vbanas commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

It is always better to add submodules by SSH. CI uses option to checkout via https automatically.

Also I've updated to the latest Rayforce and fixed issue relative to nulls due to changed behavior in Rayforce.

.gitmodules pointed at https://github.com/RayforceDB/{rayforce,rayforce-q}.git
while every clone here uses an SSH origin, so the submodules could not be
initialized without a URL rewrite. Both now use git@github.com: URLs; an
existing clone picks that up with `git submodule sync --recursive`.

CI needs nothing: actions/checkout (with no ssh-key input) rewrites
git@github.com: to https with the job token before the submodule fetch, and
persists that rewrite into each submodule's config, which is what lets
scripts/check-vendored-pin.sh fetch the pinned tag inside a shallow clone.
Both workflows say so next to their checkout step.

People without a GitHub SSH key need
`git config --global url."https://github.com/".insteadOf "git@github.com:"`
to clone, and a `git = "https://..."` Cargo dependency additionally needs
`net.git-fetch-with-cli = true`, since Cargo fetches a dependency's
submodules itself and only honours the rewrite when it shells out to git.
README, the installation page and the changelog carry both fallbacks;
crates.io consumers are unaffected because the sources ship in the crate.
Move the vendored pins from core v2.5.8 (f0d4bb4) to v2.6.0 (b3e9aa1) and
from rayforce-q 2.0.0 to 2.1.1, with CORE_VERSION / CORE_COMMIT in
rayforce-sys/build.rs moved alongside. rayforce-q's q.h is unchanged, and
the core only adds to its public header, so no bindgen allowlist changes.

The core changed what a null is. ray_vec_from_raw now scans the raw payload
once and raises HAS_NULLS when it already holds the type's sentinel, so a
vector built from a buffer containing i64::MIN is null from construction
where before the sentinel was ordinary data until set_null marked it. The
empty symbol and the empty string are now their types' in-band nulls,
recognised by ray_vec_is_null with or without the flag.

Value::get follows the second rule with one deliberate deviation: an empty
symbol or string element boxes as the empty atom rather than collapsing to
the untyped null singleton. is_null_at still reports it and is_atom_null is
true on the atom, so Option<String> extraction yields None, while plain
String extraction keeps working; to_vec::<String>() would otherwise fail on
any vector holding an empty string.

vector_nulls encoded the old rule and failed against a v2.6.0 core; it now
asserts the new one, plus that set_null(idx, false) is a no-op in the core
and that overwriting with set is what un-nulls an element. The
symbol_and_string_vectors test covers the empty-element path. The docs no
longer describe a "null bitmap": nulls are sentinels behind a HAS_NULLS
fast-path hint, and the doc comments on vec, get, is_null_at and set_null
say what the core actually does.
@singaraiona
singaraiona merged commit d9db004 into master Sep 3, 2026
2 checks passed
@vbanas
vbanas deleted the feat/ssh-submodules-and-core-2.6.0 branch September 3, 2026 12:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants