git 5.0.1 → 5.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '08c43ba7ae36ad5b41333b4c5a4d1890ff32c32ad07074145ee75d71cde61b8d'
4
- data.tar.gz: 1380d2019f14ec54339aec4d7fced236098072794747edd38de8559aee8a6b66
3
+ metadata.gz: 6dcf907e2c0ccb6d916a9aa1d43f6c768e49555465a484e0231d919cb889b889
4
+ data.tar.gz: 5cce608675a41031f79318065e8c11125f9f23a154ab2ae6f578192010b04367
5
5
  SHA512:
6
- metadata.gz: fe650cffb57c334881cda31e8f5a2e062c090bb1028c423647d5a429504c8d3ad96a6cb58812a3373ca0733f9c325e8dda3392bcd5ef4e53e561e80a17c5fa9d
7
- data.tar.gz: c66b6ccf6e4644c09550d035c0b90ad1eb7dfbf91fc7509f8461329e6a33ac55d7324653a1c7770101a20156b4297304f14098a4fb8f97d48e7b6409b751b6d7
6
+ metadata.gz: 42dbbce6613ecd406e64771bb03d85416a4eae0fe12183fee03640292f5f18700175788c35c55836ad2d572bde6857421ed6cae8f9d7520dcd8bd12b498ae809
7
+ data.tar.gz: d55dd4bd23e700aacd23d8b850adada2e0e3a8f90176515e5de3b5213e43282ac5e8e105d500243bc54a0655472368e00becf4b6c01e59e4baf842223f8f89a7
@@ -0,0 +1,14 @@
1
+ ---
2
+ description: Address all unresolved Copilot review threads on the active pull request
3
+ argument-hint: "[PR number — defaults to the PR for the current branch]"
4
+ ---
5
+
6
+ Follow the shared agent prompt in
7
+ `.github/prompts/iteratively-address-copilot-reviews.prompt.md` exactly. That file
8
+ is the canonical instructions for this task and is shared with other AI agents; read
9
+ it before doing anything else.
10
+
11
+ @.github/prompts/iteratively-address-copilot-reviews.prompt.md
12
+
13
+ If `$ARGUMENTS` is non-empty, treat it as the pull request number to operate on
14
+ instead of detecting the PR from the current branch.
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/claude-code-settings.json",
3
+ "hooks": {
4
+ "SessionStart": [
5
+ {
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "\"$CLAUDE_PROJECT_DIR/.github/hooks/run-bin-setup-once.sh\"",
10
+ "timeout": 900
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
data/.claude/skills ADDED
@@ -0,0 +1 @@
1
+ ../.github/skills
@@ -22,18 +22,6 @@ fine to use `#` in footer values such as `Closes: #999` or `Refs: #999`.
22
22
  - **RuboCop:** Use `RuboCop` for prose and `rubocop` for CLI or gem names. Never use
23
23
  `Rubocop`.
24
24
 
25
- ## Project Commands
26
-
27
- | Purpose | Command |
28
- | --- | --- |
29
- | First-time project or new worktree setup | `bin/setup` |
30
- | Run all tests and linters (CI-equivalent) | `bundle exec rake` |
31
- | Run all RSpec tests | `bundle exec rake spec` |
32
- | Run RSpec unit tests | `bundle exec rake spec:unit` |
33
- | Run RSpec integration tests | `bundle exec rake spec:integration` |
34
- | Run a specific RSpec spec | `bundle exec rspec <path>` |
35
- | Run linters | `bundle exec rake rubocop yard build` |
36
-
37
25
  ## Branch & PR Strategy
38
26
 
39
27
  | Target | When |
@@ -1,12 +1,18 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
 
4
+ # This hook is shared by every agent configured for this repo (GitHub Copilot via
5
+ # .github/hooks/, Claude Code via .claude/settings.json), so do not assume the
6
+ # caller's working directory.
7
+ command -v git >/dev/null 2>&1 || exit 0
8
+ cd "$(dirname "${BASH_SOURCE[0]}")/../.." || exit 0
9
+
4
10
  # Skip if this repo does not use bin/setup.
5
11
  [[ -x "./bin/setup" ]] || exit 0
6
12
 
7
- # Keep setup idempotent per-worktree.
8
- command -v git >/dev/null 2>&1 || exit 0
9
- marker="$(git rev-parse --git-path copilot-bin-setup.done 2>/dev/null)" || exit 0
13
+ # Keep setup idempotent per-worktree. The marker is shared across agents so that
14
+ # cloning and opening the repo in two different tools does not run setup twice.
15
+ marker="$(git rev-parse --git-path agent-bin-setup.done 2>/dev/null)" || exit 0
10
16
  [[ -f "$marker" ]] && exit 0
11
17
 
12
18
  ./bin/setup
@@ -16,4 +16,6 @@ Review our [guidelines for contributing](https://github.com/ruby-git/ruby-git/bl
16
16
  - [ ] I ran `bundle exec rake` locally on this branch and it passed (see
17
17
  [Local development setup](../CONTRIBUTING.md#local-development-setup)).
18
18
  - [ ] Tests added/updated as needed.
19
+ - [ ] `bundle exec rake spec:unit` reports 100% line and branch coverage (see
20
+ [Test coverage policy](../CONTRIBUTING.md#test-coverage-policy)).
19
21
  - [ ] Documentation updated where applicable (README and/or YARD).
@@ -908,7 +908,7 @@ For migration PRs, verify process constraints:
908
908
  - each slice is independently revertible
909
909
  - refactor-only changes are not mixed with unrelated behavior changes
910
910
  - quality gates pass for the slice — discover tasks via
911
- `bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default:parallel'].prerequisites"`
911
+ `bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default'].prerequisites"`
912
912
  and run each individually via `bundle exec rake <task>`, fixing failures before
913
913
  advancing
914
914
 
@@ -188,11 +188,11 @@ This skill supports three modes. Determine which mode applies before starting:
188
188
  requirements](REFERENCE.md#phased-rollout-requirements).
189
189
 
190
190
  5. **Run quality gates** — discover the prerequisite tasks for
191
- `default:parallel` and run them sequentially, fixing failures before
191
+ `default` and run them sequentially, fixing failures before
192
192
  advancing:
193
193
 
194
194
  ```bash
195
- bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default:parallel'].prerequisites"
195
+ bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default'].prerequisites"
196
196
  ```
197
197
 
198
198
  Run each listed task **individually** in order via `bundle exec rake <task>`
@@ -224,11 +224,11 @@ This skill supports three modes. Determine which mode applies before starting:
224
224
  - has tests that verify call-shape compatibility when classification is
225
225
  `legacy-contract` (positional hash and/or keyword-arg / `**opts` forms where required)
226
226
 
227
- 5. **Run quality gates** — discover the prerequisite tasks for `default:parallel`
227
+ 5. **Run quality gates** — discover the prerequisite tasks for `default`
228
228
  and run them sequentially, fixing failures before advancing:
229
229
 
230
230
  ```bash
231
- bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default:parallel'].prerequisites"
231
+ bundle exec ruby -e "require 'rake'; load 'Rakefile'; puts Rake::Task['default'].prerequisites"
232
232
  ```
233
233
 
234
234
  Run each listed task **individually** in order via `bundle exec rake <task>`
@@ -68,9 +68,13 @@ Adoption and enforcement notes:
68
68
  - Apply these rules as hard requirements for new and modified unit specs.
69
69
  - Legacy specs may violate some rules; treat those as incremental cleanup work.
70
70
  - Branch and line coverage are both reported by SimpleCov in this repository.
71
- - `coverage_threshold: 100` is configured, but `fail_on_low_coverage` is currently
72
- `false`; enforce Rule 21 during review by checking the coverage report until
73
- strict failure is enabled.
71
+ - `minimum_coverage: { line: 100, branch: 100 }` is configured and enforced: a full
72
+ `rake spec:unit` run fails when either threshold is missed, and CI fails the pull
73
+ request with it. Rule 21 is a build gate, not just a review check. See the
74
+ [Test coverage policy](../../../CONTRIBUTING.md#test-coverage-policy) in
75
+ `CONTRIBUTING.md` for the full policy.
76
+ - Focused runs (`SPEC=<glob> rake spec:unit`, or `rspec <file>`) report coverage but
77
+ do not fail on it, since they load all of `lib/` while exercising only a slice.
74
78
 
75
79
  ## Related skills
76
80
 
@@ -484,10 +488,50 @@ Every conditional path through the public interface must be exercised by at leas
484
488
  one example. If a branch cannot be reached through the public interface, that is a
485
489
  design smell.
486
490
 
491
+ This is enforced by the build: a full `rake spec:unit` run fails below 100% line or
492
+ branch coverage, and the failure output names each uncovered line and branch.
493
+
494
+ When a branch is hard to cover, apply these in order:
495
+
496
+ 1. **Reach it through the public interface** — if it is reachable, test it.
497
+ 2. **Delete it** — a branch unreachable through the public interface is usually dead
498
+ code. Removing it is preferable to excluding it.
499
+ 3. **Exclude it with `# simplecov:disable`** — the last resort, per the exception below.
500
+
487
501
  > **Exception:** Defensive guards that require breaking OS-level invariants to reach
488
502
  > (e.g., `raise "unreachable"` that would require triggering out-of-memory) may be
489
- > excluded. Mark them explicitly with `# :nocov:` and a brief comment explaining why
490
- > — never leave branches silently uncovered.
503
+ > excluded. Mark them explicitly with a `# simplecov:disable` directive carrying a
504
+ > reason — never leave branches silently uncovered. Cover the smallest possible span,
505
+ > and expect a reviewer to challenge it. `lib/` currently contains no coverage
506
+ > directives.
507
+
508
+ Prefer the inline form for a single line. It applies only to its own line and needs no
509
+ matching `enable`, so a region can never be left open by accident:
510
+
511
+ ```ruby
512
+ raise 'unreachable' # simplecov:disable defensive guard; only reachable on OOM
513
+ ```
514
+
515
+ Use the block form only for a genuine span, and close it explicitly:
516
+
517
+ ```ruby
518
+ # simplecov:disable branch platform-specific fallback; not reachable on MRI
519
+ ...
520
+ # simplecov:enable branch
521
+ ```
522
+
523
+ Always name the narrowest criterion that solves the problem — `line`, `branch`,
524
+ `method`, or a comma-separated combination — and write the reason after it, so the
525
+ required justification lives in the directive.
526
+
527
+ > **Review check:** verify the criterion is spelled exactly. A word SimpleCov does not
528
+ > recognize is parsed as free-form reason text, which silently widens the directive to
529
+ > all three criteria rather than failing.
530
+
531
+ > **Coverage is a floor on evidence, not a proof of correctness.** Never write an
532
+ > example whose only purpose is to execute a line. Such a test turns the report green
533
+ > while violating [Rule 24](#rule-24-must-assert-observable-behavior-not-implementation-details),
534
+ > and must be rejected in review.
491
535
 
492
536
  ### Rule 22 (MUST): Error assertions must specify both the error class and a message pattern
493
537
 
@@ -614,7 +658,9 @@ After writing or modifying tests, verify compliance before finishing:
614
658
 
615
659
  1. **Run the specs:** `bundle exec rspec spec/unit/path/to_spec.rb`
616
660
  2. **Check branch coverage** meets 100% (Rule 21) — open `coverage/index.html` and
617
- confirm no uncovered branches in the class under test.
661
+ confirm no uncovered lines or branches in the class under test. A focused run
662
+ reports coverage but does not fail on it; `bundle exec rake spec:unit` is the
663
+ authority and will fail below 100%, naming each uncovered line and branch.
618
664
  3. **Re-check MUST rules.** Scan the spec against every MUST rule. Fix violations.
619
665
  4. **Run in random order** (Rule 27): `bundle exec rspec spec/unit/path/to_spec.rb --order rand`
620
666
 
@@ -53,5 +53,17 @@ jobs:
53
53
  run: bundle exec rake default
54
54
  timeout-minutes: 15
55
55
 
56
+ # The unit suite enforces 100% line and branch coverage (see the "Test coverage
57
+ # policy" section of CONTRIBUTING.md). The failure log names the uncovered lines
58
+ # and branches; this artifact adds the browsable HTML report for the same run.
59
+ - name: Upload Coverage Report
60
+ if: failure()
61
+ uses: actions/upload-artifact@v7
62
+ with:
63
+ name: coverage-ruby-${{ matrix.ruby }}-${{ matrix.operating-system }}
64
+ path: coverage/
65
+ if-no-files-found: ignore
66
+ retention-days: 7
67
+
56
68
  - name: Test Gem
57
69
  run: bundle exec rake test:gem
data/.gitignore CHANGED
@@ -21,4 +21,10 @@ rubocop-report.json
21
21
  # generated git reference docs
22
22
  git-reference/
23
23
 
24
+ # git versions built by bin/build-git-versions
25
+ git-versions/
26
+
24
27
  tmp
28
+
29
+ # per-developer Claude Code overrides (shared config is in .claude/settings.json)
30
+ .claude/settings.local.json
@@ -1,3 +1,3 @@
1
1
  {
2
- ".": "5.0.1"
2
+ ".": "5.0.3"
3
3
  }
data/.rspec CHANGED
@@ -1,3 +1,2 @@
1
1
  --require spec_helper
2
- --format Fuubar
3
2
  --color
data/CHANGELOG.md CHANGED
@@ -5,6 +5,65 @@
5
5
 
6
6
  # Change Log
7
7
 
8
+ ## [5.0.3](https://github.com/ruby-git/ruby-git/compare/v5.0.2...v5.0.3) (2026-08-07)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * Drop unsupported -- separator from remote remove/rename commands ([8ec466f](https://github.com/ruby-git/ruby-git/commit/8ec466f8b282a5e94abd7d499bc26a92d94b2fc3))
14
+ * Remove unreachable case branch in Patch#apply_file_mode ([896fc49](https://github.com/ruby-git/ruby-git/commit/896fc49e3c2c03c401fe1b213c3f75bb40730521))
15
+ * Remove unreachable nil check in Git::Parsers::Grep.parse ([74e919a](https://github.com/ruby-git/ruby-git/commit/74e919a401126ad4415615f92cc9597e966239c6))
16
+
17
+
18
+ ### Other Changes
19
+
20
+ * Add Claude Code support alongside GitHub Copilot ([37f7d6a](https://github.com/ruby-git/ruby-git/commit/37f7d6a14c6d53bcf5b9644b8023d323290a5977))
21
+ * Add unit spec for Git::EncodingUtils ([5f0f10e](https://github.com/ruby-git/ruby-git/commit/5f0f10e4db78324bbe453de49598564a25f3428a))
22
+ * Consolidate parallel and serial spec rake tasks ([49616b1](https://github.com/ruby-git/ruby-git/commit/49616b12f52c6941a8617afbf7c56e7d7d5fe0f6))
23
+ * Cover :index option in Git::Factories#worktree_open_options_after_init ([efeba22](https://github.com/ruby-git/ruby-git/commit/efeba2294bb05327489a6523c46f26dc7392a84e))
24
+ * Cover #path when both src and dst are nil ([3a1a05a](https://github.com/ruby-git/ruby-git/commit/3a1a05a9be13057a1fc304df5008866634179124))
25
+ * Cover edge-case branches in Git::Parsers::Diff ([38d8b3f](https://github.com/ruby-git/ruby-git/commit/38d8b3f88f4f76a65776e9f6b8b87c6bb839e710))
26
+ * Cover Errno::ESRCH timeout-race rescue in run_process_executer ([899bf36](https://github.com/ruby-git/ruby-git/commit/899bf36399489038524cecf1d7ac2c606df03bde))
27
+ * Cover Git::Branch#merge ([71c0ea3](https://github.com/ruby-git/ruby-git/commit/71c0ea39d4c786a38245a8fb95fd93235ee03903))
28
+ * Cover Git::Branch#stashes ([27ba130](https://github.com/ruby-git/ruby-git/commit/27ba130a6cd3ef78171d1bb20230459c3f678a3a))
29
+ * Cover Git::Diff#name_status ([fa2ee98](https://github.com/ruby-git/ruby-git/commit/fa2ee98fd4613177843d285f7bc4a2ffb44ca79c))
30
+ * Cover Git::Factories#parse_clone_stderr unparseable-output branch ([65aa9b9](https://github.com/ruby-git/ruby-git/commit/65aa9b9318c7f8a8986c2aaae7dd0af0aeec4d69))
31
+ * Cover Git::Parsers::CatFile.each_header without trailing separator ([b7a9ed9](https://github.com/ruby-git/ruby-git/commit/b7a9ed93e03dcbd22a4fb25e9bb7b9c49647262d))
32
+ * Cover Git::Parsers::LsTree.parse with no tab-separated filename ([98b9ebf](https://github.com/ruby-git/ruby-git/commit/98b9ebf03c49f51c76b2e56dd670a9f68f220da8))
33
+ * Cover Git::Parsers::Remote.apply_pair unrecognized-variable branch ([03b10f6](https://github.com/ruby-git/ruby-git/commit/03b10f618a2f012b578ab995120cedbcd96ed8d1))
34
+ * Cover Git::Stashes#save ([7bca04c](https://github.com/ruby-git/ruby-git/commit/7bca04c53e64c747627784773d0c03ad0b9ff2e3))
35
+ * Cover Git.const_missing fallback branch for unrelated constants ([05c3c43](https://github.com/ruby-git/ruby-git/commit/05c3c4350e18bf1403fa314902708cfc40848c70))
36
+ * Cover Git.export ([4bd7f58](https://github.com/ruby-git/ruby-git/commit/4bd7f58432a19385ff55aecca9e89e2d9a96fa4a))
37
+ * Cover normalize_fetch_keys with a String option key ([47fb7fe](https://github.com/ruby-git/ruby-git/commit/47fb7fe061df9177a26ec7ada90b35b902ffc1df))
38
+ * Disable coverage for spec:integration, add SPEC filtering, fix formatters ([cb53d03](https://github.com/ruby-git/ruby-git/commit/cb53d03f8b671873f24368aadcafec638de32345))
39
+ * Document the project test coverage policy ([d378c1e](https://github.com/ruby-git/ruby-git/commit/d378c1e8b75e0c4209e17cc040ed36eb93053797))
40
+ * Enforce 100% unit test coverage on pull requests ([a446098](https://github.com/ruby-git/ruby-git/commit/a446098af548039b2c8b68bbb6562a53cb79fe40))
41
+ * Guard checkout-index nonexistent-path spec for git &lt; 2.30.0 ([cf212a9](https://github.com/ruby-git/ruby-git/commit/cf212a98b41218a7940ce54aa9b7c56a630412c3))
42
+ * Guard worktree repair spec for git &lt; 2.29.0 ([c527fb1](https://github.com/ruby-git/ruby-git/commit/c527fb15c2f21f9be5913192d43c847cf49681eb))
43
+ * **merge:** Fix incorrect version-gated failure expectation in quit_spec ([24c5ba4](https://github.com/ruby-git/ruby-git/commit/24c5ba4ce77b02413485d226a94b283f6af9d110))
44
+ * Read the gem version without loading lib/git/version.rb ([45c4b14](https://github.com/ruby-git/ruby-git/commit/45c4b14e944fcb43bda800823e377cf954ce2d3b))
45
+ * Require git 2.39.0 for maintenance register/unregister --config-file specs ([5b1fd52](https://github.com/ruby-git/ruby-git/commit/5b1fd527c39e4b3f1796851795a44694d94f4402))
46
+ * Skip get-urlmatch scope spec on git &lt; 2.42.0 ([e1ede7a](https://github.com/ruby-git/ruby-git/commit/e1ede7adddea28b654a183c618fc2336b5ffb83b))
47
+ * Upgrade simplecov and simplecov-rspec to ~&gt; 1.0 ([65e92b9](https://github.com/ruby-git/ruby-git/commit/65e92b9a9a621435efbf2a0855d48c47bb62425d))
48
+
49
+ ## [5.0.2](https://github.com/ruby-git/ruby-git/compare/v5.0.1...v5.0.2) (2026-08-02)
50
+
51
+
52
+ ### Bug Fixes
53
+
54
+ * Add bin/build-git-versions and bin/test-git-versions scripts ([3314503](https://github.com/ruby-git/ruby-git/commit/3314503708efcec2f386ca97bb6d96309a6c5c1a))
55
+
56
+
57
+ ### Other Changes
58
+
59
+ * Align CONTRIBUTING.md with current architecture and testing conventions ([60ac8e9](https://github.com/ruby-git/ruby-git/commit/60ac8e940776a3fb4efe46a98574ca5bbfcd718e))
60
+ * Allow disabling SimpleCov via COVERAGE=false env var ([3788418](https://github.com/ruby-git/ruby-git/commit/37884189eb646013628f78b6671e9876f0ebb925))
61
+ * Allow disabling SimpleCov via COVERAGE=false env var ([3788418](https://github.com/ruby-git/ruby-git/commit/37884189eb646013628f78b6671e9876f0ebb925))
62
+ * Avoid git-version-dependent all-zero SHA in stash store integration spec ([82a15e5](https://github.com/ruby-git/ruby-git/commit/82a15e57ebca03df3c3802f153c3545bc46920f4))
63
+ * Make 5.0.0 release more prominent in README ([2c8c42d](https://github.com/ruby-git/ruby-git/commit/2c8c42d30a7d7d35e03f1c4f8489fa49c866cded))
64
+ * Move Git::Repository::Factories and PathResolver to Git namespace ([dd0ae7b](https://github.com/ruby-git/ruby-git/commit/dd0ae7b34b912187f150d56b38f6eeb14b8882bf))
65
+ * Update README badges ([079a121](https://github.com/ruby-git/ruby-git/commit/079a1211216666f190583b2bfd3124ebb823ae58))
66
+
8
67
  ## [5.0.1](https://github.com/ruby-git/ruby-git/compare/v5.0.0...v5.0.1) (2026-07-30)
9
68
 
10
69
 
data/CLAUDE.md ADDED
@@ -0,0 +1,11 @@
1
+ # CLAUDE.md
2
+
3
+ This file exists so Claude Code picks up the same project instructions as every
4
+ other AI coding agent used in this repository.
5
+
6
+ **Do not add project guidance here.** The canonical instructions live in
7
+ [`.github/copilot-instructions.md`](.github/copilot-instructions.md) and are
8
+ imported below. Edit that file so all agents stay in sync. Reserve this file for
9
+ guidance that applies *only* to Claude Code.
10
+
11
+ @.github/copilot-instructions.md