git-worktrees 0.5.0__tar.gz → 0.5.1__tar.gz

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 (97) hide show
  1. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.github/workflows/publish.yml +23 -10
  2. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.github/workflows/testpypi.yml +5 -0
  3. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/CHANGELOG.md +10 -0
  4. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/PKG-INFO +1 -1
  5. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/DEVELOPMENT.md +13 -7
  6. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/pyproject.toml +1 -1
  7. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/uv.lock +1 -1
  8. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.claude/settings.json +0 -0
  9. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.github/workflows/tests.yml +0 -0
  10. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.gitignore +0 -0
  11. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.pre-commit-config.yaml +0 -0
  12. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.python-version +0 -0
  13. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.releasetools.yaml +0 -0
  14. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/AGENTS.md +0 -0
  15. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/LICENSE +0 -0
  16. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/README.md +0 -0
  17. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gw.fish +0 -0
  18. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwa.fish +0 -0
  19. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwbd.fish +0 -0
  20. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwbs.fish +0 -0
  21. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwh.fish +0 -0
  22. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwl.fish +0 -0
  23. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwm.fish +0 -0
  24. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwnb.fish +0 -0
  25. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwp.fish +0 -0
  26. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwr.fish +0 -0
  27. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwrot.fish +0 -0
  28. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gws.fish +0 -0
  29. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/worktrees.fish +0 -0
  30. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/conf.d/worktrees.fish +0 -0
  31. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/BENCHMARK.md +0 -0
  32. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/REFERENCE.md +0 -0
  33. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/commands/branch-delete.md +0 -0
  34. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/commands/branch-status.md +0 -0
  35. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwa.fish +0 -0
  36. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwl.fish +0 -0
  37. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwm.fish +0 -0
  38. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwr!.fish +0 -0
  39. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwr.fish +0 -0
  40. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/hatch_build.py +0 -0
  41. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/renovate.json +0 -0
  42. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/scripts/README.md +0 -0
  43. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/scripts/benchmark.py +0 -0
  44. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/scripts/verify-publish.bash +0 -0
  45. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/__init__.py +0 -0
  46. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/branch_cli.py +0 -0
  47. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/branch_forge.py +0 -0
  48. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/branches.py +0 -0
  49. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/cli.py +0 -0
  50. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/errors.py +0 -0
  51. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/forge.py +0 -0
  52. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/git.py +0 -0
  53. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/layout.py +0 -0
  54. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/merged.py +0 -0
  55. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/new_branch.py +0 -0
  56. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/pick.py +0 -0
  57. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/progress.py +0 -0
  58. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/prune.py +0 -0
  59. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/render.py +0 -0
  60. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/repo.py +0 -0
  61. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/rotate.py +0 -0
  62. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/verdicts.py +0 -0
  63. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/worktree.py +0 -0
  64. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/conftest.py +0 -0
  65. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_benchmark.py +0 -0
  66. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_branch_forge.py +0 -0
  67. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_branches.py +0 -0
  68. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_cli.py +0 -0
  69. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_completions.py +0 -0
  70. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_fixture.py +0 -0
  71. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_forge.py +0 -0
  72. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_gates.py +0 -0
  73. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_new_branch.py +0 -0
  74. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_render.py +0 -0
  75. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_rotate.py +0 -0
  76. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_shims.py +0 -0
  77. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_spec.py +0 -0
  78. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_version.py +0 -0
  79. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_worktree.py +0 -0
  80. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gw +0 -0
  81. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwa +0 -0
  82. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwbd +0 -0
  83. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwbs +0 -0
  84. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwh +0 -0
  85. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwl +0 -0
  86. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwm +0 -0
  87. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwnb +0 -0
  88. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwp +0 -0
  89. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwr +0 -0
  90. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwrot +0 -0
  91. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gws +0 -0
  92. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwa +0 -0
  93. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwl +0 -0
  94. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwm +0 -0
  95. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwr +0 -0
  96. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwr! +0 -0
  97. {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/worktrees.plugin.zsh +0 -0
@@ -152,25 +152,23 @@ jobs:
152
152
  name: dist
153
153
  path: dist/
154
154
 
155
+ # Sign with this job's OIDC identity. uv uploads the attestations with
156
+ # their distributions.
157
+ - name: Attest
158
+ run: uvx pypi-attestations@0.0.30 sign dist/*
159
+
155
160
  - name: Publish
156
161
  run: uv publish --trusted-publishing always
157
162
 
158
- # Uploaded and installable are two claims with two timings, so they are two
159
- # jobs. An index serves what it has accepted only after a delay of its own
160
- # choosing: 0.2.1 took longer than the script waited, and a release that had
161
- # published correctly went red and had to be re-run by hand. This job holds
162
- # the second claim, `release` needs only the first, and a red `verify` says
163
- # PyPI is slow rather than that the version is not out.
163
+ # PyPI can take time to serve an accepted upload. Verification runs in a
164
+ # separate job so that delay does not block the GitHub release.
164
165
  verify:
165
- name: Verify it installs from PyPI
166
+ name: Verify PyPI install and attestations
166
167
  runs-on: ubuntu-26.04
167
168
  needs: publish
168
169
  permissions:
169
170
  contents: read
170
171
  steps:
171
- # The script reads the name and version from pyproject.toml through
172
- # `uv version`, and installs from the index rather than from the
173
- # artifact, so there is nothing to download here.
174
172
  - name: Checkout code
175
173
  uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
176
174
 
@@ -183,6 +181,21 @@ jobs:
183
181
  - name: Verify it installs from PyPI
184
182
  run: scripts/verify-publish.bash --prod
185
183
 
184
+ # The filenames identify the distributions to fetch from PyPI.
185
+ - name: Download distributions
186
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8
187
+ with:
188
+ name: dist
189
+ path: dist/
190
+
191
+ # The install check waits for PyPI to serve the files.
192
+ - name: Verify attestations on PyPI
193
+ run: |
194
+ for f in dist/*.whl dist/*.tar.gz; do
195
+ uvx pypi-attestations@0.0.30 verify pypi \
196
+ --repository "https://github.com/$GITHUB_REPOSITORY" "pypi:${f#dist/}"
197
+ done
198
+
186
199
  release:
187
200
  name: Release
188
201
  runs-on: ubuntu-26.04
@@ -59,6 +59,11 @@ jobs:
59
59
  - name: Build
60
60
  run: uv build
61
61
 
62
+ # Sign with this job's OIDC identity. uv uploads the attestations with
63
+ # their distributions.
64
+ - name: Attest
65
+ run: uvx pypi-attestations@0.0.30 sign dist/*
66
+
62
67
  - name: Publish
63
68
  # `always` rather than the default `automatic`: fail loudly if OIDC is
64
69
  # unavailable instead of quietly looking for a token.
@@ -17,6 +17,16 @@ not in here, whatever it cost to build.
17
17
  A release closes with a `### Choices` section when a decision in it is worth
18
18
  the reader's time: what was chosen, and what the alternative failed to do.
19
19
 
20
+ ## 0.5.1 - 2026-09-29
21
+
22
+ ### Added
23
+
24
+ The wheel and source distribution on PyPI carry PEP 740 attestations signed
25
+ by the GitHub workflow that built them. PyPI shows the provenance on the
26
+ release's page, and `uvx pypi-attestations verify pypi --repository
27
+ https://github.com/MihaiBojin/worktrees pypi:<file>` checks a file against
28
+ this repository before you install it.
29
+
20
30
  ## 0.5.0 - 2026-09-29
21
31
 
22
32
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: git-worktrees
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Git worktree commands that refuse to lose work.
5
5
  Project-URL: Bug reports, https://github.com/MihaiBojin/worktrees/issues/new
6
6
  Project-URL: Source, https://github.com/MihaiBojin/worktrees
@@ -241,19 +241,25 @@ back, so the tree the tag names has already proved it uploads to an index and
241
241
  installs from one. The merge happens first and the irreversible step is last,
242
242
  so everything recoverable is already done by the time anything is published.
243
243
 
244
- `release` needs the upload and nothing else. `verify` installs the version
245
- from PyPI and runs what it installed, on its own, because an index serves what
246
- it has accepted after a delay it does not bound: 0.2.1 took longer than the
247
- script waited and a correct release went red. A red `verify` says PyPI is
248
- slow, not that the version is missing. It gives up after about 32 minutes.
244
+ `publish` signs each distribution with `uvx pypi-attestations@0.0.30 sign`
245
+ using the job's OIDC identity. `uv publish` uploads the resulting PEP 740
246
+ attestations alongside the distributions.
247
+
248
+ `release` needs the upload. `verify` installs the version from PyPI and runs
249
+ what it installed, allowing about 32 minutes for the index to serve it. It
250
+ then runs `uvx pypi-attestations@0.0.30 verify pypi` for each wheel and source
251
+ distribution, checking the attestations against this GitHub repository.
252
+ Either check can fail the verification job independently of the release.
249
253
 
250
254
  `workflow_dispatch` against a tag ref re-runs a release whose publish failed.
251
255
 
252
256
  ## Snapshots on TestPyPI
253
257
 
254
258
  `testpypi.yml` runs on every commit to `main`. It numbers the tree
255
- `<version>.post<epoch>`, builds it, uploads it to TestPyPI and installs it
256
- back from there.
259
+ `<version>.post<epoch>`, builds it and signs each distribution with
260
+ `uvx pypi-attestations@0.0.30 sign` using the job's OIDC identity. It uploads
261
+ the distributions and their PEP 740 attestations to TestPyPI, then installs
262
+ the snapshot back from there.
257
263
 
258
264
  `post` rather than `dev` because that is what the build is: made after
259
265
  `<version>` shipped. PEP 440 sorts `0.2.3.post1789247568` above `0.2.3` and
@@ -9,7 +9,7 @@ authors = [
9
9
  ]
10
10
  # Static, and the single source of truth for the version. Bump it in a pull
11
11
  # request and run `uv lock`; the release tag only has to agree with it.
12
- version = "0.5.0"
12
+ version = "0.5.1"
13
13
  # The standard library answers every question this asks. A dependency here
14
14
  # would be paid on every invocation, and an invocation is 67 ms of which 25 ms
15
15
  # is the interpreter starting.
@@ -40,7 +40,7 @@ wheels = [
40
40
 
41
41
  [[package]]
42
42
  name = "git-worktrees"
43
- version = "0.5.0"
43
+ version = "0.5.1"
44
44
  source = { editable = "." }
45
45
 
46
46
  [package.optional-dependencies]
File without changes
File without changes
File without changes
File without changes