workforest 0.2.0__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.
- {workforest-0.2.0 → workforest-0.2.2}/.github/workflows/publish_aur.yml +3 -0
- workforest-0.2.2/.github/workflows/publish_homebrew.yml +91 -0
- {workforest-0.2.0 → workforest-0.2.2}/.github/workflows/publish_pypi.yml +3 -1
- {workforest-0.2.0 → workforest-0.2.2}/PKG-INFO +13 -7
- {workforest-0.2.0 → workforest-0.2.2}/README.md +11 -6
- {workforest-0.2.0 → workforest-0.2.2}/packaging/AUR/.SRCINFO +4 -4
- {workforest-0.2.0 → workforest-0.2.2}/packaging/AUR/PKGBUILD +2 -2
- workforest-0.2.2/packaging/homebrew/workforest.rb +50 -0
- {workforest-0.2.0 → workforest-0.2.2}/pyproject.toml +1 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/__init__.py +1 -1
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/tui.py +1 -1
- {workforest-0.2.0 → workforest-0.2.2}/.github/workflows/ci.yml +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/.github/workflows/release.yml +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/.gitignore +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/LICENSE +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/Makefile +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/completions/_workforest +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/__main__.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/cli.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/commands.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/completions.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/config.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/errors.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/examples/config.yaml +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/gitutil.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/hooks.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/integrations/__init__.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/integrations/claude.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/launch.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/output.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/shell/completion.bash +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/shell/completion.zsh +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/shell/workforest.sh +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/src/workforest/shellinit.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/__init__.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/conftest.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_claude.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_cli.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_commands.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_config.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_gitutil.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_harness.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_hooks.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_launch.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_shell.py +0 -0
- {workforest-0.2.0 → workforest-0.2.2}/tests/test_tui.py +0 -0
- {workforest-0.2.0 → 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.
|
|
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
|
|
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
|
|
200
|
-
Release: bump `__version__
|
|
201
|
-
|
|
202
|
-
(
|
|
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
|
|
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
|
|
181
|
-
Release: bump `__version__
|
|
182
|
-
|
|
183
|
-
(
|
|
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,8 +1,8 @@
|
|
|
1
1
|
pkgbase = workforest
|
|
2
2
|
pkgdesc = Git worktree forest management: per-branch worktrees with project-defined setup hooks
|
|
3
|
-
pkgver = 0.1
|
|
3
|
+
pkgver = 0.2.1
|
|
4
4
|
pkgrel = 1
|
|
5
|
-
url = https://github.com/
|
|
5
|
+
url = https://github.com/ArkadyBuryakov/workforest
|
|
6
6
|
arch = any
|
|
7
7
|
license = MIT
|
|
8
8
|
makedepends = python-build
|
|
@@ -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.1.
|
|
17
|
-
sha256sums =
|
|
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.1
|
|
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=('
|
|
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
|
]
|
|
@@ -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
|
|
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
|