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.
Files changed (265) hide show
  1. checksums.yaml +4 -4
  2. data/.cargo/config +2 -2
  3. data/Cargo.lock +9 -2
  4. data/README.md +8 -8
  5. data/ext/cargo-vendor/codeowners-0.3.3/.cargo-checksum.json +1 -0
  6. data/ext/cargo-vendor/codeowners-0.3.3/.github/CODEOWNERS +1 -0
  7. data/ext/cargo-vendor/codeowners-0.3.3/AGENTS.md +38 -0
  8. data/ext/cargo-vendor/codeowners-0.3.3/CLAUDE.md +1 -0
  9. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/Cargo.lock +8 -1
  10. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/Cargo.toml +18 -1
  11. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/README.md +11 -1
  12. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cli.rs +9 -5
  13. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/config.rs +81 -1
  14. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/crosscheck.rs +5 -8
  15. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/codeowners_file_parser.rs +3 -3
  16. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/file_generator.rs +119 -9
  17. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/file_owner_resolver.rs +3 -1
  18. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/package_mapper.rs +2 -2
  19. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper.rs +2 -2
  20. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/validator.rs +84 -17
  21. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership.rs +1 -0
  22. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/project.rs +3 -0
  23. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/project_builder.rs +111 -44
  24. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/runner/api.rs +7 -6
  25. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/runner/types.rs +2 -1
  26. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/runner.rs +67 -16
  27. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/tracked_files.rs +29 -1
  28. data/ext/cargo-vendor/codeowners-0.3.3/tests/codeowners_path_test.rs +92 -0
  29. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/common/mod.rs +2 -1
  30. data/ext/cargo-vendor/codeowners-0.3.3/tests/executable_name_config_test.rs +88 -0
  31. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/config/code_ownership.yml +11 -0
  32. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/config/teams/test_team.yml +6 -0
  33. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/docs/CODEOWNERS +14 -0
  34. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/expected/CODEOWNERS +14 -0
  35. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_codeowners_path/ruby/app/models/test.rb +3 -0
  36. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/.github/CODEOWNERS +10 -0
  37. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/app/foo.rb +3 -0
  38. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/config/code_ownership.yml +4 -0
  39. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/config/teams/foo.yml +5 -0
  40. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/config/teams/payments.yml +6 -0
  41. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/custom_executable_name/ruby/app/payments/foo.rb +4 -0
  42. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/.github/CODEOWNERS +11 -0
  43. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/app/bar.rb +3 -0
  44. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/config/code_ownership.yml +5 -0
  45. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/default_executable_name/config/teams/bar.yml +5 -0
  46. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/.github/CODEOWNERS +10 -0
  47. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/code_ownership.yml +10 -0
  48. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/teams/bad_team.yml +1 -0
  49. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/missing_github_team/config/teams/good.yml +3 -0
  50. data/ext/cargo-vendor/codeowners-0.3.3/tests/fixtures/valid_project/gems/pets/dog.rb +5 -0
  51. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/git_stage_test.rs +4 -1
  52. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/invalid_project_test.rs +30 -0
  53. data/ext/cargo-vendor/codeowners-0.3.3/tests/missing_github_team_test.rs +23 -0
  54. data/ext/cargo-vendor/codeowners-0.3.3/tests/run_config_executable_override_test.rs +98 -0
  55. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/runner_api.rs +8 -4
  56. data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/valid_project_test.rs +3 -3
  57. data/ext/cargo-vendor/codeowners-0.3.3/tests/validate_files_test.rs +378 -0
  58. data/ext/cargo-vendor/similar-2.7.0/.cargo/config.toml +2 -0
  59. data/ext/cargo-vendor/similar-2.7.0/.cargo-checksum.json +1 -0
  60. data/ext/cargo-vendor/similar-2.7.0/.cargo_vcs_info.json +6 -0
  61. data/ext/cargo-vendor/similar-2.7.0/.github/FUNDING.yml +1 -0
  62. data/ext/cargo-vendor/similar-2.7.0/.github/workflows/clippy.yml +16 -0
  63. data/ext/cargo-vendor/similar-2.7.0/.github/workflows/rustfmt.yml +16 -0
  64. data/ext/cargo-vendor/similar-2.7.0/.github/workflows/tests.yml +49 -0
  65. data/ext/cargo-vendor/similar-2.7.0/.vscode/settings.json +5 -0
  66. data/ext/cargo-vendor/similar-2.7.0/CHANGELOG.md +132 -0
  67. data/ext/cargo-vendor/similar-2.7.0/Cargo.lock +373 -0
  68. data/ext/cargo-vendor/similar-2.7.0/Cargo.lock.msrv +266 -0
  69. data/ext/cargo-vendor/similar-2.7.0/Cargo.toml +149 -0
  70. data/ext/cargo-vendor/similar-2.7.0/Cargo.toml.orig +73 -0
  71. data/ext/cargo-vendor/similar-2.7.0/LICENSE +201 -0
  72. data/ext/cargo-vendor/similar-2.7.0/Makefile +31 -0
  73. data/ext/cargo-vendor/similar-2.7.0/README.md +59 -0
  74. data/ext/cargo-vendor/similar-2.7.0/clippy.toml +1 -0
  75. data/ext/cargo-vendor/similar-2.7.0/examples/close-matches.rs +15 -0
  76. data/ext/cargo-vendor/similar-2.7.0/examples/large.rs +8 -0
  77. data/ext/cargo-vendor/similar-2.7.0/examples/nonstring.rs +13 -0
  78. data/ext/cargo-vendor/similar-2.7.0/examples/original-slices.rs +11 -0
  79. data/ext/cargo-vendor/similar-2.7.0/examples/patience.rs +48 -0
  80. data/ext/cargo-vendor/similar-2.7.0/examples/serde.rs +15 -0
  81. data/ext/cargo-vendor/similar-2.7.0/examples/terminal-inline.rs +60 -0
  82. data/ext/cargo-vendor/similar-2.7.0/examples/terminal.rs +20 -0
  83. data/ext/cargo-vendor/similar-2.7.0/examples/udiff.rs +24 -0
  84. data/ext/cargo-vendor/similar-2.7.0/scripts/wasmtime-wrapper.sh +4 -0
  85. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/capture.rs +117 -0
  86. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/compact.rs +351 -0
  87. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/hook.rs +178 -0
  88. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/lcs.rs +294 -0
  89. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/mod.rs +134 -0
  90. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/myers.rs +442 -0
  91. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/patience.rs +198 -0
  92. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/replace.rs +221 -0
  93. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__capture__capture_hook_grouping-2.snap +60 -0
  94. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__capture__capture_hook_grouping.snap +64 -0
  95. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__contiguous.snap +28 -0
  96. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__diff.snap +22 -0
  97. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__pat.snap +31 -0
  98. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__same.snap +12 -0
  99. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__contiguous.snap +28 -0
  100. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__deadline_reached.snap +22 -0
  101. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__diff.snap +22 -0
  102. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__pat.snap +31 -0
  103. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__patience__patience.snap +45 -0
  104. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__patience__patience_out_of_bounds_bug.snap +16 -0
  105. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/utils.rs +379 -0
  106. data/ext/cargo-vendor/similar-2.7.0/src/common.rs +185 -0
  107. data/ext/cargo-vendor/similar-2.7.0/src/deadline_support.rs +37 -0
  108. data/ext/cargo-vendor/similar-2.7.0/src/iter.rs +195 -0
  109. data/ext/cargo-vendor/similar-2.7.0/src/lib.rs +176 -0
  110. data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff.snap +25 -0
  111. data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff_newline_hint-2.snap +10 -0
  112. data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff_newline_hint.snap +11 -0
  113. data/ext/cargo-vendor/similar-2.7.0/src/text/abstraction.rs +446 -0
  114. data/ext/cargo-vendor/similar-2.7.0/src/text/inline.rs +342 -0
  115. data/ext/cargo-vendor/similar-2.7.0/src/text/mod.rs +792 -0
  116. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__captured_ops.snap +22 -0
  117. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__captured_word_ops.snap +202 -0
  118. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__char_diff.snap +39 -0
  119. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__inline__line_ops_inline.snap +126 -0
  120. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__inline__serde.snap +107 -0
  121. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__lifetimes_on_iter.snap +42 -0
  122. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__line_ops.snap +42 -0
  123. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__serde.snap +55 -0
  124. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__serde_ops.snap +38 -0
  125. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__unified_diff.snap +12 -0
  126. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__virtual_newlines.snap +32 -0
  127. data/ext/cargo-vendor/similar-2.7.0/src/text/utils.rs +55 -0
  128. data/ext/cargo-vendor/similar-2.7.0/src/types.rs +502 -0
  129. data/ext/cargo-vendor/similar-2.7.0/src/udiff.rs +359 -0
  130. data/ext/cargo-vendor/similar-2.7.0/src/utils.rs +412 -0
  131. data/ext/cargo-vendor/unicode-ident-1.0.19/.cargo-checksum.json +1 -1
  132. data/ext/code_ownership/Cargo.toml +1 -1
  133. data/ext/code_ownership/src/lib.rs +2 -2
  134. data/lib/code_ownership/private/file_path_finder.rb +19 -3
  135. data/lib/code_ownership/private/team_finder.rb +1 -2
  136. data/lib/code_ownership/version.rb +1 -1
  137. data/lib/code_ownership.rb +2 -0
  138. metadata +252 -152
  139. data/ext/cargo-vendor/codeowners-0.3.0/.cargo-checksum.json +0 -1
  140. data/ext/cargo-vendor/codeowners-0.3.0/tests/validate_files_test.rs +0 -144
  141. data/ext/cargo-vendor/unicode-ident-1.0.19/tests/fst/.gitignore +0 -1
  142. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.github/workflows/audit.yml +0 -0
  143. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.github/workflows/ci.yml +0 -0
  144. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.github/workflows/dotslash-config.json +0 -0
  145. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.rustfmt.toml +0 -0
  146. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/.rusty-hook.toml +0 -0
  147. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/dev/run_benchmarks_for_file.sh +0 -0
  148. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/dev/run_benchmarks_for_gv.sh +0 -0
  149. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/rust-toolchain.toml +0 -0
  150. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cache/file.rs +0 -0
  151. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cache/mod.rs +0 -0
  152. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/cache/noop.rs +0 -0
  153. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/common_test.rs +0 -0
  154. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/lib.rs +0 -0
  155. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/main.rs +0 -0
  156. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/codeowners_query.rs +0 -0
  157. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/file_owner_finder.rs +0 -0
  158. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/annotated_file_mapper.rs +0 -0
  159. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/directory_mapper.rs +0 -0
  160. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/escaper.rs +0 -0
  161. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/team_gem_mapper.rs +0 -0
  162. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/team_glob_mapper.rs +0 -0
  163. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/ownership/mapper/team_yml_mapper.rs +0 -0
  164. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/path_utils.rs +0 -0
  165. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/src/project_file_builder.rs +0 -0
  166. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/cache_test.rs +0 -0
  167. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/crosscheck_owners_test.rs +0 -0
  168. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/.github/CODEOWNERS +0 -0
  169. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/code_ownership.yml +0 -0
  170. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/teams/payments.yml +0 -0
  171. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/teams/payroll.yml +0 -0
  172. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb +0 -0
  173. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/bank_account.rb +0 -0
  174. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/blockchain.rb +0 -0
  175. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/payroll.rb +0 -0
  176. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/payments/nacha.rb +0 -0
  177. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/services/.codeowner +0 -0
  178. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb +0 -0
  179. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/unowned.rb +0 -0
  180. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml +0 -0
  181. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/.github/CODEOWNERS +0 -0
  182. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/.keep +0 -0
  183. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/code_ownership.yml +0 -0
  184. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/teams/design.yml +0 -0
  185. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/teams/frontend.yml +0 -0
  186. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx +0 -0
  187. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json +0 -0
  188. /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
  189. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner +0 -0
  190. /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
  191. /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
  192. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/.github/CODEOWNERS +0 -0
  193. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/.codeowner +0 -0
  194. /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
  195. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb +0 -0
  196. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/.codeowner +0 -0
  197. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner +0 -0
  198. /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
  199. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +0 -0
  200. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/teams/bar.yml +0 -0
  201. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/teams/foo.yml +0 -0
  202. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/.github/CODEOWNERS +0 -0
  203. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/.ignore +0 -0
  204. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/code_ownership.yml +0 -0
  205. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/payments.yml +0 -0
  206. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/payroll.yml +0 -0
  207. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/ux.yml +0 -0
  208. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb +0 -0
  209. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx +0 -0
  210. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json +0 -0
  211. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner +0 -0
  212. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts +0 -0
  213. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/.codeowner +0 -0
  214. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/item.ts +0 -0
  215. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx +0 -0
  216. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/models/bank_account.rb +0 -0
  217. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/models/payroll.rb +0 -0
  218. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner +0 -0
  219. /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
  220. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/nacha.rb +0 -0
  221. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payroll/.codeowner +0 -0
  222. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payroll/payroll.rb +0 -0
  223. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/edit.erb +0 -0
  224. /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
  225. /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
  226. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb +0 -0
  227. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml +0 -0
  228. /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
  229. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS +0 -0
  230. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/code_ownership.yml +0 -0
  231. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml +0 -0
  232. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml +0 -0
  233. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/giants.yml +0 -0
  234. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml +0 -0
  235. /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
  236. /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
  237. /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
  238. /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
  239. /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
  240. /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
  241. /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
  242. /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
  243. /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
  244. /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
  245. /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
  246. /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
  247. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/games/package.yml +0 -0
  248. /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
  249. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/locations/package.yml +0 -0
  250. /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
  251. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml +0 -0
  252. /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
  253. /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
  254. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner +0 -0
  255. /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
  256. /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
  257. /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
  258. /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
  259. /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
  260. /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
  261. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/invalid_project_structure_test.rs +0 -0
  262. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/multiple_directory_owners_test.rs +0 -0
  263. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/untracked_files_test.rs +0 -0
  264. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tests/valid_project_with_overrides_test.rs +0 -0
  265. /data/ext/cargo-vendor/{codeowners-0.3.0 → codeowners-0.3.3}/tmp/.gitkeep +0 -0
@@ -1,6 +1,8 @@
1
- use std::{path::Path, process::Command};
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.to_string()],
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 config_from_path(path: &Path) -> Result<Config, Error> {
48
- match crate::config::Config::load_from_path(path) {
49
- Ok(c) => 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 = config_from_path(&run_config.config_path)?;
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
- for file_path in file_paths {
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.run_config.codeowners_file_path.parent() {
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.run_config.codeowners_file_path, content) {
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.run_config.codeowners_file_path)
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", "--full-name", "-z", "--", "."])
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,11 @@
1
+ owned_globs:
2
+ - "{config,ruby}/**/*.{rb,yml}"
3
+ ruby_package_paths: []
4
+ javascript_package_paths: []
5
+ team_file_glob:
6
+ - config/teams/**/*.yml
7
+ unbuilt_gems_path: gems
8
+ unowned_globs:
9
+ - config/code_ownership.yml
10
+ codeowners_path: docs
11
+
@@ -0,0 +1,6 @@
1
+ name: TestTeam
2
+ github:
3
+ team: "@TestTeam"
4
+ members:
5
+ - testmember
6
+
@@ -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
@@ -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
@@ -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
@@ -0,0 +1,4 @@
1
+ ---
2
+ owned_globs:
3
+ - "{app,config}/**/*.rb"
4
+ executable_name: "bin/codeownership validate"
@@ -0,0 +1,5 @@
1
+ ---
2
+ name: Foo
3
+ github:
4
+ team: '@FooTeam'
5
+
@@ -0,0 +1,6 @@
1
+ name: Payments
2
+ github:
3
+ team: "@PaymentTeam"
4
+ owned_globs:
5
+ - ruby/app/payments/**
6
+
@@ -0,0 +1,4 @@
1
+ # A file owned by Payments
2
+ class Foo
3
+ end
4
+
@@ -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,5 @@
1
+ ---
2
+ owned_globs:
3
+ - "{app,config}/**/*.rb"
4
+ # No executable_name specified - should use default
5
+
@@ -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
@@ -0,0 +1,10 @@
1
+ owned_globs:
2
+ - "{gems}/**/*.{rb,tsx,erb}"
3
+ team_file_glob:
4
+ - config/teams/**/*.yml
5
+ unbuilt_gems_path: gems
6
+ unowned_globs:
7
+ vendored_gems:
8
+ path: "gems"
9
+ cache_directory: tmp/cache/codeowners
10
+ ignore_dirs: []
@@ -0,0 +1,3 @@
1
+ name: Good
2
+ github:
3
+ team: '@GoodTeam'
@@ -0,0 +1,5 @@
1
+ # generated
2
+ # next line should be ignored
3
+ # @team Payments
4
+
5
+ class Dog; end
@@ -38,7 +38,10 @@ where
38
38
  let result = func(&run_config, stage);
39
39
  assert_no_run_errors(&result);
40
40
 
41
- assert!(run_config.codeowners_file_path.exists(), "CODEOWNERS file was not created");
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
+ }