workforest 0.2.1__tar.gz → 0.2.2__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 (47) hide show
  1. workforest-0.2.2/.github/workflows/publish_homebrew.yml +91 -0
  2. {workforest-0.2.1 → workforest-0.2.2}/PKG-INFO +13 -7
  3. {workforest-0.2.1 → workforest-0.2.2}/README.md +11 -6
  4. {workforest-0.2.1 → workforest-0.2.2}/packaging/AUR/.SRCINFO +3 -3
  5. {workforest-0.2.1 → workforest-0.2.2}/packaging/AUR/PKGBUILD +2 -2
  6. workforest-0.2.2/packaging/homebrew/workforest.rb +50 -0
  7. {workforest-0.2.1 → workforest-0.2.2}/pyproject.toml +1 -0
  8. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/__init__.py +1 -1
  9. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/tui.py +1 -1
  10. {workforest-0.2.1 → workforest-0.2.2}/.github/workflows/ci.yml +0 -0
  11. {workforest-0.2.1 → workforest-0.2.2}/.github/workflows/publish_aur.yml +0 -0
  12. {workforest-0.2.1 → workforest-0.2.2}/.github/workflows/publish_pypi.yml +0 -0
  13. {workforest-0.2.1 → workforest-0.2.2}/.github/workflows/release.yml +0 -0
  14. {workforest-0.2.1 → workforest-0.2.2}/.gitignore +0 -0
  15. {workforest-0.2.1 → workforest-0.2.2}/LICENSE +0 -0
  16. {workforest-0.2.1 → workforest-0.2.2}/Makefile +0 -0
  17. {workforest-0.2.1 → workforest-0.2.2}/completions/_workforest +0 -0
  18. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/__main__.py +0 -0
  19. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/cli.py +0 -0
  20. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/commands.py +0 -0
  21. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/completions.py +0 -0
  22. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/config.py +0 -0
  23. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/errors.py +0 -0
  24. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/examples/config.yaml +0 -0
  25. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/gitutil.py +0 -0
  26. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/hooks.py +0 -0
  27. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/integrations/__init__.py +0 -0
  28. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/integrations/claude.py +0 -0
  29. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/launch.py +0 -0
  30. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/output.py +0 -0
  31. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/shell/completion.bash +0 -0
  32. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/shell/completion.zsh +0 -0
  33. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/shell/workforest.sh +0 -0
  34. {workforest-0.2.1 → workforest-0.2.2}/src/workforest/shellinit.py +0 -0
  35. {workforest-0.2.1 → workforest-0.2.2}/tests/__init__.py +0 -0
  36. {workforest-0.2.1 → workforest-0.2.2}/tests/conftest.py +0 -0
  37. {workforest-0.2.1 → workforest-0.2.2}/tests/test_claude.py +0 -0
  38. {workforest-0.2.1 → workforest-0.2.2}/tests/test_cli.py +0 -0
  39. {workforest-0.2.1 → workforest-0.2.2}/tests/test_commands.py +0 -0
  40. {workforest-0.2.1 → workforest-0.2.2}/tests/test_config.py +0 -0
  41. {workforest-0.2.1 → workforest-0.2.2}/tests/test_gitutil.py +0 -0
  42. {workforest-0.2.1 → workforest-0.2.2}/tests/test_harness.py +0 -0
  43. {workforest-0.2.1 → workforest-0.2.2}/tests/test_hooks.py +0 -0
  44. {workforest-0.2.1 → workforest-0.2.2}/tests/test_launch.py +0 -0
  45. {workforest-0.2.1 → workforest-0.2.2}/tests/test_shell.py +0 -0
  46. {workforest-0.2.1 → workforest-0.2.2}/tests/test_tui.py +0 -0
  47. {workforest-0.2.1 → workforest-0.2.2}/uv.lock +0 -0
@@ -0,0 +1,91 @@
1
+ name: Publish to Homebrew tap
2
+
3
+ on:
4
+ release:
5
+ types: [published]
6
+
7
+ jobs:
8
+ publish:
9
+ runs-on: macos-latest
10
+ environment:
11
+ name: homebrew-tap
12
+ url: https://github.com/ArkadyBuryakov/homebrew-tap
13
+ permissions:
14
+ contents: write # commit the generated formula back to main
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - name: Update formula to released version
19
+ run: |
20
+ version="${GITHUB_REF_NAME#v}"
21
+ url="https://github.com/ArkadyBuryakov/workforest/archive/v$version.tar.gz"
22
+ curl -fsSL "$url" -o /tmp/workforest.tar.gz
23
+ sha256=$(shasum -a 256 /tmp/workforest.tar.gz | cut -d' ' -f1)
24
+ cd packaging/homebrew
25
+ sed -i '' "s|^ url .*| url \"$url\"|" workforest.rb
26
+ sed -i '' "s|^ sha256 .*| sha256 \"$sha256\"|" workforest.rb
27
+
28
+ - name: Build, test, and smoke test
29
+ run: |
30
+ brew install --build-from-source --formula packaging/homebrew/workforest.rb
31
+ brew test --formula packaging/homebrew/workforest.rb
32
+ workforest --version
33
+ wf --version
34
+ workforest shell-init bash | bash -n
35
+ workforest shell-init zsh | head -1 | grep -q Workforest
36
+
37
+ - name: Push to tap
38
+ env:
39
+ TAP_SSH_PRIVATE_KEY: ${{ secrets.TAP_SSH_PRIVATE_KEY }}
40
+ run: |
41
+ version="${GITHUB_REF_NAME#v}"
42
+ # Host keys are pinned rather than keyscanned (same policy as the
43
+ # AUR workflow); these are GitHub's published SSH fingerprints.
44
+ mkdir -p /tmp/ssh
45
+ printf '%s\n' "$TAP_SSH_PRIVATE_KEY" > /tmp/ssh/tap
46
+ chmod 600 /tmp/ssh/tap
47
+ cat > /tmp/ssh/known_hosts <<'EOF'
48
+ github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
49
+ github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
50
+ EOF
51
+ export GIT_SSH_COMMAND="ssh -i /tmp/ssh/tap -o UserKnownHostsFile=/tmp/ssh/known_hosts -o IdentitiesOnly=yes"
52
+ git config --global user.name "Arkady Buryakov"
53
+ git config --global user.email "arkady@buryakov.pro"
54
+ git clone git@github.com:ArkadyBuryakov/homebrew-tap.git /tmp/tap
55
+ cd /tmp/tap
56
+ git checkout main 2>/dev/null || git checkout -b main
57
+ mkdir -p Formula
58
+ cp "$GITHUB_WORKSPACE/packaging/homebrew/workforest.rb" Formula/workforest.rb
59
+ git add Formula/workforest.rb
60
+ if git diff --cached --quiet; then
61
+ echo "No changes to publish."
62
+ else
63
+ git commit -m "workforest $version"
64
+ git push origin main
65
+ fi
66
+
67
+ - name: Commit generated formula back to main
68
+ run: |
69
+ version="${GITHUB_REF_NAME#v}"
70
+ cp packaging/homebrew/workforest.rb /tmp/workforest.rb
71
+ git config --global user.name "Arkady Buryakov"
72
+ git config --global user.email "arkady@buryakov.pro"
73
+ # The workflow runs detached at the release tag; move to main to
74
+ # commit. Retry because the AUR publisher pushes to main from the
75
+ # same release event and the two can race.
76
+ for attempt in 1 2 3; do
77
+ git fetch origin main
78
+ git checkout -f -B main origin/main
79
+ cp /tmp/workforest.rb packaging/homebrew/workforest.rb
80
+ git add packaging/homebrew/workforest.rb
81
+ if git diff --cached --quiet; then
82
+ echo "Repo copy already up to date."
83
+ break
84
+ fi
85
+ git commit -m "Update Homebrew formula to $version"
86
+ if git push origin main; then
87
+ break
88
+ fi
89
+ echo "Push raced with another workflow, retrying ($attempt)..."
90
+ sleep 10
91
+ done
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: workforest
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Git worktree forest management: create, open, and clean up per-branch worktrees with project-defined setup hooks
5
5
  Project-URL: Homepage, https://github.com/ArkadyBuryakov/workforest
6
6
  Author-email: Arkady Buryakov <arkady@buryakov.pro>
@@ -10,6 +10,7 @@ Keywords: cli,developer-tools,git,worktree
10
10
  Classifier: Development Status :: 4 - Beta
11
11
  Classifier: Environment :: Console
12
12
  Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: MacOS
13
14
  Classifier: Operating System :: POSIX :: Linux
14
15
  Classifier: Programming Language :: Python :: 3.14
15
16
  Classifier: Topic :: Software Development :: Version Control :: Git
@@ -48,6 +49,9 @@ opened, and cleaned up with one command.
48
49
  # Arch Linux
49
50
  yay -S workforest # AUR
50
51
 
52
+ # macOS (or Linux with Homebrew)
53
+ brew install arkadyburyakov/tap/workforest
54
+
51
55
  # anywhere else
52
56
  uv tool install workforest # or: pipx install workforest
53
57
  ```
@@ -64,7 +68,8 @@ shell's directory — a plain binary cannot) and registers completions. Without
64
68
  it everything still works, but "open in current shell" prints the `cd`
65
69
  command instead of performing it.
66
70
 
67
- Requirements: Linux, git ≥ 2.36, Python ≥ 3.14. Optional: `fzf` for the TUI.
71
+ Requirements: Linux or macOS, git ≥ 2.36, Python ≥ 3.14 (the AUR and
72
+ Homebrew packages bring their own). Optional: `fzf` for the TUI.
68
73
 
69
74
  ## Quick start
70
75
 
@@ -195,11 +200,12 @@ make install # install this checkout as a uv tool (~/.local/bin/workforest)
195
200
  make uninstall # remove it again
196
201
  ```
197
202
 
198
- Packaging recipes live under
199
- `packaging/` (one directory per package manager; currently `packaging/AUR/`).
200
- Release: bump `__version__`, tag, update `sha256sums` in
201
- `packaging/AUR/PKGBUILD`, regenerate `.SRCINFO`
202
- (`makepkg --printsrcinfo > .SRCINFO` inside `packaging/AUR/`), push to AUR.
203
+ Packaging recipes live under `packaging/` (one directory per package
204
+ manager: `packaging/AUR/`, `packaging/homebrew/`).
205
+ Release: bump `__version__` and push to main — CI tags the release and
206
+ publishes to PyPI, the AUR, and the
207
+ [Homebrew tap](https://github.com/ArkadyBuryakov/homebrew-tap), committing
208
+ the regenerated recipes back to the repo.
203
209
 
204
210
  ## License
205
211
 
@@ -29,6 +29,9 @@ opened, and cleaned up with one command.
29
29
  # Arch Linux
30
30
  yay -S workforest # AUR
31
31
 
32
+ # macOS (or Linux with Homebrew)
33
+ brew install arkadyburyakov/tap/workforest
34
+
32
35
  # anywhere else
33
36
  uv tool install workforest # or: pipx install workforest
34
37
  ```
@@ -45,7 +48,8 @@ shell's directory — a plain binary cannot) and registers completions. Without
45
48
  it everything still works, but "open in current shell" prints the `cd`
46
49
  command instead of performing it.
47
50
 
48
- Requirements: Linux, git ≥ 2.36, Python ≥ 3.14. Optional: `fzf` for the TUI.
51
+ Requirements: Linux or macOS, git ≥ 2.36, Python ≥ 3.14 (the AUR and
52
+ Homebrew packages bring their own). Optional: `fzf` for the TUI.
49
53
 
50
54
  ## Quick start
51
55
 
@@ -176,11 +180,12 @@ make install # install this checkout as a uv tool (~/.local/bin/workforest)
176
180
  make uninstall # remove it again
177
181
  ```
178
182
 
179
- Packaging recipes live under
180
- `packaging/` (one directory per package manager; currently `packaging/AUR/`).
181
- Release: bump `__version__`, tag, update `sha256sums` in
182
- `packaging/AUR/PKGBUILD`, regenerate `.SRCINFO`
183
- (`makepkg --printsrcinfo > .SRCINFO` inside `packaging/AUR/`), push to AUR.
183
+ Packaging recipes live under `packaging/` (one directory per package
184
+ manager: `packaging/AUR/`, `packaging/homebrew/`).
185
+ Release: bump `__version__` and push to main — CI tags the release and
186
+ publishes to PyPI, the AUR, and the
187
+ [Homebrew tap](https://github.com/ArkadyBuryakov/homebrew-tap), committing
188
+ the regenerated recipes back to the repo.
184
189
 
185
190
  ## License
186
191
 
@@ -1,6 +1,6 @@
1
1
  pkgbase = workforest
2
2
  pkgdesc = Git worktree forest management: per-branch worktrees with project-defined setup hooks
3
- pkgver = 0.2.0
3
+ pkgver = 0.2.1
4
4
  pkgrel = 1
5
5
  url = https://github.com/ArkadyBuryakov/workforest
6
6
  arch = any
@@ -13,7 +13,7 @@ pkgbase = workforest
13
13
  depends = python-yaml
14
14
  depends = git
15
15
  optdepends = fzf: interactive TUI (workforest tui)
16
- source = workforest-0.2.0.tar.gz::https://github.com/ArkadyBuryakov/workforest/archive/v0.2.0.tar.gz
17
- sha256sums = dc1ba2518e2612714e023f7fc088aeaa37f9e0d5bffbcbc07c2dd15f109bb476
16
+ source = workforest-0.2.1.tar.gz::https://github.com/ArkadyBuryakov/workforest/archive/v0.2.1.tar.gz
17
+ sha256sums = 47062e51ae374a9afce50ee0be6c39b08da6c96064450b3c2c58566d05fb7078
18
18
 
19
19
  pkgname = workforest
@@ -1,6 +1,6 @@
1
1
  # Maintainer: Arkady Buryakov <arkady@buryakov.pro>
2
2
  pkgname=workforest
3
- pkgver=0.2.0
3
+ pkgver=0.2.1
4
4
  pkgrel=1
5
5
  pkgdesc="Git worktree forest management: per-branch worktrees with project-defined setup hooks"
6
6
  arch=(any)
@@ -10,7 +10,7 @@ depends=(python python-yaml git)
10
10
  makedepends=(python-build python-installer python-wheel python-hatchling)
11
11
  optdepends=('fzf: interactive TUI (workforest tui)')
12
12
  source=("$pkgname-$pkgver.tar.gz::$url/archive/v$pkgver.tar.gz")
13
- sha256sums=('dc1ba2518e2612714e023f7fc088aeaa37f9e0d5bffbcbc07c2dd15f109bb476')
13
+ sha256sums=('47062e51ae374a9afce50ee0be6c39b08da6c96064450b3c2c58566d05fb7078')
14
14
 
15
15
  build() {
16
16
  cd "$pkgname-$pkgver"
@@ -0,0 +1,50 @@
1
+ # The publish_homebrew workflow rewrites url/sha256 on release and pushes
2
+ # this file to the ArkadyBuryakov/homebrew-tap repo; this copy is the source
3
+ # of truth for everything else (deps, completions, caveats, test).
4
+ class Workforest < Formula
5
+ include Language::Python::Virtualenv
6
+
7
+ desc "Git worktree forest management with per-branch setup hooks"
8
+ homepage "https://github.com/ArkadyBuryakov/workforest"
9
+ url "https://github.com/ArkadyBuryakov/workforest/archive/v0.2.1.tar.gz"
10
+ sha256 "47062e51ae374a9afce50ee0be6c39b08da6c96064450b3c2c58566d05fb7078"
11
+ license "MIT"
12
+ head "https://github.com/ArkadyBuryakov/workforest.git", branch: "main"
13
+
14
+ depends_on "fzf"
15
+ depends_on "python@3.14"
16
+
17
+ resource "pyyaml" do
18
+ url "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz"
19
+ sha256 "d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"
20
+ end
21
+
22
+ def install
23
+ virtualenv_install_with_resources
24
+
25
+ # Completions for the plain binary; the wf shell function itself comes
26
+ # from `workforest shell-init` (see caveats).
27
+ bash_completion.install "src/workforest/shell/completion.bash" => "workforest"
28
+ zsh_completion.install "completions/_workforest"
29
+
30
+ # Reference configs, mirroring the Arch package's /usr/share/doc layout.
31
+ (doc/"examples").install "src/workforest/examples/config.yaml"
32
+ (doc/"examples").install "src/workforest/examples/.workforest.yaml" => "workforest.project.yaml"
33
+ end
34
+
35
+ def caveats
36
+ <<~EOS
37
+ To upgrade `wf` to a shell function (so `wf open` can change your
38
+ shell's directory) and register completions, add this to your
39
+ ~/.zshrc or ~/.bashrc:
40
+ eval "$(workforest shell-init)"
41
+ EOS
42
+ end
43
+
44
+ test do
45
+ assert_match version.to_s, shell_output("#{bin}/workforest --version")
46
+ assert_match version.to_s, shell_output("#{bin}/wf --version")
47
+ (testpath/"init.bash").write shell_output("#{bin}/workforest shell-init bash")
48
+ system "bash", "-n", testpath/"init.bash"
49
+ end
50
+ end
@@ -18,6 +18,7 @@ classifiers = [
18
18
  "Environment :: Console",
19
19
  "Intended Audience :: Developers",
20
20
  "Operating System :: POSIX :: Linux",
21
+ "Operating System :: MacOS",
21
22
  "Programming Language :: Python :: 3.14",
22
23
  "Topic :: Software Development :: Version Control :: Git",
23
24
  ]
@@ -1,3 +1,3 @@
1
1
  """Workforest — git worktree forest management."""
2
2
 
3
- __version__ = "0.2.1"
3
+ __version__ = "0.2.2"
@@ -161,7 +161,7 @@ def run(initial_mode: str | None = None) -> CommandResult: # pragma: no cover -
161
161
  is unit-tested; this function only wires them to the fzf subprocess."""
162
162
  if shutil.which("fzf") is None:
163
163
  raise WorkforestError(
164
- "the TUI requires fzf (e.g. pacman -S fzf); "
164
+ "the TUI requires fzf (e.g. pacman -S fzf, brew install fzf); "
165
165
  "all actions are also available as plain subcommands"
166
166
  )
167
167
  ctx = commands.build_context()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes