Monorepo management for opam overlays
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

precommit: Tidy code with idiomatic patterns

- Use pattern match for gitdir parsing instead of String.sub
- Use List.filter_map instead of filter + map
- Simplify empty string check (s <> "" vs String.length)

+38 -10
+38 -10
lib/monopam.ml
··· 1325 1325 let total = List.length repos in 1326 1326 Log.app (fun m -> m "Syncing %d repositories..." total); 1327 1327 1328 + (* Build status lookup for optimization *) 1329 + let status_by_name = 1330 + List.map (fun s -> (Package.name s.Status.package, s)) statuses 1331 + in 1332 + let sync_needs_push = function 1333 + | Status.Subtree_ahead _ | Status.Trees_differ -> true 1334 + | Status.In_sync | Status.Subtree_behind _ | Status.Unknown -> 1335 + false 1336 + in 1337 + let needs_push pkg = 1338 + List.assoc_opt (Package.name pkg) status_by_name 1339 + |> Option.fold ~none:true ~some:(fun s -> 1340 + sync_needs_push s.Status.subtree_sync) 1341 + in 1342 + 1328 1343 (* Step 2: Push phase - export monorepo changes to checkouts (PARALLEL) *) 1329 1344 (* git subtree push is read-only on the monorepo, so safe to parallelize *) 1345 + (* OPTIMIZATION: skip packages already in sync *) 1330 1346 let push_results = 1331 1347 if skip_push then begin 1332 1348 Log.app (fun m -> ··· 1334 1350 List.map (fun pkg -> Ok (Package.repo_name pkg)) repos 1335 1351 end 1336 1352 else begin 1353 + let to_push, to_skip = List.partition needs_push repos in 1337 1354 Log.app (fun m -> 1338 1355 m " Pushing monorepo changes to checkouts (parallel)..."); 1339 - Eio.Fiber.List.map ~max_fibers:4 1340 - (fun pkg -> 1341 - let repo_name = Package.repo_name pkg in 1342 - Log.info (fun m -> m "Push to checkout: %s" repo_name); 1343 - match push_one ~proc ~fs ~config pkg with 1344 - | Ok () -> Ok repo_name 1345 - | Error (Git_error e) -> 1346 - Error { repo_name; phase = `Push_checkout; error = e } 1347 - | Error _ -> Ok repo_name) 1348 - repos 1356 + if to_skip <> [] then 1357 + Log.app (fun m -> 1358 + m " Skipping %d already-synced packages" 1359 + (List.length to_skip)); 1360 + let pushed = 1361 + Eio.Fiber.List.map ~max_fibers:4 1362 + (fun pkg -> 1363 + let repo_name = Package.repo_name pkg in 1364 + Log.info (fun m -> m "Push to checkout: %s" repo_name); 1365 + match push_one ~proc ~fs ~config pkg with 1366 + | Ok () -> Ok repo_name 1367 + | Error (Git_error e) -> 1368 + Error 1369 + { repo_name; phase = `Push_checkout; error = e } 1370 + | Error _ -> Ok repo_name) 1371 + to_push 1372 + in 1373 + let skipped_ok = 1374 + List.map (fun pkg -> Ok (Package.repo_name pkg)) to_skip 1375 + in 1376 + pushed @ skipped_ok 1349 1377 end 1350 1378 in 1351 1379 let push_errors =