field_ios

In-the-field app for Radroots on iOS
git clone https://radroots.dev/git/field_ios.git
Log | Files | Refs | README | LICENSE

commit a7581907a22d034637cdaa1dcb47edad63e3d0bb
parent ab111c60ea4978c5362b2c66a4de185288d92cf1
Author: triesap <tyson@radroots.org>
Date:   Fri,  7 Aug 2026 00:06:40 +0000

ios: materialize canonical local lib source

- add explicit pinned and local source modes to the ffi materializer
- require the local lib gitlink to match the immutable source lock
- reject dirty or incorrectly pinned canonical source checkouts
- verify device, simulator, host, bindings, provenance, and hashes

Diffstat:
MRadrootsFFI/Makefile | 34++++++++++++++++++++++++++--------
1 file changed, 26 insertions(+), 8 deletions(-)

diff --git a/RadrootsFFI/Makefile b/RadrootsFFI/Makefile @@ -26,7 +26,18 @@ FFI_OUTPUT_NAME := RadrootsFFI LIB_STEM := libradroots_mobile_ffi GIT_FIELD_LIB_DIR := $(SOURCE_ROOT)/lib PROVENANCE_OUTPUT := RadrootsFFI/provenance.json +SOURCE_MODE ?= pinned +LOCAL_LIB_ROOT ?= +ifeq ($(SOURCE_MODE),local) +ifeq ($(strip $(LOCAL_LIB_ROOT)),) +$(error LOCAL_LIB_ROOT is required when SOURCE_MODE=local) +endif +SOURCE_WORKSPACE_ROOT := $(abspath $(LOCAL_LIB_ROOT)) +else ifeq ($(SOURCE_MODE),pinned) SOURCE_WORKSPACE_ROOT := $(GIT_FIELD_LIB_DIR) +else +$(error SOURCE_MODE must be pinned or local) +endif FFI_MANIFEST := $(SOURCE_WORKSPACE_ROOT)/crates/mobile_ffi/Cargo.toml UNIFFI_CONFIG := $(SOURCE_WORKSPACE_ROOT)/crates/mobile_ffi/uniffi.toml @@ -76,15 +87,22 @@ distclean: clean rm -rf $(SOURCE_ROOT) sync-source: - mkdir -p $(SOURCE_ROOT) - if [ ! -d $(GIT_FIELD_LIB_DIR)/.git ]; then \ - git clone --filter=blob:none $(RADROOTS_FIELD_LIB_GIT_URL) $(GIT_FIELD_LIB_DIR); \ + @if [ "$(SOURCE_MODE)" = "local" ]; then \ + test -d $(SOURCE_WORKSPACE_ROOT)/.git; \ + test "$$(git -C $(SOURCE_WORKSPACE_ROOT) rev-parse HEAD)" = "$(RADROOTS_FIELD_LIB_GIT_REV)"; \ + git -C $(SOURCE_WORKSPACE_ROOT) diff --quiet --no-ext-diff; \ + git -C $(SOURCE_WORKSPACE_ROOT) diff --cached --quiet --no-ext-diff; \ + else \ + mkdir -p $(SOURCE_ROOT); \ + if [ ! -d $(GIT_FIELD_LIB_DIR)/.git ]; then \ + git clone --filter=blob:none $(RADROOTS_FIELD_LIB_GIT_URL) $(GIT_FIELD_LIB_DIR); \ + fi; \ + git -C $(GIT_FIELD_LIB_DIR) fetch --tags --force origin; \ + git -C $(GIT_FIELD_LIB_DIR) checkout --detach $(RADROOTS_FIELD_LIB_GIT_REV); \ + test "$$(git -C $(GIT_FIELD_LIB_DIR) rev-parse HEAD)" = "$(RADROOTS_FIELD_LIB_GIT_REV)"; \ + git -C $(GIT_FIELD_LIB_DIR) diff --quiet --no-ext-diff; \ + git -C $(GIT_FIELD_LIB_DIR) diff --cached --quiet --no-ext-diff; \ fi - git -C $(GIT_FIELD_LIB_DIR) fetch --tags --force origin - git -C $(GIT_FIELD_LIB_DIR) checkout --detach $(RADROOTS_FIELD_LIB_GIT_REV) - test "$$(git -C $(GIT_FIELD_LIB_DIR) rev-parse HEAD)" = "$(RADROOTS_FIELD_LIB_GIT_REV)" - git -C $(GIT_FIELD_LIB_DIR) diff --quiet --no-ext-diff - git -C $(GIT_FIELD_LIB_DIR) diff --cached --quiet --no-ext-diff test -f $(FFI_MANIFEST) test -f $(BINDGEN_MANIFEST) test -f $(UNIFFI_CONFIG)