plex-tui 0.3.0__tar.gz → 0.3.12__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.
- {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/aur.yml +1 -1
- {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/bump.yml +19 -1
- plex_tui-0.3.12/.github/workflows/post-release-aur.yml +159 -0
- plex_tui-0.3.12/.github/workflows/post-release-homebrew.yml +154 -0
- plex_tui-0.3.12/.github/workflows/publish-aur.yml +102 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/AGENTS.md +26 -2
- {plex_tui-0.3.0 → plex_tui-0.3.12}/CHANGELOG.md +27 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/PACKAGING.md +17 -5
- {plex_tui-0.3.0 → plex_tui-0.3.12}/PKG-INFO +8 -1
- {plex_tui-0.3.0 → plex_tui-0.3.12}/README.md +7 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/RELEASE.md +57 -7
- plex_tui-0.3.12/ROADMAP.md +60 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/aur/.SRCINFO +3 -4
- {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/aur/PKGBUILD +2 -4
- {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/aur/README.md +4 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/pyproject.toml +1 -1
- {plex_tui-0.3.0 → plex_tui-0.3.12}/scripts/check_release.py +9 -4
- plex_tui-0.3.12/scripts/update_aur_package.py +67 -0
- plex_tui-0.3.12/scripts/update_homebrew_formula.py +192 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/__init__.py +1 -1
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/app.py +164 -45
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_app_helpers.py +91 -11
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_app_navigation.py +1 -1
- plex_tui-0.3.12/tests/test_release_checks.py +210 -0
- plex_tui-0.3.0/ROADMAP.md +0 -39
- plex_tui-0.3.0/tests/test_release_checks.py +0 -109
- {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/ci.yml +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/publish-pypi.yml +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/.github/workflows/publish-testpypi.yml +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/.gitignore +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/LICENSE +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/Makefile +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/config.example.toml +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/docs/assets/grid-view.png +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/docs/assets/list-view.png +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/packaging/homebrew/README.md +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/__main__.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/artwork.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/auth.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/config.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/models.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/player.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/plex_service.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/src/plextui/smoke.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_artwork.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_auth.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_cli.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_config.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_player.py +0 -0
- {plex_tui-0.3.0 → plex_tui-0.3.12}/tests/test_plex_service.py +0 -0
|
@@ -43,7 +43,7 @@ jobs:
|
|
|
43
43
|
- name: Generate .SRCINFO
|
|
44
44
|
working-directory: packaging/aur
|
|
45
45
|
run: |
|
|
46
|
-
sudo -u builder makepkg --printsrcinfo
|
|
46
|
+
sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO.generated > /dev/null
|
|
47
47
|
diff -u .SRCINFO .SRCINFO.generated
|
|
48
48
|
|
|
49
49
|
- name: Run namcap
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
new_tag: ${{ steps.bump.outputs.new_version }}
|
|
28
28
|
previous_tag: ${{ steps.bump.outputs.previous_version }}
|
|
29
29
|
skipped: ${{ steps.bump.outputs.skipped }}
|
|
30
|
-
release_requested: ${{ steps.
|
|
30
|
+
release_requested: ${{ steps.release-intent.outputs.release_requested }}
|
|
31
31
|
|
|
32
32
|
steps:
|
|
33
33
|
- name: Check out repository
|
|
@@ -44,6 +44,24 @@ jobs:
|
|
|
44
44
|
# Floating pointer tags are owned by release-creator so they only move
|
|
45
45
|
# when a GitHub Release is intentionally published.
|
|
46
46
|
|
|
47
|
+
- name: Detect release request
|
|
48
|
+
id: release-intent
|
|
49
|
+
env:
|
|
50
|
+
PR_TITLE: ${{ github.event.pull_request.title }}
|
|
51
|
+
run: |
|
|
52
|
+
set -euo pipefail
|
|
53
|
+
|
|
54
|
+
text="$(printf '%s\n' "$PR_TITLE" | tr '[:upper:]' '[:lower:]')"
|
|
55
|
+
release_requested=false
|
|
56
|
+
for marker in "#release" "#publish" "#ship"; do
|
|
57
|
+
if grep -qF "$marker" <<< "$text"; then
|
|
58
|
+
release_requested=true
|
|
59
|
+
break
|
|
60
|
+
fi
|
|
61
|
+
done
|
|
62
|
+
|
|
63
|
+
echo "release_requested=$release_requested" >> "$GITHUB_OUTPUT"
|
|
64
|
+
|
|
47
65
|
create-release:
|
|
48
66
|
name: Create GitHub Release
|
|
49
67
|
needs: bump-version
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
name: Post-release AUR Update
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["Version Bump and Release"]
|
|
6
|
+
types: ["completed"]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
tag:
|
|
10
|
+
description: "Release tag to package, such as v0.3.0. Defaults to the release created by the completed bump workflow."
|
|
11
|
+
required: false
|
|
12
|
+
type: string
|
|
13
|
+
|
|
14
|
+
env:
|
|
15
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
aur-pr:
|
|
19
|
+
if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: write
|
|
23
|
+
pull-requests: write
|
|
24
|
+
|
|
25
|
+
steps:
|
|
26
|
+
- name: Check out repository
|
|
27
|
+
uses: actions/checkout@v5
|
|
28
|
+
|
|
29
|
+
- name: Check packaging PR token
|
|
30
|
+
env:
|
|
31
|
+
PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
|
|
32
|
+
run: |
|
|
33
|
+
if [ -z "$PACKAGING_PR_TOKEN" ]; then
|
|
34
|
+
echo "PACKAGING_PR_TOKEN secret is required to create and auto-merge packaging PRs" >&2
|
|
35
|
+
exit 1
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
- name: Determine release tag
|
|
39
|
+
id: release
|
|
40
|
+
env:
|
|
41
|
+
GH_TOKEN: ${{ github.token }}
|
|
42
|
+
REQUESTED_TAG: ${{ github.event.inputs.tag }}
|
|
43
|
+
WORKFLOW_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
|
44
|
+
run: |
|
|
45
|
+
set -euo pipefail
|
|
46
|
+
|
|
47
|
+
if [ -n "$REQUESTED_TAG" ]; then
|
|
48
|
+
tag="$REQUESTED_TAG"
|
|
49
|
+
else
|
|
50
|
+
tag="$(gh release list --limit 1 --json tagName --jq '.[0].tagName // ""')"
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
if ! [[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
54
|
+
echo "Release tag must look like vX.Y.Z: $tag" >&2
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
if ! gh release view "$tag" --json tagName --jq '.tagName' >/dev/null; then
|
|
59
|
+
echo "GitHub Release does not exist for $tag" >&2
|
|
60
|
+
exit 1
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
if [ -n "$WORKFLOW_HEAD_SHA" ]; then
|
|
64
|
+
git fetch --force origin "refs/tags/$tag:refs/tags/$tag"
|
|
65
|
+
tag_sha="$(git rev-list -n 1 "$tag")"
|
|
66
|
+
if [ "$tag_sha" != "$WORKFLOW_HEAD_SHA" ]; then
|
|
67
|
+
{
|
|
68
|
+
echo "publish=false"
|
|
69
|
+
} >> "$GITHUB_OUTPUT"
|
|
70
|
+
echo "Latest release $tag points at $tag_sha, not completed workflow SHA $WORKFLOW_HEAD_SHA. Nothing to publish."
|
|
71
|
+
exit 0
|
|
72
|
+
fi
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
version="${tag#v}"
|
|
76
|
+
{
|
|
77
|
+
echo "publish=true"
|
|
78
|
+
echo "tag=$tag"
|
|
79
|
+
echo "version=$version"
|
|
80
|
+
} >> "$GITHUB_OUTPUT"
|
|
81
|
+
|
|
82
|
+
- name: Download source archive and checksum
|
|
83
|
+
if: steps.release.outputs.publish == 'true'
|
|
84
|
+
id: archive
|
|
85
|
+
env:
|
|
86
|
+
TAG: ${{ steps.release.outputs.tag }}
|
|
87
|
+
run: |
|
|
88
|
+
set -euo pipefail
|
|
89
|
+
|
|
90
|
+
url="https://github.com/${GITHUB_REPOSITORY}/archive/refs/tags/${TAG}.tar.gz"
|
|
91
|
+
curl --fail --location --retry 5 --retry-delay 2 --output source.tar.gz "$url"
|
|
92
|
+
sha256="$(sha256sum source.tar.gz | awk '{print $1}')"
|
|
93
|
+
echo "sha256=$sha256" >> "$GITHUB_OUTPUT"
|
|
94
|
+
|
|
95
|
+
- name: Update PKGBUILD
|
|
96
|
+
if: steps.release.outputs.publish == 'true'
|
|
97
|
+
run: |
|
|
98
|
+
python scripts/update_aur_package.py \
|
|
99
|
+
"${{ steps.release.outputs.version }}" \
|
|
100
|
+
"${{ steps.archive.outputs.sha256 }}"
|
|
101
|
+
|
|
102
|
+
- name: Regenerate and validate AUR package
|
|
103
|
+
if: steps.release.outputs.publish == 'true'
|
|
104
|
+
run: |
|
|
105
|
+
set -euo pipefail
|
|
106
|
+
|
|
107
|
+
docker run --rm \
|
|
108
|
+
-v "$PWD:/workspace" \
|
|
109
|
+
-w /workspace/packaging/aur \
|
|
110
|
+
archlinux:base-devel \
|
|
111
|
+
bash -lc '
|
|
112
|
+
set -euo pipefail
|
|
113
|
+
pacman -Syu --noconfirm git namcap sudo
|
|
114
|
+
useradd --create-home --shell /bin/bash builder
|
|
115
|
+
echo "builder ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/builder
|
|
116
|
+
chown -R builder:builder /workspace/packaging/aur
|
|
117
|
+
sudo -u builder makepkg --printsrcinfo | sudo -u builder tee .SRCINFO > /dev/null
|
|
118
|
+
sudo -u builder makepkg --clean --syncdeps --noconfirm --check
|
|
119
|
+
namcap PKGBUILD ./*.pkg.tar.*
|
|
120
|
+
'
|
|
121
|
+
|
|
122
|
+
sudo chown -R "$(id -u):$(id -g)" packaging/aur
|
|
123
|
+
|
|
124
|
+
- name: Remove generated package artifacts
|
|
125
|
+
if: steps.release.outputs.publish == 'true'
|
|
126
|
+
run: |
|
|
127
|
+
rm -f source.tar.gz
|
|
128
|
+
find packaging/aur -maxdepth 1 -type f \
|
|
129
|
+
\( -name "*.pkg.tar.*" -o -name "*.tar.gz" \) \
|
|
130
|
+
-delete
|
|
131
|
+
|
|
132
|
+
- name: Create packaging pull request
|
|
133
|
+
if: steps.release.outputs.publish == 'true'
|
|
134
|
+
id: create-pr
|
|
135
|
+
uses: peter-evans/create-pull-request@v7
|
|
136
|
+
with:
|
|
137
|
+
token: ${{ secrets.PACKAGING_PR_TOKEN }}
|
|
138
|
+
branch: automation/aur-${{ steps.release.outputs.tag }}
|
|
139
|
+
delete-branch: true
|
|
140
|
+
commit-message: Update AUR package to ${{ steps.release.outputs.tag }}
|
|
141
|
+
title: Update AUR package to ${{ steps.release.outputs.tag }}
|
|
142
|
+
body: |
|
|
143
|
+
Updates Arch AUR packaging metadata for `${{ steps.release.outputs.tag }}`.
|
|
144
|
+
|
|
145
|
+
Validation performed by this workflow:
|
|
146
|
+
- downloaded the release source archive and computed the sha256
|
|
147
|
+
- regenerated `packaging/aur/.SRCINFO`
|
|
148
|
+
- ran `makepkg --clean --syncdeps --noconfirm --check`
|
|
149
|
+
- ran `namcap`
|
|
150
|
+
|
|
151
|
+
This is a packaging-only PR and intentionally has no semver bump marker.
|
|
152
|
+
|
|
153
|
+
- name: Enable packaging pull request auto-merge
|
|
154
|
+
if: steps.create-pr.outputs.pull-request-number != ''
|
|
155
|
+
env:
|
|
156
|
+
GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
|
|
157
|
+
PR_NUMBER: ${{ steps.create-pr.outputs.pull-request-number }}
|
|
158
|
+
run: |
|
|
159
|
+
gh pr merge "$PR_NUMBER" --auto --squash --delete-branch
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
name: Post-release Homebrew Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["Version Bump and Release"]
|
|
6
|
+
types: ["completed"]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
inputs:
|
|
9
|
+
tag:
|
|
10
|
+
description: "Release tag to package, such as v0.3.0. Defaults to the release created by the completed bump workflow."
|
|
11
|
+
required: false
|
|
12
|
+
type: string
|
|
13
|
+
|
|
14
|
+
env:
|
|
15
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
publish-tap:
|
|
19
|
+
if: github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success'
|
|
20
|
+
runs-on: macos-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: read
|
|
23
|
+
|
|
24
|
+
steps:
|
|
25
|
+
- name: Check out repository
|
|
26
|
+
uses: actions/checkout@v5
|
|
27
|
+
|
|
28
|
+
- name: Set up Python
|
|
29
|
+
uses: actions/setup-python@v6
|
|
30
|
+
with:
|
|
31
|
+
python-version: "3.13"
|
|
32
|
+
|
|
33
|
+
- name: Check packaging PR token
|
|
34
|
+
env:
|
|
35
|
+
PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
|
|
36
|
+
run: |
|
|
37
|
+
if [ -z "$PACKAGING_PR_TOKEN" ]; then
|
|
38
|
+
echo "PACKAGING_PR_TOKEN secret is required to publish the Homebrew tap" >&2
|
|
39
|
+
exit 1
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
- name: Determine release tag
|
|
43
|
+
id: release
|
|
44
|
+
env:
|
|
45
|
+
GH_TOKEN: ${{ github.token }}
|
|
46
|
+
REQUESTED_TAG: ${{ github.event.inputs.tag }}
|
|
47
|
+
WORKFLOW_HEAD_SHA: ${{ github.event.workflow_run.head_sha }}
|
|
48
|
+
run: |
|
|
49
|
+
set -euo pipefail
|
|
50
|
+
|
|
51
|
+
if [ -n "$REQUESTED_TAG" ]; then
|
|
52
|
+
tag="$REQUESTED_TAG"
|
|
53
|
+
else
|
|
54
|
+
tag="$(gh release list --limit 1 --json tagName --jq '.[0].tagName // ""')"
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
if ! [[ "$tag" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
58
|
+
echo "Release tag must look like vX.Y.Z: $tag" >&2
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
if ! gh release view "$tag" --json tagName --jq '.tagName' >/dev/null; then
|
|
63
|
+
echo "GitHub Release does not exist for $tag" >&2
|
|
64
|
+
exit 1
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
if [ -n "$WORKFLOW_HEAD_SHA" ]; then
|
|
68
|
+
git fetch --force origin "refs/tags/$tag:refs/tags/$tag"
|
|
69
|
+
tag_sha="$(git rev-list -n 1 "$tag")"
|
|
70
|
+
if [ "$tag_sha" != "$WORKFLOW_HEAD_SHA" ]; then
|
|
71
|
+
{
|
|
72
|
+
echo "publish=false"
|
|
73
|
+
} >> "$GITHUB_OUTPUT"
|
|
74
|
+
echo "Latest release $tag points at $tag_sha, not completed workflow SHA $WORKFLOW_HEAD_SHA. Nothing to publish."
|
|
75
|
+
exit 0
|
|
76
|
+
fi
|
|
77
|
+
fi
|
|
78
|
+
|
|
79
|
+
version="${tag#v}"
|
|
80
|
+
{
|
|
81
|
+
echo "publish=true"
|
|
82
|
+
echo "tag=$tag"
|
|
83
|
+
echo "version=$version"
|
|
84
|
+
} >> "$GITHUB_OUTPUT"
|
|
85
|
+
|
|
86
|
+
- name: Tap Homebrew repository
|
|
87
|
+
if: steps.release.outputs.publish == 'true'
|
|
88
|
+
id: tap
|
|
89
|
+
env:
|
|
90
|
+
PACKAGING_PR_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
|
|
91
|
+
run: |
|
|
92
|
+
brew tap so1omon563/plex-tui "https://x-access-token:${PACKAGING_PR_TOKEN}@github.com/so1omon563/homebrew-plex-tui.git"
|
|
93
|
+
echo "path=$(brew --repo so1omon563/plex-tui)" >> "$GITHUB_OUTPUT"
|
|
94
|
+
|
|
95
|
+
- name: Update formula source
|
|
96
|
+
if: steps.release.outputs.publish == 'true'
|
|
97
|
+
run: |
|
|
98
|
+
python scripts/update_homebrew_formula.py \
|
|
99
|
+
"${{ steps.tap.outputs.path }}/Formula/plex-tui.rb" \
|
|
100
|
+
"${{ steps.release.outputs.version }}"
|
|
101
|
+
|
|
102
|
+
- name: Audit formula
|
|
103
|
+
if: steps.release.outputs.publish == 'true'
|
|
104
|
+
working-directory: ${{ steps.tap.outputs.path }}
|
|
105
|
+
run: |
|
|
106
|
+
brew audit --strict --online so1omon563/plex-tui/plex-tui
|
|
107
|
+
|
|
108
|
+
- name: Commit tap update
|
|
109
|
+
if: steps.release.outputs.publish == 'true'
|
|
110
|
+
id: commit
|
|
111
|
+
working-directory: ${{ steps.tap.outputs.path }}
|
|
112
|
+
env:
|
|
113
|
+
VERSION: ${{ steps.release.outputs.version }}
|
|
114
|
+
run: |
|
|
115
|
+
set -euo pipefail
|
|
116
|
+
|
|
117
|
+
if git diff --quiet -- Formula/plex-tui.rb; then
|
|
118
|
+
echo "changed=false" >> "$GITHUB_OUTPUT"
|
|
119
|
+
echo "Homebrew tap is already up to date."
|
|
120
|
+
exit 0
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
branch="automation/plex-tui-v${VERSION}"
|
|
124
|
+
git switch -c "$branch"
|
|
125
|
+
git config user.name "github-actions[bot]"
|
|
126
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
127
|
+
git add Formula/plex-tui.rb
|
|
128
|
+
git commit -m "Update plex-tui to ${VERSION}"
|
|
129
|
+
git push origin "$branch"
|
|
130
|
+
|
|
131
|
+
echo "changed=true" >> "$GITHUB_OUTPUT"
|
|
132
|
+
echo "branch=$branch" >> "$GITHUB_OUTPUT"
|
|
133
|
+
|
|
134
|
+
- name: Open and merge tap pull request
|
|
135
|
+
if: steps.release.outputs.publish == 'true' && steps.commit.outputs.changed == 'true'
|
|
136
|
+
working-directory: ${{ steps.tap.outputs.path }}
|
|
137
|
+
env:
|
|
138
|
+
GH_TOKEN: ${{ secrets.PACKAGING_PR_TOKEN }}
|
|
139
|
+
VERSION: ${{ steps.release.outputs.version }}
|
|
140
|
+
BRANCH: ${{ steps.commit.outputs.branch }}
|
|
141
|
+
run: |
|
|
142
|
+
set -euo pipefail
|
|
143
|
+
|
|
144
|
+
pr_url="$(gh pr create \
|
|
145
|
+
--repo so1omon563/homebrew-plex-tui \
|
|
146
|
+
--base main \
|
|
147
|
+
--head "$BRANCH" \
|
|
148
|
+
--title "Update plex-tui to ${VERSION}" \
|
|
149
|
+
--body "Automated Homebrew tap update for plex-tui ${VERSION}.")"
|
|
150
|
+
|
|
151
|
+
gh pr merge "$pr_url" \
|
|
152
|
+
--repo so1omon563/homebrew-plex-tui \
|
|
153
|
+
--squash \
|
|
154
|
+
--delete-branch
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
name: Publish AUR Package
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_run:
|
|
5
|
+
workflows: ["AUR Package"]
|
|
6
|
+
types: ["completed"]
|
|
7
|
+
workflow_dispatch:
|
|
8
|
+
|
|
9
|
+
env:
|
|
10
|
+
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
|
11
|
+
|
|
12
|
+
jobs:
|
|
13
|
+
publish:
|
|
14
|
+
if: |
|
|
15
|
+
github.event_name == 'workflow_dispatch' ||
|
|
16
|
+
(
|
|
17
|
+
github.event.workflow_run.conclusion == 'success' &&
|
|
18
|
+
github.event.workflow_run.head_branch == 'main' &&
|
|
19
|
+
github.event.workflow_run.event == 'push'
|
|
20
|
+
)
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
permissions:
|
|
23
|
+
contents: read
|
|
24
|
+
|
|
25
|
+
steps:
|
|
26
|
+
- name: Check out repository
|
|
27
|
+
uses: actions/checkout@v5
|
|
28
|
+
with:
|
|
29
|
+
ref: ${{ github.event.workflow_run.head_sha || github.sha }}
|
|
30
|
+
|
|
31
|
+
- name: Read package version
|
|
32
|
+
id: package
|
|
33
|
+
run: |
|
|
34
|
+
set -euo pipefail
|
|
35
|
+
|
|
36
|
+
version="$(sed -n 's/^pkgver=//p' packaging/aur/PKGBUILD)"
|
|
37
|
+
release="$(sed -n 's/^pkgrel=//p' packaging/aur/PKGBUILD)"
|
|
38
|
+
|
|
39
|
+
if ! [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
40
|
+
echo "pkgver must look like X.Y.Z: $version" >&2
|
|
41
|
+
exit 1
|
|
42
|
+
fi
|
|
43
|
+
if ! [[ "$release" =~ ^[0-9]+$ ]]; then
|
|
44
|
+
echo "pkgrel must be numeric: $release" >&2
|
|
45
|
+
exit 1
|
|
46
|
+
fi
|
|
47
|
+
|
|
48
|
+
echo "version=$version" >> "$GITHUB_OUTPUT"
|
|
49
|
+
echo "release=$release" >> "$GITHUB_OUTPUT"
|
|
50
|
+
|
|
51
|
+
- name: Configure AUR SSH
|
|
52
|
+
env:
|
|
53
|
+
AUR_SSH_PRIVATE_KEY: ${{ secrets.AUR_SSH_PRIVATE_KEY }}
|
|
54
|
+
run: |
|
|
55
|
+
set -euo pipefail
|
|
56
|
+
|
|
57
|
+
if [ -z "$AUR_SSH_PRIVATE_KEY" ]; then
|
|
58
|
+
echo "AUR_SSH_PRIVATE_KEY secret is required to publish to AUR" >&2
|
|
59
|
+
exit 1
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
install -m 700 -d ~/.ssh
|
|
63
|
+
printf '%s\n' "$AUR_SSH_PRIVATE_KEY" > ~/.ssh/aur
|
|
64
|
+
chmod 600 ~/.ssh/aur
|
|
65
|
+
ssh-keyscan -H aur.archlinux.org >> ~/.ssh/known_hosts
|
|
66
|
+
|
|
67
|
+
cat > ~/.ssh/config <<'EOF'
|
|
68
|
+
Host aur.archlinux.org
|
|
69
|
+
IdentityFile ~/.ssh/aur
|
|
70
|
+
IdentitiesOnly yes
|
|
71
|
+
User aur
|
|
72
|
+
EOF
|
|
73
|
+
chmod 600 ~/.ssh/config
|
|
74
|
+
|
|
75
|
+
- name: Clone AUR package repository
|
|
76
|
+
run: |
|
|
77
|
+
git clone ssh://aur@aur.archlinux.org/plex-tui.git aur-package
|
|
78
|
+
|
|
79
|
+
- name: Copy package metadata
|
|
80
|
+
run: |
|
|
81
|
+
cp packaging/aur/PKGBUILD aur-package/PKGBUILD
|
|
82
|
+
cp packaging/aur/.SRCINFO aur-package/.SRCINFO
|
|
83
|
+
|
|
84
|
+
- name: Commit and push AUR package
|
|
85
|
+
working-directory: aur-package
|
|
86
|
+
env:
|
|
87
|
+
VERSION: ${{ steps.package.outputs.version }}
|
|
88
|
+
RELEASE: ${{ steps.package.outputs.release }}
|
|
89
|
+
run: |
|
|
90
|
+
set -euo pipefail
|
|
91
|
+
|
|
92
|
+
git config user.name "github-actions[bot]"
|
|
93
|
+
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
|
94
|
+
|
|
95
|
+
if git diff --quiet -- PKGBUILD .SRCINFO; then
|
|
96
|
+
echo "AUR package repository is already up to date."
|
|
97
|
+
exit 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
git add PKGBUILD .SRCINFO
|
|
101
|
+
git commit -m "Update to ${VERSION}-${RELEASE}"
|
|
102
|
+
git push origin master
|
|
@@ -80,8 +80,32 @@ Pull requests should include:
|
|
|
80
80
|
|
|
81
81
|
Use PRs for repository changes. When publishing local commits, branch from
|
|
82
82
|
`main` with a scoped name such as `codex/release-prep`, push that branch, and
|
|
83
|
-
open a draft PR instead of pushing directly to `main`.
|
|
84
|
-
|
|
83
|
+
open a draft PR instead of pushing directly to `main`.
|
|
84
|
+
|
|
85
|
+
`main` is protected by repository rulesets. Changes must flow through PRs; force
|
|
86
|
+
pushes and branch deletion are blocked. `plex-tui` requires the Python 3.11 and
|
|
87
|
+
3.13 CI checks before merge. The Homebrew tap also requires PRs for `main`.
|
|
88
|
+
Rulesets intentionally require zero approving reviews so automation PRs can
|
|
89
|
+
merge after required checks pass without self-approval.
|
|
90
|
+
|
|
91
|
+
By default, PR titles or bodies should include exactly one semver bump marker:
|
|
92
|
+
`#patch`, `#minor`, or `#major`. Most changes should advance tags when merged,
|
|
93
|
+
even when they do not publish a GitHub Release. Add `#release` only when the
|
|
94
|
+
merge should create the GitHub Release and publish package channels. Exceptions
|
|
95
|
+
are allowed for packaging-only follow-ups, automation repair, docs-only
|
|
96
|
+
maintenance, or other changes that should not create a new version tag; call out
|
|
97
|
+
the reason in the PR body when omitting a bump marker.
|
|
98
|
+
|
|
99
|
+
When preparing or estimating a release version, fetch remote tags first with
|
|
100
|
+
`git fetch --tags origin` and base the decision on the latest origin tag, not
|
|
101
|
+
only local tags or the latest GitHub Release. Non-release PRs with `#patch`,
|
|
102
|
+
`#minor`, or `#major` still create tags, so release prep files should match the
|
|
103
|
+
tag that the release PR merge will create.
|
|
104
|
+
|
|
105
|
+
GitHub Release publishing is controlled by release markers in PR titles only:
|
|
106
|
+
`#release`, `#publish`, or `#ship`. Keep those markers out of ordinary PR titles
|
|
107
|
+
unless the merge should publish PyPI, Homebrew, and AUR. PR bodies may mention
|
|
108
|
+
release markers for explanation without publishing.
|
|
85
109
|
|
|
86
110
|
GitHub CLI notes:
|
|
87
111
|
|
|
@@ -2,6 +2,33 @@
|
|
|
2
2
|
|
|
3
3
|
## Unreleased
|
|
4
4
|
|
|
5
|
+
## 0.3.12 - 2026-06-12
|
|
6
|
+
|
|
7
|
+
- Added release workflow guards so tag-only patch bumps do not republish the
|
|
8
|
+
latest GitHub Release through Homebrew or AUR automation.
|
|
9
|
+
- Limited publish markers to PR titles so release examples in PR bodies do not
|
|
10
|
+
accidentally create GitHub Releases.
|
|
11
|
+
- Protected `main` in the app and Homebrew tap repositories while keeping
|
|
12
|
+
automation PRs mergeable without manual approval.
|
|
13
|
+
- Documented protected release automation, packaging dry-runs, and default
|
|
14
|
+
semver bump expectations for future PRs.
|
|
15
|
+
|
|
16
|
+
## 0.3.6 - 2026-06-12
|
|
17
|
+
|
|
18
|
+
- Polished grid cards so poster placeholders, cached artwork, titles,
|
|
19
|
+
subtitles, and selected status align more evenly in the media pane.
|
|
20
|
+
- Improved the details pane hierarchy with clearer playback readiness,
|
|
21
|
+
explicit empty metadata/stream states, tighter preference rows, and wrapped
|
|
22
|
+
summaries.
|
|
23
|
+
- Improved Settings detail feedback with consistent controls guidance, clearer
|
|
24
|
+
armed-confirmation text, and more useful saved-setting summaries.
|
|
25
|
+
- Polished playback diagnostics with clearer active playback status, structured
|
|
26
|
+
playback error details, and more direct debug-log follow-up guidance.
|
|
27
|
+
- Added shieldcn.dev README badges for CI, release, PyPI, AUR, Homebrew tap,
|
|
28
|
+
and license status.
|
|
29
|
+
- Documented release-prep guidance for fetching origin tags before deciding the
|
|
30
|
+
next release version.
|
|
31
|
+
|
|
5
32
|
## 0.3.0 - 2026-06-12
|
|
6
33
|
|
|
7
34
|
- Added `plex-tui --diagnostics` for collecting environment and playback setup details.
|
|
@@ -90,13 +90,25 @@ Validation is handled by `.github/workflows/aur.yml`, which runs inside
|
|
|
90
90
|
For each new app release:
|
|
91
91
|
|
|
92
92
|
1. Publish and validate PyPI.
|
|
93
|
-
2.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
2. Let the `Post-release Homebrew Publish` workflow update, validate, and merge
|
|
94
|
+
the Homebrew tap formula.
|
|
95
|
+
3. Let the `Post-release AUR Update` workflow update AUR metadata, open the
|
|
96
|
+
packaging PR, approve it, and enable auto-merge.
|
|
97
|
+
4. After the packaging PR merges and the `AUR Package` workflow passes on
|
|
98
|
+
`main`, the `Publish AUR Package` workflow pushes the validated `PKGBUILD`
|
|
99
|
+
and `.SRCINFO` to AUR.
|
|
100
|
+
|
|
101
|
+
The AUR automation requires:
|
|
102
|
+
|
|
103
|
+
- `PACKAGING_PR_TOKEN`: a token that can create, approve, and auto-merge the
|
|
104
|
+
generated packaging PR when branch protection requires those actions.
|
|
105
|
+
- `AUR_SSH_PRIVATE_KEY`: the private SSH key for pushing to
|
|
106
|
+
`ssh://aur@aur.archlinux.org/plex-tui.git`.
|
|
107
|
+
|
|
108
|
+
The Homebrew automation uses `PACKAGING_PR_TOKEN`; that token must also be able
|
|
109
|
+
to push branches and merge pull requests in `so1omon563/homebrew-plex-tui`.
|
|
97
110
|
|
|
98
111
|
## Known Follow-Up
|
|
99
112
|
|
|
100
|
-
- Automate Homebrew tap updates after PyPI publishing.
|
|
101
113
|
- Investigate faster Homebrew installs without compromising formula quality.
|
|
102
114
|
- Consider standalone artifacts only after the app behavior stabilizes.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: plex-tui
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.12
|
|
4
4
|
Summary: A small standalone Plex terminal UI.
|
|
5
5
|
Project-URL: Homepage, https://github.com/so1omon563/plex-tui
|
|
6
6
|
Project-URL: Issues, https://github.com/so1omon563/plex-tui/issues
|
|
@@ -36,6 +36,13 @@ Description-Content-Type: text/markdown
|
|
|
36
36
|
|
|
37
37
|
# plex-tui
|
|
38
38
|
|
|
39
|
+
[](https://github.com/so1omon563/plex-tui/actions/workflows/ci.yml)
|
|
40
|
+
[](https://github.com/so1omon563/plex-tui/releases/latest)
|
|
41
|
+
[](https://pypi.org/project/plex-tui/)
|
|
42
|
+
[](https://aur.archlinux.org/packages/plex-tui)
|
|
43
|
+
[](https://github.com/so1omon563/homebrew-plex-tui)
|
|
44
|
+
[](LICENSE)
|
|
45
|
+
|
|
39
46
|
A standalone Python/Textual terminal UI for browsing Plex and launching playback
|
|
40
47
|
through `mpv`.
|
|
41
48
|
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# plex-tui
|
|
2
2
|
|
|
3
|
+
[](https://github.com/so1omon563/plex-tui/actions/workflows/ci.yml)
|
|
4
|
+
[](https://github.com/so1omon563/plex-tui/releases/latest)
|
|
5
|
+
[](https://pypi.org/project/plex-tui/)
|
|
6
|
+
[](https://aur.archlinux.org/packages/plex-tui)
|
|
7
|
+
[](https://github.com/so1omon563/homebrew-plex-tui)
|
|
8
|
+
[](LICENSE)
|
|
9
|
+
|
|
3
10
|
A standalone Python/Textual terminal UI for browsing Plex and launching playback
|
|
4
11
|
through `mpv`.
|
|
5
12
|
|