Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 22 additions & 2 deletions .github/workflows/fleet-converge.yml

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions dag/extdeps/exec/command.dag
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,9 @@ fn argv_command(program: ProgramIdentity, arguments: List<String>) -> ArgvComman
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_ftps_upload_command"),
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_sigv4_s3_upload_command"),
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_sigv4_s3_download_command"),
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_sigv4_s3_delete_command"),
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_sigv4_s3_parallel_upload_command"),
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_version_command"),
decl_ref(module_path: "extdeps.tools.curl", decl_name: "curl_bmcweb_session_login_command"),
decl_ref(module_path: "extdeps.tools.nbdkit", decl_name: "nbdkit_readonly_file_serve_command"),
decl_ref(module_path: "extdeps.tools.websocat", decl_name: "websocat_nbd_proxy_bridge_command"),
Expand Down
343 changes: 342 additions & 1 deletion dag/extdeps/tools/curl.dag

Large diffs are not rendered by default.

56 changes: 54 additions & 2 deletions dag/extdeps/version/semver.dag
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ module extdeps.version.semver
import extdeps.version { VersionIdentity, VersionScheme, VersionConstraint }
import std.algebra { Ordering, Less, Equal, Greater }
import std.integer { NonNegativeInt }
import std.types { List }
import std.types { List, Int }
import std.nat { nat_compare }
import std.types { NonEmptyStr }
import std.types { NonEmptyStr, String }
import std.algebra { trim }
import std.checked_arithmetic { checked_int_to_nat }
import extdeps.external_authority { ExternalAuthority }
import extdeps.uri { Uri, Https }

Expand Down Expand Up @@ -97,6 +99,56 @@ fn semver_compare(a: SemVerVersion, b: SemVerVersion) -> Ordering {
}
}

// A NUMERIC RELEASE "M.m" OR "M.m.p" AS A SemVerVersion CORE, the form tools that are not themselves
// semver-governed (curl, among them) print and pin. A missing patch reads as 0, which is what "M.m"
// means as a release floor; any other shape -- a fourth part, a non-digit, a negative -- is absent,
// never coerced.
fn semver_core_of_dotted(text: String) -> SemVerVersion? {
let parts = split(s: trim(s: text), delimiter: ".")
if length(parts) < 2 || length(parts) > 3 {
none
} else {
match semver_dotted_part(parts: parts, index: 0) {
Absent => none
Present { value: major } =>
match semver_dotted_part(parts: parts, index: 1) {
Absent => none
Present { value: minor } =>
if length(parts) == 2 {
Present { value: SemVerVersion { major: major, minor: minor, patch: 0, pre_release: [], build: [] } }
} else {
match semver_dotted_part(parts: parts, index: 2) {
Absent => none
Present { value: patch } => Present { value: SemVerVersion { major: major, minor: minor, patch: patch, pre_release: [], build: [] } }
}
}
}
}
}
}

fn semver_dotted_part(parts: List<String>, index: Int) -> NonNegativeInt? {
match parts.skip(n: index).first() {
Absent => none
Present { value: w } =>
match parse_int(s: w) {
Absent => none
Present { value: n } => checked_int_to_nat(n: n)
}
}
}

// THE FLOOR A ">= M.m[.p]" CONSTRAINT NAMES. Only the lower-bound form is admitted: every other
// constraint shape is absent, so a caller gating on it refuses rather than reading a range as a floor.
fn semver_minimum_of_constraint(constraint: VersionConstraint) -> SemVerVersion? {
let c = trim(s: constraint as String)
if starts_with(s: c, prefix: ">=") {
semver_core_of_dotted(text: substring(s: c, start: 2, end: string_length(s: c)))
} else {
none
}
}

fn semver_identifier_label(id: SemVerIdentifier) -> String {
match id {
SemVerNumericIdentifier { value: v } => "{v}"
Expand Down
17 changes: 17 additions & 0 deletions dag/gunbc/ci/ci_spec.dag
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import gunbc.runner_microvm_slot_unit { microvm_slot_start_receipt_path, microvm
import gunbc.fleet.app_control_plane_inspection { app_control_plane_receipt_path }
import gunbc.cloudflare.r2_permission_group_observe { r2_mint_preflight_receipt_path }
import gunbc.cloudflare.r2_bucket_ensure { r2_bucket_ensure_receipt_path }
import gunbc.cloudflare.r2_conditional_put_race_probe { race_probe_receipt_path }
import gunbc.spark.managed_access_apply { spark_apply_receipt_path }
import gunbc.spark.pair_serving_apply { spark_pair_apply_receipt_path }
import gunbc.spark.native_serving_apply { spark_native_apply_receipt_path }
Expand Down Expand Up @@ -823,6 +824,11 @@ data gunbc_ci_r2_workspace_object_write_mint_target: GunbcRunStepTarget = GunbcR
function: "run_workspace_object_write",
}

data gunbc_ci_r2_conditional_put_race_probe_target: GunbcRunStepTarget = GunbcRunStepTarget {
entry: "dag/gunbc/cloudflare/r2_conditional_put_race_probe.dag",
function: "run_r2_conditional_put_race_probe",
}

data gunbc_ci_workspace_source_pack_target: GunbcRunStepTarget = GunbcRunStepTarget {
entry: "dag/gunbc/fabric/workspace_source.dag",
function: "workspace_source_pack_wet",
Expand Down Expand Up @@ -1368,6 +1374,7 @@ fn gunbc_run_step_targets() -> List<GunbcRunStepTarget> {
gunbc_ci_r2_object_write_mint_target,
gunbc_ci_r2_workspace_object_read_mint_target,
gunbc_ci_r2_workspace_object_write_mint_target,
gunbc_ci_r2_conditional_put_race_probe_target,
gunbc_ci_workspace_source_pack_target,
gunbc_ci_workspace_checkpoint_measure_target,
gunbc_ci_workspace_checkpoint_restore_target,
Expand Down Expand Up @@ -2676,6 +2683,16 @@ fn gunbc_ci_r2_workspace_object_write_mint_invoke() -> String {
)
}

fn gunbc_ci_r2_conditional_put_race_probe_invoke() -> String {
gunbc_run_step_script(
source_roots: witness_layer_roots,
entry: gunbc_ci_r2_conditional_put_race_probe_target.entry,
function: gunbc_ci_r2_conditional_put_race_probe_target.function,
claim_run: false,
receipt_rel: race_probe_receipt_path
)
}

fn gunbc_ci_workspace_source_pack_invoke() -> String {
gunbc_run_step_script(
source_roots: witness_layer_roots,
Expand Down
Loading