code_ownership 2.1.2 → 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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/.cargo/config +2 -2
  3. data/Cargo.lock +9 -2
  4. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.cargo-checksum.json +1 -1
  5. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/Cargo.lock +8 -1
  6. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/Cargo.toml +2 -1
  7. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/file_generator.rs +119 -9
  8. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/validator.rs +77 -15
  9. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/executable_name_config_test.rs +25 -4
  10. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_executable_name/.github/CODEOWNERS +1 -1
  11. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/default_executable_name/.github/CODEOWNERS +1 -1
  12. data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/invalid_project_test.rs +30 -0
  13. data/ext/cargo-vendor/similar-2.7.0/.cargo/config.toml +2 -0
  14. data/ext/cargo-vendor/similar-2.7.0/.cargo-checksum.json +1 -0
  15. data/ext/cargo-vendor/similar-2.7.0/.cargo_vcs_info.json +6 -0
  16. data/ext/cargo-vendor/similar-2.7.0/.github/FUNDING.yml +1 -0
  17. data/ext/cargo-vendor/similar-2.7.0/.github/workflows/clippy.yml +16 -0
  18. data/ext/cargo-vendor/similar-2.7.0/.github/workflows/rustfmt.yml +16 -0
  19. data/ext/cargo-vendor/similar-2.7.0/.github/workflows/tests.yml +49 -0
  20. data/ext/cargo-vendor/similar-2.7.0/.vscode/settings.json +5 -0
  21. data/ext/cargo-vendor/similar-2.7.0/CHANGELOG.md +132 -0
  22. data/ext/cargo-vendor/similar-2.7.0/Cargo.lock +373 -0
  23. data/ext/cargo-vendor/similar-2.7.0/Cargo.lock.msrv +266 -0
  24. data/ext/cargo-vendor/similar-2.7.0/Cargo.toml +149 -0
  25. data/ext/cargo-vendor/similar-2.7.0/Cargo.toml.orig +73 -0
  26. data/ext/cargo-vendor/similar-2.7.0/LICENSE +201 -0
  27. data/ext/cargo-vendor/similar-2.7.0/Makefile +31 -0
  28. data/ext/cargo-vendor/similar-2.7.0/README.md +59 -0
  29. data/ext/cargo-vendor/similar-2.7.0/clippy.toml +1 -0
  30. data/ext/cargo-vendor/similar-2.7.0/examples/close-matches.rs +15 -0
  31. data/ext/cargo-vendor/similar-2.7.0/examples/large.rs +8 -0
  32. data/ext/cargo-vendor/similar-2.7.0/examples/nonstring.rs +13 -0
  33. data/ext/cargo-vendor/similar-2.7.0/examples/original-slices.rs +11 -0
  34. data/ext/cargo-vendor/similar-2.7.0/examples/patience.rs +48 -0
  35. data/ext/cargo-vendor/similar-2.7.0/examples/serde.rs +15 -0
  36. data/ext/cargo-vendor/similar-2.7.0/examples/terminal-inline.rs +60 -0
  37. data/ext/cargo-vendor/similar-2.7.0/examples/terminal.rs +20 -0
  38. data/ext/cargo-vendor/similar-2.7.0/examples/udiff.rs +24 -0
  39. data/ext/cargo-vendor/similar-2.7.0/scripts/wasmtime-wrapper.sh +4 -0
  40. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/capture.rs +117 -0
  41. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/compact.rs +351 -0
  42. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/hook.rs +178 -0
  43. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/lcs.rs +294 -0
  44. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/mod.rs +134 -0
  45. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/myers.rs +442 -0
  46. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/patience.rs +198 -0
  47. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/replace.rs +221 -0
  48. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__capture__capture_hook_grouping-2.snap +60 -0
  49. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__capture__capture_hook_grouping.snap +64 -0
  50. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__contiguous.snap +28 -0
  51. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__diff.snap +22 -0
  52. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__pat.snap +31 -0
  53. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__lcs__same.snap +12 -0
  54. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__contiguous.snap +28 -0
  55. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__deadline_reached.snap +22 -0
  56. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__diff.snap +22 -0
  57. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__myers__pat.snap +31 -0
  58. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__patience__patience.snap +45 -0
  59. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/snapshots/similar__algorithms__patience__patience_out_of_bounds_bug.snap +16 -0
  60. data/ext/cargo-vendor/similar-2.7.0/src/algorithms/utils.rs +379 -0
  61. data/ext/cargo-vendor/similar-2.7.0/src/common.rs +185 -0
  62. data/ext/cargo-vendor/similar-2.7.0/src/deadline_support.rs +37 -0
  63. data/ext/cargo-vendor/similar-2.7.0/src/iter.rs +195 -0
  64. data/ext/cargo-vendor/similar-2.7.0/src/lib.rs +176 -0
  65. data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff.snap +25 -0
  66. data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff_newline_hint-2.snap +10 -0
  67. data/ext/cargo-vendor/similar-2.7.0/src/snapshots/similar__udiff__unified_diff_newline_hint.snap +11 -0
  68. data/ext/cargo-vendor/similar-2.7.0/src/text/abstraction.rs +446 -0
  69. data/ext/cargo-vendor/similar-2.7.0/src/text/inline.rs +342 -0
  70. data/ext/cargo-vendor/similar-2.7.0/src/text/mod.rs +792 -0
  71. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__captured_ops.snap +22 -0
  72. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__captured_word_ops.snap +202 -0
  73. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__char_diff.snap +39 -0
  74. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__inline__line_ops_inline.snap +126 -0
  75. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__inline__serde.snap +107 -0
  76. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__lifetimes_on_iter.snap +42 -0
  77. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__line_ops.snap +42 -0
  78. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__serde.snap +55 -0
  79. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__serde_ops.snap +38 -0
  80. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__unified_diff.snap +12 -0
  81. data/ext/cargo-vendor/similar-2.7.0/src/text/snapshots/similar__text__virtual_newlines.snap +32 -0
  82. data/ext/cargo-vendor/similar-2.7.0/src/text/utils.rs +55 -0
  83. data/ext/cargo-vendor/similar-2.7.0/src/types.rs +502 -0
  84. data/ext/cargo-vendor/similar-2.7.0/src/udiff.rs +359 -0
  85. data/ext/cargo-vendor/similar-2.7.0/src/utils.rs +412 -0
  86. data/ext/code_ownership/Cargo.toml +1 -1
  87. data/lib/code_ownership/version.rb +1 -1
  88. metadata +252 -178
  89. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.github/CODEOWNERS +0 -0
  90. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.github/workflows/audit.yml +0 -0
  91. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.github/workflows/ci.yml +0 -0
  92. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.github/workflows/dotslash-config.json +0 -0
  93. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.rustfmt.toml +0 -0
  94. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/.rusty-hook.toml +0 -0
  95. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/AGENTS.md +0 -0
  96. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/CLAUDE.md +0 -0
  97. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/README.md +0 -0
  98. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/dev/run_benchmarks_for_file.sh +0 -0
  99. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/dev/run_benchmarks_for_gv.sh +0 -0
  100. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/rust-toolchain.toml +0 -0
  101. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/cache/file.rs +0 -0
  102. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/cache/mod.rs +0 -0
  103. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/cache/noop.rs +0 -0
  104. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/cli.rs +0 -0
  105. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/common_test.rs +0 -0
  106. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/config.rs +0 -0
  107. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/crosscheck.rs +0 -0
  108. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/lib.rs +0 -0
  109. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/main.rs +0 -0
  110. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/codeowners_file_parser.rs +0 -0
  111. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/codeowners_query.rs +0 -0
  112. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/file_owner_finder.rs +0 -0
  113. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/file_owner_resolver.rs +0 -0
  114. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/annotated_file_mapper.rs +0 -0
  115. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/directory_mapper.rs +0 -0
  116. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/escaper.rs +0 -0
  117. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/package_mapper.rs +0 -0
  118. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/team_gem_mapper.rs +0 -0
  119. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/team_glob_mapper.rs +0 -0
  120. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper/team_yml_mapper.rs +0 -0
  121. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership/mapper.rs +0 -0
  122. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/ownership.rs +0 -0
  123. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/path_utils.rs +0 -0
  124. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/project.rs +0 -0
  125. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/project_builder.rs +0 -0
  126. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/project_file_builder.rs +0 -0
  127. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/runner/api.rs +0 -0
  128. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/runner/types.rs +0 -0
  129. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/runner.rs +0 -0
  130. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/src/tracked_files.rs +0 -0
  131. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/cache_test.rs +0 -0
  132. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/codeowners_path_test.rs +0 -0
  133. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/common/mod.rs +0 -0
  134. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/crosscheck_owners_test.rs +0 -0
  135. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_codeowners_path/config/code_ownership.yml +0 -0
  136. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_codeowners_path/config/teams/test_team.yml +0 -0
  137. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_codeowners_path/docs/CODEOWNERS +0 -0
  138. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_codeowners_path/expected/CODEOWNERS +0 -0
  139. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_codeowners_path/ruby/app/models/test.rb +0 -0
  140. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_executable_name/app/foo.rb +0 -0
  141. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_executable_name/config/code_ownership.yml +0 -0
  142. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_executable_name/config/teams/foo.yml +0 -0
  143. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_executable_name/config/teams/payments.yml +0 -0
  144. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/custom_executable_name/ruby/app/payments/foo.rb +0 -0
  145. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/default_executable_name/app/bar.rb +0 -0
  146. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/default_executable_name/config/code_ownership.yml +0 -0
  147. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/default_executable_name/config/teams/bar.yml +0 -0
  148. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/.github/CODEOWNERS +0 -0
  149. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/code_ownership.yml +0 -0
  150. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/teams/payments.yml +0 -0
  151. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/config/teams/payroll.yml +0 -0
  152. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/gems/payroll_calculator/calculator.rb +0 -0
  153. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/bank_account.rb +0 -0
  154. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/blockchain.rb +0 -0
  155. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/models/payroll.rb +0 -0
  156. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/payments/nacha.rb +0 -0
  157. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/services/.codeowner +0 -0
  158. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/services/multi_owned.rb +0 -0
  159. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/app/unowned.rb +0 -0
  160. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/invalid_project/ruby/packages/payroll_flow/package.yml +0 -0
  161. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/.github/CODEOWNERS +0 -0
  162. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/.keep +0 -0
  163. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/code_ownership.yml +0 -0
  164. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/teams/design.yml +0 -0
  165. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/config/teams/frontend.yml +0 -0
  166. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/apps/public/index.tsx +0 -0
  167. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/package.json +0 -0
  168. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/dashboard/src/index.tsx +0 -0
  169. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/.codeowner +0 -0
  170. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/javascript_only_project/frontend/packages/ui-kit/src/button.tsx +0 -0
  171. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/missing_github_team/.github/CODEOWNERS +0 -0
  172. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/missing_github_team/config/code_ownership.yml +0 -0
  173. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/missing_github_team/config/teams/bad_team.yml +0 -0
  174. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/missing_github_team/config/teams/good.yml +0 -0
  175. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/missing_github_team/gems/pets/dog.rb +0 -0
  176. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/.github/CODEOWNERS +0 -0
  177. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/.codeowner +0 -0
  178. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/deep/nesting/nestdir/deep_file.rb +0 -0
  179. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/consumers/one_owner.rb +0 -0
  180. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/.codeowner +0 -0
  181. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/exciting/.codeowner +0 -0
  182. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/app/services/exciting/some_other_file.rb +0 -0
  183. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/code_ownership.yml +0 -0
  184. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/teams/bar.yml +0 -0
  185. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/multiple-directory-owners/config/teams/foo.yml +0 -0
  186. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/.github/CODEOWNERS +0 -0
  187. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/.ignore +0 -0
  188. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/config/code_ownership.yml +0 -0
  189. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/payments.yml +0 -0
  190. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/payroll.yml +0 -0
  191. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/config/teams/ux.yml +0 -0
  192. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/gems/payroll_calculator/calculator.rb +0 -0
  193. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/gems/pets/dog.rb +0 -0
  194. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/index.tsx +0 -0
  195. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/PayrollFlow/package.json +0 -0
  196. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/(special)/.codeowner +0 -0
  197. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/(special)/pay.ts +0 -0
  198. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/.codeowner +0 -0
  199. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/items/item.ts +0 -0
  200. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/javascript/packages/list/page-admin.tsx +0 -0
  201. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/models/bank_account.rb +0 -0
  202. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/models/payroll.rb +0 -0
  203. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/foo/.codeowner +0 -0
  204. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/foo/ownedby_payroll.rb +0 -0
  205. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payments/nacha.rb +0 -0
  206. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payroll/.codeowner +0 -0
  207. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/payroll/payroll.rb +0 -0
  208. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/edit.erb +0 -0
  209. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/index.html.erb +0 -0
  210. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/app/views/foos/new.html.erb +0 -0
  211. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/ignored_files/git_ignored.rb +0 -0
  212. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/ruby/packages/payroll_flow/package.yml +0 -0
  213. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project/should_be_ignored/an_ignored_file.rb +0 -0
  214. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/.github/CODEOWNERS +0 -0
  215. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/code_ownership.yml +0 -0
  216. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/brewers.yml +0 -0
  217. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/cubs.yml +0 -0
  218. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/giants.yml +0 -0
  219. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/config/teams/rockies.yml +0 -0
  220. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/package.json +0 -0
  221. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/datepicker/src/picks/dp.tsx +0 -0
  222. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/package.json +0 -0
  223. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/list/src/item.tsx +0 -0
  224. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/package.json +0 -0
  225. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/field.tsx +0 -0
  226. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/frontend/packages/components/textfield/src/fields/small.tsx +0 -0
  227. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/apollo/lib/apollo.rb +0 -0
  228. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/ivy/lib/ivy.rb +0 -0
  229. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/lager/lib/lager.rb +0 -0
  230. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/gems/summit/lib/summit.rb +0 -0
  231. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/games/app/services/stats.rb +0 -0
  232. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/games/package.yml +0 -0
  233. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/locations/app/services/capacity.rb +0 -0
  234. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/locations/package.yml +0 -0
  235. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/schedule/app/services/date.rb +0 -0
  236. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/packs/schedule/package.yml +0 -0
  237. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/lib/util.rb +0 -0
  238. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/brewers/services/play.rb +0 -0
  239. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/.codeowner +0 -0
  240. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/.codeowner +0 -0
  241. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/db/price.rb +0 -0
  242. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/models/entertainment.rb +0 -0
  243. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/cubs/services/play.rb +0 -0
  244. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/giants/services/play.rb +0 -0
  245. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/fixtures/valid_project_with_overrides/ruby/app/rockies/services/play.rb +0 -0
  246. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/git_stage_test.rs +0 -0
  247. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/invalid_project_structure_test.rs +0 -0
  248. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/missing_github_team_test.rs +0 -0
  249. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/multiple_directory_owners_test.rs +0 -0
  250. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/run_config_executable_override_test.rs +0 -0
  251. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/runner_api.rs +0 -0
  252. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/untracked_files_test.rs +0 -0
  253. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/valid_project_test.rs +0 -0
  254. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/valid_project_with_overrides_test.rs +0 -0
  255. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tests/validate_files_test.rs +0 -0
  256. /data/ext/cargo-vendor/{codeowners-0.3.2 → codeowners-0.3.3}/tmp/.gitkeep +0 -0
@@ -0,0 +1,351 @@
1
+ //! Implements basic compacting. This is based on the compaction logic from
2
+ //! diffy by Brandon Williams.
3
+ use std::ops::Index;
4
+
5
+ use crate::{DiffOp, DiffTag};
6
+
7
+ use super::utils::{common_prefix_len, common_suffix_len};
8
+ use super::DiffHook;
9
+
10
+ /// Performs semantic cleanup operations on a diff.
11
+ ///
12
+ /// This merges similar ops together but also tries to move hunks up and
13
+ /// down the diff with the desire to connect as many hunks as possible.
14
+ /// It still needs to be combined with [`Replace`](crate::algorithms::Replace)
15
+ /// to get actual replace diff ops out.
16
+ #[derive(Debug)]
17
+ pub struct Compact<'old, 'new, Old: ?Sized, New: ?Sized, D> {
18
+ d: D,
19
+ ops: Vec<DiffOp>,
20
+ old: &'old Old,
21
+ new: &'new New,
22
+ }
23
+
24
+ impl<'old, 'new, Old, New, D> Compact<'old, 'new, Old, New, D>
25
+ where
26
+ D: DiffHook,
27
+ Old: Index<usize> + ?Sized + 'old,
28
+ New: Index<usize> + ?Sized + 'new,
29
+ New::Output: PartialEq<Old::Output>,
30
+ {
31
+ /// Creates a new compact hook wrapping another hook.
32
+ pub fn new(d: D, old: &'old Old, new: &'new New) -> Self {
33
+ Compact {
34
+ d,
35
+ ops: Vec::new(),
36
+ old,
37
+ new,
38
+ }
39
+ }
40
+
41
+ /// Extracts the inner hook.
42
+ pub fn into_inner(self) -> D {
43
+ self.d
44
+ }
45
+ }
46
+
47
+ impl<Old: ?Sized, New: ?Sized, D: DiffHook> AsRef<D> for Compact<'_, '_, Old, New, D> {
48
+ fn as_ref(&self) -> &D {
49
+ &self.d
50
+ }
51
+ }
52
+
53
+ impl<Old: ?Sized, New: ?Sized, D: DiffHook> AsMut<D> for Compact<'_, '_, Old, New, D> {
54
+ fn as_mut(&mut self) -> &mut D {
55
+ &mut self.d
56
+ }
57
+ }
58
+
59
+ impl<'old, 'new, Old, New, D> DiffHook for Compact<'old, 'new, Old, New, D>
60
+ where
61
+ D: DiffHook,
62
+ Old: Index<usize> + ?Sized + 'old,
63
+ New: Index<usize> + ?Sized + 'new,
64
+ New::Output: PartialEq<Old::Output>,
65
+ {
66
+ type Error = D::Error;
67
+
68
+ #[inline(always)]
69
+ fn equal(&mut self, old_index: usize, new_index: usize, len: usize) -> Result<(), Self::Error> {
70
+ self.ops.push(DiffOp::Equal {
71
+ old_index,
72
+ new_index,
73
+ len,
74
+ });
75
+ Ok(())
76
+ }
77
+
78
+ #[inline(always)]
79
+ fn delete(
80
+ &mut self,
81
+ old_index: usize,
82
+ old_len: usize,
83
+ new_index: usize,
84
+ ) -> Result<(), Self::Error> {
85
+ self.ops.push(DiffOp::Delete {
86
+ old_index,
87
+ old_len,
88
+ new_index,
89
+ });
90
+ Ok(())
91
+ }
92
+
93
+ #[inline(always)]
94
+ fn insert(
95
+ &mut self,
96
+ old_index: usize,
97
+ new_index: usize,
98
+ new_len: usize,
99
+ ) -> Result<(), Self::Error> {
100
+ self.ops.push(DiffOp::Insert {
101
+ old_index,
102
+ new_index,
103
+ new_len,
104
+ });
105
+ Ok(())
106
+ }
107
+
108
+ fn finish(&mut self) -> Result<(), Self::Error> {
109
+ cleanup_diff_ops(self.old, self.new, &mut self.ops);
110
+ for op in &self.ops {
111
+ op.apply_to_hook(&mut self.d)?;
112
+ }
113
+ self.d.finish()
114
+ }
115
+ }
116
+
117
+ // Walks through all edits and shifts them up and then down, trying to see if
118
+ // they run into similar edits which can be merged.
119
+ pub fn cleanup_diff_ops<Old, New>(old: &Old, new: &New, ops: &mut Vec<DiffOp>)
120
+ where
121
+ Old: Index<usize> + ?Sized,
122
+ New: Index<usize> + ?Sized,
123
+ New::Output: PartialEq<Old::Output>,
124
+ {
125
+ // First attempt to compact all Deletions
126
+ let mut pointer = 0;
127
+ while let Some(&op) = ops.get(pointer) {
128
+ if let DiffTag::Delete = op.tag() {
129
+ pointer = shift_diff_ops_up(ops, old, new, pointer);
130
+ pointer = shift_diff_ops_down(ops, old, new, pointer);
131
+ }
132
+ pointer += 1;
133
+ }
134
+
135
+ // Then attempt to compact all Insertions
136
+ let mut pointer = 0;
137
+ while let Some(&op) = ops.get(pointer) {
138
+ if let DiffTag::Insert = op.tag() {
139
+ pointer = shift_diff_ops_up(ops, old, new, pointer);
140
+ pointer = shift_diff_ops_down(ops, old, new, pointer);
141
+ }
142
+ pointer += 1;
143
+ }
144
+ }
145
+
146
+ fn shift_diff_ops_up<Old, New>(
147
+ ops: &mut Vec<DiffOp>,
148
+ old: &Old,
149
+ new: &New,
150
+ mut pointer: usize,
151
+ ) -> usize
152
+ where
153
+ Old: Index<usize> + ?Sized,
154
+ New: Index<usize> + ?Sized,
155
+ New::Output: PartialEq<Old::Output>,
156
+ {
157
+ while let Some(&prev_op) = pointer.checked_sub(1).and_then(|idx| ops.get(idx)) {
158
+ let this_op = ops[pointer];
159
+ match (this_op.tag(), prev_op.tag()) {
160
+ // Shift Inserts Upwards
161
+ (DiffTag::Insert, DiffTag::Equal) => {
162
+ let suffix_len =
163
+ common_suffix_len(old, prev_op.old_range(), new, this_op.new_range());
164
+ if suffix_len > 0 {
165
+ if let Some(DiffTag::Equal) = ops.get(pointer + 1).map(|x| x.tag()) {
166
+ ops[pointer + 1].grow_left(suffix_len);
167
+ } else {
168
+ ops.insert(
169
+ pointer + 1,
170
+ DiffOp::Equal {
171
+ old_index: prev_op.old_range().end - suffix_len,
172
+ new_index: this_op.new_range().end - suffix_len,
173
+ len: suffix_len,
174
+ },
175
+ );
176
+ }
177
+ ops[pointer].shift_left(suffix_len);
178
+ ops[pointer - 1].shrink_left(suffix_len);
179
+
180
+ if ops[pointer - 1].is_empty() {
181
+ ops.remove(pointer - 1);
182
+ pointer -= 1;
183
+ }
184
+ } else if ops[pointer - 1].is_empty() {
185
+ ops.remove(pointer - 1);
186
+ pointer -= 1;
187
+ } else {
188
+ // We can't shift upwards anymore
189
+ break;
190
+ }
191
+ }
192
+ // Shift Deletions Upwards
193
+ (DiffTag::Delete, DiffTag::Equal) => {
194
+ // check common suffix for the amount we can shift
195
+ let suffix_len =
196
+ common_suffix_len(old, prev_op.old_range(), new, this_op.new_range());
197
+ if suffix_len != 0 {
198
+ if let Some(DiffTag::Equal) = ops.get(pointer + 1).map(|x| x.tag()) {
199
+ ops[pointer + 1].grow_left(suffix_len);
200
+ } else {
201
+ let old_range = prev_op.old_range();
202
+ ops.insert(
203
+ pointer + 1,
204
+ DiffOp::Equal {
205
+ old_index: old_range.end - suffix_len,
206
+ new_index: this_op.new_range().end - suffix_len,
207
+ len: old_range.len() - suffix_len,
208
+ },
209
+ );
210
+ }
211
+ ops[pointer].shift_left(suffix_len);
212
+ ops[pointer - 1].shrink_left(suffix_len);
213
+
214
+ if ops[pointer - 1].is_empty() {
215
+ ops.remove(pointer - 1);
216
+ pointer -= 1;
217
+ }
218
+ } else if ops[pointer - 1].is_empty() {
219
+ ops.remove(pointer - 1);
220
+ pointer -= 1;
221
+ } else {
222
+ // We can't shift upwards anymore
223
+ break;
224
+ }
225
+ }
226
+ // Swap the Delete and Insert
227
+ (DiffTag::Insert, DiffTag::Delete) | (DiffTag::Delete, DiffTag::Insert) => {
228
+ ops.swap(pointer - 1, pointer);
229
+ pointer -= 1;
230
+ }
231
+ // Merge the two ranges
232
+ (DiffTag::Insert, DiffTag::Insert) => {
233
+ ops[pointer - 1].grow_right(this_op.new_range().len());
234
+ ops.remove(pointer);
235
+ pointer -= 1;
236
+ }
237
+ (DiffTag::Delete, DiffTag::Delete) => {
238
+ ops[pointer - 1].grow_right(this_op.old_range().len());
239
+ ops.remove(pointer);
240
+ pointer -= 1;
241
+ }
242
+ _ => unreachable!("unexpected tag"),
243
+ }
244
+ }
245
+ pointer
246
+ }
247
+
248
+ fn shift_diff_ops_down<Old, New>(
249
+ ops: &mut Vec<DiffOp>,
250
+ old: &Old,
251
+ new: &New,
252
+ mut pointer: usize,
253
+ ) -> usize
254
+ where
255
+ Old: Index<usize> + ?Sized,
256
+ New: Index<usize> + ?Sized,
257
+ New::Output: PartialEq<Old::Output>,
258
+ {
259
+ while let Some(&next_op) = pointer.checked_add(1).and_then(|idx| ops.get(idx)) {
260
+ let this_op = ops[pointer];
261
+ match (this_op.tag(), next_op.tag()) {
262
+ // Shift Inserts Downwards
263
+ (DiffTag::Insert, DiffTag::Equal) => {
264
+ let prefix_len =
265
+ common_prefix_len(old, next_op.old_range(), new, this_op.new_range());
266
+ if prefix_len > 0 {
267
+ if let Some(DiffTag::Equal) = pointer
268
+ .checked_sub(1)
269
+ .and_then(|x| ops.get(x))
270
+ .map(|x| x.tag())
271
+ {
272
+ ops[pointer - 1].grow_right(prefix_len);
273
+ } else {
274
+ ops.insert(
275
+ pointer,
276
+ DiffOp::Equal {
277
+ old_index: next_op.old_range().start,
278
+ new_index: this_op.new_range().start,
279
+ len: prefix_len,
280
+ },
281
+ );
282
+ pointer += 1;
283
+ }
284
+ ops[pointer].shift_right(prefix_len);
285
+ ops[pointer + 1].shrink_right(prefix_len);
286
+
287
+ if ops[pointer + 1].is_empty() {
288
+ ops.remove(pointer + 1);
289
+ }
290
+ } else if ops[pointer + 1].is_empty() {
291
+ ops.remove(pointer + 1);
292
+ } else {
293
+ // We can't shift upwards anymore
294
+ break;
295
+ }
296
+ }
297
+ // Shift Deletions Downwards
298
+ (DiffTag::Delete, DiffTag::Equal) => {
299
+ // check common suffix for the amount we can shift
300
+ let prefix_len =
301
+ common_prefix_len(old, next_op.old_range(), new, this_op.new_range());
302
+ if prefix_len > 0 {
303
+ if let Some(DiffTag::Equal) = pointer
304
+ .checked_sub(1)
305
+ .and_then(|x| ops.get(x))
306
+ .map(|x| x.tag())
307
+ {
308
+ ops[pointer - 1].grow_right(prefix_len);
309
+ } else {
310
+ ops.insert(
311
+ pointer,
312
+ DiffOp::Equal {
313
+ old_index: next_op.old_range().start,
314
+ new_index: this_op.new_range().start,
315
+ len: prefix_len,
316
+ },
317
+ );
318
+ pointer += 1;
319
+ }
320
+ ops[pointer].shift_right(prefix_len);
321
+ ops[pointer + 1].shrink_right(prefix_len);
322
+
323
+ if ops[pointer + 1].is_empty() {
324
+ ops.remove(pointer + 1);
325
+ }
326
+ } else if ops[pointer + 1].is_empty() {
327
+ ops.remove(pointer + 1);
328
+ } else {
329
+ // We can't shift downwards anymore
330
+ break;
331
+ }
332
+ }
333
+ // Swap the Delete and Insert
334
+ (DiffTag::Insert, DiffTag::Delete) | (DiffTag::Delete, DiffTag::Insert) => {
335
+ ops.swap(pointer, pointer + 1);
336
+ pointer += 1;
337
+ }
338
+ // Merge the two ranges
339
+ (DiffTag::Insert, DiffTag::Insert) => {
340
+ ops[pointer].grow_right(next_op.new_range().len());
341
+ ops.remove(pointer + 1);
342
+ }
343
+ (DiffTag::Delete, DiffTag::Delete) => {
344
+ ops[pointer].grow_right(next_op.old_range().len());
345
+ ops.remove(pointer + 1);
346
+ }
347
+ _ => unreachable!("unexpected tag"),
348
+ }
349
+ }
350
+ pointer
351
+ }
@@ -0,0 +1,178 @@
1
+ /// A trait for reacting to an edit script from the "old" version to
2
+ /// the "new" version.
3
+ pub trait DiffHook: Sized {
4
+ /// The error produced from the hook methods.
5
+ type Error;
6
+
7
+ /// Called when lines with indices `old_index` (in the old version) and
8
+ /// `new_index` (in the new version) start an section equal in both
9
+ /// versions, of length `len`.
10
+ fn equal(&mut self, old_index: usize, new_index: usize, len: usize) -> Result<(), Self::Error> {
11
+ let _ = old_index;
12
+ let _ = new_index;
13
+ let _ = len;
14
+ Ok(())
15
+ }
16
+
17
+ /// Called when a section of length `old_len`, starting at `old_index`,
18
+ /// needs to be deleted from the old version.
19
+ fn delete(
20
+ &mut self,
21
+ old_index: usize,
22
+ old_len: usize,
23
+ new_index: usize,
24
+ ) -> Result<(), Self::Error> {
25
+ let _ = old_index;
26
+ let _ = old_len;
27
+ let _ = new_index;
28
+ Ok(())
29
+ }
30
+
31
+ /// Called when a section of the new version, of length `new_len`
32
+ /// and starting at `new_index`, needs to be inserted at position `old_index'.
33
+ fn insert(
34
+ &mut self,
35
+ old_index: usize,
36
+ new_index: usize,
37
+ new_len: usize,
38
+ ) -> Result<(), Self::Error> {
39
+ let _ = old_index;
40
+ let _ = new_index;
41
+ let _ = new_len;
42
+ Ok(())
43
+ }
44
+
45
+ /// Called when a section of the old version, starting at index
46
+ /// `old_index` and of length `old_len`, needs to be replaced with a
47
+ /// section of length `new_len`, starting at `new_index`, of the new
48
+ /// version.
49
+ ///
50
+ /// The default implementations invokes `delete` and `insert`.
51
+ ///
52
+ /// You can use the [`Replace`](crate::algorithms::Replace) hook to
53
+ /// automatically generate these.
54
+ #[inline(always)]
55
+ fn replace(
56
+ &mut self,
57
+ old_index: usize,
58
+ old_len: usize,
59
+ new_index: usize,
60
+ new_len: usize,
61
+ ) -> Result<(), Self::Error> {
62
+ self.delete(old_index, old_len, new_index)?;
63
+ self.insert(old_index, new_index, new_len)
64
+ }
65
+
66
+ /// Always called at the end of the algorithm.
67
+ #[inline(always)]
68
+ fn finish(&mut self) -> Result<(), Self::Error> {
69
+ Ok(())
70
+ }
71
+ }
72
+
73
+ impl<'a, D: DiffHook + 'a> DiffHook for &'a mut D {
74
+ type Error = D::Error;
75
+
76
+ #[inline(always)]
77
+ fn equal(&mut self, old_index: usize, new_index: usize, len: usize) -> Result<(), Self::Error> {
78
+ (*self).equal(old_index, new_index, len)
79
+ }
80
+
81
+ #[inline(always)]
82
+ fn delete(
83
+ &mut self,
84
+ old_index: usize,
85
+ old_len: usize,
86
+ new_index: usize,
87
+ ) -> Result<(), Self::Error> {
88
+ (*self).delete(old_index, old_len, new_index)
89
+ }
90
+
91
+ #[inline(always)]
92
+ fn insert(
93
+ &mut self,
94
+ old_index: usize,
95
+ new_index: usize,
96
+ new_len: usize,
97
+ ) -> Result<(), Self::Error> {
98
+ (*self).insert(old_index, new_index, new_len)
99
+ }
100
+
101
+ #[inline(always)]
102
+ fn replace(
103
+ &mut self,
104
+ old: usize,
105
+ old_len: usize,
106
+ new: usize,
107
+ new_len: usize,
108
+ ) -> Result<(), Self::Error> {
109
+ (*self).replace(old, old_len, new, new_len)
110
+ }
111
+
112
+ #[inline(always)]
113
+ fn finish(&mut self) -> Result<(), Self::Error> {
114
+ (*self).finish()
115
+ }
116
+ }
117
+
118
+ /// Wrapper [`DiffHook`] that prevents calls to [`DiffHook::finish`].
119
+ ///
120
+ /// This hook is useful in situations where diff hooks are composed but you
121
+ /// want to prevent that the finish hook method is called.
122
+ pub struct NoFinishHook<D: DiffHook>(D);
123
+
124
+ impl<D: DiffHook> NoFinishHook<D> {
125
+ /// Wraps another hook.
126
+ pub fn new(d: D) -> NoFinishHook<D> {
127
+ NoFinishHook(d)
128
+ }
129
+
130
+ /// Extracts the inner hook.
131
+ pub fn into_inner(self) -> D {
132
+ self.0
133
+ }
134
+ }
135
+
136
+ impl<D: DiffHook> DiffHook for NoFinishHook<D> {
137
+ type Error = D::Error;
138
+
139
+ #[inline(always)]
140
+ fn equal(&mut self, old_index: usize, new_index: usize, len: usize) -> Result<(), Self::Error> {
141
+ self.0.equal(old_index, new_index, len)
142
+ }
143
+
144
+ #[inline(always)]
145
+ fn delete(
146
+ &mut self,
147
+ old_index: usize,
148
+ old_len: usize,
149
+ new_index: usize,
150
+ ) -> Result<(), Self::Error> {
151
+ self.0.delete(old_index, old_len, new_index)
152
+ }
153
+
154
+ #[inline(always)]
155
+ fn insert(
156
+ &mut self,
157
+ old_index: usize,
158
+ new_index: usize,
159
+ new_len: usize,
160
+ ) -> Result<(), Self::Error> {
161
+ self.0.insert(old_index, new_index, new_len)
162
+ }
163
+
164
+ #[inline(always)]
165
+ fn replace(
166
+ &mut self,
167
+ old_index: usize,
168
+ old_len: usize,
169
+ new_index: usize,
170
+ new_len: usize,
171
+ ) -> Result<(), Self::Error> {
172
+ self.0.replace(old_index, old_len, new_index, new_len)
173
+ }
174
+
175
+ fn finish(&mut self) -> Result<(), Self::Error> {
176
+ Ok(())
177
+ }
178
+ }