git 1.19.1 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (265) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +5 -1
  3. data/AI_POLICY.md +24 -0
  4. data/CHANGELOG.md +689 -0
  5. data/CODE_OF_CONDUCT.md +25 -0
  6. data/CONTRIBUTING.md +1175 -97
  7. data/GOVERNANCE.md +106 -0
  8. data/LICENSE +1 -1
  9. data/MAINTAINERS.md +17 -4
  10. data/README.md +476 -320
  11. data/UPGRADING.md +1138 -0
  12. data/git.gemspec +124 -36
  13. data/lib/git/author.rb +39 -7
  14. data/lib/git/author_info.rb +66 -0
  15. data/lib/git/branch.rb +615 -65
  16. data/lib/git/branch_delete_failure.rb +34 -0
  17. data/lib/git/branch_delete_result.rb +66 -0
  18. data/lib/git/branch_info.rb +237 -0
  19. data/lib/git/branches.rb +167 -44
  20. data/lib/git/command_line/base.rb +247 -0
  21. data/lib/git/command_line/capturing.rb +308 -0
  22. data/lib/git/command_line/result.rb +88 -0
  23. data/lib/git/command_line/streaming.rb +236 -0
  24. data/lib/git/command_line.rb +52 -0
  25. data/lib/git/commands/add.rb +139 -0
  26. data/lib/git/commands/am/abort.rb +43 -0
  27. data/lib/git/commands/am/apply.rb +263 -0
  28. data/lib/git/commands/am/continue.rb +43 -0
  29. data/lib/git/commands/am/quit.rb +43 -0
  30. data/lib/git/commands/am/retry.rb +49 -0
  31. data/lib/git/commands/am/show_current_patch.rb +64 -0
  32. data/lib/git/commands/am/skip.rb +42 -0
  33. data/lib/git/commands/am.rb +33 -0
  34. data/lib/git/commands/apply.rb +242 -0
  35. data/lib/git/commands/archive/list_formats.rb +46 -0
  36. data/lib/git/commands/archive.rb +145 -0
  37. data/lib/git/commands/arguments.rb +4521 -0
  38. data/lib/git/commands/base.rb +502 -0
  39. data/lib/git/commands/branch/copy.rb +102 -0
  40. data/lib/git/commands/branch/create.rb +177 -0
  41. data/lib/git/commands/branch/delete.rb +88 -0
  42. data/lib/git/commands/branch/list.rb +178 -0
  43. data/lib/git/commands/branch/move.rb +102 -0
  44. data/lib/git/commands/branch/set_upstream.rb +86 -0
  45. data/lib/git/commands/branch/show_current.rb +49 -0
  46. data/lib/git/commands/branch/unset_upstream.rb +53 -0
  47. data/lib/git/commands/branch.rb +34 -0
  48. data/lib/git/commands/cat_file/batch.rb +385 -0
  49. data/lib/git/commands/cat_file/filtered.rb +105 -0
  50. data/lib/git/commands/cat_file/raw.rb +271 -0
  51. data/lib/git/commands/cat_file.rb +49 -0
  52. data/lib/git/commands/checkout/branch.rb +153 -0
  53. data/lib/git/commands/checkout/files.rb +116 -0
  54. data/lib/git/commands/checkout.rb +38 -0
  55. data/lib/git/commands/checkout_index.rb +106 -0
  56. data/lib/git/commands/clean.rb +102 -0
  57. data/lib/git/commands/clone.rb +241 -0
  58. data/lib/git/commands/commit.rb +273 -0
  59. data/lib/git/commands/commit_tree.rb +101 -0
  60. data/lib/git/commands/config_option_syntax/add.rb +86 -0
  61. data/lib/git/commands/config_option_syntax/get.rb +121 -0
  62. data/lib/git/commands/config_option_syntax/get_all.rb +118 -0
  63. data/lib/git/commands/config_option_syntax/get_color.rb +95 -0
  64. data/lib/git/commands/config_option_syntax/get_color_bool.rb +96 -0
  65. data/lib/git/commands/config_option_syntax/get_regexp.rb +119 -0
  66. data/lib/git/commands/config_option_syntax/get_urlmatch.rb +111 -0
  67. data/lib/git/commands/config_option_syntax/list.rb +111 -0
  68. data/lib/git/commands/config_option_syntax/remove_section.rb +79 -0
  69. data/lib/git/commands/config_option_syntax/rename_section.rb +83 -0
  70. data/lib/git/commands/config_option_syntax/replace_all.rb +109 -0
  71. data/lib/git/commands/config_option_syntax/set.rb +119 -0
  72. data/lib/git/commands/config_option_syntax/unset.rb +92 -0
  73. data/lib/git/commands/config_option_syntax/unset_all.rb +94 -0
  74. data/lib/git/commands/config_option_syntax.rb +56 -0
  75. data/lib/git/commands/describe.rb +156 -0
  76. data/lib/git/commands/diff.rb +657 -0
  77. data/lib/git/commands/diff_files.rb +519 -0
  78. data/lib/git/commands/diff_index.rb +499 -0
  79. data/lib/git/commands/fetch.rb +354 -0
  80. data/lib/git/commands/fsck.rb +138 -0
  81. data/lib/git/commands/gc.rb +134 -0
  82. data/lib/git/commands/grep.rb +339 -0
  83. data/lib/git/commands/init.rb +101 -0
  84. data/lib/git/commands/log.rb +634 -0
  85. data/lib/git/commands/ls_files.rb +195 -0
  86. data/lib/git/commands/ls_remote.rb +161 -0
  87. data/lib/git/commands/ls_tree.rb +135 -0
  88. data/lib/git/commands/maintenance/register.rb +77 -0
  89. data/lib/git/commands/maintenance/run.rb +109 -0
  90. data/lib/git/commands/maintenance/start.rb +71 -0
  91. data/lib/git/commands/maintenance/stop.rb +60 -0
  92. data/lib/git/commands/maintenance/unregister.rb +84 -0
  93. data/lib/git/commands/maintenance.rb +31 -0
  94. data/lib/git/commands/merge/abort.rb +44 -0
  95. data/lib/git/commands/merge/continue.rb +44 -0
  96. data/lib/git/commands/merge/quit.rb +46 -0
  97. data/lib/git/commands/merge/start.rb +250 -0
  98. data/lib/git/commands/merge.rb +28 -0
  99. data/lib/git/commands/merge_base.rb +91 -0
  100. data/lib/git/commands/mv.rb +82 -0
  101. data/lib/git/commands/name_rev.rb +119 -0
  102. data/lib/git/commands/pull.rb +382 -0
  103. data/lib/git/commands/push.rb +251 -0
  104. data/lib/git/commands/read_tree.rb +154 -0
  105. data/lib/git/commands/remote/add.rb +96 -0
  106. data/lib/git/commands/remote/get_url.rb +68 -0
  107. data/lib/git/commands/remote/list.rb +56 -0
  108. data/lib/git/commands/remote/prune.rb +63 -0
  109. data/lib/git/commands/remote/remove.rb +52 -0
  110. data/lib/git/commands/remote/rename.rb +76 -0
  111. data/lib/git/commands/remote/set_branches.rb +70 -0
  112. data/lib/git/commands/remote/set_head.rb +89 -0
  113. data/lib/git/commands/remote/set_url.rb +78 -0
  114. data/lib/git/commands/remote/set_url_add.rb +70 -0
  115. data/lib/git/commands/remote/set_url_delete.rb +71 -0
  116. data/lib/git/commands/remote/show.rb +77 -0
  117. data/lib/git/commands/remote/update.rb +79 -0
  118. data/lib/git/commands/remote.rb +42 -0
  119. data/lib/git/commands/repack.rb +281 -0
  120. data/lib/git/commands/reset.rb +154 -0
  121. data/lib/git/commands/rev_parse.rb +304 -0
  122. data/lib/git/commands/revert/abort.rb +45 -0
  123. data/lib/git/commands/revert/continue.rb +62 -0
  124. data/lib/git/commands/revert/quit.rb +47 -0
  125. data/lib/git/commands/revert/skip.rb +44 -0
  126. data/lib/git/commands/revert/start.rb +158 -0
  127. data/lib/git/commands/revert.rb +29 -0
  128. data/lib/git/commands/rm.rb +113 -0
  129. data/lib/git/commands/show.rb +632 -0
  130. data/lib/git/commands/show_ref/exclude_existing.rb +119 -0
  131. data/lib/git/commands/show_ref/exists.rb +80 -0
  132. data/lib/git/commands/show_ref/list.rb +149 -0
  133. data/lib/git/commands/show_ref/verify.rb +122 -0
  134. data/lib/git/commands/show_ref.rb +42 -0
  135. data/lib/git/commands/stash/apply.rb +81 -0
  136. data/lib/git/commands/stash/branch.rb +67 -0
  137. data/lib/git/commands/stash/clear.rb +43 -0
  138. data/lib/git/commands/stash/create.rb +60 -0
  139. data/lib/git/commands/stash/drop.rb +73 -0
  140. data/lib/git/commands/stash/list.rb +43 -0
  141. data/lib/git/commands/stash/pop.rb +87 -0
  142. data/lib/git/commands/stash/push.rb +112 -0
  143. data/lib/git/commands/stash/show.rb +158 -0
  144. data/lib/git/commands/stash/store.rb +72 -0
  145. data/lib/git/commands/stash.rb +38 -0
  146. data/lib/git/commands/status.rb +174 -0
  147. data/lib/git/commands/symbolic_ref/delete.rb +72 -0
  148. data/lib/git/commands/symbolic_ref/read.rb +99 -0
  149. data/lib/git/commands/symbolic_ref/update.rb +79 -0
  150. data/lib/git/commands/symbolic_ref.rb +38 -0
  151. data/lib/git/commands/tag/create.rb +142 -0
  152. data/lib/git/commands/tag/delete.rb +57 -0
  153. data/lib/git/commands/tag/list.rb +146 -0
  154. data/lib/git/commands/tag/verify.rb +71 -0
  155. data/lib/git/commands/tag.rb +26 -0
  156. data/lib/git/commands/update_ref/batch.rb +145 -0
  157. data/lib/git/commands/update_ref/delete.rb +90 -0
  158. data/lib/git/commands/update_ref/update.rb +103 -0
  159. data/lib/git/commands/update_ref.rb +42 -0
  160. data/lib/git/commands/version.rb +60 -0
  161. data/lib/git/commands/worktree/add.rb +139 -0
  162. data/lib/git/commands/worktree/list.rb +64 -0
  163. data/lib/git/commands/worktree/lock.rb +58 -0
  164. data/lib/git/commands/worktree/management_base.rb +51 -0
  165. data/lib/git/commands/worktree/move.rb +66 -0
  166. data/lib/git/commands/worktree/prune.rb +67 -0
  167. data/lib/git/commands/worktree/remove.rb +63 -0
  168. data/lib/git/commands/worktree/repair.rb +76 -0
  169. data/lib/git/commands/worktree/unlock.rb +47 -0
  170. data/lib/git/commands/worktree.rb +43 -0
  171. data/lib/git/commands/write_tree.rb +68 -0
  172. data/lib/git/commands.rb +88 -0
  173. data/lib/git/config.rb +72 -5
  174. data/lib/git/config_entry_info.rb +106 -0
  175. data/lib/git/configuring.rb +795 -0
  176. data/lib/git/detached_head_info.rb +57 -0
  177. data/lib/git/diff.rb +437 -86
  178. data/lib/git/diff_file_numstat_info.rb +31 -0
  179. data/lib/git/diff_file_patch_info.rb +136 -0
  180. data/lib/git/diff_file_raw_info.rb +129 -0
  181. data/lib/git/diff_info.rb +162 -0
  182. data/lib/git/diff_path_status.rb +107 -0
  183. data/lib/git/diff_result.rb +34 -0
  184. data/lib/git/diff_stats.rb +111 -0
  185. data/lib/git/dirstat_info.rb +102 -0
  186. data/lib/git/encoding_utils.rb +32 -1
  187. data/lib/git/errors.rb +285 -0
  188. data/lib/git/escaped_path.rb +57 -5
  189. data/lib/git/execution_context/global.rb +31 -0
  190. data/lib/git/execution_context/repository.rb +151 -0
  191. data/lib/git/execution_context.rb +559 -0
  192. data/lib/git/factories.rb +813 -0
  193. data/lib/git/file_ref.rb +77 -0
  194. data/lib/git/fsck_object.rb +56 -0
  195. data/lib/git/fsck_result.rb +132 -0
  196. data/lib/git/log.rb +306 -90
  197. data/lib/git/object.rb +563 -141
  198. data/lib/git/parsers/branch.rb +240 -0
  199. data/lib/git/parsers/cat_file.rb +111 -0
  200. data/lib/git/parsers/config_entry.rb +110 -0
  201. data/lib/git/parsers/diff.rb +792 -0
  202. data/lib/git/parsers/fsck.rb +144 -0
  203. data/lib/git/parsers/grep.rb +42 -0
  204. data/lib/git/parsers/ls_remote.rb +79 -0
  205. data/lib/git/parsers/ls_tree.rb +58 -0
  206. data/lib/git/parsers/remote.rb +162 -0
  207. data/lib/git/parsers/stash.rb +292 -0
  208. data/lib/git/parsers/status.rb +251 -0
  209. data/lib/git/parsers/tag.rb +341 -0
  210. data/lib/git/parsers/worktree.rb +185 -0
  211. data/lib/git/path_resolver.rb +206 -0
  212. data/lib/git/remote.rb +165 -12
  213. data/lib/git/remote_info.rb +203 -0
  214. data/lib/git/repository/branching.rb +964 -0
  215. data/lib/git/repository/committing.rb +246 -0
  216. data/lib/git/repository/context_helpers.rb +293 -0
  217. data/lib/git/repository/diffing.rb +785 -0
  218. data/lib/git/repository/inspecting.rb +252 -0
  219. data/lib/git/repository/logging.rb +410 -0
  220. data/lib/git/repository/maintenance.rb +65 -0
  221. data/lib/git/repository/merging.rb +451 -0
  222. data/lib/git/repository/object_operations.rb +1551 -0
  223. data/lib/git/repository/remote_operations.rb +984 -0
  224. data/lib/git/repository/shared_private.rb +120 -0
  225. data/lib/git/repository/staging.rb +587 -0
  226. data/lib/git/repository/stashing.rb +623 -0
  227. data/lib/git/repository/status_operations.rb +249 -0
  228. data/lib/git/repository/worktree_operations.rb +339 -0
  229. data/lib/git/repository.rb +484 -2
  230. data/lib/git/stash.rb +109 -12
  231. data/lib/git/stash_info.rb +102 -0
  232. data/lib/git/stashes.rb +169 -26
  233. data/lib/git/status.rb +308 -122
  234. data/lib/git/status_file_info.rb +258 -0
  235. data/lib/git/status_info.rb +189 -0
  236. data/lib/git/tag_delete_failure.rb +34 -0
  237. data/lib/git/tag_delete_result.rb +66 -0
  238. data/lib/git/tag_info.rb +99 -0
  239. data/lib/git/url.rb +15 -8
  240. data/lib/git/version.rb +113 -2
  241. data/lib/git/version_constraint.rb +85 -0
  242. data/lib/git/worktree.rb +150 -8
  243. data/lib/git/worktree_info.rb +128 -0
  244. data/lib/git/worktrees.rb +118 -13
  245. data/lib/git.rb +632 -234
  246. metadata +369 -54
  247. data/.github/stale.yml +0 -25
  248. data/.github/workflows/continuous_integration.yml +0 -49
  249. data/.gitignore +0 -10
  250. data/Dockerfile.changelog-rs +0 -12
  251. data/Gemfile +0 -5
  252. data/ISSUE_TEMPLATE.md +0 -15
  253. data/PULL_REQUEST_TEMPLATE.md +0 -9
  254. data/RELEASING.md +0 -70
  255. data/Rakefile +0 -60
  256. data/lib/git/base/factory.rb +0 -99
  257. data/lib/git/base.rb +0 -711
  258. data/lib/git/command_line_result.rb +0 -86
  259. data/lib/git/failed_error.rb +0 -53
  260. data/lib/git/git_execute_error.rb +0 -7
  261. data/lib/git/index.rb +0 -5
  262. data/lib/git/lib.rb +0 -1328
  263. data/lib/git/path.rb +0 -31
  264. data/lib/git/signaled_error.rb +0 -50
  265. data/lib/git/working_directory.rb +0 -4
@@ -0,0 +1,102 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+
5
+ require 'git/author_info'
6
+
7
+ module Git
8
+ # Immutable value object representing stash entry information
9
+ #
10
+ # StashInfo encapsulates the parsed data from `git stash list` output.
11
+ # Each entry contains comprehensive information about the stash including
12
+ # its index, reference name, commit SHA, branch, message, and the author and
13
+ # committer identities.
14
+ #
15
+ # The author and committer are nested {Git::AuthorInfo} values. Their `date`
16
+ # is a `Time` parsed from git's ISO 8601 output, not an ISO 8601 string.
17
+ #
18
+ # @example Create a StashInfo from parsed stash list output
19
+ # info = Git::StashInfo.new(
20
+ # index: 0,
21
+ # name: 'stash@{0}',
22
+ # oid: 'abc123def456789...',
23
+ # short_oid: 'abc123d',
24
+ # branch: 'main',
25
+ # message: 'WIP on main: abc123 Initial commit',
26
+ # author: Git::AuthorInfo.new(
27
+ # name: 'Jane Doe',
28
+ # email: 'jane@example.com',
29
+ # date: Time.iso8601('2026-01-24T10:30:00-08:00')
30
+ # ),
31
+ # committer: Git::AuthorInfo.new(
32
+ # name: 'Jane Doe',
33
+ # email: 'jane@example.com',
34
+ # date: Time.iso8601('2026-01-24T10:30:00-08:00')
35
+ # )
36
+ # )
37
+ #
38
+ # info.index # => 0
39
+ # info.name # => 'stash@{0}'
40
+ # info.oid # => 'abc123def456789...'
41
+ # info.short_oid # => 'abc123d'
42
+ # info.branch # => 'main'
43
+ # info.message # => 'WIP on main: abc123 Initial commit'
44
+ # info.author.name # => 'Jane Doe'
45
+ # info.author.email # => 'jane@example.com'
46
+ # info.author.date # => 2026-01-24 10:30:00 -0800
47
+ # info.committer.name # => 'Jane Doe'
48
+ #
49
+ # @see Git::AuthorInfo for the nested author and committer identities
50
+ #
51
+ # @api public
52
+ #
53
+ # @!attribute [r] index
54
+ # @return [Integer] the stash index (0, 1, 2, ...)
55
+ #
56
+ # @!attribute [r] name
57
+ # @return [String] the stash reference name (e.g., 'stash@\\{0\\}')
58
+ #
59
+ # @!attribute [r] oid
60
+ # @return [String] the full 40-character object identifier of the stash
61
+ #
62
+ # @!attribute [r] short_oid
63
+ # @return [String] the abbreviated object identifier (typically 7 characters)
64
+ #
65
+ # @!attribute [r] branch
66
+ # @return [String, nil] the branch name where the stash was created,
67
+ # or nil for custom stash messages
68
+ #
69
+ # @!attribute [r] message
70
+ # @return [String] the stash message (e.g., 'WIP on main: abc123 commit msg')
71
+ #
72
+ # @!attribute [r] author
73
+ # The identity of the stash author; the nested `date` is a `Time`.
74
+ #
75
+ # @return [Git::AuthorInfo] the author of the stash commit
76
+ #
77
+ # @!attribute [r] committer
78
+ # The identity of the stash committer; the nested `date` is a `Time`.
79
+ #
80
+ # @return [Git::AuthorInfo] the committer of the stash commit
81
+ #
82
+ StashInfo = Data.define(
83
+ :index,
84
+ :name,
85
+ :oid,
86
+ :short_oid,
87
+ :branch,
88
+ :message,
89
+ :author,
90
+ :committer
91
+ ) do
92
+ # Returns the stash reference name
93
+ #
94
+ # @example Convert to string
95
+ # info.to_s # => 'stash@{0}'
96
+ #
97
+ # @return [String] the stash name (e.g., 'stash@\\{0}')
98
+ def to_s
99
+ name
100
+ end
101
+ end
102
+ end
data/lib/git/stashes.rb CHANGED
@@ -1,55 +1,198 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Git
2
-
3
- # object that holds all the available stashes
4
+ # Collection of stash entries for a Git repository
5
+ #
6
+ # This class is deprecated and will be removed in v6.0.0. Use the
7
+ # {Git::Repository} stash methods and {Git::StashInfo} instead:
8
+ # {Git::Repository#stash_infos} replaces the collection, and
9
+ # {Git::Repository#stash_push}, {Git::Repository#stash_apply}, and
10
+ # {Git::Repository#stash_clear} replace {#save}, {#apply}, and {#clear}.
11
+ #
12
+ # @example Iterate over stash entries (deprecated)
13
+ # git.stashes.each { |s| puts s.message }
14
+ #
15
+ # @example The replacement
16
+ # repo.stash_infos.each { |info| puts info.message }
17
+ # repo.stash_infos.size #=> 2
18
+ # repo.stash_apply
19
+ #
20
+ # @deprecated Use {Git::Repository#stash_infos} and {Git::StashInfo} instead
21
+ #
22
+ # @see Git::Repository#stash_infos
23
+ #
24
+ # @api public
25
+ #
4
26
  class Stashes
5
27
  include Enumerable
6
-
28
+
29
+ # Initialize the stashes collection
30
+ #
31
+ # Loads all existing stash entries from the repository at construction time.
32
+ # Emits one deprecation warning per object.
33
+ #
34
+ # @example Load stashes for a repository
35
+ # stashes = Git::Stashes.new(repo)
36
+ # stashes.size #=> 2
37
+ #
38
+ # @param base [Git::Repository] the git repository
39
+ #
40
+ # @return [void]
41
+ #
42
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
43
+ #
44
+ # @deprecated Use {Git::Repository#stash_infos} and {Git::StashInfo} instead
45
+ #
7
46
  def initialize(base)
47
+ Git::Deprecation.warn(
48
+ 'Git::Stashes is deprecated and will be removed in v6.0.0. ' \
49
+ 'Use the Git::Repository stash methods (stash_infos, stash_push, stash_apply, stash_clear) ' \
50
+ 'and Git::StashInfo instead.'
51
+ )
8
52
  @stashes = []
9
-
10
53
  @base = base
11
-
12
- @base.lib.stashes_all.each do |id, message|
13
- @stashes.unshift(Git::Stash.new(@base, message, true))
14
- end
54
+ # stashes_all and Git::Stash are deprecated too; silence them so one
55
+ # Git::Stashes.new emits one warning
56
+ Git::Deprecation.silence { load_stashes }
15
57
  end
16
58
 
59
+ # Returns all stash entries as an array of index and message pairs
60
+ #
61
+ # Entries are listed in oldest-first order matching {Git::Repository#stashes_all}.
62
+ #
63
+ # @example List all stash entries
64
+ # git.stashes.all #=> [[0, "testing-stash-all"], [1, "another-stash"]]
17
65
  #
18
- # Returns an multi-dimensional Array of elements that have been stash saved.
19
- # Array is based on position and name. See Example
66
+ # @return [Array<Array(Integer, String)>] array of `[index, message]` pairs where
67
+ # index 0 is the oldest stash
68
+ #
69
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
20
70
  #
21
- # @example Returns Array of items that have been stashed
22
- # .all - [0, "testing-stash-all"]]
23
- # @return [Array]
24
71
  def all
25
- @base.lib.stashes_all
72
+ # stashes_all is deprecated too; silence it so this call emits no second warning
73
+ Git::Deprecation.silence { stash_repository.stashes_all }
26
74
  end
27
-
75
+
76
+ # Saves the current working-directory state to a new stash entry
77
+ #
78
+ # @example Save current changes to the stash
79
+ # git.stashes.save('WIP: feature work')
80
+ # git.stashes.size #=> 1
81
+ #
82
+ # @param message [String] the stash message
83
+ #
84
+ # @return [void]
85
+ #
86
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
87
+ #
28
88
  def save(message)
29
- s = Git::Stash.new(@base, message)
89
+ # Git::Stash is deprecated too; silence it so this call emits no second warning
90
+ s = Git::Deprecation.silence { Git::Stash.new(@base, message) }
30
91
  @stashes.unshift(s) if s.saved?
31
92
  end
32
-
33
- def apply(index=nil)
34
- @base.lib.stash_apply(index)
93
+
94
+ # Applies a stash entry to the working directory
95
+ #
96
+ # @example Apply the most recent stash
97
+ # git.stashes.apply
98
+ #
99
+ # @example Apply a specific stash by index
100
+ # git.stashes.apply(1)
101
+ #
102
+ # @param index [Integer, nil] the stash index to apply (default: latest)
103
+ #
104
+ # @return [String] the output from the git stash apply command
105
+ #
106
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
107
+ #
108
+ def apply(index = nil)
109
+ stash_repository.stash_apply(index)
35
110
  end
36
-
111
+
112
+ # Removes all stash entries
113
+ #
114
+ # @example Clear all stashes
115
+ # git.stashes.clear
116
+ # git.stashes.size #=> 0
117
+ #
118
+ # @return [void]
119
+ #
120
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
121
+ #
37
122
  def clear
38
- @base.lib.stash_clear
123
+ stash_repository.stash_clear
39
124
  @stashes = []
125
+ nil
40
126
  end
41
127
 
128
+ # Returns the number of stash entries
129
+ #
130
+ # @example Check how many stashes exist
131
+ # git.stashes.size #=> 2
132
+ #
133
+ # @return [Integer] the number of stashes
134
+ #
42
135
  def size
43
136
  @stashes.size
44
137
  end
45
-
46
- def each(&block)
47
- @stashes.each(&block)
138
+
139
+ # Iterates over each stash entry in newest-first order
140
+ #
141
+ # @example Iterate over stashes
142
+ # git.stashes.each { |s| puts s.message }
143
+ #
144
+ # @overload each
145
+ #
146
+ # @return [Enumerator<Git::Stash>] an enumerator over stash entries
147
+ #
148
+ # @overload each(&block)
149
+ #
150
+ # @yield [stash] each stash entry
151
+ #
152
+ # @yieldparam stash [Git::Stash] the current stash entry
153
+ #
154
+ # @yieldreturn [void]
155
+ #
156
+ # @return [Array<Git::Stash>] the stash entries
157
+ #
158
+ def each(&)
159
+ @stashes.each(&)
48
160
  end
49
-
161
+
162
+ # Returns the stash entry at the given index
163
+ #
164
+ # Stashes are stored in newest-first order; index 0 is the most recent stash.
165
+ #
166
+ # @example Access the most recent stash
167
+ # git.stashes[0].message #=> "WIP: feature work"
168
+ #
169
+ # @param index [Integer, #to_i] the stash index (0 = most recent)
170
+ #
171
+ # @return [Git::Stash, nil] the stash entry, or `nil` if the index is out of bounds
172
+ #
50
173
  def [](index)
51
174
  @stashes[index.to_i]
52
175
  end
53
-
176
+
177
+ private
178
+
179
+ # Wraps every entry from the repository in a Git::Stash, newest first
180
+ #
181
+ # @return [void]
182
+ #
183
+ def load_stashes
184
+ stash_repository.stashes_all.each do |stash|
185
+ message = stash[1]
186
+ @stashes.unshift(Git::Stash.new(@base, message, existing: true))
187
+ end
188
+ end
189
+
190
+ # Returns the facade interface for stash operations
191
+ #
192
+ # @return [Git::Repository]
193
+ #
194
+ def stash_repository
195
+ @base
196
+ end
54
197
  end
55
198
  end