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.
- checksums.yaml +4 -4
- data/.github/copilot-instructions.md +67 -2705
- data/.github/pull_request_template.md +3 -1
- data/.github/skills/breaking-change-analysis/SKILL.md +102 -0
- data/.github/skills/ci-cd-troubleshooting/SKILL.md +264 -0
- data/.github/skills/command-implementation/REFERENCE.md +993 -0
- data/.github/skills/command-implementation/SKILL.md +229 -0
- data/.github/skills/command-test-conventions/SKILL.md +660 -0
- data/.github/skills/command-yard-documentation/SKILL.md +426 -0
- data/.github/skills/dependency-management/SKILL.md +72 -0
- data/.github/skills/development-workflow/SKILL.md +506 -0
- data/.github/skills/extract-command-from-lib/SKILL.md +487 -0
- data/.github/skills/extract-facade-from-base-lib/SKILL.md +586 -0
- data/.github/skills/facade-implementation/REFERENCE.md +840 -0
- data/.github/skills/facade-implementation/SKILL.md +260 -0
- data/.github/skills/facade-test-conventions/SKILL.md +380 -0
- data/.github/skills/facade-yard-documentation/SKILL.md +429 -0
- data/.github/skills/make-skill-template/SKILL.md +176 -0
- data/.github/skills/pr-readiness-review/SKILL.md +185 -0
- data/.github/skills/project-context/SKILL.md +313 -0
- data/.github/skills/pull-request-review/SKILL.md +168 -0
- data/.github/skills/refactor-command-to-commandlineresult/SKILL.md +131 -0
- data/.github/skills/release-management/SKILL.md +125 -0
- data/.github/skills/review-arguments-dsl/CHECKLIST.md +788 -0
- data/.github/skills/review-arguments-dsl/SKILL.md +214 -0
- data/.github/skills/review-backward-compatibility/SKILL.md +275 -0
- data/.github/skills/review-cross-command-consistency/SKILL.md +139 -0
- data/.github/skills/reviewing-skills/SKILL.md +189 -0
- data/.github/skills/rspec-unit-testing-standards/SKILL.md +639 -0
- data/.github/skills/tdd-refactor-step/SKILL.md +236 -0
- data/.github/skills/test-debugging/SKILL.md +160 -0
- data/.github/skills/yard-documentation/SKILL.md +793 -0
- data/.github/workflows/continuous_integration.yml +3 -2
- data/.github/workflows/enforce_conventional_commits.yml +1 -1
- data/.github/workflows/experimental_continuous_integration.yml +2 -2
- data/.github/workflows/release.yml +3 -4
- data/.gitignore +8 -0
- data/.husky/pre-commit +13 -0
- data/.release-please-manifest.json +1 -1
- data/.rspec +3 -0
- data/.rubocop.yml +7 -3
- data/.rubocop_todo.yml +23 -5
- data/.yardopts +1 -0
- data/CHANGELOG.md +0 -40
- data/CONTRIBUTING.md +694 -53
- data/README.md +17 -5
- data/Rakefile +61 -9
- data/commitlint.test +4 -0
- data/git.gemspec +14 -8
- data/lib/git/args_builder.rb +0 -8
- data/lib/git/base.rb +486 -410
- data/lib/git/branch.rb +380 -43
- data/lib/git/branch_delete_failure.rb +31 -0
- data/lib/git/branch_delete_result.rb +63 -0
- data/lib/git/branch_info.rb +178 -0
- data/lib/git/branches.rb +130 -24
- data/lib/git/command_line/base.rb +245 -0
- data/lib/git/command_line/capturing.rb +249 -0
- data/lib/git/command_line/result.rb +96 -0
- data/lib/git/command_line/streaming.rb +194 -0
- data/lib/git/command_line.rb +43 -322
- data/lib/git/command_line_result.rb +4 -88
- data/lib/git/commands/add.rb +131 -0
- data/lib/git/commands/am/abort.rb +43 -0
- data/lib/git/commands/am/apply.rb +252 -0
- data/lib/git/commands/am/continue.rb +43 -0
- data/lib/git/commands/am/quit.rb +43 -0
- data/lib/git/commands/am/retry.rb +47 -0
- data/lib/git/commands/am/show_current_patch.rb +64 -0
- data/lib/git/commands/am/skip.rb +42 -0
- data/lib/git/commands/am.rb +33 -0
- data/lib/git/commands/apply.rb +237 -0
- data/lib/git/commands/archive/list_formats.rb +46 -0
- data/lib/git/commands/archive.rb +140 -0
- data/lib/git/commands/arguments.rb +3510 -0
- data/lib/git/commands/base.rb +403 -0
- data/lib/git/commands/branch/copy.rb +94 -0
- data/lib/git/commands/branch/create.rb +173 -0
- data/lib/git/commands/branch/delete.rb +80 -0
- data/lib/git/commands/branch/list.rb +162 -0
- data/lib/git/commands/branch/move.rb +94 -0
- data/lib/git/commands/branch/set_upstream.rb +86 -0
- data/lib/git/commands/branch/show_current.rb +49 -0
- data/lib/git/commands/branch/unset_upstream.rb +57 -0
- data/lib/git/commands/branch.rb +34 -0
- data/lib/git/commands/cat_file/batch.rb +364 -0
- data/lib/git/commands/cat_file/filtered.rb +105 -0
- data/lib/git/commands/cat_file/raw.rb +210 -0
- data/lib/git/commands/cat_file.rb +49 -0
- data/lib/git/commands/checkout/branch.rb +151 -0
- data/lib/git/commands/checkout/files.rb +115 -0
- data/lib/git/commands/checkout.rb +38 -0
- data/lib/git/commands/checkout_index.rb +105 -0
- data/lib/git/commands/clean.rb +100 -0
- data/lib/git/commands/clone.rb +240 -0
- data/lib/git/commands/commit.rb +272 -0
- data/lib/git/commands/commit_tree.rb +100 -0
- data/lib/git/commands/config_option_syntax/add.rb +83 -0
- data/lib/git/commands/config_option_syntax/get.rb +117 -0
- data/lib/git/commands/config_option_syntax/get_all.rb +115 -0
- data/lib/git/commands/config_option_syntax/get_color.rb +91 -0
- data/lib/git/commands/config_option_syntax/get_color_bool.rb +93 -0
- data/lib/git/commands/config_option_syntax/get_regexp.rb +115 -0
- data/lib/git/commands/config_option_syntax/get_urlmatch.rb +102 -0
- data/lib/git/commands/config_option_syntax/list.rb +107 -0
- data/lib/git/commands/config_option_syntax/remove_section.rb +74 -0
- data/lib/git/commands/config_option_syntax/rename_section.rb +78 -0
- data/lib/git/commands/config_option_syntax/replace_all.rb +104 -0
- data/lib/git/commands/config_option_syntax/set.rb +114 -0
- data/lib/git/commands/config_option_syntax/unset.rb +89 -0
- data/lib/git/commands/config_option_syntax/unset_all.rb +89 -0
- data/lib/git/commands/config_option_syntax.rb +56 -0
- data/lib/git/commands/describe.rb +155 -0
- data/lib/git/commands/diff.rb +656 -0
- data/lib/git/commands/diff_files.rb +518 -0
- data/lib/git/commands/diff_index.rb +496 -0
- data/lib/git/commands/fetch.rb +352 -0
- data/lib/git/commands/fsck.rb +136 -0
- data/lib/git/commands/gc.rb +132 -0
- data/lib/git/commands/grep.rb +338 -0
- data/lib/git/commands/init.rb +99 -0
- data/lib/git/commands/log.rb +632 -0
- data/lib/git/commands/ls_files.rb +191 -0
- data/lib/git/commands/ls_remote.rb +155 -0
- data/lib/git/commands/ls_tree.rb +131 -0
- data/lib/git/commands/maintenance/register.rb +75 -0
- data/lib/git/commands/maintenance/run.rb +104 -0
- data/lib/git/commands/maintenance/start.rb +66 -0
- data/lib/git/commands/maintenance/stop.rb +55 -0
- data/lib/git/commands/maintenance/unregister.rb +79 -0
- data/lib/git/commands/maintenance.rb +31 -0
- data/lib/git/commands/merge/abort.rb +44 -0
- data/lib/git/commands/merge/continue.rb +44 -0
- data/lib/git/commands/merge/quit.rb +46 -0
- data/lib/git/commands/merge/start.rb +245 -0
- data/lib/git/commands/merge.rb +28 -0
- data/lib/git/commands/merge_base.rb +86 -0
- data/lib/git/commands/mv.rb +77 -0
- data/lib/git/commands/name_rev.rb +114 -0
- data/lib/git/commands/pull.rb +377 -0
- data/lib/git/commands/push.rb +246 -0
- data/lib/git/commands/read_tree.rb +149 -0
- data/lib/git/commands/remote/add.rb +91 -0
- data/lib/git/commands/remote/get_url.rb +66 -0
- data/lib/git/commands/remote/list.rb +54 -0
- data/lib/git/commands/remote/prune.rb +61 -0
- data/lib/git/commands/remote/remove.rb +52 -0
- data/lib/git/commands/remote/rename.rb +69 -0
- data/lib/git/commands/remote/set_branches.rb +63 -0
- data/lib/git/commands/remote/set_head.rb +82 -0
- data/lib/git/commands/remote/set_url.rb +71 -0
- data/lib/git/commands/remote/set_url_add.rb +61 -0
- data/lib/git/commands/remote/set_url_delete.rb +64 -0
- data/lib/git/commands/remote/show.rb +71 -0
- data/lib/git/commands/remote/update.rb +72 -0
- data/lib/git/commands/remote.rb +42 -0
- data/lib/git/commands/repack.rb +277 -0
- data/lib/git/commands/reset.rb +147 -0
- data/lib/git/commands/rev_parse.rb +297 -0
- data/lib/git/commands/revert/abort.rb +45 -0
- data/lib/git/commands/revert/continue.rb +57 -0
- data/lib/git/commands/revert/quit.rb +47 -0
- data/lib/git/commands/revert/skip.rb +44 -0
- data/lib/git/commands/revert/start.rb +153 -0
- data/lib/git/commands/revert.rb +29 -0
- data/lib/git/commands/rm.rb +114 -0
- data/lib/git/commands/show.rb +632 -0
- data/lib/git/commands/show_ref/exclude_existing.rb +120 -0
- data/lib/git/commands/show_ref/exists.rb +78 -0
- data/lib/git/commands/show_ref/list.rb +145 -0
- data/lib/git/commands/show_ref/verify.rb +120 -0
- data/lib/git/commands/show_ref.rb +42 -0
- data/lib/git/commands/stash/apply.rb +75 -0
- data/lib/git/commands/stash/branch.rb +65 -0
- data/lib/git/commands/stash/clear.rb +41 -0
- data/lib/git/commands/stash/create.rb +58 -0
- data/lib/git/commands/stash/drop.rb +67 -0
- data/lib/git/commands/stash/list.rb +39 -0
- data/lib/git/commands/stash/pop.rb +78 -0
- data/lib/git/commands/stash/push.rb +103 -0
- data/lib/git/commands/stash/show.rb +149 -0
- data/lib/git/commands/stash/store.rb +63 -0
- data/lib/git/commands/stash.rb +38 -0
- data/lib/git/commands/status.rb +169 -0
- data/lib/git/commands/symbolic_ref/delete.rb +68 -0
- data/lib/git/commands/symbolic_ref/read.rb +95 -0
- data/lib/git/commands/symbolic_ref/update.rb +76 -0
- data/lib/git/commands/symbolic_ref.rb +38 -0
- data/lib/git/commands/tag/create.rb +139 -0
- data/lib/git/commands/tag/delete.rb +55 -0
- data/lib/git/commands/tag/list.rb +143 -0
- data/lib/git/commands/tag/verify.rb +71 -0
- data/lib/git/commands/tag.rb +26 -0
- data/lib/git/commands/update_ref/batch.rb +140 -0
- data/lib/git/commands/update_ref/delete.rb +92 -0
- data/lib/git/commands/update_ref/update.rb +106 -0
- data/lib/git/commands/update_ref.rb +42 -0
- data/lib/git/commands/version.rb +52 -0
- data/lib/git/commands/worktree/add.rb +140 -0
- data/lib/git/commands/worktree/list.rb +64 -0
- data/lib/git/commands/worktree/lock.rb +58 -0
- data/lib/git/commands/worktree/management_base.rb +51 -0
- data/lib/git/commands/worktree/move.rb +66 -0
- data/lib/git/commands/worktree/prune.rb +67 -0
- data/lib/git/commands/worktree/remove.rb +63 -0
- data/lib/git/commands/worktree/repair.rb +76 -0
- data/lib/git/commands/worktree/unlock.rb +47 -0
- data/lib/git/commands/worktree.rb +43 -0
- data/lib/git/commands/write_tree.rb +68 -0
- data/lib/git/commands.rb +89 -0
- data/lib/git/detached_head_info.rb +54 -0
- data/lib/git/diff.rb +297 -7
- data/lib/git/diff_file_numstat_info.rb +29 -0
- data/lib/git/diff_file_patch_info.rb +134 -0
- data/lib/git/diff_file_raw_info.rb +127 -0
- data/lib/git/diff_info.rb +169 -0
- data/lib/git/diff_path_status.rb +78 -19
- data/lib/git/diff_result.rb +32 -0
- data/lib/git/diff_stats.rb +59 -14
- data/lib/git/dirstat_info.rb +86 -0
- data/lib/git/errors.rb +65 -2
- data/lib/git/execution_context/global.rb +56 -0
- data/lib/git/execution_context/repository.rb +147 -0
- data/lib/git/execution_context.rb +482 -0
- data/lib/git/file_ref.rb +74 -0
- data/lib/git/fsck_object.rb +9 -9
- data/lib/git/fsck_result.rb +1 -1
- data/lib/git/lib.rb +1606 -1028
- data/lib/git/log.rb +15 -2
- data/lib/git/object.rb +92 -22
- data/lib/git/parsers/branch.rb +224 -0
- data/lib/git/parsers/cat_file.rb +111 -0
- data/lib/git/parsers/diff.rb +585 -0
- data/lib/git/parsers/fsck.rb +133 -0
- data/lib/git/parsers/grep.rb +42 -0
- data/lib/git/parsers/ls_tree.rb +58 -0
- data/lib/git/parsers/stash.rb +208 -0
- data/lib/git/parsers/tag.rb +257 -0
- data/lib/git/remote.rb +133 -9
- data/lib/git/repository/branching.rb +572 -0
- data/lib/git/repository/committing.rb +191 -0
- data/lib/git/repository/configuring.rb +156 -0
- data/lib/git/repository/diffing.rb +775 -0
- data/lib/git/repository/inspecting.rb +153 -0
- data/lib/git/repository/logging.rb +247 -0
- data/lib/git/repository/merging.rb +295 -0
- data/lib/git/repository/object_operations.rb +1101 -0
- data/lib/git/repository/path_resolver.rb +207 -0
- data/lib/git/repository/remote_operations.rb +753 -0
- data/lib/git/repository/shared_private.rb +51 -0
- data/lib/git/repository/staging.rb +390 -0
- data/lib/git/repository/stashing.rb +107 -0
- data/lib/git/repository/status_operations.rb +180 -0
- data/lib/git/repository/worktree_operations.rb +159 -0
- data/lib/git/repository.rb +264 -1
- data/lib/git/stash.rb +85 -4
- data/lib/git/stash_info.rb +104 -0
- data/lib/git/stashes.rb +130 -13
- data/lib/git/status.rb +224 -18
- data/lib/git/tag_delete_failure.rb +31 -0
- data/lib/git/tag_delete_result.rb +63 -0
- data/lib/git/tag_info.rb +105 -0
- data/lib/git/version.rb +109 -2
- data/lib/git/version_constraint.rb +81 -0
- data/lib/git/worktree.rb +120 -5
- data/lib/git/worktrees.rb +107 -7
- data/lib/git.rb +114 -18
- data/redesign/1_architecture_existing.md +54 -18
- data/redesign/2_architecture_redesign.md +365 -46
- data/redesign/3_architecture_implementation.md +1451 -54
- data/tasks/gem_tasks.rake +4 -0
- data/tasks/npm_tasks.rake +7 -0
- data/tasks/rspec.rake +48 -0
- data/tasks/test.rake +13 -1
- data/tasks/yard.rake +34 -7
- metadata +349 -20
- data/lib/git/index.rb +0 -6
- data/lib/git/path.rb +0 -38
- data/lib/git/working_directory.rb +0 -6
- /data/{release-please-config.json → .release-please-config.json} +0 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'git/commands/commit'
|
|
4
|
+
require 'git/commands/commit_tree'
|
|
5
|
+
require 'git/commands/write_tree'
|
|
6
|
+
require 'git/repository/shared_private'
|
|
7
|
+
|
|
8
|
+
module Git
|
|
9
|
+
class Repository
|
|
10
|
+
# Facade methods for committing operations: recording commits, manipulating
|
|
11
|
+
# tree objects, and building commit objects outside the working tree
|
|
12
|
+
#
|
|
13
|
+
# Included by {Git::Repository}.
|
|
14
|
+
#
|
|
15
|
+
# @api public
|
|
16
|
+
#
|
|
17
|
+
module Committing
|
|
18
|
+
# Option keys accepted by {#commit}
|
|
19
|
+
COMMIT_ALLOWED_OPTS = %i[
|
|
20
|
+
all amend allow_empty allow_empty_message author date
|
|
21
|
+
gpg_sign no_gpg_sign no_verify
|
|
22
|
+
].freeze
|
|
23
|
+
private_constant :COMMIT_ALLOWED_OPTS
|
|
24
|
+
|
|
25
|
+
# Option keys accepted by {#commit_tree}
|
|
26
|
+
COMMIT_TREE_ALLOWED_OPTS = %i[parent p parents message m].freeze
|
|
27
|
+
private_constant :COMMIT_TREE_ALLOWED_OPTS
|
|
28
|
+
|
|
29
|
+
# Record staged changes as a new commit
|
|
30
|
+
#
|
|
31
|
+
# @overload commit(message = nil, **options)
|
|
32
|
+
#
|
|
33
|
+
# @example Commit with a message
|
|
34
|
+
# repo.commit('Add README')
|
|
35
|
+
#
|
|
36
|
+
# @example Amend the previous commit, reusing its message
|
|
37
|
+
# repo.commit(nil, amend: true)
|
|
38
|
+
#
|
|
39
|
+
# @example Stage all modified files and commit
|
|
40
|
+
# repo.commit('Cleanup', all: true)
|
|
41
|
+
#
|
|
42
|
+
# @param message [String, nil] the commit message; pass `nil` to omit
|
|
43
|
+
# (e.g. when using `:amend` to reuse the previous message)
|
|
44
|
+
#
|
|
45
|
+
# @param options [Hash] options for the commit command
|
|
46
|
+
#
|
|
47
|
+
# @option options [Boolean, nil] :all (nil) automatically stage modified and
|
|
48
|
+
# deleted files before committing
|
|
49
|
+
#
|
|
50
|
+
# @option options [Boolean, nil] :amend (nil) replace the tip of the current
|
|
51
|
+
# branch with a new commit
|
|
52
|
+
#
|
|
53
|
+
# @option options [Boolean, nil] :allow_empty (nil) allow committing with no
|
|
54
|
+
# changes
|
|
55
|
+
#
|
|
56
|
+
# @option options [Boolean, nil] :allow_empty_message (nil) allow committing
|
|
57
|
+
# with an empty message
|
|
58
|
+
#
|
|
59
|
+
# @option options [String] :author (nil) override the commit author in
|
|
60
|
+
# `A U Thor <author@example.com>` format
|
|
61
|
+
#
|
|
62
|
+
# @option options [String] :date (nil) override the author date
|
|
63
|
+
#
|
|
64
|
+
# @option options [Boolean, nil] :gpg_sign (nil) GPG-sign the commit
|
|
65
|
+
#
|
|
66
|
+
# @option options [Boolean, nil] :no_gpg_sign (nil) disable GPG signing
|
|
67
|
+
#
|
|
68
|
+
# @option options [Boolean, nil] :no_verify (nil) bypass the pre-commit and
|
|
69
|
+
# commit-msg hooks
|
|
70
|
+
#
|
|
71
|
+
# @return [String] git's stdout from the commit
|
|
72
|
+
#
|
|
73
|
+
# @raise [ArgumentError] when unsupported options are provided
|
|
74
|
+
#
|
|
75
|
+
# @raise [Git::FailedError] when git exits with a non-zero exit status
|
|
76
|
+
#
|
|
77
|
+
def commit(message = nil, **opts)
|
|
78
|
+
if opts.key?(:add_all)
|
|
79
|
+
Git::Deprecation.warn('The :add_all option for #commit is deprecated, use :all instead')
|
|
80
|
+
opts[:all] = opts.delete(:add_all)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
SharedPrivate.assert_valid_opts!(COMMIT_ALLOWED_OPTS, **opts)
|
|
84
|
+
|
|
85
|
+
call_opts = { no_edit: true }
|
|
86
|
+
call_opts[:message] = message if message
|
|
87
|
+
|
|
88
|
+
Git::Commands::Commit.new(@execution_context).call(**call_opts, **opts).stdout
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Commit all modified tracked files without explicitly staging them first
|
|
92
|
+
#
|
|
93
|
+
# Equivalent to `commit(message, all: true, **options)`.
|
|
94
|
+
#
|
|
95
|
+
# @overload commit_all(message, **options)
|
|
96
|
+
#
|
|
97
|
+
# @example Commit all changes with a message
|
|
98
|
+
# repo.commit_all('Update everything')
|
|
99
|
+
#
|
|
100
|
+
# @param message [String] the commit message
|
|
101
|
+
#
|
|
102
|
+
# @param options [Hash] additional options forwarded to {#commit}
|
|
103
|
+
#
|
|
104
|
+
# @return [String] git's stdout from the commit
|
|
105
|
+
#
|
|
106
|
+
# @raise [ArgumentError] when unsupported options are provided
|
|
107
|
+
#
|
|
108
|
+
# @raise [Git::FailedError] when git exits with a non-zero exit status
|
|
109
|
+
#
|
|
110
|
+
def commit_all(*, **)
|
|
111
|
+
commit(*, all: true, **)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Create a commit object from a tree SHA without moving HEAD
|
|
115
|
+
#
|
|
116
|
+
# Unlike {#commit}, this does not read the index; it directly wraps
|
|
117
|
+
# `git commit-tree`.
|
|
118
|
+
#
|
|
119
|
+
# @overload commit_tree(tree, **options)
|
|
120
|
+
#
|
|
121
|
+
# @example Commit a tree with a parent
|
|
122
|
+
# repo.commit_tree('deadbeef', message: 'snapshot', parent: 'HEAD')
|
|
123
|
+
#
|
|
124
|
+
# @param tree [String] the tree SHA to commit
|
|
125
|
+
#
|
|
126
|
+
# @param options [Hash] options for the commit-tree command
|
|
127
|
+
#
|
|
128
|
+
# @option options [String] :m (nil) the commit message (short form)
|
|
129
|
+
#
|
|
130
|
+
# @option options [String] :message (nil) the commit message (normalized
|
|
131
|
+
# to `:m` before passing to the command)
|
|
132
|
+
#
|
|
133
|
+
# @option options [String, Array<String>] :p (nil) parent commit SHA(s)
|
|
134
|
+
#
|
|
135
|
+
# @option options [String] :parent (nil) a single parent commit SHA
|
|
136
|
+
# (normalized to `:p`)
|
|
137
|
+
#
|
|
138
|
+
# @option options [Array<String>] :parents (nil) multiple parent commit
|
|
139
|
+
# SHAs (normalized to `:p`)
|
|
140
|
+
#
|
|
141
|
+
# @return [String] the SHA of the newly created commit object
|
|
142
|
+
#
|
|
143
|
+
# @raise [ArgumentError] when unsupported options are provided
|
|
144
|
+
#
|
|
145
|
+
# @raise [Git::FailedError] when git exits with a non-zero exit status
|
|
146
|
+
#
|
|
147
|
+
def commit_tree(tree, **opts)
|
|
148
|
+
SharedPrivate.assert_valid_opts!(COMMIT_TREE_ALLOWED_OPTS, **opts)
|
|
149
|
+
|
|
150
|
+
opts[:p] = opts.delete(:parents) if opts.key?(:parents)
|
|
151
|
+
opts[:p] = opts.delete(:parent) if opts.key?(:parent)
|
|
152
|
+
opts[:m] = opts.delete(:message) if opts.key?(:message)
|
|
153
|
+
opts[:m] = "commit tree #{tree}" unless opts[:m]
|
|
154
|
+
|
|
155
|
+
Git::Commands::CommitTree.new(@execution_context).call(tree, **opts).stdout
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
# Write the current index to a tree object in the object store
|
|
159
|
+
#
|
|
160
|
+
# @example Get the tree SHA of the current index
|
|
161
|
+
# tree_sha = repo.write_tree
|
|
162
|
+
#
|
|
163
|
+
# @return [String] the SHA of the tree object written
|
|
164
|
+
#
|
|
165
|
+
# @raise [Git::FailedError] when git exits with a non-zero exit status
|
|
166
|
+
#
|
|
167
|
+
def write_tree
|
|
168
|
+
Git::Commands::WriteTree.new(@execution_context).call.stdout
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Write the current index to a tree object and immediately commit it
|
|
172
|
+
#
|
|
173
|
+
# Combines {#write_tree} and {#commit_tree} in a single call.
|
|
174
|
+
#
|
|
175
|
+
# @overload write_and_commit_tree(**options)
|
|
176
|
+
#
|
|
177
|
+
# @example Commit the current index as a snapshot
|
|
178
|
+
# commit_sha = repo.write_and_commit_tree(message: 'snapshot')
|
|
179
|
+
#
|
|
180
|
+
# @param options [Hash] options forwarded to {#commit_tree}
|
|
181
|
+
#
|
|
182
|
+
# @return [String] the SHA of the newly created commit object
|
|
183
|
+
#
|
|
184
|
+
# @raise [Git::FailedError] when git exits with a non-zero exit status
|
|
185
|
+
#
|
|
186
|
+
def write_and_commit_tree(**)
|
|
187
|
+
commit_tree(write_tree, **)
|
|
188
|
+
end
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
end
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'git/commands/config_option_syntax'
|
|
4
|
+
require 'git/repository/shared_private'
|
|
5
|
+
|
|
6
|
+
module Git
|
|
7
|
+
class Repository
|
|
8
|
+
# Facade methods for reading and writing git configuration
|
|
9
|
+
#
|
|
10
|
+
# Provides the {#config} method, which dispatches to read a single entry,
|
|
11
|
+
# list all entries, or write a value depending on the arguments supplied.
|
|
12
|
+
#
|
|
13
|
+
# Included by {Git::Repository}.
|
|
14
|
+
#
|
|
15
|
+
# @api public
|
|
16
|
+
#
|
|
17
|
+
module Configuring
|
|
18
|
+
# Option keys accepted by {#config} when writing a value
|
|
19
|
+
CONFIG_SET_ALLOWED_OPTS = %i[file].freeze
|
|
20
|
+
private_constant :CONFIG_SET_ALLOWED_OPTS
|
|
21
|
+
|
|
22
|
+
# Read or write a git configuration entry
|
|
23
|
+
#
|
|
24
|
+
# Dispatches to one of three modes depending on the arguments supplied:
|
|
25
|
+
#
|
|
26
|
+
# * **List** — `config()` returns all visible config entries as a `Hash`.
|
|
27
|
+
# * **Get** — `config(name)` returns the value for a single key as a `String`.
|
|
28
|
+
# * **Set** — `config(name, value)` writes a value and returns the raw
|
|
29
|
+
# command result.
|
|
30
|
+
#
|
|
31
|
+
# @overload config
|
|
32
|
+
#
|
|
33
|
+
# @example List all config entries
|
|
34
|
+
# repo.config #=> { "user.name" => "Alice", "core.bare" => "false" }
|
|
35
|
+
#
|
|
36
|
+
# @return [Hash{String => String}] all visible config entries, keyed by
|
|
37
|
+
# their full dotted key names (e.g. `"user.name"`)
|
|
38
|
+
#
|
|
39
|
+
# @overload config(name)
|
|
40
|
+
#
|
|
41
|
+
# @example Read the committer name from config
|
|
42
|
+
# repo.config('user.name') #=> "Alice"
|
|
43
|
+
#
|
|
44
|
+
# @param name [String] the dotted config key to look up (e.g.
|
|
45
|
+
# `"user.name"`)
|
|
46
|
+
#
|
|
47
|
+
# @return [String] the value of the config entry
|
|
48
|
+
#
|
|
49
|
+
# @overload config(name, value, options = {})
|
|
50
|
+
#
|
|
51
|
+
# @example Set the committer name in local config
|
|
52
|
+
# repo.config('user.name', 'Alice')
|
|
53
|
+
#
|
|
54
|
+
# @example Write a value to a custom config file
|
|
55
|
+
# repo.config('user.name', 'Alice', file: '/path/to/custom/config')
|
|
56
|
+
#
|
|
57
|
+
# @param name [String] the dotted config key to write (e.g.
|
|
58
|
+
# `"user.name"`)
|
|
59
|
+
#
|
|
60
|
+
# @param value [String] the value to assign
|
|
61
|
+
#
|
|
62
|
+
# @param options [Hash] options for the set operation
|
|
63
|
+
#
|
|
64
|
+
# @option options [String, nil] :file (nil) path to a custom config file
|
|
65
|
+
# to write to instead of the repository's default `.git/config`
|
|
66
|
+
#
|
|
67
|
+
# @return [Git::CommandLineResult] the raw result of
|
|
68
|
+
# `git config <name> <value>`
|
|
69
|
+
#
|
|
70
|
+
# @raise [ArgumentError] if unsupported options are provided
|
|
71
|
+
#
|
|
72
|
+
# @raise [Git::FailedError] if git exits with a non-zero exit status
|
|
73
|
+
#
|
|
74
|
+
def config(name = nil, value = nil, options = {})
|
|
75
|
+
if name && value
|
|
76
|
+
Private.config_set(@execution_context, name, value, **options)
|
|
77
|
+
elsif name
|
|
78
|
+
Private.config_get(@execution_context, name)
|
|
79
|
+
else
|
|
80
|
+
Private.config_list(@execution_context)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Private helpers local to {Git::Repository::Configuring}
|
|
85
|
+
#
|
|
86
|
+
# @api private
|
|
87
|
+
#
|
|
88
|
+
module Private
|
|
89
|
+
module_function
|
|
90
|
+
|
|
91
|
+
# Set a config value by key name
|
|
92
|
+
#
|
|
93
|
+
# @overload config_set(execution_context, name, value, **options)
|
|
94
|
+
#
|
|
95
|
+
# @param execution_context [Git::ExecutionContext] the execution context
|
|
96
|
+
#
|
|
97
|
+
# @param name [String] the dotted config key to write (e.g. `"user.name"`)
|
|
98
|
+
#
|
|
99
|
+
# @param value [String] the value to assign
|
|
100
|
+
#
|
|
101
|
+
# @param options [Hash] keyword options forwarded to the command
|
|
102
|
+
#
|
|
103
|
+
# @option options [String, nil] :file (nil) path to a custom config file
|
|
104
|
+
# to write to instead of the repository's default `.git/config`
|
|
105
|
+
#
|
|
106
|
+
# @return [Git::CommandLineResult] the raw result of
|
|
107
|
+
# `git config <name> <value>`
|
|
108
|
+
#
|
|
109
|
+
# @raise [ArgumentError] if unsupported options are provided
|
|
110
|
+
#
|
|
111
|
+
# @raise [Git::FailedError] if git exits with a non-zero exit status
|
|
112
|
+
#
|
|
113
|
+
def config_set(execution_context, name, value, **)
|
|
114
|
+
SharedPrivate.assert_valid_opts!(CONFIG_SET_ALLOWED_OPTS, **)
|
|
115
|
+
Git::Commands::ConfigOptionSyntax::Set.new(execution_context).call(name, value, **)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Retrieve a config value by key name
|
|
119
|
+
#
|
|
120
|
+
# @param execution_context [Git::ExecutionContext] the execution context
|
|
121
|
+
#
|
|
122
|
+
# @param name [String] the dotted config key to look up (e.g. `"user.name"`)
|
|
123
|
+
#
|
|
124
|
+
# @return [String] the value of the config entry
|
|
125
|
+
#
|
|
126
|
+
# @raise [Git::FailedError] if git exits with a non-zero exit status
|
|
127
|
+
#
|
|
128
|
+
def config_get(execution_context, name)
|
|
129
|
+
result = Git::Commands::ConfigOptionSyntax::Get.new(execution_context).call(name)
|
|
130
|
+
raise Git::FailedError, result if result.status.exitstatus != 0
|
|
131
|
+
|
|
132
|
+
result.stdout
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
# Retrieve all config entries as a hash
|
|
136
|
+
#
|
|
137
|
+
# @param execution_context [Git::ExecutionContext] the execution context
|
|
138
|
+
#
|
|
139
|
+
# @return [Hash{String => String}] all config entries, keyed by their full
|
|
140
|
+
# dotted key names (e.g. `"user.name"`)
|
|
141
|
+
#
|
|
142
|
+
# @raise [Git::FailedError] if git exits with a non-zero exit status
|
|
143
|
+
#
|
|
144
|
+
def config_list(execution_context)
|
|
145
|
+
lines = Git::Commands::ConfigOptionSyntax::List.new(execution_context).call.stdout.split("\n")
|
|
146
|
+
lines.each_with_object({}) do |line, hsh|
|
|
147
|
+
key, value = line.split('=', 2)
|
|
148
|
+
hsh[key] = value || ''
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
private_constant :Private
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|