MCPcopy Create free account
hub / github.com/atomicdotdev/atomic / manifest_apply_order

Function manifest_apply_order

atomic-cli/src/commands/clone/helpers.rs:408–437  ·  view source on GitHub ↗

Order manifests so every parent is applied before its children. A manifest is ready when its declared parent is `None` (a root view), already applied locally (`already_applied`), or emitted earlier in the order. Repeatedly emits ready manifests until no progress can be made. # Returns `(ordered, stuck)` — indices into `manifests`. `ordered` is a valid root→leaf apply order; `stuck` holds manife

(
    manifests: &[ViewManifest],
    already_applied: &HashSet<String>,
)

Source from the content-addressed store, hash-verified

406/// (their parent chain has a cycle or references a view that is neither
407/// in the set nor already applied).
408pub fn manifest_apply_order(
409 manifests: &[ViewManifest],
410 already_applied: &HashSet<String>,
411) -> (Vec<usize>, Vec<usize>) {
412 let mut ordered: Vec<usize> = Vec::with_capacity(manifests.len());
413 let mut emitted: HashSet<&str> = HashSet::with_capacity(manifests.len());
414 let mut remaining: Vec<usize> = (0..manifests.len()).collect();
415
416 loop {
417 let before = ordered.len();
418 remaining.retain(|&i| {
419 let ready = match manifests[i].parent.as_deref() {
420 None => true,
421 Some(p) => already_applied.contains(p) || emitted.contains(p),
422 };
423 if ready {
424 emitted.insert(manifests[i].name.as_str());
425 ordered.push(i);
426 false
427 } else {
428 true
429 }
430 });
431 if ordered.len() == before {
432 break;
433 }
434 }
435
436 (ordered, remaining)
437}
438
439/// The union of change hashes across a set of manifests.
440///

Calls 5

lenMethod · 0.45
containsMethod · 0.45
insertMethod · 0.45
as_strMethod · 0.45
pushMethod · 0.45