git 4.3.2 → 5.0.0.beta.1

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 (280) hide show
  1. checksums.yaml +4 -4
  2. data/.github/copilot-instructions.md +67 -2705
  3. data/.github/pull_request_template.md +3 -1
  4. data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
  5. data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
  6. data/.github/skills/command-implementation/REFERENCE.md +993 -0
  7. data/.github/skills/command-implementation/SKILL.md +229 -0
  8. data/.github/skills/command-test-conventions/SKILL.md +660 -0
  9. data/.github/skills/command-yard-documentation/SKILL.md +426 -0
  10. data/.github/skills/dependency-management/SKILL.md +72 -0
  11. data/.github/skills/development-workflow/SKILL.md +506 -0
  12. data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
  13. data/.github/skills/extract-facade-from-base-lib/SKILL.md +586 -0
  14. data/.github/skills/facade-implementation/REFERENCE.md +840 -0
  15. data/.github/skills/facade-implementation/SKILL.md +260 -0
  16. data/.github/skills/facade-test-conventions/SKILL.md +380 -0
  17. data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
  18. data/.github/skills/make-skill-template/SKILL.md +176 -0
  19. data/.github/skills/pr-readiness-review/SKILL.md +185 -0
  20. data/.github/skills/project-context/SKILL.md +313 -0
  21. data/.github/skills/pull-request-review/SKILL.md +168 -0
  22. data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
  23. data/.github/skills/release-management/SKILL.md +125 -0
  24. data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
  25. data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
  26. data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
  27. data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
  28. data/.github/skills/reviewing-skills/SKILL.md +189 -0
  29. data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
  30. data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
  31. data/.github/skills/test-debugging/SKILL.md +160 -0
  32. data/.github/skills/yard-documentation/SKILL.md +793 -0
  33. data/.github/workflows/continuous_integration.yml +3 -2
  34. data/.github/workflows/enforce_conventional_commits.yml +1 -1
  35. data/.github/workflows/experimental_continuous_integration.yml +2 -2
  36. data/.github/workflows/release.yml +3 -4
  37. data/.gitignore +8 -0
  38. data/.husky/pre-commit +13 -0
  39. data/.release-please-manifest.json +1 -1
  40. data/.rspec +3 -0
  41. data/.rubocop.yml +7 -3
  42. data/.rubocop_todo.yml +23 -5
  43. data/.yardopts +1 -0
  44. data/CHANGELOG.md +0 -40
  45. data/CONTRIBUTING.md +694 -53
  46. data/README.md +17 -5
  47. data/Rakefile +61 -9
  48. data/commitlint.test +4 -0
  49. data/git.gemspec +14 -8
  50. data/lib/git/args_builder.rb +0 -8
  51. data/lib/git/base.rb +486 -410
  52. data/lib/git/branch.rb +380 -43
  53. data/lib/git/branch_delete_failure.rb +31 -0
  54. data/lib/git/branch_delete_result.rb +63 -0
  55. data/lib/git/branch_info.rb +178 -0
  56. data/lib/git/branches.rb +130 -24
  57. data/lib/git/command_line/base.rb +245 -0
  58. data/lib/git/command_line/capturing.rb +249 -0
  59. data/lib/git/command_line/result.rb +96 -0
  60. data/lib/git/command_line/streaming.rb +194 -0
  61. data/lib/git/command_line.rb +43 -322
  62. data/lib/git/command_line_result.rb +4 -88
  63. data/lib/git/commands/add.rb +131 -0
  64. data/lib/git/commands/am/abort.rb +43 -0
  65. data/lib/git/commands/am/apply.rb +252 -0
  66. data/lib/git/commands/am/continue.rb +43 -0
  67. data/lib/git/commands/am/quit.rb +43 -0
  68. data/lib/git/commands/am/retry.rb +47 -0
  69. data/lib/git/commands/am/show_current_patch.rb +64 -0
  70. data/lib/git/commands/am/skip.rb +42 -0
  71. data/lib/git/commands/am.rb +33 -0
  72. data/lib/git/commands/apply.rb +237 -0
  73. data/lib/git/commands/archive/list_formats.rb +46 -0
  74. data/lib/git/commands/archive.rb +140 -0
  75. data/lib/git/commands/arguments.rb +3510 -0
  76. data/lib/git/commands/base.rb +403 -0
  77. data/lib/git/commands/branch/copy.rb +94 -0
  78. data/lib/git/commands/branch/create.rb +173 -0
  79. data/lib/git/commands/branch/delete.rb +80 -0
  80. data/lib/git/commands/branch/list.rb +162 -0
  81. data/lib/git/commands/branch/move.rb +94 -0
  82. data/lib/git/commands/branch/set_upstream.rb +86 -0
  83. data/lib/git/commands/branch/show_current.rb +49 -0
  84. data/lib/git/commands/branch/unset_upstream.rb +57 -0
  85. data/lib/git/commands/branch.rb +34 -0
  86. data/lib/git/commands/cat_file/batch.rb +364 -0
  87. data/lib/git/commands/cat_file/filtered.rb +105 -0
  88. data/lib/git/commands/cat_file/raw.rb +210 -0
  89. data/lib/git/commands/cat_file.rb +49 -0
  90. data/lib/git/commands/checkout/branch.rb +151 -0
  91. data/lib/git/commands/checkout/files.rb +115 -0
  92. data/lib/git/commands/checkout.rb +38 -0
  93. data/lib/git/commands/checkout_index.rb +105 -0
  94. data/lib/git/commands/clean.rb +100 -0
  95. data/lib/git/commands/clone.rb +240 -0
  96. data/lib/git/commands/commit.rb +272 -0
  97. data/lib/git/commands/commit_tree.rb +100 -0
  98. data/lib/git/commands/config_option_syntax/add.rb +83 -0
  99. data/lib/git/commands/config_option_syntax/get.rb +117 -0
  100. data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
  101. data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
  102. data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
  103. data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
  104. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +102 -0
  105. data/lib/git/commands/config_option_syntax/list.rb +107 -0
  106. data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
  107. data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
  108. data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
  109. data/lib/git/commands/config_option_syntax/set.rb +114 -0
  110. data/lib/git/commands/config_option_syntax/unset.rb +89 -0
  111. data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
  112. data/lib/git/commands/config_option_syntax.rb +56 -0
  113. data/lib/git/commands/describe.rb +155 -0
  114. data/lib/git/commands/diff.rb +656 -0
  115. data/lib/git/commands/diff_files.rb +518 -0
  116. data/lib/git/commands/diff_index.rb +496 -0
  117. data/lib/git/commands/fetch.rb +352 -0
  118. data/lib/git/commands/fsck.rb +136 -0
  119. data/lib/git/commands/gc.rb +132 -0
  120. data/lib/git/commands/grep.rb +338 -0
  121. data/lib/git/commands/init.rb +99 -0
  122. data/lib/git/commands/log.rb +632 -0
  123. data/lib/git/commands/ls_files.rb +191 -0
  124. data/lib/git/commands/ls_remote.rb +155 -0
  125. data/lib/git/commands/ls_tree.rb +131 -0
  126. data/lib/git/commands/maintenance/register.rb +75 -0
  127. data/lib/git/commands/maintenance/run.rb +104 -0
  128. data/lib/git/commands/maintenance/start.rb +66 -0
  129. data/lib/git/commands/maintenance/stop.rb +55 -0
  130. data/lib/git/commands/maintenance/unregister.rb +79 -0
  131. data/lib/git/commands/maintenance.rb +31 -0
  132. data/lib/git/commands/merge/abort.rb +44 -0
  133. data/lib/git/commands/merge/continue.rb +44 -0
  134. data/lib/git/commands/merge/quit.rb +46 -0
  135. data/lib/git/commands/merge/start.rb +245 -0
  136. data/lib/git/commands/merge.rb +28 -0
  137. data/lib/git/commands/merge_base.rb +86 -0
  138. data/lib/git/commands/mv.rb +77 -0
  139. data/lib/git/commands/name_rev.rb +114 -0
  140. data/lib/git/commands/pull.rb +377 -0
  141. data/lib/git/commands/push.rb +246 -0
  142. data/lib/git/commands/read_tree.rb +149 -0
  143. data/lib/git/commands/remote/add.rb +91 -0
  144. data/lib/git/commands/remote/get_url.rb +66 -0
  145. data/lib/git/commands/remote/list.rb +54 -0
  146. data/lib/git/commands/remote/prune.rb +61 -0
  147. data/lib/git/commands/remote/remove.rb +52 -0
  148. data/lib/git/commands/remote/rename.rb +69 -0
  149. data/lib/git/commands/remote/set_branches.rb +63 -0
  150. data/lib/git/commands/remote/set_head.rb +82 -0
  151. data/lib/git/commands/remote/set_url.rb +71 -0
  152. data/lib/git/commands/remote/set_url_add.rb +61 -0
  153. data/lib/git/commands/remote/set_url_delete.rb +64 -0
  154. data/lib/git/commands/remote/show.rb +71 -0
  155. data/lib/git/commands/remote/update.rb +72 -0
  156. data/lib/git/commands/remote.rb +42 -0
  157. data/lib/git/commands/repack.rb +277 -0
  158. data/lib/git/commands/reset.rb +147 -0
  159. data/lib/git/commands/rev_parse.rb +297 -0
  160. data/lib/git/commands/revert/abort.rb +45 -0
  161. data/lib/git/commands/revert/continue.rb +57 -0
  162. data/lib/git/commands/revert/quit.rb +47 -0
  163. data/lib/git/commands/revert/skip.rb +44 -0
  164. data/lib/git/commands/revert/start.rb +153 -0
  165. data/lib/git/commands/revert.rb +29 -0
  166. data/lib/git/commands/rm.rb +114 -0
  167. data/lib/git/commands/show.rb +632 -0
  168. data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
  169. data/lib/git/commands/show_ref/exists.rb +78 -0
  170. data/lib/git/commands/show_ref/list.rb +145 -0
  171. data/lib/git/commands/show_ref/verify.rb +120 -0
  172. data/lib/git/commands/show_ref.rb +42 -0
  173. data/lib/git/commands/stash/apply.rb +75 -0
  174. data/lib/git/commands/stash/branch.rb +65 -0
  175. data/lib/git/commands/stash/clear.rb +41 -0
  176. data/lib/git/commands/stash/create.rb +58 -0
  177. data/lib/git/commands/stash/drop.rb +67 -0
  178. data/lib/git/commands/stash/list.rb +39 -0
  179. data/lib/git/commands/stash/pop.rb +78 -0
  180. data/lib/git/commands/stash/push.rb +103 -0
  181. data/lib/git/commands/stash/show.rb +149 -0
  182. data/lib/git/commands/stash/store.rb +63 -0
  183. data/lib/git/commands/stash.rb +38 -0
  184. data/lib/git/commands/status.rb +169 -0
  185. data/lib/git/commands/symbolic_ref/delete.rb +68 -0
  186. data/lib/git/commands/symbolic_ref/read.rb +95 -0
  187. data/lib/git/commands/symbolic_ref/update.rb +76 -0
  188. data/lib/git/commands/symbolic_ref.rb +38 -0
  189. data/lib/git/commands/tag/create.rb +139 -0
  190. data/lib/git/commands/tag/delete.rb +55 -0
  191. data/lib/git/commands/tag/list.rb +143 -0
  192. data/lib/git/commands/tag/verify.rb +71 -0
  193. data/lib/git/commands/tag.rb +26 -0
  194. data/lib/git/commands/update_ref/batch.rb +140 -0
  195. data/lib/git/commands/update_ref/delete.rb +92 -0
  196. data/lib/git/commands/update_ref/update.rb +106 -0
  197. data/lib/git/commands/update_ref.rb +42 -0
  198. data/lib/git/commands/version.rb +52 -0
  199. data/lib/git/commands/worktree/add.rb +140 -0
  200. data/lib/git/commands/worktree/list.rb +64 -0
  201. data/lib/git/commands/worktree/lock.rb +58 -0
  202. data/lib/git/commands/worktree/management_base.rb +51 -0
  203. data/lib/git/commands/worktree/move.rb +66 -0
  204. data/lib/git/commands/worktree/prune.rb +67 -0
  205. data/lib/git/commands/worktree/remove.rb +63 -0
  206. data/lib/git/commands/worktree/repair.rb +76 -0
  207. data/lib/git/commands/worktree/unlock.rb +47 -0
  208. data/lib/git/commands/worktree.rb +43 -0
  209. data/lib/git/commands/write_tree.rb +68 -0
  210. data/lib/git/commands.rb +89 -0
  211. data/lib/git/detached_head_info.rb +54 -0
  212. data/lib/git/diff.rb +297 -7
  213. data/lib/git/diff_file_numstat_info.rb +29 -0
  214. data/lib/git/diff_file_patch_info.rb +134 -0
  215. data/lib/git/diff_file_raw_info.rb +127 -0
  216. data/lib/git/diff_info.rb +169 -0
  217. data/lib/git/diff_path_status.rb +78 -19
  218. data/lib/git/diff_result.rb +32 -0
  219. data/lib/git/diff_stats.rb +59 -14
  220. data/lib/git/dirstat_info.rb +86 -0
  221. data/lib/git/errors.rb +65 -2
  222. data/lib/git/execution_context/global.rb +56 -0
  223. data/lib/git/execution_context/repository.rb +147 -0
  224. data/lib/git/execution_context.rb +482 -0
  225. data/lib/git/file_ref.rb +74 -0
  226. data/lib/git/fsck_object.rb +9 -9
  227. data/lib/git/fsck_result.rb +1 -1
  228. data/lib/git/lib.rb +1606 -1028
  229. data/lib/git/log.rb +15 -2
  230. data/lib/git/object.rb +92 -22
  231. data/lib/git/parsers/branch.rb +224 -0
  232. data/lib/git/parsers/cat_file.rb +111 -0
  233. data/lib/git/parsers/diff.rb +585 -0
  234. data/lib/git/parsers/fsck.rb +133 -0
  235. data/lib/git/parsers/grep.rb +42 -0
  236. data/lib/git/parsers/ls_tree.rb +58 -0
  237. data/lib/git/parsers/stash.rb +208 -0
  238. data/lib/git/parsers/tag.rb +257 -0
  239. data/lib/git/remote.rb +133 -9
  240. data/lib/git/repository/branching.rb +572 -0
  241. data/lib/git/repository/committing.rb +191 -0
  242. data/lib/git/repository/configuring.rb +156 -0
  243. data/lib/git/repository/diffing.rb +775 -0
  244. data/lib/git/repository/inspecting.rb +153 -0
  245. data/lib/git/repository/logging.rb +247 -0
  246. data/lib/git/repository/merging.rb +295 -0
  247. data/lib/git/repository/object_operations.rb +1101 -0
  248. data/lib/git/repository/path_resolver.rb +207 -0
  249. data/lib/git/repository/remote_operations.rb +753 -0
  250. data/lib/git/repository/shared_private.rb +51 -0
  251. data/lib/git/repository/staging.rb +390 -0
  252. data/lib/git/repository/stashing.rb +107 -0
  253. data/lib/git/repository/status_operations.rb +180 -0
  254. data/lib/git/repository/worktree_operations.rb +159 -0
  255. data/lib/git/repository.rb +264 -1
  256. data/lib/git/stash.rb +85 -4
  257. data/lib/git/stash_info.rb +104 -0
  258. data/lib/git/stashes.rb +130 -13
  259. data/lib/git/status.rb +224 -18
  260. data/lib/git/tag_delete_failure.rb +31 -0
  261. data/lib/git/tag_delete_result.rb +63 -0
  262. data/lib/git/tag_info.rb +105 -0
  263. data/lib/git/version.rb +109 -2
  264. data/lib/git/version_constraint.rb +81 -0
  265. data/lib/git/worktree.rb +120 -5
  266. data/lib/git/worktrees.rb +107 -7
  267. data/lib/git.rb +114 -18
  268. data/redesign/1_architecture_existing.md +54 -18
  269. data/redesign/2_architecture_redesign.md +365 -46
  270. data/redesign/3_architecture_implementation.md +1451 -54
  271. data/tasks/gem_tasks.rake +4 -0
  272. data/tasks/npm_tasks.rake +7 -0
  273. data/tasks/rspec.rake +48 -0
  274. data/tasks/test.rake +13 -1
  275. data/tasks/yard.rake +34 -7
  276. metadata +349 -20
  277. data/lib/git/index.rb +0 -6
  278. data/lib/git/path.rb +0 -38
  279. data/lib/git/working_directory.rb +0 -6
  280. /data/{release-please-config.json → .release-please-config.json} +0 -0
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Stash
8
+ # Create a stash commit without storing it in refs/stash
9
+ #
10
+ # This is a plumbing command used to create a stash commit object without
11
+ # actually storing it in the stash reflog. It's useful for scripts that
12
+ # need to create stash commits programmatically.
13
+ #
14
+ # The command creates a stash commit and outputs its SHA, but does not
15
+ # update refs/stash. Use {Store} to store the commit in the stash reflog.
16
+ #
17
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
18
+ #
19
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
20
+ #
21
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
22
+ #
23
+ # @api private
24
+ #
25
+ # @example Create a stash commit
26
+ # Git::Commands::Stash::Create.new(execution_context).call
27
+ #
28
+ # @example Create a stash commit with a message
29
+ # Git::Commands::Stash::Create.new(execution_context).call('WIP: my changes')
30
+ #
31
+ class Create < Git::Commands::Base
32
+ arguments do
33
+ literal 'stash'
34
+ literal 'create'
35
+ operand :message
36
+ end
37
+
38
+ # @!method call(*, **)
39
+ #
40
+ # Create a stash commit
41
+ #
42
+ # @overload call()
43
+ #
44
+ # Create a stash commit without a message
45
+ #
46
+ # @overload call(message)
47
+ #
48
+ # Create a stash commit with a message
49
+ #
50
+ # @param message [String] optional message for the stash commit
51
+ #
52
+ # @return [Git::CommandLineResult] the result of calling `git stash create`
53
+ #
54
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Stash
8
+ # Remove a stash entry from the stash list
9
+ #
10
+ # Removes a single stash entry from the list of stash entries.
11
+ # If no stash reference is given, it removes the latest one.
12
+ #
13
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
14
+ #
15
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
16
+ #
17
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
18
+ #
19
+ # @api private
20
+ #
21
+ # @example Drop the latest stash
22
+ # Git::Commands::Stash::Drop.new(execution_context).call
23
+ #
24
+ # @example Drop a specific stash
25
+ # Git::Commands::Stash::Drop.new(execution_context).call('stash@\\{2}')
26
+ #
27
+ class Drop < Git::Commands::Base
28
+ arguments do
29
+ literal 'stash'
30
+ literal 'drop'
31
+ flag_option %i[quiet q]
32
+ operand :stash
33
+ end
34
+
35
+ # @!method call(*, **)
36
+ #
37
+ # Drop a stash entry
38
+ #
39
+ # @overload call(**options)
40
+ #
41
+ # Drop the latest stash
42
+ #
43
+ # @param options [Hash] command options
44
+ #
45
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
46
+ #
47
+ # Alias: :q
48
+ #
49
+ # @overload call(stash, **options)
50
+ #
51
+ # Drop a specific stash
52
+ #
53
+ # @param stash [String] stash reference (e.g., 'stash@\\{0}', '0')
54
+ #
55
+ # @param options [Hash] command options
56
+ #
57
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
58
+ #
59
+ # Alias: :q
60
+ #
61
+ # @return [Git::CommandLineResult] the result of calling `git stash drop`
62
+ #
63
+ # @raise [Git::FailedError] if the stash does not exist
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+ require 'git/parsers/stash'
5
+
6
+ module Git
7
+ module Commands
8
+ module Stash
9
+ # List all stash entries
10
+ #
11
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
12
+ #
13
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
14
+ #
15
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
16
+ #
17
+ # @api private
18
+ #
19
+ # @example List all stashes
20
+ # Git::Commands::Stash::List.new(execution_context).call
21
+ #
22
+ class List < Git::Commands::Base
23
+ arguments do
24
+ literal 'stash'
25
+ literal 'list'
26
+ literal "--format=#{Git::Parsers::Stash::STASH_FORMAT}"
27
+ end
28
+
29
+ # @!method call(*, **)
30
+ #
31
+ # List all stash entries
32
+ #
33
+ # @overload call()
34
+ #
35
+ # @return [Git::CommandLineResult] the result of calling `git stash list`
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Stash
8
+ # Apply stashed changes and remove from stash list
9
+ #
10
+ # Like {Apply}, but removes the stash from the stash list after
11
+ # applying, unless there are conflicts.
12
+ #
13
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
14
+ #
15
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
16
+ #
17
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
18
+ #
19
+ # @api private
20
+ #
21
+ # @example Pop the latest stash
22
+ # Git::Commands::Stash::Pop.new(execution_context).call
23
+ #
24
+ # @example Pop a specific stash
25
+ # Git::Commands::Stash::Pop.new(execution_context).call('stash@\\{2}')
26
+ #
27
+ # @example Pop and restore index state
28
+ # Git::Commands::Stash::Pop.new(execution_context).call(index: true)
29
+ #
30
+ # @example Pop quietly
31
+ # Git::Commands::Stash::Pop.new(execution_context).call(quiet: true)
32
+ #
33
+ class Pop < Git::Commands::Base
34
+ arguments do
35
+ literal 'stash'
36
+ literal 'pop'
37
+ flag_option :index
38
+ flag_option %i[quiet q]
39
+ operand :stash
40
+ end
41
+
42
+ # @!method call(*, **)
43
+ #
44
+ # Pop stashed changes
45
+ #
46
+ # @overload call(**options)
47
+ #
48
+ # Pop the latest stash
49
+ #
50
+ # @param options [Hash] command options
51
+ #
52
+ # @option options [Boolean, nil] :index (nil) restore the index state as well
53
+ #
54
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
55
+ #
56
+ # Alias: :q
57
+ #
58
+ # @overload call(stash, **options)
59
+ #
60
+ # Pop a specific stash
61
+ #
62
+ # @param stash [String] stash reference (e.g., 'stash@\\{0}', '0')
63
+ #
64
+ # @param options [Hash] command options
65
+ #
66
+ # @option options [Boolean, nil] :index (nil) restore the index state as well
67
+ #
68
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
69
+ #
70
+ # Alias: :q
71
+ #
72
+ # @return [Git::CommandLineResult] the result of calling `git stash pop`
73
+ #
74
+ # @raise [Git::FailedError] if the stash does not exist
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Stash
8
+ # Stash changes in the working directory
9
+ #
10
+ # Saves local modifications to a new stash entry and rolls them back
11
+ # to HEAD (in the working tree and index). The command takes
12
+ # various options to customize what gets stashed.
13
+ #
14
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
15
+ #
16
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
17
+ #
18
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
19
+ #
20
+ # @api private
21
+ #
22
+ # @example Save all changes with a message
23
+ # Git::Commands::Stash::Push.new(execution_context).call(message: 'WIP: feature work')
24
+ #
25
+ # @example Stash only specific files
26
+ # Git::Commands::Stash::Push.new(execution_context).call('src/file.rb', message: 'Partial stash')
27
+ #
28
+ # @example Keep staged changes in index
29
+ # Git::Commands::Stash::Push.new(execution_context).call(keep_index: true)
30
+ #
31
+ # @example Include untracked files
32
+ # Git::Commands::Stash::Push.new(execution_context).call(include_untracked: true)
33
+ #
34
+ class Push < Git::Commands::Base
35
+ arguments do
36
+ literal 'stash'
37
+ literal 'push'
38
+ flag_option %i[patch p]
39
+ flag_option %i[staged S]
40
+ flag_option %i[keep_index k], negatable: true
41
+ flag_option %i[quiet q]
42
+ flag_option %i[include_untracked u]
43
+ flag_option %i[all a]
44
+ value_option %i[message m]
45
+ value_option :pathspec_from_file, inline: true
46
+ flag_option :pathspec_file_nul
47
+ end_of_options
48
+ operand :pathspec, repeatable: true
49
+ end
50
+
51
+ # @!method call(*, **)
52
+ #
53
+ # @overload call(*pathspec, **options)
54
+ #
55
+ # Stash changes in the working directory
56
+ #
57
+ # @param pathspec [Array<String>] optional paths to limit what gets stashed
58
+ #
59
+ # @param options [Hash] command options
60
+ #
61
+ # @option options [Boolean, nil] :patch (nil) interactively select hunks to stash
62
+ #
63
+ # Alias: :p
64
+ #
65
+ # @option options [Boolean, nil] :staged (nil) stash only staged changes
66
+ #
67
+ # Alias: :S
68
+ #
69
+ # @option options [Boolean, nil] :keep_index (nil) keep staged changes in the index (`--keep-index`)
70
+ #
71
+ # Alias: :k
72
+ #
73
+ # @option options [Boolean, nil] :no_keep_index (nil) do not preserve staged changes in the index
74
+ # (`--no-keep-index`)
75
+ #
76
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
77
+ #
78
+ # Alias: :q
79
+ #
80
+ # @option options [Boolean, nil] :include_untracked (nil) include untracked files in the stash
81
+ #
82
+ # Alias: :u
83
+ #
84
+ # @option options [Boolean, nil] :all (nil) include untracked and ignored files in the stash
85
+ #
86
+ # Alias: :a
87
+ #
88
+ # @option options [String] :message (nil) descriptive message for the stash
89
+ #
90
+ # Alias: :m
91
+ #
92
+ # @option options [String] :pathspec_from_file (nil) read pathspecs from the given file
93
+ #
94
+ # @option options [Boolean, nil] :pathspec_file_nul (nil) pathspecs in the file are NUL-separated
95
+ #
96
+ # @return [Git::CommandLineResult] the result of calling `git stash push`
97
+ #
98
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
99
+ #
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,149 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Stash
8
+ # Show the changes recorded in a stash entry as a diff
9
+ #
10
+ # Shows the changes recorded in the stash entry as a diff between the
11
+ # stashed contents and the commit back when the stash entry was first
12
+ # created.
13
+ #
14
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
15
+ #
16
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
17
+ #
18
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
19
+ #
20
+ # @api private
21
+ #
22
+ # @example Show numstat for the latest stash
23
+ # Git::Commands::Stash::Show.new(ctx).call(numstat: true, shortstat: true)
24
+ #
25
+ # @example Show patch for a specific stash
26
+ # Git::Commands::Stash::Show.new(ctx).call('stash@{2}', patch: true, numstat: true, shortstat: true)
27
+ #
28
+ # @example Show with directory statistics
29
+ # Git::Commands::Stash::Show.new(ctx).call(numstat: true, shortstat: true, dirstat: true)
30
+ # Git::Commands::Stash::Show.new(ctx).call(numstat: true, shortstat: true, dirstat: 'lines,cumulative')
31
+ #
32
+ class Show < Git::Commands::Base
33
+ arguments do
34
+ literal 'stash'
35
+ literal 'show'
36
+
37
+ flag_option :patch
38
+ flag_option :numstat
39
+ flag_option :raw
40
+ flag_option :shortstat
41
+ value_option %i[unified U], inline: true
42
+
43
+ flag_option %i[include_untracked u], negatable: true
44
+ flag_option :only_untracked
45
+ flag_or_value_option %i[find_renames M], inline: true
46
+ flag_or_value_option %i[find_copies C], inline: true
47
+ flag_option :find_copies_harder
48
+ value_option :inter_hunk_context, inline: true
49
+ flag_or_value_option :dirstat, inline: true
50
+ operand :stash
51
+ end
52
+
53
+ # @!method call(*, **)
54
+ #
55
+ # Show stash diff
56
+ #
57
+ # @overload call(**options)
58
+ #
59
+ # Show diff for the latest stash
60
+ #
61
+ # @param options [Hash] command options
62
+ #
63
+ # @option options [Boolean, nil] :patch (nil) include unified diff patches per file
64
+ #
65
+ # @option options [Boolean, nil] :numstat (nil) include per-file insertion/deletion counts
66
+ #
67
+ # @option options [Boolean, nil] :raw (nil) include per-file mode/SHA/status metadata
68
+ #
69
+ # @option options [Boolean, nil] :shortstat (nil) include aggregate totals line
70
+ #
71
+ # @option options [Integer, String] :unified (nil) generate diff with <n> lines of context
72
+ #
73
+ # Alias: :U
74
+ #
75
+ # @option options [Boolean, nil] :include_untracked (nil) include untracked files (`--include-untracked`)
76
+ #
77
+ # Alias: :u
78
+ #
79
+ # @option options [Boolean, nil] :no_include_untracked (nil) exclude untracked files
80
+ # (`--no-include-untracked`)
81
+ #
82
+ # @option options [Boolean, nil] :only_untracked (nil) show only untracked files
83
+ #
84
+ # @option options [Boolean, Integer, nil] :find_renames (nil) detect renames; optionally pass a
85
+ # similarity threshold (e.g., 50 for 50%). Alias: :M
86
+ #
87
+ # @option options [Boolean, Integer, nil] :find_copies (nil) detect copies as well as renames;
88
+ # optionally pass a threshold. Alias: :C
89
+ #
90
+ # @option options [Boolean, nil] :find_copies_harder (nil) inspect all files as copy sources; expensive
91
+ #
92
+ # @option options [Integer, String] :inter_hunk_context (nil) show context between diff hunks, up to
93
+ # <n> lines, fusing hunks that are close to each other
94
+ #
95
+ # @option options [Boolean, String, nil] :dirstat (nil) include directory statistics
96
+ #
97
+ # Pass `true` for default, or a string like `'lines,cumulative'` for options.
98
+ #
99
+ # @overload call(stash, **options)
100
+ #
101
+ # Show diff for a specific stash
102
+ #
103
+ # @param stash [String] stash reference (e.g., 'stash@\\{0}', '0')
104
+ #
105
+ # @param options [Hash] command options
106
+ #
107
+ # @option options [Boolean, nil] :patch (nil) include unified diff patches per file
108
+ #
109
+ # @option options [Boolean, nil] :numstat (nil) include per-file insertion/deletion counts
110
+ #
111
+ # @option options [Boolean, nil] :raw (nil) include per-file mode/SHA/status metadata
112
+ #
113
+ # @option options [Boolean, nil] :shortstat (nil) include aggregate totals line
114
+ #
115
+ # @option options [Integer, String] :unified (nil) generate diff with <n> lines of context
116
+ #
117
+ # Alias: :U
118
+ #
119
+ # @option options [Boolean, nil] :include_untracked (nil) include untracked files (`--include-untracked`)
120
+ #
121
+ # Alias: :u
122
+ #
123
+ # @option options [Boolean, nil] :no_include_untracked (nil) exclude untracked files
124
+ # (`--no-include-untracked`)
125
+ #
126
+ # @option options [Boolean, nil] :only_untracked (nil) show only untracked files
127
+ #
128
+ # @option options [Boolean, Integer, nil] :find_renames (nil) detect renames; optionally pass a
129
+ # similarity threshold (e.g., 50 for 50%). Alias: :M
130
+ #
131
+ # @option options [Boolean, Integer, nil] :find_copies (nil) detect copies as well as renames;
132
+ # optionally pass a threshold. Alias: :C
133
+ #
134
+ # @option options [Boolean, nil] :find_copies_harder (nil) inspect all files as copy sources; expensive
135
+ #
136
+ # @option options [Integer, String] :inter_hunk_context (nil) show context between diff hunks, up to
137
+ # <n> lines, fusing hunks that are close to each other
138
+ #
139
+ # @option options [Boolean, String, nil] :dirstat (nil) include directory statistics
140
+ #
141
+ # Pass `true` for default, or a string like `'lines,cumulative'` for options.
142
+ #
143
+ # @return [Git::CommandLineResult] the result of calling `git stash show`
144
+ #
145
+ # @raise [Git::FailedError] if git returns a non-zero exit status
146
+ end
147
+ end
148
+ end
149
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Stash
8
+ # Store a commit in the stash reflog
9
+ #
10
+ # This is a plumbing command used to store a given stash commit (created
11
+ # by `git stash create`) in the stash reflog, updating refs/stash.
12
+ #
13
+ # This command is typically used after {Create} to actually record
14
+ # the stash in the reflog.
15
+ #
16
+ # @note `arguments` block audited against https://git-scm.com/docs/git-stash/2.53.0
17
+ #
18
+ # @see Git::Commands::Stash Git::Commands::Stash for usage examples
19
+ #
20
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
21
+ #
22
+ # @api private
23
+ #
24
+ # @example Store a stash commit
25
+ # Git::Commands::Stash::Store.new(execution_context).call('abc123def456')
26
+ #
27
+ # @example Store with a custom message
28
+ # Git::Commands::Stash::Store.new(execution_context).call('abc123def456', message: 'WIP: feature')
29
+ #
30
+ class Store < Git::Commands::Base
31
+ arguments do
32
+ literal 'stash'
33
+ literal 'store'
34
+ value_option %i[message m]
35
+ flag_option %i[quiet q]
36
+ operand :commit, required: true
37
+ end
38
+
39
+ # @!method call(*, **)
40
+ #
41
+ # Store a commit in the stash reflog
42
+ #
43
+ # @overload call(commit, **options)
44
+ #
45
+ # @param commit [String] the commit SHA to store in the stash (required)
46
+ #
47
+ # @param options [Hash] command options
48
+ #
49
+ # @option options [String] :message (nil) description for the reflog entry
50
+ #
51
+ # Alias: :m
52
+ #
53
+ # @option options [Boolean, nil] :quiet (nil) suppress output
54
+ #
55
+ # Alias: :q
56
+ #
57
+ # @return [Git::CommandLineResult] the result of calling `git stash store`
58
+ #
59
+ # @raise [Git::FailedError] if the commit is not a valid stash commit
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'stash/apply'
4
+ require_relative 'stash/branch'
5
+ require_relative 'stash/clear'
6
+ require_relative 'stash/create'
7
+ require_relative 'stash/drop'
8
+ require_relative 'stash/list'
9
+ require_relative 'stash/pop'
10
+ require_relative 'stash/push'
11
+ require_relative 'stash/show'
12
+ require_relative 'stash/store'
13
+
14
+ module Git
15
+ module Commands
16
+ # Commands for stashing working directory changes via `git stash`
17
+ #
18
+ # This module contains command classes split by stash operation:
19
+ #
20
+ # - {Stash::Push} — save changes to a new stash entry
21
+ # - {Stash::Pop} — apply the top stash and remove it from the stash list
22
+ # - {Stash::Apply} — apply a stash without removing it
23
+ # - {Stash::Drop} — remove a single stash entry
24
+ # - {Stash::Clear} — remove all stash entries
25
+ # - {Stash::List} — list stash entries
26
+ # - {Stash::Show} — show changes recorded in a stash entry
27
+ # - {Stash::Branch} — create a new branch from a stash entry
28
+ # - {Stash::Create} — create a stash object without storing it
29
+ # - {Stash::Store} — store a stash object created with `create`
30
+ #
31
+ # @api private
32
+ #
33
+ # @see https://git-scm.com/docs/git-stash git-stash documentation
34
+ #
35
+ module Stash
36
+ end
37
+ end
38
+ end