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.
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.github/workflows/publish.yml +23 -10
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.github/workflows/testpypi.yml +5 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/CHANGELOG.md +10 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/PKG-INFO +1 -1
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/DEVELOPMENT.md +13 -7
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/pyproject.toml +1 -1
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/uv.lock +1 -1
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.claude/settings.json +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.github/workflows/tests.yml +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.gitignore +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.pre-commit-config.yaml +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.python-version +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/.releasetools.yaml +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/AGENTS.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/LICENSE +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/README.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gw.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwa.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwbd.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwbs.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwh.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwl.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwm.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwnb.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwp.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwr.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gwrot.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/gws.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/completions/worktrees.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/conf.d/worktrees.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/BENCHMARK.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/REFERENCE.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/commands/branch-delete.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/docs/commands/branch-status.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwa.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwl.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwm.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwr!.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/functions/gwr.fish +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/hatch_build.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/renovate.json +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/scripts/README.md +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/scripts/benchmark.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/scripts/verify-publish.bash +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/__init__.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/branch_cli.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/branch_forge.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/branches.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/cli.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/errors.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/forge.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/git.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/layout.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/merged.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/new_branch.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/pick.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/progress.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/prune.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/render.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/repo.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/rotate.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/verdicts.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/src/worktrees/worktree.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/conftest.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_benchmark.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_branch_forge.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_branches.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_cli.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_completions.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_fixture.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_forge.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_gates.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_new_branch.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_render.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_rotate.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_shims.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_spec.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_version.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/tests/test_worktree.py +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gw +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwa +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwbd +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwbs +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwh +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwl +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwm +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwnb +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwp +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwr +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gwrot +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/completions/_gws +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwa +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwl +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwm +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwr +0 -0
- {git_worktrees-0.5.0 → git_worktrees-0.5.1}/zsh/plugins/worktrees/functions/gwr! +0 -0
- {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
|
-
#
|
|
159
|
-
#
|
|
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
|
|
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.
|
|
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
|
-
`
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
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
|
|
256
|
-
|
|
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.
|
|
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.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|