git 4.3.2 → 5.0.0.beta.2

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 (297) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +73 -2705
  3. data/.github/prompts/iteratively-address-copilot-reviews.prompt.md +188 -0
  4. data/.github/pull_request_template.md +3 -1
  5. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  6. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  7. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  8. data/.github/skills/command-implementation/SKILL.md +229 -0
  9. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  10. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  11. data/.github/skills/dependency-management/SKILL.md +72 -0
  12. data/.github/skills/development-workflow/SKILL.md +506 -0
  13. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  14. data/.github/skills/extract-facade-from-base-lib/KEYWORD_ARG_REMEDIATION.md +22 -0
  15. data/.github/skills/extract-facade-from-base-lib/SKILL.md +600 -0
  16. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  17. data/.github/skills/facade-implementation/SKILL.md +274 -0
  18. data/.github/skills/facade-test-conventions/SKILL.md +394 -0
  19. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  20. data/.github/skills/make-skill-template/SKILL.md +176 -0
  21. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  22. data/.github/skills/project-context/SKILL.md +313 -0
  23. data/.github/skills/pull-request-review/SKILL.md +168 -0
  24. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  25. data/.github/skills/release-management/SKILL.md +125 -0
  26. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  27. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  28. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  29. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  30. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  31. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  32. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  33. data/.github/skills/test-debugging/SKILL.md +160 -0
  34. data/.github/skills/yard-documentation/SKILL.md +793 -0
  35. data/.github/workflows/continuous_integration.yml +3 -2
  36. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  37. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  38. data/.github/workflows/release.yml +3 -4
  39. data/.gitignore +8 -0
  40. data/.husky/pre-commit +13 -0
  41. data/.release-please-manifest.json +1 -1
  42. data/.rspec +3 -0
  43. data/.rubocop.yml +12 -3
  44. data/.rubocop_todo.yml +23 -5
  45. data/.yardopts +1 -0
  46. data/CHANGELOG.md +0 -40
  47. data/CONTRIBUTING.md +694 -53
  48. data/README.md +67 -15
  49. data/Rakefile +61 -9
  50. data/UPGRADING.md +141 -0
  51. data/commitlint.test +4 -0
  52. data/git.gemspec +18 -7
  53. data/lib/git/args_builder.rb +0 -8
  54. data/lib/git/branch.rb +369 -43
  55. data/lib/git/branch_delete_failure.rb +31 -0
  56. data/lib/git/branch_delete_result.rb +63 -0
  57. data/lib/git/branch_info.rb +178 -0
  58. data/lib/git/branches.rb +122 -24
  59. data/lib/git/command_line/base.rb +255 -0
  60. data/lib/git/command_line/capturing.rb +251 -0
  61. data/lib/git/command_line/result.rb +96 -0
  62. data/lib/git/command_line/streaming.rb +196 -0
  63. data/lib/git/command_line.rb +43 -322
  64. data/lib/git/command_line_result.rb +4 -88
  65. data/lib/git/commands/add.rb +131 -0
  66. data/lib/git/commands/am/abort.rb +43 -0
  67. data/lib/git/commands/am/apply.rb +252 -0
  68. data/lib/git/commands/am/continue.rb +43 -0
  69. data/lib/git/commands/am/quit.rb +43 -0
  70. data/lib/git/commands/am/retry.rb +47 -0
  71. data/lib/git/commands/am/show_current_patch.rb +64 -0
  72. data/lib/git/commands/am/skip.rb +42 -0
  73. data/lib/git/commands/am.rb +33 -0
  74. data/lib/git/commands/apply.rb +237 -0
  75. data/lib/git/commands/archive/list_formats.rb +46 -0
  76. data/lib/git/commands/archive.rb +140 -0
  77. data/lib/git/commands/arguments.rb +3510 -0
  78. data/lib/git/commands/base.rb +404 -0
  79. data/lib/git/commands/branch/copy.rb +94 -0
  80. data/lib/git/commands/branch/create.rb +173 -0
  81. data/lib/git/commands/branch/delete.rb +80 -0
  82. data/lib/git/commands/branch/list.rb +162 -0
  83. data/lib/git/commands/branch/move.rb +94 -0
  84. data/lib/git/commands/branch/set_upstream.rb +86 -0
  85. data/lib/git/commands/branch/show_current.rb +49 -0
  86. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  87. data/lib/git/commands/branch.rb +34 -0
  88. data/lib/git/commands/cat_file/batch.rb +369 -0
  89. data/lib/git/commands/cat_file/filtered.rb +105 -0
  90. data/lib/git/commands/cat_file/raw.rb +216 -0
  91. data/lib/git/commands/cat_file.rb +49 -0
  92. data/lib/git/commands/checkout/branch.rb +151 -0
  93. data/lib/git/commands/checkout/files.rb +115 -0
  94. data/lib/git/commands/checkout.rb +38 -0
  95. data/lib/git/commands/checkout_index.rb +105 -0
  96. data/lib/git/commands/clean.rb +100 -0
  97. data/lib/git/commands/clone.rb +240 -0
  98. data/lib/git/commands/commit.rb +272 -0
  99. data/lib/git/commands/commit_tree.rb +100 -0
  100. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  101. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  102. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  103. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  104. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  105. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  106. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +107 -0
  107. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  108. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  109. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  110. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  111. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  112. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  113. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  114. data/lib/git/commands/config_option_syntax.rb +56 -0
  115. data/lib/git/commands/describe.rb +155 -0
  116. data/lib/git/commands/diff.rb +656 -0
  117. data/lib/git/commands/diff_files.rb +518 -0
  118. data/lib/git/commands/diff_index.rb +496 -0
  119. data/lib/git/commands/fetch.rb +352 -0
  120. data/lib/git/commands/fsck.rb +136 -0
  121. data/lib/git/commands/gc.rb +132 -0
  122. data/lib/git/commands/grep.rb +338 -0
  123. data/lib/git/commands/init.rb +99 -0
  124. data/lib/git/commands/log.rb +632 -0
  125. data/lib/git/commands/ls_files.rb +191 -0
  126. data/lib/git/commands/ls_remote.rb +155 -0
  127. data/lib/git/commands/ls_tree.rb +131 -0
  128. data/lib/git/commands/maintenance/register.rb +75 -0
  129. data/lib/git/commands/maintenance/run.rb +104 -0
  130. data/lib/git/commands/maintenance/start.rb +66 -0
  131. data/lib/git/commands/maintenance/stop.rb +55 -0
  132. data/lib/git/commands/maintenance/unregister.rb +79 -0
  133. data/lib/git/commands/maintenance.rb +31 -0
  134. data/lib/git/commands/merge/abort.rb +44 -0
  135. data/lib/git/commands/merge/continue.rb +44 -0
  136. data/lib/git/commands/merge/quit.rb +46 -0
  137. data/lib/git/commands/merge/start.rb +245 -0
  138. data/lib/git/commands/merge.rb +28 -0
  139. data/lib/git/commands/merge_base.rb +86 -0
  140. data/lib/git/commands/mv.rb +77 -0
  141. data/lib/git/commands/name_rev.rb +114 -0
  142. data/lib/git/commands/pull.rb +377 -0
  143. data/lib/git/commands/push.rb +246 -0
  144. data/lib/git/commands/read_tree.rb +149 -0
  145. data/lib/git/commands/remote/add.rb +91 -0
  146. data/lib/git/commands/remote/get_url.rb +66 -0
  147. data/lib/git/commands/remote/list.rb +54 -0
  148. data/lib/git/commands/remote/prune.rb +61 -0
  149. data/lib/git/commands/remote/remove.rb +52 -0
  150. data/lib/git/commands/remote/rename.rb +69 -0
  151. data/lib/git/commands/remote/set_branches.rb +63 -0
  152. data/lib/git/commands/remote/set_head.rb +82 -0
  153. data/lib/git/commands/remote/set_url.rb +71 -0
  154. data/lib/git/commands/remote/set_url_add.rb +61 -0
  155. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  156. data/lib/git/commands/remote/show.rb +71 -0
  157. data/lib/git/commands/remote/update.rb +72 -0
  158. data/lib/git/commands/remote.rb +42 -0
  159. data/lib/git/commands/repack.rb +277 -0
  160. data/lib/git/commands/reset.rb +147 -0
  161. data/lib/git/commands/rev_parse.rb +297 -0
  162. data/lib/git/commands/revert/abort.rb +45 -0
  163. data/lib/git/commands/revert/continue.rb +57 -0
  164. data/lib/git/commands/revert/quit.rb +47 -0
  165. data/lib/git/commands/revert/skip.rb +44 -0
  166. data/lib/git/commands/revert/start.rb +153 -0
  167. data/lib/git/commands/revert.rb +29 -0
  168. data/lib/git/commands/rm.rb +114 -0
  169. data/lib/git/commands/show.rb +632 -0
  170. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  171. data/lib/git/commands/show_ref/exists.rb +78 -0
  172. data/lib/git/commands/show_ref/list.rb +145 -0
  173. data/lib/git/commands/show_ref/verify.rb +120 -0
  174. data/lib/git/commands/show_ref.rb +42 -0
  175. data/lib/git/commands/stash/apply.rb +75 -0
  176. data/lib/git/commands/stash/branch.rb +65 -0
  177. data/lib/git/commands/stash/clear.rb +41 -0
  178. data/lib/git/commands/stash/create.rb +58 -0
  179. data/lib/git/commands/stash/drop.rb +67 -0
  180. data/lib/git/commands/stash/list.rb +39 -0
  181. data/lib/git/commands/stash/pop.rb +78 -0
  182. data/lib/git/commands/stash/push.rb +103 -0
  183. data/lib/git/commands/stash/show.rb +149 -0
  184. data/lib/git/commands/stash/store.rb +63 -0
  185. data/lib/git/commands/stash.rb +38 -0
  186. data/lib/git/commands/status.rb +169 -0
  187. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  188. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  189. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  190. data/lib/git/commands/symbolic_ref.rb +38 -0
  191. data/lib/git/commands/tag/create.rb +139 -0
  192. data/lib/git/commands/tag/delete.rb +55 -0
  193. data/lib/git/commands/tag/list.rb +143 -0
  194. data/lib/git/commands/tag/verify.rb +71 -0
  195. data/lib/git/commands/tag.rb +26 -0
  196. data/lib/git/commands/update_ref/batch.rb +140 -0
  197. data/lib/git/commands/update_ref/delete.rb +92 -0
  198. data/lib/git/commands/update_ref/update.rb +106 -0
  199. data/lib/git/commands/update_ref.rb +42 -0
  200. data/lib/git/commands/version.rb +57 -0
  201. data/lib/git/commands/worktree/add.rb +140 -0
  202. data/lib/git/commands/worktree/list.rb +64 -0
  203. data/lib/git/commands/worktree/lock.rb +58 -0
  204. data/lib/git/commands/worktree/management_base.rb +51 -0
  205. data/lib/git/commands/worktree/move.rb +66 -0
  206. data/lib/git/commands/worktree/prune.rb +67 -0
  207. data/lib/git/commands/worktree/remove.rb +63 -0
  208. data/lib/git/commands/worktree/repair.rb +76 -0
  209. data/lib/git/commands/worktree/unlock.rb +47 -0
  210. data/lib/git/commands/worktree.rb +43 -0
  211. data/lib/git/commands/write_tree.rb +68 -0
  212. data/lib/git/commands.rb +87 -0
  213. data/lib/git/config.rb +17 -0
  214. data/lib/git/config_entry_info.rb +106 -0
  215. data/lib/git/configuring.rb +665 -0
  216. data/lib/git/deprecation.rb +9 -0
  217. data/lib/git/detached_head_info.rb +54 -0
  218. data/lib/git/diff.rb +293 -7
  219. data/lib/git/diff_file_numstat_info.rb +29 -0
  220. data/lib/git/diff_file_patch_info.rb +134 -0
  221. data/lib/git/diff_file_raw_info.rb +127 -0
  222. data/lib/git/diff_info.rb +169 -0
  223. data/lib/git/diff_path_status.rb +67 -19
  224. data/lib/git/diff_result.rb +32 -0
  225. data/lib/git/diff_stats.rb +51 -14
  226. data/lib/git/dirstat_info.rb +86 -0
  227. data/lib/git/errors.rb +65 -2
  228. data/lib/git/execution_context/global.rb +31 -0
  229. data/lib/git/execution_context/repository.rb +136 -0
  230. data/lib/git/execution_context.rb +501 -0
  231. data/lib/git/file_ref.rb +74 -0
  232. data/lib/git/fsck_object.rb +9 -9
  233. data/lib/git/fsck_result.rb +1 -1
  234. data/lib/git/log.rb +9 -2
  235. data/lib/git/object.rb +90 -27
  236. data/lib/git/parsers/branch.rb +224 -0
  237. data/lib/git/parsers/cat_file.rb +111 -0
  238. data/lib/git/parsers/config_entry.rb +110 -0
  239. data/lib/git/parsers/diff.rb +585 -0
  240. data/lib/git/parsers/fsck.rb +133 -0
  241. data/lib/git/parsers/grep.rb +42 -0
  242. data/lib/git/parsers/ls_remote.rb +79 -0
  243. data/lib/git/parsers/ls_tree.rb +58 -0
  244. data/lib/git/parsers/stash.rb +208 -0
  245. data/lib/git/parsers/tag.rb +257 -0
  246. data/lib/git/remote.rb +120 -9
  247. data/lib/git/repository/branching.rb +743 -0
  248. data/lib/git/repository/committing.rb +187 -0
  249. data/lib/git/repository/configuring.rb +351 -0
  250. data/lib/git/repository/context_helpers.rb +264 -0
  251. data/lib/git/repository/diffing.rb +775 -0
  252. data/lib/git/repository/factories.rb +682 -0
  253. data/lib/git/repository/inspecting.rb +252 -0
  254. data/lib/git/repository/logging.rb +247 -0
  255. data/lib/git/repository/maintenance.rb +65 -0
  256. data/lib/git/repository/merging.rb +357 -0
  257. data/lib/git/repository/object_operations.rb +1199 -0
  258. data/lib/git/repository/path_resolver.rb +207 -0
  259. data/lib/git/repository/remote_operations.rb +898 -0
  260. data/lib/git/repository/shared_private.rb +51 -0
  261. data/lib/git/repository/staging.rb +554 -0
  262. data/lib/git/repository/stashing.rb +143 -0
  263. data/lib/git/repository/status_operations.rb +201 -0
  264. data/lib/git/repository/worktree_operations.rb +159 -0
  265. data/lib/git/repository.rb +203 -1
  266. data/lib/git/stash.rb +78 -4
  267. data/lib/git/stash_info.rb +104 -0
  268. data/lib/git/stashes.rb +125 -13
  269. data/lib/git/status.rb +215 -18
  270. data/lib/git/tag_delete_failure.rb +31 -0
  271. data/lib/git/tag_delete_result.rb +63 -0
  272. data/lib/git/tag_info.rb +105 -0
  273. data/lib/git/version.rb +109 -2
  274. data/lib/git/version_constraint.rb +81 -0
  275. data/lib/git/worktree.rb +108 -6
  276. data/lib/git/worktrees.rb +94 -7
  277. data/lib/git.rb +260 -61
  278. data/redesign/1_architecture_existing.md +54 -18
  279. data/redesign/2_architecture_redesign.md +365 -46
  280. data/redesign/3_architecture_implementation.md +1497 -63
  281. data/redesign/Phase 4 - Step A.md +360 -0
  282. data/redesign/beta_release.md +107 -0
  283. data/redesign/c1c2_audit.md +566 -0
  284. data/redesign/c1c2_bucket6_lib_orphans.md +626 -0
  285. data/redesign/config_design.rb +501 -0
  286. data/tasks/gem_tasks.rake +4 -0
  287. data/tasks/npm_tasks.rake +7 -0
  288. data/tasks/rspec.rake +48 -0
  289. data/tasks/test.rake +13 -1
  290. data/tasks/yard.rake +34 -7
  291. metadata +365 -22
  292. data/lib/git/base.rb +0 -1128
  293. data/lib/git/index.rb +0 -6
  294. data/lib/git/lib.rb +0 -2277
  295. data/lib/git/path.rb +0 -38
  296. data/lib/git/working_directory.rb +0 -6
  297. /data/{release-please-config.json → .release-please-config.json} +0 -0
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ # Implements the `git write-tree` command
8
+ #
9
+ # Creates a tree object using the current index and prints the SHA-1 name of
10
+ # the new tree object to standard output. The index must be in a fully
11
+ # merged state.
12
+ #
13
+ # @example Write the current index as a tree object
14
+ # write_tree = Git::Commands::WriteTree.new(execution_context)
15
+ # result = write_tree.call
16
+ # sha = result.stdout # => "abc123..."
17
+ #
18
+ # @example Write only a subdirectory as a tree object
19
+ # write_tree = Git::Commands::WriteTree.new(execution_context)
20
+ # result = write_tree.call(prefix: 'lib/')
21
+ #
22
+ # @example Allow missing objects in the object database
23
+ # write_tree = Git::Commands::WriteTree.new(execution_context)
24
+ # result = write_tree.call(missing_ok: true)
25
+ #
26
+ # @note `arguments` block audited against https://git-scm.com/docs/git-write-tree/2.53.0
27
+ #
28
+ # @see https://git-scm.com/docs/git-write-tree git-write-tree
29
+ #
30
+ # @see Git::Commands
31
+ #
32
+ # @api private
33
+ #
34
+ class WriteTree < Git::Commands::Base
35
+ arguments do
36
+ literal 'write-tree'
37
+ flag_option :missing_ok
38
+ value_option :prefix, inline: true
39
+ end
40
+
41
+ # @!method call(*, **)
42
+ #
43
+ # @overload call(**options)
44
+ #
45
+ # Execute the `git write-tree` command
46
+ #
47
+ # @param options [Hash] command options
48
+ #
49
+ # @option options [Boolean, nil] :missing_ok (nil) disable the check that
50
+ # all objects referenced by the directory exist in the object
51
+ # database
52
+ #
53
+ # @option options [String] :prefix (nil) write a tree object that
54
+ # represents a subdirectory
55
+ #
56
+ # The prefix path should end with `/` (e.g., `'lib/'`).
57
+ #
58
+ # @return [Git::CommandLineResult] the result of calling `git write-tree`
59
+ #
60
+ # @raise [ArgumentError] if unsupported options are provided
61
+ #
62
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
63
+ #
64
+ # @api public
65
+ #
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'commands/base'
4
+ require_relative 'commands/add'
5
+ require_relative 'commands/am'
6
+ require_relative 'commands/apply'
7
+ require_relative 'commands/archive'
8
+ require_relative 'commands/branch'
9
+ require_relative 'commands/cat_file'
10
+ require_relative 'commands/checkout'
11
+ require_relative 'commands/checkout_index'
12
+ require_relative 'commands/clean'
13
+ require_relative 'commands/clone'
14
+ require_relative 'commands/commit'
15
+ require_relative 'commands/commit_tree'
16
+ require_relative 'commands/config_option_syntax'
17
+ require_relative 'commands/describe'
18
+ require_relative 'commands/diff'
19
+ require_relative 'commands/diff_files'
20
+ require_relative 'commands/diff_index'
21
+ require_relative 'commands/fetch'
22
+ require_relative 'commands/fsck'
23
+ require_relative 'commands/gc'
24
+ require_relative 'commands/grep'
25
+ require_relative 'commands/init'
26
+ require_relative 'commands/log'
27
+ require_relative 'commands/ls_files'
28
+ require_relative 'commands/ls_remote'
29
+ require_relative 'commands/ls_tree'
30
+ require_relative 'commands/maintenance'
31
+ require_relative 'commands/merge'
32
+ require_relative 'commands/merge_base'
33
+ require_relative 'commands/mv'
34
+ require_relative 'commands/name_rev'
35
+ require_relative 'commands/pull'
36
+ require_relative 'commands/push'
37
+ require_relative 'commands/read_tree'
38
+ require_relative 'commands/remote'
39
+ require_relative 'commands/repack'
40
+ require_relative 'commands/reset'
41
+ require_relative 'commands/rev_parse'
42
+ require_relative 'commands/revert'
43
+ require_relative 'commands/rm'
44
+ require_relative 'commands/show'
45
+ require_relative 'commands/show_ref'
46
+ require_relative 'commands/stash'
47
+ require_relative 'commands/status'
48
+ require_relative 'commands/symbolic_ref'
49
+ require_relative 'commands/tag'
50
+ require_relative 'commands/update_ref'
51
+ require_relative 'commands/version'
52
+ require_relative 'commands/worktree'
53
+ require_relative 'commands/write_tree'
54
+
55
+ module Git
56
+ # Internal command layer for the git gem
57
+ #
58
+ # Each git operation is represented by a class within this namespace. Command
59
+ # classes define the CLI contract via the {Arguments} DSL, bind caller-supplied
60
+ # parameters to command-line flags and operands, execute the subprocess through
61
+ # {Git::CommandLine}, and return a raw {Git::CommandLineResult}.
62
+ #
63
+ # Commands do **not** parse output — that responsibility belongs to the
64
+ # {Git::Parsers} layer, orchestrated by the facade ({Git::Repository}).
65
+ #
66
+ # All classes in this namespace are internal (`@api private`). End users
67
+ # should interact with the public API on {Git::Repository} instead.
68
+ #
69
+ # ## Architecture
70
+ #
71
+ # ```
72
+ # Git::Repository (public API / facade — orchestrates commands + parsers)
73
+ # └── Git::Commands::* (defines CLI API, binds args, executes)
74
+ # └── Git::CommandLine (subprocess execution)
75
+ # ```
76
+ #
77
+ # Simple commands inherit from {Commands::Base} and only need an `arguments`
78
+ # block. Multi-mode git commands (e.g., `git branch`, `git stash`) are split
79
+ # into namespace modules with one class per mode.
80
+ #
81
+ # @api private
82
+ #
83
+ # @see Git::Commands::Base
84
+ # @see Git::Commands::Arguments
85
+ #
86
+ module Commands; end
87
+ end
data/lib/git/config.rb CHANGED
@@ -3,6 +3,23 @@
3
3
  module Git
4
4
  # The global configuration for this gem
5
5
  class Config
6
+ # Returns the process-wide singleton {Git::Config} instance
7
+ #
8
+ # All calls to {Git.configure}, {Git.config}, and the {Git::ExecutionContext}
9
+ # classes resolve global configuration through this method.
10
+ #
11
+ # @example Read the configured binary path
12
+ # Git::Config.instance.binary_path #=> "git"
13
+ #
14
+ # @example Mutate the singleton (same as Git.configure { |c| ... })
15
+ # Git::Config.instance.binary_path = '/usr/local/bin/git'
16
+ #
17
+ # @return [Git::Config] the singleton config object
18
+ #
19
+ def self.instance
20
+ @instance ||= new
21
+ end
22
+
6
23
  attr_writer :binary_path, :git_ssh, :timeout
7
24
 
8
25
  def initialize
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ # Represents a single Git configuration entry
5
+ #
6
+ # Returned by {Git::Configuring} read operations such as {Git::Configuring#config_get},
7
+ # {Git::Configuring#config_get_all}, {Git::Configuring#config_list}, and their
8
+ # related methods.
9
+ #
10
+ # @example Create a ConfigEntryInfo
11
+ # entry = Git::ConfigEntryInfo.new(
12
+ # scope: 'local',
13
+ # origin: 'file:.git/config',
14
+ # key: 'remote.origin.url',
15
+ # value: 'https://github.com/ruby-git/ruby-git'
16
+ # )
17
+ # entry.section # => "remote"
18
+ # entry.subsection # => "origin"
19
+ # entry.variable # => "url"
20
+ #
21
+ # @api public
22
+ #
23
+ # @!attribute [r] scope
24
+ #
25
+ # The scope of the configuration entry
26
+ #
27
+ # May be one of `"system"`, `"global"`, `"local"`, `"worktree"`, `"command"`,
28
+ # `"file"`, or `"blob"`. The `"command"` scope is used for values supplied
29
+ # via the command line (including default values from `--default`).
30
+ #
31
+ # @return [String] the config scope string (e.g. `"local"`, `"global"`)
32
+ #
33
+ # @!attribute [r] origin
34
+ #
35
+ # Where the configuration entry originates
36
+ #
37
+ # The origin is in the format `<origin-type>:<actual-origin>` and is never
38
+ # blank. The origin type prefix is one of `file:`, `blob:`, `command line:`,
39
+ # or `standard input:`.
40
+ #
41
+ # `nil` when the git command used to retrieve this entry does not support
42
+ # `--show-origin` (currently only `--get-urlmatch`).
43
+ #
44
+ # @return [String, nil] the origin path in the format `<type>:<path>`, or `nil`
45
+ #
46
+ # @!attribute [r] key
47
+ #
48
+ # The full dotted key name of the configuration entry (e.g., `remote.origin.url`)
49
+ #
50
+ # @return [String] the full dotted key name (e.g. `remote.origin.url`)
51
+ #
52
+ # @!attribute [r] value
53
+ #
54
+ # The value of the configuration entry
55
+ #
56
+ # @return [String] the string value of this entry
57
+ #
58
+ ConfigEntryInfo = Data.define(:scope, :origin, :key, :value) do
59
+ # Returns the section component of the key (everything before the first dot)
60
+ #
61
+ # Returns an empty string when the key contains no dot.
62
+ #
63
+ # @example Section component of a dotted key
64
+ # entry.section # => "remote"
65
+ #
66
+ # @return [String] the section name, or an empty string when the key has no dot
67
+ #
68
+ def section = first_dot ? key[0...first_dot] : ''
69
+
70
+ # Returns the subsection component of the key (everything between the first and last dot)
71
+ #
72
+ # Returns an empty string when the key has zero or one dot (no subsection).
73
+ #
74
+ # @example Subsection component of a dotted key
75
+ # entry.subsection # => "origin"
76
+ #
77
+ # @return [String] the subsection name, or an empty string when there is no subsection
78
+ #
79
+ def subsection = first_dot && first_dot != last_dot ? key[(first_dot + 1)...last_dot] : ''
80
+
81
+ # Returns the variable component of the key (everything after the last dot)
82
+ #
83
+ # Returns the full key when the key contains no dot.
84
+ #
85
+ # @example Variable component of a dotted key
86
+ # entry.variable # => "url"
87
+ #
88
+ # @return [String] the variable name (everything after the last dot)
89
+ #
90
+ def variable = last_dot ? key[(last_dot + 1)..] : key
91
+
92
+ private
93
+
94
+ # Returns the index of the first dot in the key, or nil if none exists
95
+ #
96
+ # @return [Integer, nil] the zero-based index of the first dot, or `nil`
97
+ #
98
+ def first_dot = key.index('.')
99
+
100
+ # Returns the index of the last dot in the key, or nil if none exists
101
+ #
102
+ # @return [Integer, nil] the zero-based index of the last dot, or `nil`
103
+ #
104
+ def last_dot = key.rindex('.')
105
+ end
106
+ end