gitgrip 1.5.1__tar.gz → 2.0.0a2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gitgrip-2.0.0a2/PKG-INFO +116 -0
- gitgrip-2.0.0a2/README.md +101 -0
- gitgrip-2.0.0a2/gitgrip.egg-info/PKG-INFO +116 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/SOURCES.txt +23 -7
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/entry_points.txt +1 -0
- gitgrip-2.0.0a2/gr2/overlay/__init__.py +9 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/concurrent_lease_stress.py +4 -3
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/concurrent_workspace_cap_stress.py +4 -3
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/cross_mode_lane_stress.py +21 -21
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/lane_workspace_prototype.py +41 -12
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_exec_playground.py +2 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_hook_runtime_playground.py +2 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_migration_playground.py +2 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_review_checkout_playground.py +2 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/python_spec_apply_playground.py +2 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/real_git_lane_materialization.py +3 -2
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/real_git_playground.py +1 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/pyproject.toml +9 -14
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/app.py +415 -42
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/commit.py +88 -2
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/execops.py +12 -1
- gitgrip-2.0.0a2/python_cli/git_review.py +845 -0
- gitgrip-2.0.0a2/python_cli/gitops.py +489 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/hooks.py +29 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/launch_exec.py +87 -11
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/migration.py +1 -2
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/project_review.py +3 -3
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/review.py +1 -1
- gitgrip-2.0.0a2/python_cli/review_dispatch.py +52 -0
- gitgrip-2.0.0a2/python_cli/review_rebind.py +315 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/review_run.py +211 -15
- gitgrip-2.0.0a2/python_cli/review_runners.py +292 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/spec_apply.py +6 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/syncops.py +61 -4
- gitgrip-2.0.0a2/tests/test_conftest_git_isolation.py +219 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_ensure_lane_checkout_reference_clone.py +1 -1
- gitgrip-2.0.0a2/tests/test_exec_apostrophe_and_oserror.py +279 -0
- gitgrip-2.0.0a2/tests/test_exec_single_string_and_materialize_plan.py +442 -0
- gitgrip-2.0.0a2/tests/test_foreground_launch_runtime.py +155 -0
- gitgrip-2.0.0a2/tests/test_git_review.py +873 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_create_fork_base_cli.py +2 -2
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_lifecycle_safety.py +10 -5
- gitgrip-2.0.0a2/tests/test_lane_repo_paths_and_all_skipped.py +234 -0
- gitgrip-2.0.0a2/tests/test_projection_tracked_dest.py +183 -0
- gitgrip-2.0.0a2/tests/test_readme_verbs_exist.py +151 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_bind_fork_base.py +1 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_cli.py +41 -0
- gitgrip-2.0.0a2/tests/test_review_dispatch.py +105 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_open_lane.py +7 -2
- gitgrip-2.0.0a2/tests/test_review_rebind.py +198 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_run.py +110 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_run_import_isolation.py +9 -3
- gitgrip-2.0.0a2/tests/test_review_runners.py +384 -0
- gitgrip-2.0.0a2/tests/test_single_repo_cwd_refusal.py +158 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_sprint21_sync_platform.py +27 -0
- gitgrip-2.0.0a2/tests/test_store_verb_rename.py +46 -0
- gitgrip-2.0.0a2/tests/test_sync_fast_forward.py +238 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_sync_fetch.py +10 -5
- gitgrip-2.0.0a2/tests/test_sync_seed_local.py +241 -0
- gitgrip-2.0.0a2/tests/test_sync_ssh_rewrite.py +326 -0
- gitgrip-2.0.0a2/tests/test_sync_status_probe.py +232 -0
- gitgrip-2.0.0a2/tests/test_version_static.py +111 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_convert_clone.py +1 -1
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_init_from_topology.py +2 -1
- gitgrip-2.0.0a2/tests/test_workspace_init_local_repos.py +120 -0
- gitgrip-1.5.1/MANIFEST.in +0 -6
- gitgrip-1.5.1/PKG-INFO +0 -13
- gitgrip-1.5.1/README.md +0 -258
- gitgrip-1.5.1/VERSION +0 -1
- gitgrip-1.5.1/_build/__pycache__/backend.cpython-311.pyc +0 -0
- gitgrip-1.5.1/_build/__pycache__/version_from_cargo.cpython-311.pyc +0 -0
- gitgrip-1.5.1/_build/backend.py +0 -58
- gitgrip-1.5.1/_build/version_from_cargo.py +0 -43
- gitgrip-1.5.1/gitgrip.egg-info/PKG-INFO +0 -13
- gitgrip-1.5.1/gr2/overlay/__init__.py +0 -6
- gitgrip-1.5.1/python_cli/gitops.py +0 -226
- gitgrip-1.5.1/tests/test_version_single_sourced.py +0 -96
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/dependency_links.txt +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/requires.txt +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gitgrip.egg-info/top_level.txt +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/__init__.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/activate.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/agent_manifest.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/cli.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/cross_repo.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/drivers.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/introspection.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/language_drivers.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/objects.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/perf.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/refs.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/trust.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/types.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/units.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/overlay/workspace_spec.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2/schemas/gr2-materialization-plan-v1.schema.json +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/gr2_overlay/__init__.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/__init__.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/cache_materialization_probe.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/concurrent_event_stress.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/contribution_protocol.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/jsonl_store.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/layout_model_probe.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/propagation_daemon.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/propagation_state_machine.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/recall_lane_history.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/repo_maintenance_prototype.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/prototypes/repo_transport_probe.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/__init__.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/__main__.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/add.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/branch.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/channel_bridge.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/clone_exec.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/config.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/env_exec.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/events.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/failures.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/file_exec.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/grip.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/grip_cli.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/merge_verification.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/open_gr_review.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/platform.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/pr.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/prune.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/push.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/review_ephemeral.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/staging_cleanup.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/target.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/python_cli/workspace_snapshot.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/setup.cfg +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_add.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_agent_manifest_overlay_source.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_app_event_outcomes.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_apply_convergence.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_branch.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_channel_bridge.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_clone_materialization.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_commit.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_config_base_path_guard.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_config_overlay.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_contribution_protocol.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_env_materialization.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_event_log_integrity.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_event_outcome_policy.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_events.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_events_torn_line.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_execops.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_failure_event_outcome.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_gr2_packaging.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_gr2_review_receipt.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_cli.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_hardening.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_object_model.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_grip_snapshot.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_hook_events.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_hook_hardening.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_jsonl_store.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_lease_show_json.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_lane_toml_serialization.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_launch_primitive.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_m2_overlay_hindsight.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_m2_overlay_mem0.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_m2_overlay_zep.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_materialization_plan_contract.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_merge_evidence.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_merge_parent_verification.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_migration.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_migration_overlay_compatibility.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_no_bare_python_cli_imports.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_null_current_lane_refusal.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_open_gr_enter.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_open_project_refusal_reason_cli.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_acceptance.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_activate.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cli.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cli_wiring.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_composition_merge.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cross_repo_atomic_apply.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cross_repo_perf_gate.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_cross_repo_rollback.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_driver_registry.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_introspection.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_multi_stack.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_object_encoding.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_perf_gates.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_python_driver.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_encoding.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_perf_gates.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_repo_state.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_tier_b_staging_discipline.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_trust_model.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_overlay_workspace_spec.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_pr_events.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_pr_merge_method.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_pr_merge_partial_failure.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_project_file_materialization.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_project_review_range_reconstruction.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_project_review_three_repo.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_propagation_contribution.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_propagation_daemon.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_propagation_state_machine.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_prune.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_push.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_repo_status_linked_worktree.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_repo_status_schema_version.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_repo_status_symlinked_git_dir.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_bind_from_range.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_bind_verify.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_close_gr.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_create_project_cli.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_ephemeral.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_run_rerun_and_refusal_receipt.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_review_verify_inside.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_rmtree_or_refuse.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_snapshot_id_prefix_resolution.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_spec_apply_event_outcomes.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_staging_cleanup.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_sync_event_outcomes.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_target.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_tmux_launch_runtime.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_abort.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_apply.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_apply_dry_run.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_manifest_schema.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_propose.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_unit_topological_apply.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_edit_lease_cap.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_identity_boundary.py +0 -0
- {gitgrip-1.5.1 → gitgrip-2.0.0a2}/tests/test_workspace_snapshot.py +0 -0
gitgrip-2.0.0a2/PKG-INFO
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gitgrip
|
|
3
|
+
Version: 2.0.0a2
|
|
4
|
+
Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: typer>=0.9
|
|
8
|
+
Requires-Dist: tomli_w>=1.0
|
|
9
|
+
Requires-Dist: pyyaml>=6.0
|
|
10
|
+
Requires-Dist: toml>=0.10
|
|
11
|
+
Requires-Dist: jsonschema>=4.18
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
14
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
15
|
+
|
|
16
|
+
# gr2
|
|
17
|
+
|
|
18
|
+
**gr2 is the workspace layer for multi-repo work.** One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust `gr` (1.x, called gr1 below); both ship from this repository, and `gr2` is the command for the workspace and the slice.
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
|
|
24
|
+
pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
|
|
25
|
+
gr2 --version
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`--pre` is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
|
|
29
|
+
|
|
30
|
+
The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
|
|
31
|
+
|
|
32
|
+
## First five minutes
|
|
33
|
+
|
|
34
|
+
Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say `~/ws/repo-a` and `~/ws/repo-b`.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cd ~/ws
|
|
38
|
+
gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
|
|
39
|
+
gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
|
|
40
|
+
gr2 workspace status ~/ws # what kind of workspace this is
|
|
41
|
+
gr2 store init ~/ws # the workspace snapshot store (needed before review)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
A **unit** is one worker — you, or one agent — and `default` is created for you. A **lane** is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
|
|
48
|
+
gr2 lane enter ~/ws default feat-x --actor human:you
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Both commands print, per repo, the absolute directory you work in:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
|
|
55
|
+
repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Edit there — not in your original clones. Stage and commit across the lane's repos:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
|
|
62
|
+
gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`commit` with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
69
|
+
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
|
|
70
|
+
gr2 lane current ~/ws default # where am I?
|
|
71
|
+
gr2 lane exit ~/ws default --actor human:you
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
75
|
+
|
|
76
|
+
## What works today, and what is not there yet
|
|
77
|
+
|
|
78
|
+
Alpha 2 is a working local workspace layer. Verified by running the walk above:
|
|
79
|
+
|
|
80
|
+
- `workspace` (init, materialize, status, migrate-gr1 from a gr1 gripspace), `lane` (create, enter, exit, current, lease), `store` (init, snapshot, log, diff, checkout), `exec run`, `repo status`, `sync status`, `review create-project`.
|
|
81
|
+
- Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
|
|
82
|
+
- A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
|
|
83
|
+
|
|
84
|
+
Not there yet:
|
|
85
|
+
|
|
86
|
+
- The full walk with **remote** PRs (`gr2 push`, `gr2 pr create`) is documented in `--help` but was not exercised in a clean environment for this README; treat those two as alpha.
|
|
87
|
+
- `gr2 --help` and some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.
|
|
88
|
+
- The Rust `gr` (gr1) still owns `spawn`, `fleet`, and `manifest` until their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
|
|
89
|
+
|
|
90
|
+
## Commands
|
|
91
|
+
|
|
92
|
+
| Group | Verbs |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
|
|
95
|
+
| `spec` | show, validate |
|
|
96
|
+
| `lane` | create, enter, exit, current, resolve, bind, lease |
|
|
97
|
+
| (top level) | branch, add, commit, push, prune |
|
|
98
|
+
| `sync` | status, run |
|
|
99
|
+
| `pr` | create, status, checks, merge |
|
|
100
|
+
| `review` | open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
|
|
101
|
+
| `exec` | status, run |
|
|
102
|
+
| `repo` | status, hooks, hook-run, projection-run |
|
|
103
|
+
| `store` | init, snapshot, log, diff, checkout |
|
|
104
|
+
| `target`, `config`, `plan`, `apply` | stored PR target; config overlays; show/apply the materialization plan |
|
|
105
|
+
|
|
106
|
+
## Overlay substrate
|
|
107
|
+
|
|
108
|
+
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
|
|
109
|
+
|
|
110
|
+
## Development
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pip install -e "gr2[dev]" # from the repository root
|
|
114
|
+
cd gr2 && pytest # the gr2 suite (tests + overlay tests)
|
|
115
|
+
cd gr2 && ruff check . # lint, same config as CI
|
|
116
|
+
```
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# gr2
|
|
2
|
+
|
|
3
|
+
**gr2 is the workspace layer for multi-repo work.** One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust `gr` (1.x, called gr1 below); both ship from this repository, and `gr2` is the command for the workspace and the slice.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
|
|
9
|
+
pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
|
|
10
|
+
gr2 --version
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
`--pre` is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
|
|
14
|
+
|
|
15
|
+
The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
|
|
16
|
+
|
|
17
|
+
## First five minutes
|
|
18
|
+
|
|
19
|
+
Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say `~/ws/repo-a` and `~/ws/repo-b`.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd ~/ws
|
|
23
|
+
gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
|
|
24
|
+
gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
|
|
25
|
+
gr2 workspace status ~/ws # what kind of workspace this is
|
|
26
|
+
gr2 store init ~/ws # the workspace snapshot store (needed before review)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
A **unit** is one worker — you, or one agent — and `default` is created for you. A **lane** is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
|
|
33
|
+
gr2 lane enter ~/ws default feat-x --actor human:you
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Both commands print, per repo, the absolute directory you work in:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
|
|
40
|
+
repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Edit there — not in your original clones. Stage and commit across the lane's repos:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
|
|
47
|
+
gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
`commit` with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
54
|
+
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
|
|
55
|
+
gr2 lane current ~/ws default # where am I?
|
|
56
|
+
gr2 lane exit ~/ws default --actor human:you
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
60
|
+
|
|
61
|
+
## What works today, and what is not there yet
|
|
62
|
+
|
|
63
|
+
Alpha 2 is a working local workspace layer. Verified by running the walk above:
|
|
64
|
+
|
|
65
|
+
- `workspace` (init, materialize, status, migrate-gr1 from a gr1 gripspace), `lane` (create, enter, exit, current, lease), `store` (init, snapshot, log, diff, checkout), `exec run`, `repo status`, `sync status`, `review create-project`.
|
|
66
|
+
- Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
|
|
67
|
+
- A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
|
|
68
|
+
|
|
69
|
+
Not there yet:
|
|
70
|
+
|
|
71
|
+
- The full walk with **remote** PRs (`gr2 push`, `gr2 pr create`) is documented in `--help` but was not exercised in a clean environment for this README; treat those two as alpha.
|
|
72
|
+
- `gr2 --help` and some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.
|
|
73
|
+
- The Rust `gr` (gr1) still owns `spawn`, `fleet`, and `manifest` until their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
|
|
74
|
+
|
|
75
|
+
## Commands
|
|
76
|
+
|
|
77
|
+
| Group | Verbs |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
|
|
80
|
+
| `spec` | show, validate |
|
|
81
|
+
| `lane` | create, enter, exit, current, resolve, bind, lease |
|
|
82
|
+
| (top level) | branch, add, commit, push, prune |
|
|
83
|
+
| `sync` | status, run |
|
|
84
|
+
| `pr` | create, status, checks, merge |
|
|
85
|
+
| `review` | open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
|
|
86
|
+
| `exec` | status, run |
|
|
87
|
+
| `repo` | status, hooks, hook-run, projection-run |
|
|
88
|
+
| `store` | init, snapshot, log, diff, checkout |
|
|
89
|
+
| `target`, `config`, `plan`, `apply` | stored PR target; config overlays; show/apply the materialization plan |
|
|
90
|
+
|
|
91
|
+
## Overlay substrate
|
|
92
|
+
|
|
93
|
+
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
|
|
94
|
+
|
|
95
|
+
## Development
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
pip install -e "gr2[dev]" # from the repository root
|
|
99
|
+
cd gr2 && pytest # the gr2 suite (tests + overlay tests)
|
|
100
|
+
cd gr2 && ruff check . # lint, same config as CI
|
|
101
|
+
```
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: gitgrip
|
|
3
|
+
Version: 2.0.0a2
|
|
4
|
+
Summary: Workspace layer for multi-repo work: workspaces, isolated lanes, and one grouped review per slice
|
|
5
|
+
Requires-Python: >=3.11
|
|
6
|
+
Description-Content-Type: text/markdown
|
|
7
|
+
Requires-Dist: typer>=0.9
|
|
8
|
+
Requires-Dist: tomli_w>=1.0
|
|
9
|
+
Requires-Dist: pyyaml>=6.0
|
|
10
|
+
Requires-Dist: toml>=0.10
|
|
11
|
+
Requires-Dist: jsonschema>=4.18
|
|
12
|
+
Provides-Extra: dev
|
|
13
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
14
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
15
|
+
|
|
16
|
+
# gr2
|
|
17
|
+
|
|
18
|
+
**gr2 is the workspace layer for multi-repo work.** One repository is just git; when a change spans repositories — a feature slice, a release, several agents touching several repos — gr2 gives you a workspace over them, isolated lanes to work in, and one grouped review/PR set for the slice. It is the Python successor to the Rust `gr` (1.x, called gr1 below); both ship from this repository, and `gr2` is the command for the workspace and the slice.
|
|
19
|
+
|
|
20
|
+
## Install
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
python3 -m venv ~/gr2-venv && source ~/gr2-venv/bin/activate
|
|
24
|
+
pip install --pre gitgrip # the PyPI package is "gitgrip"; the command is "gr2"
|
|
25
|
+
gr2 --version
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`--pre` is required while 2.x is an alpha — without it pip installs 1.5.1, which is gr1. To run unreleased development code instead, install from a checkout: `pip install -e gr2/` from the repository root.
|
|
29
|
+
|
|
30
|
+
The Rust `gr` (gr1, 1.x) installs with `brew install synapt-dev/tap/gitgrip` or `cargo install gitgrip`. The two do not collide; you can have both installed.
|
|
31
|
+
|
|
32
|
+
## First five minutes
|
|
33
|
+
|
|
34
|
+
Every command below was run, in this order, in a clean virtualenv against a throwaway workspace of two repositories. Put two clones side by side in one folder, say `~/ws/repo-a` and `~/ws/repo-b`.
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
cd ~/ws
|
|
38
|
+
gr2 workspace init ~/ws # scans the folder; writes .grip/workspace_spec.toml
|
|
39
|
+
gr2 workspace materialize ~/ws --yes # builds the .grip layout and a default unit
|
|
40
|
+
gr2 workspace status ~/ws # what kind of workspace this is
|
|
41
|
+
gr2 store init ~/ws # the workspace snapshot store (needed before review)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
A **unit** is one worker — you, or one agent — and `default` is created for you. A **lane** is one piece of work spanning repos, with its own clones, so two lanes never step on each other:
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
gr2 lane create ~/ws default feat-x --repos repo-a,repo-b --branch feat/x
|
|
48
|
+
gr2 lane enter ~/ws default feat-x --actor human:you
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Both commands print, per repo, the absolute directory you work in:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
repo-a: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
|
|
55
|
+
repo-b: ~/ws/.grip/state/lanes/default/feat-x/repos/repo-b
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Edit there — not in your original clones. Stage and commit across the lane's repos:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
gr2 add . --repo-path ~/ws/.grip/state/lanes/default/feat-x/repos/repo-a
|
|
62
|
+
gr2 commit -m "my change" --workspace-root ~/ws --owner-unit default
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`commit` with the lane flags commits every lane repo that has staged changes and names the repos it skipped. If every repo was skipped it exits non-zero with one sentence naming where it looked — and, when it can see them, where your staged changes actually are. Run one command across every lane repo, then turn the lane into one reviewable object:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
gr2 exec run ~/ws default --actor human:you -- pytest -q # one command, every lane repo
|
|
69
|
+
gr2 review create-project ~/ws default feat-x # prints gr:<sha>: one object to review
|
|
70
|
+
gr2 lane current ~/ws default # where am I?
|
|
71
|
+
gr2 lane exit ~/ws default --actor human:you
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`exec run` and `lane exit` require `--actor`. Every group and verb takes `--help`; `gr2 --help` lists them all.
|
|
75
|
+
|
|
76
|
+
## What works today, and what is not there yet
|
|
77
|
+
|
|
78
|
+
Alpha 2 is a working local workspace layer. Verified by running the walk above:
|
|
79
|
+
|
|
80
|
+
- `workspace` (init, materialize, status, migrate-gr1 from a gr1 gripspace), `lane` (create, enter, exit, current, lease), `store` (init, snapshot, log, diff, checkout), `exec run`, `repo status`, `sync status`, `review create-project`.
|
|
81
|
+
- Lanes are independent clones: two lanes, or two agents, never share refs, an index, or a working tree.
|
|
82
|
+
- A lane commit that commits nothing anywhere refuses loudly instead of reporting success.
|
|
83
|
+
|
|
84
|
+
Not there yet:
|
|
85
|
+
|
|
86
|
+
- The full walk with **remote** PRs (`gr2 push`, `gr2 pr create`) is documented in `--help` but was not exercised in a clean environment for this README; treat those two as alpha.
|
|
87
|
+
- `gr2 --help` and some verb output still say "prototype" in places; the wording is being cleaned up as verbs land.
|
|
88
|
+
- The Rust `gr` (gr1) still owns `spawn`, `fleet`, and `manifest` until their gr2 ports land. Everything else — workspace sync, lanes, the multi-repo slice, its review — is gr2's job; if a verb is missing or wrong there, that is a bug worth reporting, not a reason to reach for gr1.
|
|
89
|
+
|
|
90
|
+
## Commands
|
|
91
|
+
|
|
92
|
+
| Group | Verbs |
|
|
93
|
+
|---|---|
|
|
94
|
+
| `workspace` | init, init-from-topology, materialize, status, convert-clone, detect-gr1, migrate-gr1, migrate-lane-state, bootstrap-gr1 |
|
|
95
|
+
| `spec` | show, validate |
|
|
96
|
+
| `lane` | create, enter, exit, current, resolve, bind, lease |
|
|
97
|
+
| (top level) | branch, add, commit, push, prune |
|
|
98
|
+
| `sync` | status, run |
|
|
99
|
+
| `pr` | create, status, checks, merge |
|
|
100
|
+
| `review` | open, close, checkout-pr, run, requirements, bind, verify, rebind, create-project |
|
|
101
|
+
| `exec` | status, run |
|
|
102
|
+
| `repo` | status, hooks, hook-run, projection-run |
|
|
103
|
+
| `store` | init, snapshot, log, diff, checkout |
|
|
104
|
+
| `target`, `config`, `plan`, `apply` | stored PR target; config overlays; show/apply the materialization plan |
|
|
105
|
+
|
|
106
|
+
## Overlay substrate
|
|
107
|
+
|
|
108
|
+
gr2 also carries the config-overlay substrate (capture, compose, and materialize configuration layers over a workspace): see [docs/OVERLAY-SUBSTRATE.md](docs/OVERLAY-SUBSTRATE.md).
|
|
109
|
+
|
|
110
|
+
## Development
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
pip install -e "gr2[dev]" # from the repository root
|
|
114
|
+
cd gr2 && pytest # the gr2 suite (tests + overlay tests)
|
|
115
|
+
cd gr2 && ruff check . # lint, same config as CI
|
|
116
|
+
```
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
MANIFEST.in
|
|
2
1
|
README.md
|
|
3
|
-
VERSION
|
|
4
2
|
pyproject.toml
|
|
5
|
-
_build/backend.py
|
|
6
|
-
_build/version_from_cargo.py
|
|
7
|
-
_build/__pycache__/backend.cpython-311.pyc
|
|
8
|
-
_build/__pycache__/version_from_cargo.cpython-311.pyc
|
|
9
3
|
gitgrip.egg-info/PKG-INFO
|
|
10
4
|
gitgrip.egg-info/SOURCES.txt
|
|
11
5
|
gitgrip.egg-info/dependency_links.txt
|
|
@@ -66,6 +60,7 @@ python_cli/events.py
|
|
|
66
60
|
python_cli/execops.py
|
|
67
61
|
python_cli/failures.py
|
|
68
62
|
python_cli/file_exec.py
|
|
63
|
+
python_cli/git_review.py
|
|
69
64
|
python_cli/gitops.py
|
|
70
65
|
python_cli/grip.py
|
|
71
66
|
python_cli/grip_cli.py
|
|
@@ -80,8 +75,11 @@ python_cli/project_review.py
|
|
|
80
75
|
python_cli/prune.py
|
|
81
76
|
python_cli/push.py
|
|
82
77
|
python_cli/review.py
|
|
78
|
+
python_cli/review_dispatch.py
|
|
83
79
|
python_cli/review_ephemeral.py
|
|
80
|
+
python_cli/review_rebind.py
|
|
84
81
|
python_cli/review_run.py
|
|
82
|
+
python_cli/review_runners.py
|
|
85
83
|
python_cli/spec_apply.py
|
|
86
84
|
python_cli/staging_cleanup.py
|
|
87
85
|
python_cli/syncops.py
|
|
@@ -97,6 +95,7 @@ tests/test_clone_materialization.py
|
|
|
97
95
|
tests/test_commit.py
|
|
98
96
|
tests/test_config_base_path_guard.py
|
|
99
97
|
tests/test_config_overlay.py
|
|
98
|
+
tests/test_conftest_git_isolation.py
|
|
100
99
|
tests/test_contribution_protocol.py
|
|
101
100
|
tests/test_ensure_lane_checkout_reference_clone.py
|
|
102
101
|
tests/test_env_materialization.py
|
|
@@ -104,8 +103,12 @@ tests/test_event_log_integrity.py
|
|
|
104
103
|
tests/test_event_outcome_policy.py
|
|
105
104
|
tests/test_events.py
|
|
106
105
|
tests/test_events_torn_line.py
|
|
106
|
+
tests/test_exec_apostrophe_and_oserror.py
|
|
107
|
+
tests/test_exec_single_string_and_materialize_plan.py
|
|
107
108
|
tests/test_execops.py
|
|
108
109
|
tests/test_failure_event_outcome.py
|
|
110
|
+
tests/test_foreground_launch_runtime.py
|
|
111
|
+
tests/test_git_review.py
|
|
109
112
|
tests/test_gr2_packaging.py
|
|
110
113
|
tests/test_gr2_review_receipt.py
|
|
111
114
|
tests/test_grip_cli.py
|
|
@@ -118,6 +121,7 @@ tests/test_jsonl_store.py
|
|
|
118
121
|
tests/test_lane_create_fork_base_cli.py
|
|
119
122
|
tests/test_lane_lease_show_json.py
|
|
120
123
|
tests/test_lane_lifecycle_safety.py
|
|
124
|
+
tests/test_lane_repo_paths_and_all_skipped.py
|
|
121
125
|
tests/test_lane_toml_serialization.py
|
|
122
126
|
tests/test_launch_primitive.py
|
|
123
127
|
tests/test_m2_overlay_hindsight.py
|
|
@@ -158,11 +162,13 @@ tests/test_pr_merge_partial_failure.py
|
|
|
158
162
|
tests/test_project_file_materialization.py
|
|
159
163
|
tests/test_project_review_range_reconstruction.py
|
|
160
164
|
tests/test_project_review_three_repo.py
|
|
165
|
+
tests/test_projection_tracked_dest.py
|
|
161
166
|
tests/test_propagation_contribution.py
|
|
162
167
|
tests/test_propagation_daemon.py
|
|
163
168
|
tests/test_propagation_state_machine.py
|
|
164
169
|
tests/test_prune.py
|
|
165
170
|
tests/test_push.py
|
|
171
|
+
tests/test_readme_verbs_exist.py
|
|
166
172
|
tests/test_repo_status_linked_worktree.py
|
|
167
173
|
tests/test_repo_status_schema_version.py
|
|
168
174
|
tests/test_repo_status_symlinked_git_dir.py
|
|
@@ -172,19 +178,28 @@ tests/test_review_bind_verify.py
|
|
|
172
178
|
tests/test_review_cli.py
|
|
173
179
|
tests/test_review_close_gr.py
|
|
174
180
|
tests/test_review_create_project_cli.py
|
|
181
|
+
tests/test_review_dispatch.py
|
|
175
182
|
tests/test_review_ephemeral.py
|
|
176
183
|
tests/test_review_open_lane.py
|
|
184
|
+
tests/test_review_rebind.py
|
|
177
185
|
tests/test_review_run.py
|
|
178
186
|
tests/test_review_run_import_isolation.py
|
|
179
187
|
tests/test_review_run_rerun_and_refusal_receipt.py
|
|
188
|
+
tests/test_review_runners.py
|
|
180
189
|
tests/test_review_verify_inside.py
|
|
181
190
|
tests/test_rmtree_or_refuse.py
|
|
191
|
+
tests/test_single_repo_cwd_refusal.py
|
|
182
192
|
tests/test_snapshot_id_prefix_resolution.py
|
|
183
193
|
tests/test_spec_apply_event_outcomes.py
|
|
184
194
|
tests/test_sprint21_sync_platform.py
|
|
185
195
|
tests/test_staging_cleanup.py
|
|
196
|
+
tests/test_store_verb_rename.py
|
|
186
197
|
tests/test_sync_event_outcomes.py
|
|
198
|
+
tests/test_sync_fast_forward.py
|
|
187
199
|
tests/test_sync_fetch.py
|
|
200
|
+
tests/test_sync_seed_local.py
|
|
201
|
+
tests/test_sync_ssh_rewrite.py
|
|
202
|
+
tests/test_sync_status_probe.py
|
|
188
203
|
tests/test_target.py
|
|
189
204
|
tests/test_tmux_launch_runtime.py
|
|
190
205
|
tests/test_unit_abort.py
|
|
@@ -193,9 +208,10 @@ tests/test_unit_apply_dry_run.py
|
|
|
193
208
|
tests/test_unit_manifest_schema.py
|
|
194
209
|
tests/test_unit_propose.py
|
|
195
210
|
tests/test_unit_topological_apply.py
|
|
196
|
-
tests/
|
|
211
|
+
tests/test_version_static.py
|
|
197
212
|
tests/test_workspace_convert_clone.py
|
|
198
213
|
tests/test_workspace_edit_lease_cap.py
|
|
199
214
|
tests/test_workspace_identity_boundary.py
|
|
200
215
|
tests/test_workspace_init_from_topology.py
|
|
216
|
+
tests/test_workspace_init_local_repos.py
|
|
201
217
|
tests/test_workspace_snapshot.py
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"""gr2 overlay substrate: config-overlay capture, composition, and materialization.
|
|
2
|
+
|
|
3
|
+
M1 scope: Tier A only (config files), eager materialization, trust-gated.
|
|
4
|
+
|
|
5
|
+
The distribution version is single-sourced from the package metadata (the static
|
|
6
|
+
number in gr2/pyproject.toml); this module carries no ``__version__`` literal so a
|
|
7
|
+
stale third number cannot drift here. Read it with
|
|
8
|
+
``importlib.metadata.version("gitgrip")`` or ``gr2 --version``.
|
|
9
|
+
"""
|
|
@@ -8,6 +8,7 @@ import json
|
|
|
8
8
|
import multiprocessing
|
|
9
9
|
import os
|
|
10
10
|
import subprocess
|
|
11
|
+
import sys
|
|
11
12
|
import tempfile
|
|
12
13
|
from pathlib import Path
|
|
13
14
|
|
|
@@ -65,7 +66,7 @@ repos = ["app"]
|
|
|
65
66
|
def create_lane(root: Path, workspace_root: Path) -> None:
|
|
66
67
|
run(
|
|
67
68
|
[
|
|
68
|
-
|
|
69
|
+
sys.executable,
|
|
69
70
|
str(lane_proto(root)),
|
|
70
71
|
"create-lane",
|
|
71
72
|
str(workspace_root),
|
|
@@ -88,7 +89,7 @@ def worker(workspace_root: str, actor: str, queue, disable_locking: bool) -> Non
|
|
|
88
89
|
env["GR2_LEASE_TEST_DELAY"] = "0.02"
|
|
89
90
|
proc = run(
|
|
90
91
|
[
|
|
91
|
-
|
|
92
|
+
sys.executable,
|
|
92
93
|
str(lane_proto(root)),
|
|
93
94
|
"acquire-lane-lease",
|
|
94
95
|
workspace_root,
|
|
@@ -154,7 +155,7 @@ def release_all(root: Path, workspace_root: Path, disable_locking: bool) -> None
|
|
|
154
155
|
for actor in ("worker:a", "worker:b"):
|
|
155
156
|
run(
|
|
156
157
|
[
|
|
157
|
-
|
|
158
|
+
sys.executable,
|
|
158
159
|
str(lane_proto(root)),
|
|
159
160
|
"release-lane-lease",
|
|
160
161
|
str(workspace_root),
|
|
@@ -8,6 +8,7 @@ import json
|
|
|
8
8
|
import multiprocessing
|
|
9
9
|
import os
|
|
10
10
|
import subprocess
|
|
11
|
+
import sys
|
|
11
12
|
import tempfile
|
|
12
13
|
from pathlib import Path
|
|
13
14
|
|
|
@@ -65,7 +66,7 @@ repos = ["app"]
|
|
|
65
66
|
for unit, lane in (("atlas", "lane-a"), ("apollo", "lane-b")):
|
|
66
67
|
result = _run(
|
|
67
68
|
[
|
|
68
|
-
|
|
69
|
+
sys.executable,
|
|
69
70
|
str(lane_proto(root)),
|
|
70
71
|
"create-lane",
|
|
71
72
|
str(workspace_root),
|
|
@@ -100,7 +101,7 @@ def _acquire_worker(
|
|
|
100
101
|
env["GR2_LEASE_TEST_DELAY"] = "0.04"
|
|
101
102
|
result = _run(
|
|
102
103
|
[
|
|
103
|
-
|
|
104
|
+
sys.executable,
|
|
104
105
|
str(lane_proto(repo_root())),
|
|
105
106
|
"acquire-lane-lease",
|
|
106
107
|
workspace_root,
|
|
@@ -190,7 +191,7 @@ def sequential_control() -> dict[str, object]:
|
|
|
190
191
|
outcomes.append(
|
|
191
192
|
_run(
|
|
192
193
|
[
|
|
193
|
-
|
|
194
|
+
sys.executable,
|
|
194
195
|
str(lane_proto(repo_root())),
|
|
195
196
|
"acquire-lane-lease",
|
|
196
197
|
str(workspace_root),
|