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,140 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Creates a new linked worktree
9
+ #
10
+ # @example Add a worktree at a path (auto-creates a branch)
11
+ # Git::Commands::Worktree::Add.new(execution_context).call('/tmp/feature')
12
+ #
13
+ # @example Add a worktree and check out an existing branch
14
+ # Git::Commands::Worktree::Add.new(execution_context).call('/tmp/hotfix', 'main')
15
+ #
16
+ # @example Add a worktree with a new branch
17
+ # Git::Commands::Worktree::Add.new(execution_context).call('/tmp/feat', b: 'feature/new')
18
+ #
19
+ # @example Add a detached-HEAD worktree locked at creation
20
+ # Git::Commands::Worktree::Add.new(execution_context).call('/tmp/exp', detach: true, lock: true)
21
+ #
22
+ # @note `arguments` block audited against
23
+ # https://git-scm.com/docs/git-worktree/2.54.0
24
+ #
25
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
26
+ #
27
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
28
+ #
29
+ # @api private
30
+ #
31
+ class Add < ManagementBase
32
+ arguments do
33
+ literal 'worktree'
34
+ literal 'add'
35
+ flag_option %i[force f], max_times: 2
36
+ value_option :b
37
+ value_option :B
38
+ flag_option %i[detach d]
39
+ flag_option :checkout, negatable: true
40
+ flag_option :guess_remote, negatable: true
41
+ flag_option :relative_paths, negatable: true
42
+ flag_option :track, negatable: true
43
+ flag_option :lock
44
+ flag_option :orphan
45
+ flag_option %i[quiet q]
46
+ value_option :reason
47
+ end_of_options
48
+ operand :path, required: true
49
+ operand :commit_ish
50
+ end
51
+
52
+ # @!method call(*, **)
53
+ #
54
+ # @overload call(path, commit_ish = nil, **options)
55
+ #
56
+ # Create a new linked worktree and check out `commit_ish` into it
57
+ #
58
+ # @param path [String] filesystem path for the new worktree
59
+ #
60
+ # @param commit_ish [String, nil] (nil) branch, tag, or commit to check out
61
+ #
62
+ # When omitted, git creates a new branch named after the final path
63
+ # component and checks it out.
64
+ #
65
+ # @param options [Hash] command options
66
+ #
67
+ # @option options [Boolean, Integer, nil] :force (nil) override safety guards
68
+ #
69
+ # Pass `true` or `1` to emit `--force` once. Pass `2` to emit
70
+ # `--force --force`, which also allows adding worktrees for locked branches.
71
+ #
72
+ # Alias: :f
73
+ #
74
+ # @option options [String] :b (nil) create a new branch with this name
75
+ # and check it out
76
+ #
77
+ # @option options [String] :B (nil) create or reset a branch with this
78
+ # name and check it out
79
+ #
80
+ # @option options [Boolean, nil] :detach (nil) check out in
81
+ # detached-HEAD state
82
+ #
83
+ # Alias: :d
84
+ #
85
+ # @option options [Boolean, nil] :checkout (nil) control whether the working
86
+ # tree is checked out after creation (`--checkout`)
87
+ #
88
+ # @option options [Boolean, nil] :no_checkout (nil) suppress the initial
89
+ # checkout after worktree creation (`--no-checkout`)
90
+ #
91
+ # @option options [Boolean, nil] :guess_remote (nil) base new branch on a
92
+ # matching remote-tracking branch (`--guess-remote`)
93
+ #
94
+ # Applied when no `commit_ish` argument is provided.
95
+ #
96
+ # @option options [Boolean, nil] :no_guess_remote (nil) disable guess-remote
97
+ # behavior (`--no-guess-remote`)
98
+ #
99
+ # @option options [Boolean, nil] :relative_paths (nil) link worktrees using
100
+ # relative paths (`--relative-paths`)
101
+ #
102
+ # Overrides the `worktree.useRelativePaths` config option.
103
+ #
104
+ # @option options [Boolean, nil] :no_relative_paths (nil) use absolute paths
105
+ # for worktree links (`--no-relative-paths`)
106
+ #
107
+ # Overrides the `worktree.useRelativePaths` config option.
108
+ #
109
+ # @option options [Boolean, nil] :track (nil) mark the upstream branch for
110
+ # tracking (`--track`)
111
+ #
112
+ # @option options [Boolean, nil] :no_track (nil) do not mark the upstream
113
+ # branch for tracking (`--no-track`)
114
+ #
115
+ # @option options [Boolean, nil] :lock (nil) lock the worktree immediately
116
+ # after creation
117
+ #
118
+ # @option options [Boolean, nil] :orphan (nil) create an empty worktree
119
+ # associated with a new unborn branch
120
+ #
121
+ # @option options [Boolean, nil] :quiet (nil) suppress informational messages
122
+ #
123
+ # Alias: :q
124
+ #
125
+ # @option options [String] :reason (nil) explanation for why the worktree
126
+ # is locked
127
+ #
128
+ # Only meaningful when used with `:lock`.
129
+ #
130
+ # @return [Git::CommandLineResult] the result of calling `git worktree add`
131
+ #
132
+ # @raise [ArgumentError] if unsupported options are provided
133
+ #
134
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
135
+ #
136
+ # @api public
137
+ end
138
+ end
139
+ end
140
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Lists all worktrees attached to the repository
9
+ #
10
+ # @example List all worktrees in porcelain format
11
+ # Git::Commands::Worktree::List.new(execution_context).call(porcelain: true)
12
+ #
13
+ # @note `arguments` block audited against
14
+ # https://git-scm.com/docs/git-worktree/2.54.0
15
+ #
16
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
17
+ #
18
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
19
+ #
20
+ # @api private
21
+ #
22
+ class List < Git::Commands::Base
23
+ arguments do
24
+ literal 'worktree'
25
+ literal 'list'
26
+ flag_option :porcelain
27
+ flag_option :z
28
+ flag_option %i[verbose v]
29
+ value_option :expire
30
+ end
31
+
32
+ # @!method call(*, **)
33
+ #
34
+ # @overload call(**options)
35
+ #
36
+ # List all worktrees attached to the repository
37
+ #
38
+ # @param options [Hash] command options
39
+ #
40
+ # @option options [Boolean, nil] :porcelain (nil) produce machine-readable
41
+ # output
42
+ #
43
+ # @option options [Boolean, nil] :z (nil) terminate output lines with NUL
44
+ # bytes (use with `:porcelain`)
45
+ #
46
+ # @option options [Boolean, nil] :verbose (nil) output additional information
47
+ # about worktrees
48
+ #
49
+ # Alias: :v
50
+ #
51
+ # @option options [String] :expire (nil) annotate missing worktrees as
52
+ # prunable if older than this time expression
53
+ #
54
+ # @return [Git::CommandLineResult] the result of calling `git worktree list`
55
+ #
56
+ # @raise [ArgumentError] if unsupported options are provided
57
+ #
58
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
59
+ #
60
+ # @api public
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Locks a worktree to prevent it from being pruned
9
+ #
10
+ # @example Lock a worktree
11
+ # Git::Commands::Worktree::Lock.new(execution_context).call('/tmp/feature')
12
+ #
13
+ # @example Lock with a reason message
14
+ # Git::Commands::Worktree::Lock.new(execution_context).call('/tmp/feature', reason: 'on NFS share')
15
+ #
16
+ # @note `arguments` block audited against
17
+ # https://git-scm.com/docs/git-worktree/2.54.0
18
+ #
19
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
20
+ #
21
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
22
+ #
23
+ # @api private
24
+ #
25
+ class Lock < ManagementBase
26
+ arguments do
27
+ literal 'worktree'
28
+ literal 'lock'
29
+ value_option :reason
30
+ end_of_options
31
+ operand :worktree, required: true
32
+ end
33
+
34
+ # @!method call(*, **)
35
+ #
36
+ # @overload call(worktree, **options)
37
+ #
38
+ # Lock a worktree to prevent it from being pruned
39
+ #
40
+ # @param worktree [String] path or unique suffix identifying the
41
+ # worktree to lock
42
+ #
43
+ # @param options [Hash] command options
44
+ #
45
+ # @option options [String] :reason (nil) human-readable explanation stored
46
+ # alongside the lock
47
+ #
48
+ # @return [Git::CommandLineResult] the result of calling `git worktree lock`
49
+ #
50
+ # @raise [ArgumentError] if unsupported options are provided
51
+ #
52
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
53
+ #
54
+ # @api public
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Shared base class for worktree management subcommands
9
+ #
10
+ # Overrides the `env` method from {Git::Commands::Base} to unconditionally
11
+ # unset `GIT_INDEX_FILE` in the subprocess environment. Git worktrees
12
+ # maintain their own index files; passing a `GIT_INDEX_FILE` override when
13
+ # running management commands causes silent corruption of both the main
14
+ # worktree and linked worktree indexes.
15
+ #
16
+ # All worktree management subcommands ({Add}, {Lock}, {Move}, {Prune},
17
+ # {Remove}, {Repair}, {Unlock}) inherit from this class. The read-only
18
+ # {List} subcommand uses {Git::Commands::Base} directly.
19
+ #
20
+ # @example Defining a new worktree management subcommand
21
+ # class Archive < Git::Commands::Worktree::ManagementBase
22
+ # arguments do
23
+ # literal 'worktree'
24
+ # literal 'archive'
25
+ # operand :path, required: true
26
+ # end
27
+ # end
28
+ #
29
+ # @see Git::Commands::Base
30
+ #
31
+ # @see Git::Commands::Worktree
32
+ #
33
+ # @api private
34
+ #
35
+ class ManagementBase < Git::Commands::Base
36
+ private
37
+
38
+ # Returns environment variable overrides that unset `GIT_INDEX_FILE`
39
+ #
40
+ # @return [Hash] the environment variable overrides, always
41
+ # `{ 'GIT_INDEX_FILE' => nil }`
42
+ #
43
+ # @api private
44
+ #
45
+ def env
46
+ { 'GIT_INDEX_FILE' => nil }
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Moves a linked worktree to a new filesystem location
9
+ #
10
+ # @example Move a worktree to a new path
11
+ # Git::Commands::Worktree::Move.new(execution_context).call('/tmp/old', '/tmp/new')
12
+ #
13
+ # @example Force-move a locked worktree
14
+ # Git::Commands::Worktree::Move.new(execution_context).call('/tmp/feat', '/tmp/feat2', force: true)
15
+ #
16
+ # @note `arguments` block audited against
17
+ # https://git-scm.com/docs/git-worktree/2.54.0
18
+ #
19
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
20
+ #
21
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
22
+ #
23
+ # @api private
24
+ #
25
+ class Move < ManagementBase
26
+ arguments do
27
+ literal 'worktree'
28
+ literal 'move'
29
+ flag_option %i[force f], max_times: 2
30
+ end_of_options
31
+ operand :worktree, required: true
32
+ operand :new_path, required: true
33
+ end
34
+
35
+ # @!method call(*, **)
36
+ #
37
+ # @overload call(worktree, new_path, **options)
38
+ #
39
+ # Move a linked worktree to a new filesystem location
40
+ #
41
+ # @param worktree [String] path or unique suffix identifying the
42
+ # worktree to move
43
+ #
44
+ # @param new_path [String] destination path for the worktree
45
+ #
46
+ # @param options [Hash] command options
47
+ #
48
+ # @option options [Boolean, Integer, nil] :force (nil) allow moving a
49
+ # locked worktree
50
+ #
51
+ # Pass `true` or `1` to emit `--force` once. Pass `2` to emit
52
+ # `--force --force`, which also handles locked or missing destinations.
53
+ #
54
+ # Alias: :f
55
+ #
56
+ # @return [Git::CommandLineResult] the result of calling `git worktree move`
57
+ #
58
+ # @raise [ArgumentError] if unsupported options are provided
59
+ #
60
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
61
+ #
62
+ # @api public
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Prunes stale worktree administrative files
9
+ #
10
+ # @example Prune stale worktree info
11
+ # Git::Commands::Worktree::Prune.new(execution_context).call
12
+ #
13
+ # @example Dry-run to see what would be pruned
14
+ # Git::Commands::Worktree::Prune.new(execution_context).call(dry_run: true)
15
+ #
16
+ # @example Prune entries older than 2 weeks
17
+ # Git::Commands::Worktree::Prune.new(execution_context).call(expire: '2.weeks.ago')
18
+ #
19
+ # @note `arguments` block audited against
20
+ # https://git-scm.com/docs/git-worktree/2.54.0
21
+ #
22
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
23
+ #
24
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
25
+ #
26
+ # @api private
27
+ #
28
+ class Prune < ManagementBase
29
+ arguments do
30
+ literal 'worktree'
31
+ literal 'prune'
32
+ flag_option %i[dry_run n]
33
+ flag_option %i[verbose v]
34
+ value_option :expire
35
+ end
36
+
37
+ # @!method call(*, **)
38
+ #
39
+ # @overload call(**options)
40
+ #
41
+ # Prune stale worktree administrative files
42
+ #
43
+ # @param options [Hash] command options
44
+ #
45
+ # @option options [Boolean, nil] :dry_run (nil) report what would be removed
46
+ # without removing anything
47
+ #
48
+ # Alias: :n
49
+ #
50
+ # @option options [Boolean, nil] :verbose (nil) report all removals
51
+ #
52
+ # Alias: :v
53
+ #
54
+ # @option options [String] :expire (nil) only prune entries older than
55
+ # this time expression
56
+ #
57
+ # @return [Git::CommandLineResult] the result of calling `git worktree prune`
58
+ #
59
+ # @raise [ArgumentError] if unsupported options are provided
60
+ #
61
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
62
+ #
63
+ # @api public
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Removes a linked worktree
9
+ #
10
+ # @example Remove a clean worktree
11
+ # Git::Commands::Worktree::Remove.new(execution_context).call('/tmp/feature')
12
+ #
13
+ # @example Force-remove an unclean worktree
14
+ # Git::Commands::Worktree::Remove.new(execution_context).call('/tmp/feature', force: true)
15
+ #
16
+ # @note `arguments` block audited against
17
+ # https://git-scm.com/docs/git-worktree/2.54.0
18
+ #
19
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
20
+ #
21
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
22
+ #
23
+ # @api private
24
+ #
25
+ class Remove < ManagementBase
26
+ arguments do
27
+ literal 'worktree'
28
+ literal 'remove'
29
+ flag_option %i[force f], max_times: 2
30
+ end_of_options
31
+ operand :worktree, required: true
32
+ end
33
+
34
+ # @!method call(*, **)
35
+ #
36
+ # @overload call(worktree, **options)
37
+ #
38
+ # Remove a linked worktree
39
+ #
40
+ # @param worktree [String] path or unique suffix identifying the
41
+ # worktree to remove
42
+ #
43
+ # @param options [Hash] command options
44
+ #
45
+ # @option options [Boolean, Integer, nil] :force (nil) remove even if the
46
+ # worktree has uncommitted changes
47
+ #
48
+ # Pass `true` or `1` to emit `--force` once. Pass `2` to emit
49
+ # `--force --force`, which also removes locked worktrees.
50
+ #
51
+ # Alias: :f
52
+ #
53
+ # @return [Git::CommandLineResult] the result of calling `git worktree remove`
54
+ #
55
+ # @raise [ArgumentError] if unsupported options are provided
56
+ #
57
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
58
+ #
59
+ # @api public
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Repairs worktree administrative files
9
+ #
10
+ # Resolves broken links between the repository and one or more linked
11
+ # worktrees. Useful after a worktree directory is moved manually.
12
+ #
13
+ # @example Repair all registered worktrees
14
+ # Git::Commands::Worktree::Repair.new(execution_context).call
15
+ #
16
+ # @example Repair specific moved worktrees
17
+ # Git::Commands::Worktree::Repair.new(execution_context).call('/tmp/moved1', '/tmp/moved2')
18
+ #
19
+ # @note `arguments` block audited against
20
+ # https://git-scm.com/docs/git-worktree/2.54.0
21
+ #
22
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
23
+ #
24
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
25
+ #
26
+ # @api private
27
+ #
28
+ class Repair < ManagementBase
29
+ arguments do
30
+ literal 'worktree'
31
+ literal 'repair'
32
+ flag_option :relative_paths, negatable: true
33
+ end_of_options
34
+ operand :path, repeatable: true
35
+ end
36
+
37
+ # git worktree repair was introduced in git 2.29.0
38
+ requires_git_version '2.29.0'
39
+
40
+ # @!method call(*, **)
41
+ #
42
+ # @overload call(*path, **options)
43
+ #
44
+ # Repair worktree administrative files
45
+ #
46
+ # @param path [Array<String>] paths to specific worktrees to repair
47
+ #
48
+ # When omitted, all registered worktrees are repaired.
49
+ #
50
+ # @param options [Hash] command options
51
+ #
52
+ # @option options [Boolean, nil] :relative_paths (nil) link worktrees using
53
+ # relative paths (`--relative-paths`)
54
+ #
55
+ # Overrides the `worktree.useRelativePaths` config option.
56
+ #
57
+ # @option options [Boolean, nil] :no_relative_paths (nil) use absolute paths
58
+ # for worktree links (`--no-relative-paths`)
59
+ #
60
+ # Overrides the `worktree.useRelativePaths` config option. Also causes
61
+ # repair to update linking files if there is an absolute/relative
62
+ # mismatch, even if the links are already correct.
63
+ #
64
+ # @return [Git::CommandLineResult] the result of calling `git worktree repair`
65
+ #
66
+ # @raise [ArgumentError] if unsupported options are provided
67
+ #
68
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
69
+ #
70
+ # @raise [Git::VersionError] if git version is below 2.29.0
71
+ #
72
+ # @api public
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git/commands/worktree/management_base'
4
+
5
+ module Git
6
+ module Commands
7
+ module Worktree
8
+ # Unlocks a worktree, allowing it to be pruned, moved, or deleted
9
+ #
10
+ # @example Unlock a worktree
11
+ # Git::Commands::Worktree::Unlock.new(execution_context).call('/tmp/feature')
12
+ #
13
+ # @note `arguments` block audited against
14
+ # https://git-scm.com/docs/git-worktree/2.54.0
15
+ #
16
+ # @see Git::Commands::Worktree Git::Commands::Worktree for the full sub-command list
17
+ #
18
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
19
+ #
20
+ # @api private
21
+ #
22
+ class Unlock < ManagementBase
23
+ arguments do
24
+ literal 'worktree'
25
+ literal 'unlock'
26
+ end_of_options
27
+ operand :worktree, required: true
28
+ end
29
+
30
+ # @!method call(*, **)
31
+ #
32
+ # @overload call(worktree)
33
+ #
34
+ # Unlock a worktree, allowing it to be pruned, moved, or deleted
35
+ #
36
+ # @param worktree [String] path or unique suffix identifying the worktree
37
+ # to unlock
38
+ #
39
+ # @return [Git::CommandLineResult] the result of calling `git worktree unlock`
40
+ #
41
+ # @raise [Git::FailedError] if git exits with a non-zero exit status
42
+ #
43
+ # @api public
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'worktree/add'
4
+ require_relative 'worktree/list'
5
+ require_relative 'worktree/lock'
6
+ require_relative 'worktree/management_base'
7
+ require_relative 'worktree/move'
8
+ require_relative 'worktree/prune'
9
+ require_relative 'worktree/remove'
10
+ require_relative 'worktree/repair'
11
+ require_relative 'worktree/unlock'
12
+
13
+ module Git
14
+ module Commands
15
+ # Implements `git worktree` subcommands for managing multiple working trees
16
+ #
17
+ # Split into subclasses because each subcommand has a distinct call shape
18
+ # and option set:
19
+ #
20
+ # - {Worktree::Add} — create a new linked worktree
21
+ # - {Worktree::List} — list all worktrees
22
+ # - {Worktree::Lock} — prevent a worktree from being pruned
23
+ # - {Worktree::Move} — move a worktree to a new location
24
+ # - {Worktree::Prune} — prune stale worktree administrative files
25
+ # - {Worktree::Remove} — remove a worktree
26
+ # - {Worktree::Repair} — repair worktree administrative files
27
+ # - {Worktree::Unlock} — allow a worktree to be pruned
28
+ #
29
+ # Management subcommands ({Add}, {Lock}, {Move}, {Prune}, {Remove},
30
+ # {Repair}, {Unlock}) inherit from {Worktree::ManagementBase}, which
31
+ # unconditionally unsets `GIT_INDEX_FILE` in the subprocess environment.
32
+ # Git worktrees maintain their own index files; leaving `GIT_INDEX_FILE`
33
+ # set causes silent corruption of both the main and the linked worktree
34
+ # indexes.
35
+ #
36
+ # @see https://git-scm.com/docs/git-worktree git-worktree documentation
37
+ #
38
+ # @api private
39
+ #
40
+ module Worktree
41
+ end
42
+ end
43
+ end