code_ownership 2.1.1 → 2.1.3
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.
- checksums.yaml +4 -4
- data/.cargo/config +2 -2
- data/Cargo.lock +9 -2
- data/README.md +8 -8
- data/ext/cargo-vendor/codeowners-0.3.3/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/codeowners-0.3.3/.github/CODEOWNERS +1 -0
- data/ext/cargo-vendor/codeowners-0.3.3/AGENTS.md +38 -0
- data/ext/cargo-vendor/codeowners-0.3.3/CLAUDE.md +1 -0
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/Cargo.lock +8 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/Cargo.toml +18 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/README.md +11 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cli.rs +9 -5
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/config.rs +81 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/crosscheck.rs +5 -8
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/codeowners_file_parser.rs +3 -3
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/file_generator.rs +119 -9
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/file_owner_resolver.rs +3 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/package_mapper.rs +2 -2
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper.rs +2 -2
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/validator.rs +84 -17
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership.rs +1 -0
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/project.rs +3 -0
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/project_builder.rs +111 -44
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/runner/api.rs +7 -6
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/runner/types.rs +2 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/runner.rs +67 -16
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/tracked_files.rs +29 -1
- data/ext/cargo-vendor/codeowners-0.3.3/tests/codeowners_path_test.rs +92 -0
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/common/mod.rs +2 -1
- data/ext/cargo-vendor/codeowners-0.3.3/tests/executable_name_config_test.rs +88 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/config/code_ownership.yml +11 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/config/teams/test_team.yml +6 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/docs/CODEOWNERS +14 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/expected/CODEOWNERS +14 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/ruby/app/models/test.rb +3 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/.github/CODEOWNERS +10 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/app/foo.rb +3 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/config/code_ownership.yml +4 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/config/teams/foo.yml +5 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/config/teams/payments.yml +6 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/ruby/app/payments/foo.rb +4 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/.github/CODEOWNERS +11 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/app/bar.rb +3 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/config/code_ownership.yml +5 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/config/teams/bar.yml +5 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/.github/CODEOWNERS +10 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/code_ownership.yml +10 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/teams/bad_team.yml +1 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/teams/good.yml +3 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/valid_project/gems/pets/dog.rb +5 -0
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/git_stage_test.rs +4 -1
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/invalid_project_test.rs +30 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/missing_github_team_test.rs +23 -0
- data/ext/cargo-vendor/codeowners-0.3.3/tests/run_config_executable_override_test.rs +98 -0
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/runner_api.rs +8 -4
- data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/valid_project_test.rs +3 -3
- data/ext/cargo-vendor/codeowners-0.3.3/tests/validate_files_test.rs +378 -0
- data/ext/cargo-vendor/similar-2.7.0/.cargo/config.toml +2 -0
- data/ext/cargo-vendor/similar-2.7.0/.cargo-checksum.json +1 -0
- data/ext/cargo-vendor/similar-2.7.0/.cargo_vcs_info.json +6 -0
- data/ext/cargo-vendor/similar-2.7.0/.github/FUNDING.yml +1 -0
- data/ext/cargo-vendor/similar-2.7.0/.github/workflows/clippy.yml +16 -0
- data/ext/cargo-vendor/similar-2.7.0/.github/workflows/rustfmt.yml +16 -0
- data/ext/cargo-vendor/similar-2.7.0/.github/workflows/tests.yml +49 -0
- data/ext/cargo-vendor/similar-2.7.0/.vscode/settings.json +5 -0
- data/ext/cargo-vendor/similar-2.7.0/CHANGELOG.md +132 -0
- data/ext/cargo-vendor/similar-2.7.0/Cargo.lock +373 -0
- data/ext/cargo-vendor/similar-2.7.0/Cargo.lock.msrv +266 -0
- data/ext/cargo-vendor/similar-2.7.0/Cargo.toml +149 -0
- data/ext/cargo-vendor/similar-2.7.0/Cargo.toml.orig +73 -0
- data/ext/cargo-vendor/similar-2.7.0/LICENSE +201 -0
- data/ext/cargo-vendor/similar-2.7.0/Makefile +31 -0
- data/ext/cargo-vendor/similar-2.7.0/README.md +59 -0
- data/ext/cargo-vendor/similar-2.7.0/clippy.toml +1 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/close-matches.rs +15 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/large.rs +8 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/nonstring.rs +13 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/original-slices.rs +11 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/patience.rs +48 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/serde.rs +15 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/terminal-inline.rs +60 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/terminal.rs +20 -0
- data/ext/cargo-vendor/similar-2.7.0/examples/udiff.rs +24 -0
- data/ext/cargo-vendor/similar-2.7.0/scripts/wasmtime-wrapper.sh +4 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/capture.rs +117 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/compact.rs +351 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/hook.rs +178 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/lcs.rs +294 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/mod.rs +134 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/myers.rs +442 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/patience.rs +198 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/replace.rs +221 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__capture__capture_hook_grouping-2.snap +60 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__capture__capture_hook_grouping.snap +64 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__contiguous.snap +28 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__diff.snap +22 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__pat.snap +31 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__same.snap +12 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__contiguous.snap +28 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__deadline_reached.snap +22 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__diff.snap +22 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__pat.snap +31 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__patience__patience.snap +45 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__patience__patience_out_of_bounds_bug.snap +16 -0
- data/ext/cargo-vendor/similar-2.7.0/src/algorithms/utils.rs +379 -0
- data/ext/cargo-vendor/similar-2.7.0/src/common.rs +185 -0
- data/ext/cargo-vendor/similar-2.7.0/src/deadline_support.rs +37 -0
- data/ext/cargo-vendor/similar-2.7.0/src/iter.rs +195 -0
- data/ext/cargo-vendor/similar-2.7.0/src/lib.rs +176 -0
- data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff.snap +25 -0
- data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff_newline_hint-2.snap +10 -0
- data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff_newline_hint.snap +11 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/abstraction.rs +446 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/inline.rs +342 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/mod.rs +792 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__captured_ops.snap +22 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__captured_word_ops.snap +202 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__char_diff.snap +39 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__inline__line_ops_inline.snap +126 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__inline__serde.snap +107 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__lifetimes_on_iter.snap +42 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__line_ops.snap +42 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__serde.snap +55 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__serde_ops.snap +38 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__unified_diff.snap +12 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__virtual_newlines.snap +32 -0
- data/ext/cargo-vendor/similar-2.7.0/src/text/utils.rs +55 -0
- data/ext/cargo-vendor/similar-2.7.0/src/types.rs +502 -0
- data/ext/cargo-vendor/similar-2.7.0/src/udiff.rs +359 -0
- data/ext/cargo-vendor/similar-2.7.0/src/utils.rs +412 -0
- data/ext/cargo-vendor/unicode-ident-1.0.19/.cargo-checksum.json +1 -1
- data/ext/code_ownership/Cargo.toml +1 -1
- data/ext/code_ownership/src/lib.rs +2 -2
- data/lib/code_ownership/private/file_path_finder.rb +19 -3
- data/lib/code_ownership/private/team_finder.rb +1 -2
- data/lib/code_ownership/version.rb +1 -1
- data/lib/code_ownership.rb +2 -0
- metadata +252 -152
- data/ext/cargo-vendor/codeowners-0.3.0/.cargo-checksum.json +0 -1
- data/ext/cargo-vendor/codeowners-0.3.0/tests/validate_files_test.rs +0 -144
- data/ext/cargo-vendor/unicode-ident-1.0.19/tests/fst/.gitignore +0 -1
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.github/workflows/audit.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.github/workflows/ci.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.github/workflows/dotslash-config.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.rustfmt.toml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.rusty-hook.toml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/dev/run_benchmarks_for_file.sh +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/dev/run_benchmarks_for_gv.sh +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/rust-toolchain.toml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cache/file.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cache/mod.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cache/noop.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/common_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/lib.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/main.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/codeowners_query.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/file_owner_finder.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/annotated_file_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/directory_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/escaper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/team_gem_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/team_glob_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/team_yml_mapper.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/path_utils.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/project_file_builder.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/cache_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/crosscheck_owners_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/code_ownership.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/teams/payments.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/teams/payroll.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/bank_account.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/blockchain.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/payments/nacha.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/services/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/unowned.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/.keep +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/code_ownership.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/teams/design.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/teams/frontend.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/src/index.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/src/button.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0/tests/fixtures/valid_project → codeowners-0.3.3/tests/fixtures/missing_github_team}/gems/pets/dog.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/deep/nesting/nestdir/deep_file.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/exciting/some_other_file.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/teams/bar.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/teams/foo.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/.ignore +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/code_ownership.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/payments.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/payroll.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/ux.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/item.ts +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/models/bank_account.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/models/payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/foo/ownedby_payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/nacha.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payroll/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payroll/payroll.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/edit.erb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/index.html.erb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/new.html.erb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/should_be_ignored/an_ignored_file.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/code_ownership.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/giants.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/package.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/src/picks/dp.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/package.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/src/item.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/package.json +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/field.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/fields/small.tsx +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/apollo/lib/apollo.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/ivy/lib/ivy.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/lager/lib/lager.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/summit/lib/summit.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/games/app/services/stats.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/games/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/locations/app/services/capacity.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/locations/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/schedule/app/services/date.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/lib/util.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/services/play.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/.codeowner +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/db/price.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/entertainment.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/play.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/giants/services/play.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/rockies/services/play.rb +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/invalid_project_structure_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/multiple_directory_owners_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/untracked_files_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/valid_project_with_overrides_test.rs +0 -0
- /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tmp/.gitkeep +0 -0
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
use std::
|
|
1
|
+
use std::path::{Path, PathBuf};
|
|
2
|
+
use std::process::Command;
|
|
2
3
|
|
|
3
4
|
use error_stack::{Result, ResultExt};
|
|
5
|
+
use fast_glob::glob_match;
|
|
4
6
|
use serde::Serialize;
|
|
5
7
|
|
|
6
8
|
use crate::{
|
|
@@ -20,6 +22,7 @@ pub struct Runner {
|
|
|
20
22
|
ownership: Ownership,
|
|
21
23
|
cache: Cache,
|
|
22
24
|
config: Config,
|
|
25
|
+
codeowners_file_path: PathBuf,
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
pub fn version() -> String {
|
|
@@ -36,7 +39,7 @@ where
|
|
|
36
39
|
Ok(runner) => runner,
|
|
37
40
|
Err(err) => {
|
|
38
41
|
return RunResult {
|
|
39
|
-
io_errors: vec![err
|
|
42
|
+
io_errors: vec![format!("{:?}", err)],
|
|
40
43
|
..Default::default()
|
|
41
44
|
};
|
|
42
45
|
}
|
|
@@ -44,15 +47,41 @@ where
|
|
|
44
47
|
runnable(runner)
|
|
45
48
|
}
|
|
46
49
|
|
|
47
|
-
pub(crate) fn
|
|
48
|
-
match crate::config::Config::load_from_path(
|
|
49
|
-
Ok(c) =>
|
|
50
|
+
pub(crate) fn config_from_run_config(run_config: &RunConfig) -> Result<Config, Error> {
|
|
51
|
+
match crate::config::Config::load_from_path(&run_config.config_path) {
|
|
52
|
+
Ok(mut c) => {
|
|
53
|
+
if let Some(executable_name) = &run_config.executable_name {
|
|
54
|
+
c.executable_name = executable_name.clone();
|
|
55
|
+
}
|
|
56
|
+
Ok(c)
|
|
57
|
+
}
|
|
50
58
|
Err(msg) => Err(error_stack::Report::new(Error::Io(msg))),
|
|
51
59
|
}
|
|
52
60
|
}
|
|
61
|
+
|
|
62
|
+
/// Resolves the CODEOWNERS file path with the following priority:
|
|
63
|
+
/// 1. Explicit `codeowners_file_path` in `RunConfig` (if provided from e.g. CLI flag)
|
|
64
|
+
/// 2. `CODEOWNERS_PATH` environment variable (if set and not empty)
|
|
65
|
+
/// 3. Computed from `codeowners_path` directory path in config + "CODEOWNERS" filename
|
|
66
|
+
/// 4. Default fallback to `.github/CODEOWNERS` (using default codeowners_path from config)
|
|
67
|
+
pub(crate) fn resolve_codeowners_file_path(run_config: &RunConfig, config: &Config) -> PathBuf {
|
|
68
|
+
if let Some(ref path) = run_config.codeowners_file_path {
|
|
69
|
+
return path.clone();
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if let Ok(env_path) = std::env::var("CODEOWNERS_PATH")
|
|
73
|
+
&& !env_path.is_empty()
|
|
74
|
+
{
|
|
75
|
+
return run_config.project_root.join(env_path);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
run_config.project_root.join(&config.codeowners_path).join("CODEOWNERS")
|
|
79
|
+
}
|
|
80
|
+
|
|
53
81
|
impl Runner {
|
|
54
82
|
pub fn new(run_config: &RunConfig) -> Result<Self, Error> {
|
|
55
|
-
let config =
|
|
83
|
+
let config = config_from_run_config(run_config)?;
|
|
84
|
+
let codeowners_file_path = resolve_codeowners_file_path(run_config, &config);
|
|
56
85
|
|
|
57
86
|
let cache: Cache = if run_config.no_cache {
|
|
58
87
|
NoopCache::default().into()
|
|
@@ -66,12 +95,7 @@ impl Runner {
|
|
|
66
95
|
.into()
|
|
67
96
|
};
|
|
68
97
|
|
|
69
|
-
let mut project_builder = ProjectBuilder::new(
|
|
70
|
-
&config,
|
|
71
|
-
run_config.project_root.clone(),
|
|
72
|
-
run_config.codeowners_file_path.clone(),
|
|
73
|
-
&cache,
|
|
74
|
-
);
|
|
98
|
+
let mut project_builder = ProjectBuilder::new(&config, run_config.project_root.clone(), codeowners_file_path.clone(), &cache);
|
|
75
99
|
let project = project_builder.build().change_context(Error::Io(format!(
|
|
76
100
|
"Can't build project: {}",
|
|
77
101
|
&run_config.config_path.to_string_lossy()
|
|
@@ -88,6 +112,7 @@ impl Runner {
|
|
|
88
112
|
ownership,
|
|
89
113
|
cache,
|
|
90
114
|
config,
|
|
115
|
+
codeowners_file_path,
|
|
91
116
|
})
|
|
92
117
|
}
|
|
93
118
|
|
|
@@ -113,7 +138,25 @@ impl Runner {
|
|
|
113
138
|
let mut unowned_files = Vec::new();
|
|
114
139
|
let mut io_errors = Vec::new();
|
|
115
140
|
|
|
116
|
-
|
|
141
|
+
// Filter files based on owned_globs and unowned_globs configuration
|
|
142
|
+
// Only validate files that match owned_globs and don't match unowned_globs
|
|
143
|
+
let filtered_paths: Vec<String> = file_paths
|
|
144
|
+
.into_iter()
|
|
145
|
+
.filter(|file_path| {
|
|
146
|
+
// Convert to relative path for glob matching
|
|
147
|
+
let path = Path::new(file_path);
|
|
148
|
+
let relative_path = if path.is_absolute() {
|
|
149
|
+
path.strip_prefix(&self.run_config.project_root).unwrap_or(path)
|
|
150
|
+
} else {
|
|
151
|
+
path
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
// Mirror the filtering applied by ProjectBuilder when walking the project
|
|
155
|
+
matches_globs(relative_path, &self.config.owned_globs) && !matches_globs(relative_path, &self.config.unowned_globs)
|
|
156
|
+
})
|
|
157
|
+
.collect();
|
|
158
|
+
|
|
159
|
+
for file_path in filtered_paths {
|
|
117
160
|
match team_for_file_from_codeowners(&self.run_config, &file_path) {
|
|
118
161
|
Ok(Some(_)) => {}
|
|
119
162
|
Ok(None) => unowned_files.push(file_path),
|
|
@@ -145,10 +188,10 @@ impl Runner {
|
|
|
145
188
|
|
|
146
189
|
pub fn generate(&self, git_stage: bool) -> RunResult {
|
|
147
190
|
let content = self.ownership.generate_file();
|
|
148
|
-
if let Some(parent) = &self.
|
|
191
|
+
if let Some(parent) = &self.codeowners_file_path.parent() {
|
|
149
192
|
let _ = std::fs::create_dir_all(parent);
|
|
150
193
|
}
|
|
151
|
-
match std::fs::write(&self.
|
|
194
|
+
match std::fs::write(&self.codeowners_file_path, content) {
|
|
152
195
|
Ok(_) => {
|
|
153
196
|
if git_stage {
|
|
154
197
|
self.git_stage();
|
|
@@ -173,7 +216,7 @@ impl Runner {
|
|
|
173
216
|
fn git_stage(&self) {
|
|
174
217
|
let _ = Command::new("git")
|
|
175
218
|
.arg("add")
|
|
176
|
-
.arg(&self.
|
|
219
|
+
.arg(&self.codeowners_file_path)
|
|
177
220
|
.current_dir(&self.run_config.project_root)
|
|
178
221
|
.output();
|
|
179
222
|
}
|
|
@@ -389,6 +432,14 @@ impl RunResult {
|
|
|
389
432
|
}
|
|
390
433
|
}
|
|
391
434
|
|
|
435
|
+
/// Returns true if `path` matches any of the provided glob patterns.
|
|
436
|
+
fn matches_globs(path: &Path, globs: &[String]) -> bool {
|
|
437
|
+
match path.to_str() {
|
|
438
|
+
Some(s) => globs.iter().any(|glob| glob_match(glob, s)),
|
|
439
|
+
None => false,
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
392
443
|
#[cfg(test)]
|
|
393
444
|
mod tests {
|
|
394
445
|
use super::*;
|
|
@@ -6,7 +6,7 @@ use std::{
|
|
|
6
6
|
|
|
7
7
|
pub(crate) fn find_tracked_files(base_path: &Path) -> Option<HashMap<PathBuf, bool>> {
|
|
8
8
|
let output = Command::new("git")
|
|
9
|
-
.args(["ls-files", "
|
|
9
|
+
.args(["ls-files", "-z", "--", "."])
|
|
10
10
|
.current_dir(base_path)
|
|
11
11
|
.output()
|
|
12
12
|
.ok()?;
|
|
@@ -55,4 +55,32 @@ mod tests {
|
|
|
55
55
|
assert!(tracked.len() == 1);
|
|
56
56
|
assert!(tracked.get(&tmp_dir.path().join("test.txt")).unwrap());
|
|
57
57
|
}
|
|
58
|
+
|
|
59
|
+
#[test]
|
|
60
|
+
fn test_tracked_files_from_subdirectory() {
|
|
61
|
+
let tmp_dir = tempfile::tempdir().unwrap();
|
|
62
|
+
let backend_dir = tmp_dir.path().join("backend");
|
|
63
|
+
let tracked_file = backend_dir.join("app/models/foo.rb");
|
|
64
|
+
|
|
65
|
+
std::process::Command::new("git")
|
|
66
|
+
.arg("init")
|
|
67
|
+
.current_dir(tmp_dir.path())
|
|
68
|
+
.output()
|
|
69
|
+
.expect("failed to run git init");
|
|
70
|
+
|
|
71
|
+
std::fs::create_dir_all(tracked_file.parent().unwrap()).unwrap();
|
|
72
|
+
std::fs::write(&tracked_file, "class Foo; end").unwrap();
|
|
73
|
+
std::fs::write(tmp_dir.path().join("README.md"), "readme").unwrap();
|
|
74
|
+
|
|
75
|
+
std::process::Command::new("git")
|
|
76
|
+
.args(["add", "--all"])
|
|
77
|
+
.current_dir(tmp_dir.path())
|
|
78
|
+
.output()
|
|
79
|
+
.expect("failed to add tracked files");
|
|
80
|
+
|
|
81
|
+
let tracked = find_tracked_files(&backend_dir).unwrap();
|
|
82
|
+
assert_eq!(tracked.len(), 1);
|
|
83
|
+
assert!(tracked.get(&tracked_file).unwrap());
|
|
84
|
+
assert!(!tracked.contains_key(&backend_dir.join("backend/app/models/foo.rb")));
|
|
85
|
+
}
|
|
58
86
|
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
use predicates::prelude::predicate;
|
|
2
|
+
use std::{error::Error, fs, path::Path};
|
|
3
|
+
|
|
4
|
+
mod common;
|
|
5
|
+
|
|
6
|
+
use common::OutputStream;
|
|
7
|
+
use common::git_add_all_files;
|
|
8
|
+
use common::run_codeowners;
|
|
9
|
+
use common::setup_fixture_repo;
|
|
10
|
+
|
|
11
|
+
#[test]
|
|
12
|
+
fn test_generate_uses_codeowners_path_from_config() -> Result<(), Box<dyn Error>> {
|
|
13
|
+
let fixture_root = Path::new("tests/fixtures/custom_codeowners_path");
|
|
14
|
+
let temp_dir = setup_fixture_repo(fixture_root);
|
|
15
|
+
let project_root = temp_dir.path();
|
|
16
|
+
git_add_all_files(project_root);
|
|
17
|
+
|
|
18
|
+
let mut cmd = assert_cmd::Command::cargo_bin("codeowners")?;
|
|
19
|
+
cmd.arg("--project-root")
|
|
20
|
+
.arg(project_root)
|
|
21
|
+
.arg("--no-cache")
|
|
22
|
+
.arg("generate")
|
|
23
|
+
.assert()
|
|
24
|
+
.success();
|
|
25
|
+
|
|
26
|
+
let expected_codeowners: String = std::fs::read_to_string(Path::new("tests/fixtures/custom_codeowners_path/expected/CODEOWNERS"))?;
|
|
27
|
+
let actual_codeowners: String = std::fs::read_to_string(project_root.join("docs/CODEOWNERS"))?;
|
|
28
|
+
|
|
29
|
+
assert_eq!(expected_codeowners, actual_codeowners);
|
|
30
|
+
|
|
31
|
+
Ok(())
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
#[test]
|
|
35
|
+
fn test_cli_overrides_codeowners_path_from_config() -> Result<(), Box<dyn Error>> {
|
|
36
|
+
fs::create_dir_all("tmp")?;
|
|
37
|
+
let codeowners_abs = std::env::current_dir()?.join("tmp/CODEOWNERS");
|
|
38
|
+
let codeowners_str = codeowners_abs.to_str().unwrap();
|
|
39
|
+
|
|
40
|
+
run_codeowners(
|
|
41
|
+
"custom_codeowners_path",
|
|
42
|
+
&["--codeowners-file-path", codeowners_str, "generate"],
|
|
43
|
+
true,
|
|
44
|
+
OutputStream::Stdout,
|
|
45
|
+
predicate::eq(""),
|
|
46
|
+
)?;
|
|
47
|
+
|
|
48
|
+
let expected_codeowners: String = std::fs::read_to_string(Path::new("tests/fixtures/custom_codeowners_path/expected/CODEOWNERS"))?;
|
|
49
|
+
let actual_codeowners: String = std::fs::read_to_string(Path::new("tmp/CODEOWNERS"))?;
|
|
50
|
+
|
|
51
|
+
assert_eq!(expected_codeowners, actual_codeowners);
|
|
52
|
+
|
|
53
|
+
Ok(())
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#[test]
|
|
57
|
+
fn test_validate_uses_codeowners_path_from_config() -> Result<(), Box<dyn Error>> {
|
|
58
|
+
run_codeowners(
|
|
59
|
+
"custom_codeowners_path",
|
|
60
|
+
&["validate"],
|
|
61
|
+
true,
|
|
62
|
+
OutputStream::Stdout,
|
|
63
|
+
predicate::eq(""),
|
|
64
|
+
)?;
|
|
65
|
+
|
|
66
|
+
Ok(())
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
#[test]
|
|
70
|
+
fn test_validate_uses_cli_override() -> Result<(), Box<dyn Error>> {
|
|
71
|
+
fs::create_dir_all("tmp")?;
|
|
72
|
+
let codeowners_abs = std::env::current_dir()?.join("tmp/CODEOWNERS");
|
|
73
|
+
let codeowners_str = codeowners_abs.to_str().unwrap();
|
|
74
|
+
|
|
75
|
+
run_codeowners(
|
|
76
|
+
"custom_codeowners_path",
|
|
77
|
+
&["--codeowners-file-path", codeowners_str, "generate"],
|
|
78
|
+
true,
|
|
79
|
+
OutputStream::Stdout,
|
|
80
|
+
predicate::eq(""),
|
|
81
|
+
)?;
|
|
82
|
+
|
|
83
|
+
run_codeowners(
|
|
84
|
+
"custom_codeowners_path",
|
|
85
|
+
&["--codeowners-file-path", codeowners_str, "validate"],
|
|
86
|
+
true,
|
|
87
|
+
OutputStream::Stdout,
|
|
88
|
+
predicate::eq(""),
|
|
89
|
+
)?;
|
|
90
|
+
|
|
91
|
+
Ok(())
|
|
92
|
+
}
|
|
@@ -154,9 +154,10 @@ pub fn build_run_config(project_root: &Path, codeowners_rel_path: &str) -> RunCo
|
|
|
154
154
|
let config_path = project_root.join("config/code_ownership.yml");
|
|
155
155
|
RunConfig {
|
|
156
156
|
project_root,
|
|
157
|
-
codeowners_file_path,
|
|
157
|
+
codeowners_file_path: Some(codeowners_file_path),
|
|
158
158
|
config_path,
|
|
159
159
|
no_cache: true,
|
|
160
|
+
executable_name: None,
|
|
160
161
|
}
|
|
161
162
|
}
|
|
162
163
|
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
use indoc::indoc;
|
|
2
|
+
use predicates::prelude::*;
|
|
3
|
+
use std::error::Error;
|
|
4
|
+
|
|
5
|
+
mod common;
|
|
6
|
+
use common::OutputStream;
|
|
7
|
+
use common::run_codeowners;
|
|
8
|
+
|
|
9
|
+
#[test]
|
|
10
|
+
fn test_validate_with_custom_executable_name() -> Result<(), Box<dyn Error>> {
|
|
11
|
+
// When executable_name is configured, error should show that command
|
|
12
|
+
run_codeowners(
|
|
13
|
+
"custom_executable_name",
|
|
14
|
+
&["validate"],
|
|
15
|
+
false,
|
|
16
|
+
OutputStream::Stdout,
|
|
17
|
+
predicate::str::contains("Run `bin/codeownership validate`"),
|
|
18
|
+
)?;
|
|
19
|
+
Ok(())
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#[test]
|
|
23
|
+
fn test_validate_with_default_executable_name() -> Result<(), Box<dyn Error>> {
|
|
24
|
+
// When executable_name is not configured, error should show default "codeowners"
|
|
25
|
+
run_codeowners(
|
|
26
|
+
"default_executable_name",
|
|
27
|
+
&["validate"],
|
|
28
|
+
false,
|
|
29
|
+
OutputStream::Stdout,
|
|
30
|
+
predicate::str::contains("Run `codeowners generate`"),
|
|
31
|
+
)?;
|
|
32
|
+
Ok(())
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
#[test]
|
|
36
|
+
fn test_custom_executable_name_full_error_message() -> Result<(), Box<dyn Error>> {
|
|
37
|
+
// Verify the complete error message format with custom executable
|
|
38
|
+
run_codeowners(
|
|
39
|
+
"custom_executable_name",
|
|
40
|
+
&["validate"],
|
|
41
|
+
false,
|
|
42
|
+
OutputStream::Stdout,
|
|
43
|
+
predicate::eq(indoc! {r#"
|
|
44
|
+
|
|
45
|
+
CODEOWNERS out of date. Run `bin/codeownership validate` to update the CODEOWNERS file
|
|
46
|
+
The following changes are required (- current, + expected):
|
|
47
|
+
-# Outdated content to trigger validation error
|
|
48
|
+
-/app/old.rb @FooTeam
|
|
49
|
+
+
|
|
50
|
+
+# Annotations at the top of file
|
|
51
|
+
+/app/foo.rb @FooTeam
|
|
52
|
+
+
|
|
53
|
+
+# Team-specific owned globs
|
|
54
|
+
+/ruby/app/payments/** @PaymentTeam
|
|
55
|
+
+
|
|
56
|
+
+# Team YML ownership
|
|
57
|
+
+/config/teams/foo.yml @FooTeam
|
|
58
|
+
+/config/teams/payments.yml @PaymentTeam
|
|
59
|
+
|
|
60
|
+
"#}),
|
|
61
|
+
)?;
|
|
62
|
+
Ok(())
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
#[test]
|
|
66
|
+
fn test_default_executable_name_full_error_message() -> Result<(), Box<dyn Error>> {
|
|
67
|
+
// Verify the complete error message format with default executable
|
|
68
|
+
run_codeowners(
|
|
69
|
+
"default_executable_name",
|
|
70
|
+
&["validate"],
|
|
71
|
+
false,
|
|
72
|
+
OutputStream::Stdout,
|
|
73
|
+
predicate::eq(indoc! {r#"
|
|
74
|
+
|
|
75
|
+
CODEOWNERS out of date. Run `codeowners generate` to update the CODEOWNERS file
|
|
76
|
+
The following changes are required (- current, + expected):
|
|
77
|
+
-# Outdated content to trigger validation error
|
|
78
|
+
-/app/old.rb @BarTeam
|
|
79
|
+
+# Annotations at the top of file
|
|
80
|
+
+/app/bar.rb @BarTeam
|
|
81
|
+
+
|
|
82
|
+
+# Team YML ownership
|
|
83
|
+
+/config/teams/bar.yml @BarTeam
|
|
84
|
+
|
|
85
|
+
"#}),
|
|
86
|
+
)?;
|
|
87
|
+
Ok(())
|
|
88
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# STOP! - DO NOT EDIT THIS FILE MANUALLY
|
|
2
|
+
# This file was automatically generated by "bin/codeownership validate".
|
|
3
|
+
#
|
|
4
|
+
# CODEOWNERS is used for GitHub to suggest code/file owners to various GitHub
|
|
5
|
+
# teams. This is useful when developers create Pull Requests since the
|
|
6
|
+
# code/file owner is notified. Reference GitHub docs for more details:
|
|
7
|
+
# https://help.github.com/en/articles/about-code-owners
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Annotations at the top of file
|
|
11
|
+
/ruby/app/models/test.rb @TestTeam
|
|
12
|
+
|
|
13
|
+
# Team YML ownership
|
|
14
|
+
/config/teams/test_team.yml @TestTeam
|
data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/expected/CODEOWNERS
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# STOP! - DO NOT EDIT THIS FILE MANUALLY
|
|
2
|
+
# This file was automatically generated by "bin/codeownership validate".
|
|
3
|
+
#
|
|
4
|
+
# CODEOWNERS is used for GitHub to suggest code/file owners to various GitHub
|
|
5
|
+
# teams. This is useful when developers create Pull Requests since the
|
|
6
|
+
# code/file owner is notified. Reference GitHub docs for more details:
|
|
7
|
+
# https://help.github.com/en/articles/about-code-owners
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
# Annotations at the top of file
|
|
11
|
+
/ruby/app/models/test.rb @TestTeam
|
|
12
|
+
|
|
13
|
+
# Team YML ownership
|
|
14
|
+
/config/teams/test_team.yml @TestTeam
|
data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/.github/CODEOWNERS
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# STOP! - DO NOT EDIT THIS FILE MANUALLY
|
|
2
|
+
# This file was automatically generated by "bin/codeownership validate".
|
|
3
|
+
#
|
|
4
|
+
# CODEOWNERS is used for GitHub to suggest code/file owners to various GitHub
|
|
5
|
+
# teams. This is useful when developers create Pull Requests since the
|
|
6
|
+
# code/file owner is notified. Reference GitHub docs for more details:
|
|
7
|
+
# https://help.github.com/en/articles/about-code-owners
|
|
8
|
+
|
|
9
|
+
# Outdated content to trigger validation error
|
|
10
|
+
/app/old.rb @FooTeam
|
data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/.github/CODEOWNERS
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# STOP! - DO NOT EDIT THIS FILE MANUALLY
|
|
2
|
+
# This file was automatically generated by "bin/codeownership validate".
|
|
3
|
+
#
|
|
4
|
+
# CODEOWNERS is used for GitHub to suggest code/file owners to various GitHub
|
|
5
|
+
# teams. This is useful when developers create Pull Requests since the
|
|
6
|
+
# code/file owner is notified. Reference GitHub docs for more details:
|
|
7
|
+
# https://help.github.com/en/articles/about-code-owners
|
|
8
|
+
|
|
9
|
+
# Outdated content to trigger validation error
|
|
10
|
+
/app/old.rb @BarTeam
|
|
11
|
+
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# STOP! - DO NOT EDIT THIS FILE MANUALLY
|
|
2
|
+
# This file was automatically generated by "bin/codeownership validate".
|
|
3
|
+
#
|
|
4
|
+
# CODEOWNERS is used for GitHub to suggest code/file owners to various GitHub
|
|
5
|
+
# teams. This is useful when developers create Pull Requests since the
|
|
6
|
+
# code/file owner is notified. Reference GitHub docs for more details:
|
|
7
|
+
# https://help.github.com/en/articles/about-code-owners
|
|
8
|
+
|
|
9
|
+
# Match all files to GoodTeam so for-file --from-codeowners hits the parser path
|
|
10
|
+
* @GoodTeam
|
data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/teams/bad_team.yml
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
name: MissingGithub
|
|
@@ -38,7 +38,10 @@ where
|
|
|
38
38
|
let result = func(&run_config, stage);
|
|
39
39
|
assert_no_run_errors(&result);
|
|
40
40
|
|
|
41
|
-
assert!(
|
|
41
|
+
assert!(
|
|
42
|
+
run_config.codeowners_file_path.as_ref().unwrap().exists(),
|
|
43
|
+
"CODEOWNERS file was not created",
|
|
44
|
+
);
|
|
42
45
|
let staged = is_file_staged(&run_config.project_root, CODEOWNERS_REL);
|
|
43
46
|
assert_eq!(staged, expected_staged, "unexpected staged state for CODEOWNERS");
|
|
44
47
|
}
|
|
@@ -16,6 +16,36 @@ fn test_validate() -> Result<(), Box<dyn Error>> {
|
|
|
16
16
|
predicate::eq(indoc! {"
|
|
17
17
|
|
|
18
18
|
CODEOWNERS out of date. Run `codeowners generate` to update the CODEOWNERS file
|
|
19
|
+
The following changes are required (- current, + expected):
|
|
20
|
+
+# STOP! - DO NOT EDIT THIS FILE MANUALLY
|
|
21
|
+
+# This file was automatically generated by \"bin/codeownership validate\".
|
|
22
|
+
+#
|
|
23
|
+
+# CODEOWNERS is used for GitHub to suggest code/file owners to various GitHub
|
|
24
|
+
+# teams. This is useful when developers create Pull Requests since the
|
|
25
|
+
+# code/file owner is notified. Reference GitHub docs for more details:
|
|
26
|
+
+# https://help.github.com/en/articles/about-code-owners
|
|
27
|
+
+
|
|
28
|
+
+# Annotations at the top of file
|
|
29
|
+
+/gems/payroll_calculator/calculator.rb @PaymentTeam
|
|
30
|
+
+/ruby/app/models/bank_account.rb @PaymentTeam
|
|
31
|
+
+/ruby/app/models/payroll.rb @PayrollTeam
|
|
32
|
+
+/ruby/app/services/multi_owned.rb @PaymentTeam
|
|
33
|
+
+
|
|
34
|
+
+# Team-specific owned globs
|
|
35
|
+
+/ruby/app/payments/**/* @PaymentTeam
|
|
36
|
+
+
|
|
37
|
+
+# Owner in .codeowner
|
|
38
|
+
+/ruby/app/services/**/** @PayrollTeam
|
|
39
|
+
+
|
|
40
|
+
+# Owner metadata key in package.yml
|
|
41
|
+
+/ruby/packages/payroll_flow/**/** @PayrollTeam
|
|
42
|
+
+
|
|
43
|
+
+# Team YML ownership
|
|
44
|
+
+/config/teams/payments.yml @PaymentTeam
|
|
45
|
+
+/config/teams/payroll.yml @PayrollTeam
|
|
46
|
+
+
|
|
47
|
+
+# Team owned gems
|
|
48
|
+
+/gems/payroll_calculator/**/** @PayrollTeam
|
|
19
49
|
|
|
20
50
|
Code ownership should only be defined for each file in one way. The following files have declared ownership in multiple ways
|
|
21
51
|
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
use predicates::prelude::*;
|
|
2
|
+
use std::error::Error;
|
|
3
|
+
|
|
4
|
+
mod common;
|
|
5
|
+
use common::OutputStream;
|
|
6
|
+
use common::run_codeowners;
|
|
7
|
+
|
|
8
|
+
// Exercise the code path that skips invalid team files and prints to stderr
|
|
9
|
+
// (codeowners_file_parser::teams_by_github_team_name). Uses for-file
|
|
10
|
+
// --from-codeowners so the project is not built and the parser globs team
|
|
11
|
+
// files; the invalid bad_team.yml is skipped and an error is printed.
|
|
12
|
+
// With the fix: stderr contains "Error parsing team file:" and "missing field `github`".
|
|
13
|
+
// Without the fix (reverted): stderr only has generic "YAML serialization/deserialization failed".
|
|
14
|
+
#[test]
|
|
15
|
+
fn test_missing_github_team_in_team_file_is_reported_on_stderr() -> Result<(), Box<dyn Error>> {
|
|
16
|
+
run_codeowners(
|
|
17
|
+
"missing_github_team",
|
|
18
|
+
&["for-file", "--from-codeowners", "ruby/foo.rb"],
|
|
19
|
+
true, // command succeeds; invalid file is skipped
|
|
20
|
+
OutputStream::Stderr,
|
|
21
|
+
predicate::str::contains("Error parsing team file:").and(predicate::str::contains("missing field `github`")),
|
|
22
|
+
)
|
|
23
|
+
}
|