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.
- checksums.yaml +4 -4
- data/.yardopts +5 -1
- data/AI_POLICY.md +24 -0
- data/CHANGELOG.md +689 -0
- data/CODE_OF_CONDUCT.md +25 -0
- data/CONTRIBUTING.md +1175 -97
- data/GOVERNANCE.md +106 -0
- data/LICENSE +1 -1
- data/MAINTAINERS.md +17 -4
- data/README.md +476 -320
- data/UPGRADING.md +1138 -0
- data/git.gemspec +124 -36
- data/lib/git/author.rb +39 -7
- data/lib/git/author_info.rb +66 -0
- data/lib/git/branch.rb +615 -65
- data/lib/git/branch_delete_failure.rb +34 -0
- data/lib/git/branch_delete_result.rb +66 -0
- data/lib/git/branch_info.rb +237 -0
- data/lib/git/branches.rb +167 -44
- data/lib/git/command_line/base.rb +247 -0
- data/lib/git/command_line/capturing.rb +308 -0
- data/lib/git/command_line/result.rb +88 -0
- data/lib/git/command_line/streaming.rb +236 -0
- data/lib/git/command_line.rb +52 -0
- data/lib/git/commands/add.rb +139 -0
- data/lib/git/commands/am/abort.rb +43 -0
- data/lib/git/commands/am/apply.rb +263 -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 +49 -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 +242 -0
- data/lib/git/commands/archive/list_formats.rb +46 -0
- data/lib/git/commands/archive.rb +145 -0
- data/lib/git/commands/arguments.rb +4521 -0
- data/lib/git/commands/base.rb +502 -0
- data/lib/git/commands/branch/copy.rb +102 -0
- data/lib/git/commands/branch/create.rb +177 -0
- data/lib/git/commands/branch/delete.rb +88 -0
- data/lib/git/commands/branch/list.rb +178 -0
- data/lib/git/commands/branch/move.rb +102 -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 +53 -0
- data/lib/git/commands/branch.rb +34 -0
- data/lib/git/commands/cat_file/batch.rb +385 -0
- data/lib/git/commands/cat_file/filtered.rb +105 -0
- data/lib/git/commands/cat_file/raw.rb +271 -0
- data/lib/git/commands/cat_file.rb +49 -0
- data/lib/git/commands/checkout/branch.rb +153 -0
- data/lib/git/commands/checkout/files.rb +116 -0
- data/lib/git/commands/checkout.rb +38 -0
- data/lib/git/commands/checkout_index.rb +106 -0
- data/lib/git/commands/clean.rb +102 -0
- data/lib/git/commands/clone.rb +241 -0
- data/lib/git/commands/commit.rb +273 -0
- data/lib/git/commands/commit_tree.rb +101 -0
- data/lib/git/commands/config_option_syntax/add.rb +86 -0
- data/lib/git/commands/config_option_syntax/get.rb +121 -0
- data/lib/git/commands/config_option_syntax/get_all.rb +118 -0
- data/lib/git/commands/config_option_syntax/get_color.rb +95 -0
- data/lib/git/commands/config_option_syntax/get_color_bool.rb +96 -0
- data/lib/git/commands/config_option_syntax/get_regexp.rb +119 -0
- data/lib/git/commands/config_option_syntax/get_urlmatch.rb +111 -0
- data/lib/git/commands/config_option_syntax/list.rb +111 -0
- data/lib/git/commands/config_option_syntax/remove_section.rb +79 -0
- data/lib/git/commands/config_option_syntax/rename_section.rb +83 -0
- data/lib/git/commands/config_option_syntax/replace_all.rb +109 -0
- data/lib/git/commands/config_option_syntax/set.rb +119 -0
- data/lib/git/commands/config_option_syntax/unset.rb +92 -0
- data/lib/git/commands/config_option_syntax/unset_all.rb +94 -0
- data/lib/git/commands/config_option_syntax.rb +56 -0
- data/lib/git/commands/describe.rb +156 -0
- data/lib/git/commands/diff.rb +657 -0
- data/lib/git/commands/diff_files.rb +519 -0
- data/lib/git/commands/diff_index.rb +499 -0
- data/lib/git/commands/fetch.rb +354 -0
- data/lib/git/commands/fsck.rb +138 -0
- data/lib/git/commands/gc.rb +134 -0
- data/lib/git/commands/grep.rb +339 -0
- data/lib/git/commands/init.rb +101 -0
- data/lib/git/commands/log.rb +634 -0
- data/lib/git/commands/ls_files.rb +195 -0
- data/lib/git/commands/ls_remote.rb +161 -0
- data/lib/git/commands/ls_tree.rb +135 -0
- data/lib/git/commands/maintenance/register.rb +77 -0
- data/lib/git/commands/maintenance/run.rb +109 -0
- data/lib/git/commands/maintenance/start.rb +71 -0
- data/lib/git/commands/maintenance/stop.rb +60 -0
- data/lib/git/commands/maintenance/unregister.rb +84 -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 +250 -0
- data/lib/git/commands/merge.rb +28 -0
- data/lib/git/commands/merge_base.rb +91 -0
- data/lib/git/commands/mv.rb +82 -0
- data/lib/git/commands/name_rev.rb +119 -0
- data/lib/git/commands/pull.rb +382 -0
- data/lib/git/commands/push.rb +251 -0
- data/lib/git/commands/read_tree.rb +154 -0
- data/lib/git/commands/remote/add.rb +96 -0
- data/lib/git/commands/remote/get_url.rb +68 -0
- data/lib/git/commands/remote/list.rb +56 -0
- data/lib/git/commands/remote/prune.rb +63 -0
- data/lib/git/commands/remote/remove.rb +52 -0
- data/lib/git/commands/remote/rename.rb +76 -0
- data/lib/git/commands/remote/set_branches.rb +70 -0
- data/lib/git/commands/remote/set_head.rb +89 -0
- data/lib/git/commands/remote/set_url.rb +78 -0
- data/lib/git/commands/remote/set_url_add.rb +70 -0
- data/lib/git/commands/remote/set_url_delete.rb +71 -0
- data/lib/git/commands/remote/show.rb +77 -0
- data/lib/git/commands/remote/update.rb +79 -0
- data/lib/git/commands/remote.rb +42 -0
- data/lib/git/commands/repack.rb +281 -0
- data/lib/git/commands/reset.rb +154 -0
- data/lib/git/commands/rev_parse.rb +304 -0
- data/lib/git/commands/revert/abort.rb +45 -0
- data/lib/git/commands/revert/continue.rb +62 -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 +158 -0
- data/lib/git/commands/revert.rb +29 -0
- data/lib/git/commands/rm.rb +113 -0
- data/lib/git/commands/show.rb +632 -0
- data/lib/git/commands/show_ref/exclude_existing.rb +119 -0
- data/lib/git/commands/show_ref/exists.rb +80 -0
- data/lib/git/commands/show_ref/list.rb +149 -0
- data/lib/git/commands/show_ref/verify.rb +122 -0
- data/lib/git/commands/show_ref.rb +42 -0
- data/lib/git/commands/stash/apply.rb +81 -0
- data/lib/git/commands/stash/branch.rb +67 -0
- data/lib/git/commands/stash/clear.rb +43 -0
- data/lib/git/commands/stash/create.rb +60 -0
- data/lib/git/commands/stash/drop.rb +73 -0
- data/lib/git/commands/stash/list.rb +43 -0
- data/lib/git/commands/stash/pop.rb +87 -0
- data/lib/git/commands/stash/push.rb +112 -0
- data/lib/git/commands/stash/show.rb +158 -0
- data/lib/git/commands/stash/store.rb +72 -0
- data/lib/git/commands/stash.rb +38 -0
- data/lib/git/commands/status.rb +174 -0
- data/lib/git/commands/symbolic_ref/delete.rb +72 -0
- data/lib/git/commands/symbolic_ref/read.rb +99 -0
- data/lib/git/commands/symbolic_ref/update.rb +79 -0
- data/lib/git/commands/symbolic_ref.rb +38 -0
- data/lib/git/commands/tag/create.rb +142 -0
- data/lib/git/commands/tag/delete.rb +57 -0
- data/lib/git/commands/tag/list.rb +146 -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 +145 -0
- data/lib/git/commands/update_ref/delete.rb +90 -0
- data/lib/git/commands/update_ref/update.rb +103 -0
- data/lib/git/commands/update_ref.rb +42 -0
- data/lib/git/commands/version.rb +60 -0
- data/lib/git/commands/worktree/add.rb +139 -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 +88 -0
- data/lib/git/config.rb +72 -5
- data/lib/git/config_entry_info.rb +106 -0
- data/lib/git/configuring.rb +795 -0
- data/lib/git/detached_head_info.rb +57 -0
- data/lib/git/diff.rb +437 -86
- data/lib/git/diff_file_numstat_info.rb +31 -0
- data/lib/git/diff_file_patch_info.rb +136 -0
- data/lib/git/diff_file_raw_info.rb +129 -0
- data/lib/git/diff_info.rb +162 -0
- data/lib/git/diff_path_status.rb +107 -0
- data/lib/git/diff_result.rb +34 -0
- data/lib/git/diff_stats.rb +111 -0
- data/lib/git/dirstat_info.rb +102 -0
- data/lib/git/encoding_utils.rb +32 -1
- data/lib/git/errors.rb +285 -0
- data/lib/git/escaped_path.rb +57 -5
- data/lib/git/execution_context/global.rb +31 -0
- data/lib/git/execution_context/repository.rb +151 -0
- data/lib/git/execution_context.rb +559 -0
- data/lib/git/factories.rb +813 -0
- data/lib/git/file_ref.rb +77 -0
- data/lib/git/fsck_object.rb +56 -0
- data/lib/git/fsck_result.rb +132 -0
- data/lib/git/log.rb +306 -90
- data/lib/git/object.rb +563 -141
- data/lib/git/parsers/branch.rb +240 -0
- data/lib/git/parsers/cat_file.rb +111 -0
- data/lib/git/parsers/config_entry.rb +110 -0
- data/lib/git/parsers/diff.rb +792 -0
- data/lib/git/parsers/fsck.rb +144 -0
- data/lib/git/parsers/grep.rb +42 -0
- data/lib/git/parsers/ls_remote.rb +79 -0
- data/lib/git/parsers/ls_tree.rb +58 -0
- data/lib/git/parsers/remote.rb +162 -0
- data/lib/git/parsers/stash.rb +292 -0
- data/lib/git/parsers/status.rb +251 -0
- data/lib/git/parsers/tag.rb +341 -0
- data/lib/git/parsers/worktree.rb +185 -0
- data/lib/git/path_resolver.rb +206 -0
- data/lib/git/remote.rb +165 -12
- data/lib/git/remote_info.rb +203 -0
- data/lib/git/repository/branching.rb +964 -0
- data/lib/git/repository/committing.rb +246 -0
- data/lib/git/repository/context_helpers.rb +293 -0
- data/lib/git/repository/diffing.rb +785 -0
- data/lib/git/repository/inspecting.rb +252 -0
- data/lib/git/repository/logging.rb +410 -0
- data/lib/git/repository/maintenance.rb +65 -0
- data/lib/git/repository/merging.rb +451 -0
- data/lib/git/repository/object_operations.rb +1551 -0
- data/lib/git/repository/remote_operations.rb +984 -0
- data/lib/git/repository/shared_private.rb +120 -0
- data/lib/git/repository/staging.rb +587 -0
- data/lib/git/repository/stashing.rb +623 -0
- data/lib/git/repository/status_operations.rb +249 -0
- data/lib/git/repository/worktree_operations.rb +339 -0
- data/lib/git/repository.rb +484 -2
- data/lib/git/stash.rb +109 -12
- data/lib/git/stash_info.rb +102 -0
- data/lib/git/stashes.rb +169 -26
- data/lib/git/status.rb +308 -122
- data/lib/git/status_file_info.rb +258 -0
- data/lib/git/status_info.rb +189 -0
- data/lib/git/tag_delete_failure.rb +34 -0
- data/lib/git/tag_delete_result.rb +66 -0
- data/lib/git/tag_info.rb +99 -0
- data/lib/git/url.rb +15 -8
- data/lib/git/version.rb +113 -2
- data/lib/git/version_constraint.rb +85 -0
- data/lib/git/worktree.rb +150 -8
- data/lib/git/worktree_info.rb +128 -0
- data/lib/git/worktrees.rb +118 -13
- data/lib/git.rb +632 -234
- metadata +369 -54
- data/.github/stale.yml +0 -25
- data/.github/workflows/continuous_integration.yml +0 -49
- data/.gitignore +0 -10
- data/Dockerfile.changelog-rs +0 -12
- data/Gemfile +0 -5
- data/ISSUE_TEMPLATE.md +0 -15
- data/PULL_REQUEST_TEMPLATE.md +0 -9
- data/RELEASING.md +0 -70
- data/Rakefile +0 -60
- data/lib/git/base/factory.rb +0 -99
- data/lib/git/base.rb +0 -711
- data/lib/git/command_line_result.rb +0 -86
- data/lib/git/failed_error.rb +0 -53
- data/lib/git/git_execute_error.rb +0 -7
- data/lib/git/index.rb +0 -5
- data/lib/git/lib.rb +0 -1328
- data/lib/git/path.rb +0 -31
- data/lib/git/signaled_error.rb +0 -50
- data/lib/git/working_directory.rb +0 -4
data/git.gemspec
CHANGED
|
@@ -1,52 +1,140 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Read the version out of lib/git/version.rb rather than requiring it.
|
|
4
|
+
#
|
|
5
|
+
# The Gemfile uses `gemspec`, so Bundler evaluates this file on every `bundle exec`.
|
|
6
|
+
# `require`ing lib/git/version.rb here would therefore load it before SimpleCov
|
|
7
|
+
# starts in spec_helper, leaving it invisible to the coverage report -- an
|
|
8
|
+
# unmeasured hole in the 100% coverage gate. See the "Test coverage policy" section
|
|
9
|
+
# of CONTRIBUTING.md.
|
|
10
|
+
#
|
|
11
|
+
# release-please rewrites the `VERSION = '...'` assignment in place (see
|
|
12
|
+
# `version-file` in .release-please-config.json), so matching on it stays correct
|
|
13
|
+
# across releases. If the match ever fails, the raise below stops the build
|
|
14
|
+
# immediately rather than letting a nil version reach the specification.
|
|
15
|
+
version = File.read(File.expand_path('lib/git/version.rb', __dir__))[/^\s*VERSION\s*=\s*['"]([^'"]+)['"]/, 1]
|
|
16
|
+
raise 'Could not determine Git::VERSION from lib/git/version.rb' if version.nil?
|
|
17
|
+
|
|
18
|
+
Gem::Specification.new do |spec|
|
|
19
|
+
spec.author = 'Scott Chacon and others'
|
|
20
|
+
spec.email = 'schacon@gmail.com'
|
|
21
|
+
spec.homepage = 'http://github.com/ruby-git/ruby-git'
|
|
22
|
+
spec.license = 'MIT'
|
|
23
|
+
spec.name = 'git'
|
|
24
|
+
spec.summary = 'An API to create, read, and manipulate Git repositories'
|
|
25
|
+
spec.description = <<~DESCRIPTION
|
|
12
26
|
The git gem provides an API that can be used to
|
|
13
27
|
create, read, and manipulate Git repositories by wrapping system calls to the git
|
|
14
28
|
command line. The API can be used for working with Git in complex interactions
|
|
15
29
|
including branching and merging, object inspection and manipulation, history, patch
|
|
16
30
|
generation and more.
|
|
17
31
|
DESCRIPTION
|
|
18
|
-
|
|
32
|
+
spec.version = version
|
|
19
33
|
|
|
34
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
|
35
|
+
spec.metadata['source_code_uri'] = spec.homepage
|
|
36
|
+
spec.metadata['changelog_uri'] = "https://rubydoc.info/gems/#{spec.name}/#{spec.version}/file/CHANGELOG.md"
|
|
37
|
+
spec.metadata['documentation_uri'] = "https://rubydoc.info/gems/#{spec.name}/#{spec.version}"
|
|
38
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
|
20
39
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
s.metadata['documentation_uri'] = "https://rubydoc.info/gems/#{s.name}/#{s.version}"
|
|
40
|
+
spec.require_paths = ['lib']
|
|
41
|
+
spec.required_ruby_version = '>= 3.2.0'
|
|
42
|
+
spec.requirements = ['git 2.28.0 or greater']
|
|
25
43
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
44
|
+
spec.add_dependency 'activesupport', '>= 5.0'
|
|
45
|
+
spec.add_dependency 'addressable', '~> 2.8'
|
|
46
|
+
spec.add_dependency 'process_executer', '~> 4.1'
|
|
47
|
+
spec.add_dependency 'rchardet', '~> 1.9'
|
|
30
48
|
|
|
31
|
-
|
|
32
|
-
|
|
49
|
+
# Not every development dependency is installed on every runtime. Each predicate
|
|
50
|
+
# below names one reason for holding a gem back, which keeps the dependency list
|
|
51
|
+
# itself a flat, readable list. Deriving one predicate from another also keeps
|
|
52
|
+
# coupled gems from drifting apart when a condition changes.
|
|
53
|
+
#
|
|
54
|
+
# These are local variables rather than methods deliberately. The Gemfile uses
|
|
55
|
+
# `gemspec`, so Bundler evaluates this file on every `bundle exec`, and a top-level
|
|
56
|
+
# `def` -- including one written inside this block, since a block is not a definition
|
|
57
|
+
# scope -- would define a private method on Object in every one of those processes.
|
|
33
58
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
s.add_development_dependency 'mocha', '~> 2.1'
|
|
38
|
-
s.add_development_dependency 'rake', '~> 13.0'
|
|
39
|
-
s.add_development_dependency 'test-unit', '~> 3.3'
|
|
59
|
+
# JRuby (which reports RUBY_PLATFORM as 'java') and TruffleRuby build no C extensions
|
|
60
|
+
# and do not run the docs build.
|
|
61
|
+
mri = !(RUBY_PLATFORM == 'java' || RUBY_ENGINE == 'truffleruby')
|
|
40
62
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
63
|
+
# irb stopped being a default gem in Ruby 3.4. JRuby and TruffleRuby ship their own.
|
|
64
|
+
install_irb = mri
|
|
65
|
+
|
|
66
|
+
# Ruby 4.0.0 dropped fiddle from the default gems. On Windows, irb loads
|
|
67
|
+
# reline/io/windows.rb, which requires fiddle/import for the Win32 console API, so
|
|
68
|
+
# bin/console cannot start without it; every other platform takes reline's ANSI IO
|
|
69
|
+
# gate and never loads that file. Derived from install_irb because fiddle exists only
|
|
70
|
+
# to serve irb and, being a C extension, could not install where irb is not.
|
|
71
|
+
install_fiddle = install_irb && Gem.win_platform?
|
|
72
|
+
|
|
73
|
+
# The docs toolchain is supported on MRI only. redcarpet, YARD's Markdown renderer,
|
|
74
|
+
# is also a C extension and so could not install on JRuby regardless.
|
|
75
|
+
install_docs = mri
|
|
76
|
+
|
|
77
|
+
# yard-lint requires Ruby >= 3.3.
|
|
78
|
+
install_yard_lint = install_docs && Gem.ruby_version >= Gem::Version.new('3.3.0')
|
|
79
|
+
|
|
80
|
+
# i18n 1.15+ uses Fiber.[] (Ruby 3.2 Fiber storage), which TruffleRuby < 34.0.0 does
|
|
81
|
+
# not implement, so those runtimes hold at the last release that works there.
|
|
82
|
+
pin_old_i18n = RUBY_ENGINE == 'truffleruby' &&
|
|
83
|
+
Gem::Version.new(RUBY_ENGINE_VERSION) < Gem::Version.new('34.0.0')
|
|
84
|
+
|
|
85
|
+
spec.add_development_dependency 'create_github_release', '~> 2.1'
|
|
86
|
+
spec.add_development_dependency 'fiddle', '~> 1.1' if install_fiddle
|
|
87
|
+
spec.add_development_dependency 'fuubar', '~> 2.5'
|
|
88
|
+
spec.add_development_dependency 'i18n', '< 1.15' if pin_old_i18n
|
|
89
|
+
spec.add_development_dependency 'irb', '~> 1.16' if install_irb
|
|
90
|
+
spec.add_development_dependency 'main_branch_shared_rubocop_config', '~> 0.1'
|
|
91
|
+
spec.add_development_dependency 'parallel_tests', '~> 5.6'
|
|
92
|
+
spec.add_development_dependency 'rake', '~> 13.3'
|
|
93
|
+
spec.add_development_dependency 'redcarpet', '~> 3.6' if install_docs
|
|
94
|
+
spec.add_development_dependency 'rspec', '~> 3.13'
|
|
95
|
+
spec.add_development_dependency 'rubocop', '~> 1.82'
|
|
96
|
+
spec.add_development_dependency 'simplecov', '~> 1.0'
|
|
97
|
+
spec.add_development_dependency 'simplecov-lcov', '~> 0.9'
|
|
98
|
+
spec.add_development_dependency 'simplecov-rspec', '~> 1.1'
|
|
99
|
+
spec.add_development_dependency 'yard', '~> 0.9', '>= 0.9.28' if install_docs
|
|
100
|
+
spec.add_development_dependency 'yard_example_test', '~> 0.2', '>= 0.2.1' if install_docs
|
|
101
|
+
spec.add_development_dependency 'yard-lint', '~> 1.8' if install_yard_lint
|
|
46
102
|
|
|
47
103
|
# Specify which files should be added to the gem when it is released.
|
|
48
|
-
#
|
|
49
|
-
|
|
50
|
-
|
|
104
|
+
#
|
|
105
|
+
# This is an allowlist rather than a denylist. A denylist admitted every new
|
|
106
|
+
# development-only path by default, so the gem shipped `.github/`, `tasks/`, the
|
|
107
|
+
# husky hooks, and -- the reason this became an allowlist -- the `.claude/skills`
|
|
108
|
+
# symlink. Extracting a symlink needs a privilege that Windows grants only under
|
|
109
|
+
# Developer Mode or an elevated shell, so installing the gem there either failed
|
|
110
|
+
# outright or, on RubyGems new enough to fall back to a copy, silently duplicated
|
|
111
|
+
# the whole skills tree into the installed gem.
|
|
112
|
+
#
|
|
113
|
+
# spec/unit/gemspec_spec.rb guards both directions: nothing in the list may be a
|
|
114
|
+
# symlink, and every tracked file under lib/ must be present, so the allowlist
|
|
115
|
+
# cannot quietly drop runtime code.
|
|
116
|
+
#
|
|
117
|
+
# doc_files must stay in sync with the extra files named in .yardopts -- those are
|
|
118
|
+
# what rubydoc.info renders for the published documentation, so a file listed there
|
|
119
|
+
# but absent from the gem becomes a broken link.
|
|
120
|
+
doc_files = %w[
|
|
121
|
+
AI_POLICY.md
|
|
122
|
+
CHANGELOG.md
|
|
123
|
+
CODE_OF_CONDUCT.md
|
|
124
|
+
CONTRIBUTING.md
|
|
125
|
+
GOVERNANCE.md
|
|
126
|
+
LICENSE
|
|
127
|
+
MAINTAINERS.md
|
|
128
|
+
README.md
|
|
129
|
+
UPGRADING.md
|
|
130
|
+
]
|
|
131
|
+
|
|
132
|
+
# .yardopts drives the rubydoc.info build; the gemspec is included by convention.
|
|
133
|
+
build_files = %w[.yardopts git.gemspec]
|
|
134
|
+
|
|
135
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
136
|
+
`git ls-files -z`.split("\x0").select do |f|
|
|
137
|
+
f.start_with?('lib/') || doc_files.include?(f) || build_files.include?(f)
|
|
138
|
+
end
|
|
51
139
|
end
|
|
52
140
|
end
|
data/lib/git/author.rb
CHANGED
|
@@ -1,14 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Git
|
|
4
|
+
# An author in a Git commit
|
|
5
|
+
#
|
|
6
|
+
# @deprecated Use {Git::AuthorInfo} instead; this mutable class will be
|
|
7
|
+
# removed in v6.0.0
|
|
8
|
+
#
|
|
9
|
+
# @api public
|
|
10
|
+
#
|
|
2
11
|
class Author
|
|
3
|
-
|
|
4
|
-
|
|
12
|
+
# @return [String, nil] the author's name
|
|
13
|
+
attr_accessor :name
|
|
14
|
+
|
|
15
|
+
# @return [String, nil] the author's email
|
|
16
|
+
attr_accessor :email
|
|
17
|
+
|
|
18
|
+
# @return [Time, nil] the date the change was authored (author date, not committer date)
|
|
19
|
+
attr_accessor :date
|
|
20
|
+
|
|
21
|
+
# Initializes a new Author object from a string
|
|
22
|
+
#
|
|
23
|
+
# @example
|
|
24
|
+
# Git::Author.new("John Doe <john.doe@example.com> 1627849923 +0200")
|
|
25
|
+
#
|
|
26
|
+
# @param author_string [String] the author string
|
|
27
|
+
#
|
|
28
|
+
# @return [void]
|
|
29
|
+
#
|
|
30
|
+
# @deprecated Use {Git::AuthorInfo.parse} instead
|
|
31
|
+
#
|
|
5
32
|
def initialize(author_string)
|
|
6
|
-
if
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
33
|
+
if defined?(Git::Deprecation)
|
|
34
|
+
Git::Deprecation.warn(
|
|
35
|
+
'Git::Author is deprecated and will be removed in v6.0.0. Use Git::AuthorInfo instead.'
|
|
36
|
+
)
|
|
10
37
|
end
|
|
38
|
+
|
|
39
|
+
return unless (m = /(.*?) <(.*?)> (\d+) (.*)/.match(author_string))
|
|
40
|
+
|
|
41
|
+
@name = m[1]
|
|
42
|
+
@email = m[2]
|
|
43
|
+
@date = Time.at(m[3].to_i)
|
|
11
44
|
end
|
|
12
|
-
|
|
13
45
|
end
|
|
14
46
|
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Git
|
|
4
|
+
# Immutable value object representing an author or committer identity
|
|
5
|
+
#
|
|
6
|
+
# This is a lightweight, immutable data structure holding the identity data
|
|
7
|
+
# git records for commit authors, committers, and taggers. It replaces the
|
|
8
|
+
# mutable {Git::Author}, which is deprecated.
|
|
9
|
+
#
|
|
10
|
+
# @example Construct from individual values
|
|
11
|
+
# info = Git::AuthorInfo.new(
|
|
12
|
+
# name: 'John Doe',
|
|
13
|
+
# email: 'john.doe@example.com',
|
|
14
|
+
# date: Time.at(1627849923)
|
|
15
|
+
# )
|
|
16
|
+
# info.name #=> 'John Doe'
|
|
17
|
+
#
|
|
18
|
+
# @example Parse from a raw git author string
|
|
19
|
+
# info = Git::AuthorInfo.parse('John Doe <john.doe@example.com> 1627849923 +0200')
|
|
20
|
+
# info.email #=> 'john.doe@example.com'
|
|
21
|
+
# info.date.to_i #=> 1627849923
|
|
22
|
+
#
|
|
23
|
+
# @see Git::Object::Commit#author
|
|
24
|
+
#
|
|
25
|
+
# @see Git::Object::Commit#committer
|
|
26
|
+
#
|
|
27
|
+
# @api public
|
|
28
|
+
#
|
|
29
|
+
# @!attribute [r] name
|
|
30
|
+
# @return [String, nil] the person's name, or `nil` if not available
|
|
31
|
+
#
|
|
32
|
+
# @!attribute [r] email
|
|
33
|
+
# @return [String, nil] the person's email address, or `nil` if not available
|
|
34
|
+
#
|
|
35
|
+
# @!attribute [r] date
|
|
36
|
+
# @return [Time, nil] the timestamp of the change, or `nil` if not available
|
|
37
|
+
#
|
|
38
|
+
AuthorInfo = Data.define(:name, :email, :date) do
|
|
39
|
+
# Parses a raw git identity string into a Git::AuthorInfo
|
|
40
|
+
#
|
|
41
|
+
# The expected format is `"Name <email> timestamp offset"` as emitted by
|
|
42
|
+
# `git cat-file` for the `author`, `committer`, and `tagger` headers. The
|
|
43
|
+
# timestamp is interpreted as seconds since the Unix epoch; the timezone
|
|
44
|
+
# offset is not preserved in the resulting `date`.
|
|
45
|
+
#
|
|
46
|
+
# @example Parse a well-formed identity string
|
|
47
|
+
# Git::AuthorInfo.parse('John Doe <john.doe@example.com> 1627849923 +0200')
|
|
48
|
+
# #=> #<data Git::AuthorInfo name="John Doe", email="john.doe@example.com", ...>
|
|
49
|
+
#
|
|
50
|
+
# @example A string that does not match the expected format
|
|
51
|
+
# Git::AuthorInfo.parse('garbage')
|
|
52
|
+
# #=> #<data Git::AuthorInfo name=nil, email=nil, date=nil>
|
|
53
|
+
#
|
|
54
|
+
# @param author_string [String] the raw identity string to parse
|
|
55
|
+
#
|
|
56
|
+
# @return [Git::AuthorInfo] the parsed identity; all attributes are `nil`
|
|
57
|
+
# when the string does not match the expected format
|
|
58
|
+
#
|
|
59
|
+
def self.parse(author_string)
|
|
60
|
+
match = /(.*?) <(.*?)> (\d+) (.*)/.match(author_string)
|
|
61
|
+
return new(name: nil, email: nil, date: nil) unless match
|
|
62
|
+
|
|
63
|
+
new(name: match[1], email: match[2], date: Time.at(match[3].to_i))
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|